1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
|
-- Tracks the current step in the tutorial
CREATE TABLE lnav_tutorial_step
(
name TEXT NOT NULL PRIMARY KEY,
step INTEGER NOT NULL
);
INSERT INTO lnav_tutorial_step
VALUES ('tutorial1', 1);
-- A description of each step in the tutorial with its achievements
CREATE TABLE lnav_tutorial_steps
(
name TEXT NOT NULL,
step INTEGER NOT NULL,
achievements TEXT NOT NULL,
PRIMARY KEY (name, step)
);
-- Tracks the progress through the achievements in a step of the tutorial
CREATE TABLE IF NOT EXISTS lnav_tutorial_progress
(
name TEXT NOT NULL,
step INTEGER NOT NULL,
achieved TEXT NOT NULL,
PRIMARY KEY (name, step, achieved)
);
CREATE TABLE IF NOT EXISTS lnav_tutorial_lines
(
name TEXT NOT NULL,
step INTEGER NOT NULL,
view_ptr TEXT NOT NULL,
view_value TEXT NOT NULL,
achievement TEXT NOT NULL,
log_comment TEXT
);
-- Copy the tutorial data from the markdown frontmatter to
-- the appropriate tables.
CREATE TRIGGER IF NOT EXISTS add_tutorial_data
AFTER INSERT
ON lnav_events
WHEN jget(new.content, '/$schema') = 'https://lnav.org/event-file-format-detected-v1.schema.json' AND
jget(new.content, '/format') = 'text/markdown'
BEGIN
INSERT INTO lnav_tutorial_steps
SELECT jget(tutorial_meta, '/name'),
key + 1,
value
FROM (SELECT yaml_to_json(lnav_file_metadata.content) AS tutorial_meta
FROM lnav_file_metadata
WHERE filepath = jget(new.content, '/filename')) AS meta_content,
json_each(jget(meta_content.tutorial_meta, '/steps'));
REPLACE INTO lnav_tutorial_lines
SELECT name,
step,
jget(value, '/view_ptr'),
jget(value, '/view_value'),
key,
jget(value, '/comment')
FROM lnav_tutorial_steps,
json_each(achievements)
WHERE jget(value, '/view_ptr') IS NOT NULL;
REPLACE INTO lnav_user_notifications (id, views, message)
SELECT *
FROM lnav_tutorial_log_notification;
END;
CREATE TRIGGER IF NOT EXISTS tutorial_move_log_after_load
AFTER INSERT
ON lnav_events
WHEN jget(new.content, '/$schema') = 'https://lnav.org/event-session-loaded-v1.schema.json'
BEGIN
UPDATE lnav_views SET top = 0 WHERE name = 'log';
END;
CREATE TRIGGER IF NOT EXISTS lnav_tutorial_view_listener UPDATE OF top
ON lnav_views_echo
WHEN new.name = 'log'
BEGIN
INSERT OR IGNORE INTO lnav_tutorial_progress
SELECT lnav_tutorial_lines.name,
lnav_tutorial_lines.step,
achievement
FROM lnav_tutorial_step,
lnav_tutorial_lines
WHERE lnav_tutorial_step.step = lnav_tutorial_lines.step
AND jget(json_object('top', new.top,
'left', new.left,
'search', new.search),
view_ptr) = view_value;
UPDATE all_logs
SET log_comment = (SELECT log_comment
FROM lnav_tutorial_step,
lnav_tutorial_lines
WHERE lnav_tutorial_step.step = lnav_tutorial_lines.step
AND lnav_tutorial_lines.log_comment IS NOT NULL
AND jget(json_object('top', new.top,
'left', new.left,
'search', new.search), view_ptr) = view_value)
WHERE log_line = new.top
AND log_comment IS NULL;
END;
CREATE TABLE lnav_tutorial_message
(
msgid INTEGER PRIMARY KEY,
msg TEXT
);
CREATE VIEW lnav_tutorial_current_achievements AS
SELECT key AS achievement, value
FROM lnav_tutorial_step,
lnav_tutorial_steps, json_each(lnav_tutorial_steps.achievements)
WHERE lnav_tutorial_step.step = lnav_tutorial_steps.step;
CREATE VIEW lnav_tutorial_current_progress AS
SELECT achieved
FROM lnav_tutorial_step,
lnav_tutorial_progress
WHERE lnav_tutorial_step.step = lnav_tutorial_progress.step;
CREATE VIEW lnav_tutorial_remaining_achievements AS
SELECT *
FROM lnav_tutorial_current_achievements
WHERE achievement NOT IN (SELECT * FROM lnav_tutorial_current_progress);
CREATE VIEW lnav_tutorial_log_notification AS
SELECT *
FROM (SELECT 'org.lnav.tutorial.log' AS id, '["log"]' AS views, jget(value, '/notification') AS message
FROM lnav_tutorial_remaining_achievements
UNION ALL
SELECT 'org.lnav.tutorial.log' AS id,
'["log"]' AS views,
'Press `y` to go to the next step in the tutorial' AS message)
LIMIT 1;
CREATE TRIGGER IF NOT EXISTS lnav_tutorial_progress_listener
AFTER INSERT
ON lnav_tutorial_progress
BEGIN
DELETE FROM lnav_user_notifications WHERE id = 'org.lnav.tutorial.log';
REPLACE INTO lnav_user_notifications (id, views, message)
SELECT *
FROM lnav_tutorial_log_notification;
END;
REPLACE INTO lnav_user_notifications (id, views, message)
VALUES ('org.lnav.tutorial.text', '["text"]', 'Press `q` to go to the log view')
|