Skip to content

Commit c4f3ab0

Browse files
committed
refactor into single and multi-line actions
1 parent c1860b0 commit c4f3ab0

File tree

4 files changed

+160
-104
lines changed

4 files changed

+160
-104
lines changed

‎parser/index.pegjs

Lines changed: 53 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -211,50 +211,68 @@ task_action
211211

212212
action_type
213213
= action_open
214-
/ action_set
215-
/ action_insert
216-
/ action_write
214+
// test for multi-line actions first
215+
/ action_set_multi
216+
/ action_insert_multi
217+
/ action_write_multi
218+
// single-line actions
219+
/ action_set_single
220+
/ action_insert_single
221+
/ action_write_single
217222
/ action_write_from_file
218223

219224
action_open
220225
= 'open'
221226
'('
222227
file: file_path
223-
')'
224-
break?
225-
')'
228+
closing_bracket
229+
closing_bracket
226230
{ return `open(${file})`; }
227231

228-
action_insert
232+
action_insert_single
233+
= 'insert'
234+
'('
235+
content: in_single_line
236+
{ return `insert(\"${content.slice(0, -2)}\")`; }
237+
238+
action_insert_multi
229239
= 'insert'
230-
content:
231-
(
232-
between_code_block_and_brackets
233-
/ between_brackets
234-
)
235-
break?
236-
')'
240+
'('
241+
content: in_code_block
242+
closing_bracket
243+
closing_bracket
237244
{ return `insert(\"${content}\")`; }
238245

239-
action_set
246+
action_set_single
247+
= 'set'
248+
'('
249+
content: in_single_line
250+
{ return `set(\"${content.slice(0, -2)}\")`; }
251+
252+
action_set_multi
240253
= 'set'
241-
content: (
242-
between_code_block_and_brackets
243-
/ between_brackets
244-
)
245-
break?
246-
')'
254+
'('
255+
content: in_code_block
256+
closing_bracket
257+
closing_bracket
247258
{ return `set(\"${content}\")`; }
248259

249-
action_write
260+
action_write_single
261+
= 'write'
262+
'('
263+
to: file_path
264+
',' space?
265+
content: in_single_line
266+
{ return `write(${to}, \"${content.slice(0, -2)}\")`}
267+
268+
action_write_multi
250269
= 'write'
251270
'('
252271
to: file_path
253272
',' space?
254-
content: ( between_code_block_with_closing_bracket
255-
/ until_end_quote_bracket ) // TODO: make this more flexible
256-
break?
257-
273+
content: in_code_block
274+
closing_bracket
275+
closing_bracket
258276
{ return `write(${to}, \"${content}\")`}
259277

260278
action_write_from_file
@@ -263,9 +281,8 @@ action_write_from_file
263281
to: file_path
264282
',' space?
265283
from: file_path
266-
')'
267-
break?
268-
')'
284+
closing_bracket
285+
closing_bracket
269286
{ return `writeFromFile(${to}, ${from})`; }
270287

271288
/*** "pegjs/shared.pegjs" ***/
@@ -283,6 +300,7 @@ break = [\n\r]
283300
non_break = [^\n^\r]
284301
quote = [\"\'\`]
285302
code_block = '```'
303+
closing_bracket = break? ')'
286304

287305
content
288306
= non_special_line
@@ -305,34 +323,17 @@ between_brackets
305323
')'
306324
{ return trimQuotes(adjust(content)); }
307325

308-
between_code_block
326+
in_code_block
309327
= break?
310328
code_block
311329
break?
312-
content: ( [^\`]+ / '`' [^\`]+ )+ // not three back ticks
330+
content: ( [^\`]+ / '`' [^\`]+ )+ // anything but ```
313331
code_block
314332
break?
315333
{ return adjust(content); }
316334

317-
between_code_block_and_brackets
318-
= '('
319-
content: between_code_block
320-
')'
321-
{ return content; }
322-
323-
between_code_block_with_closing_bracket
324-
= content: between_code_block
325-
')'
326-
break?
327-
')'
328-
{ return content; }
329-
330-
until_end_quote_bracket
331-
= content: until_end
332-
{
333-
// trim off final quote & bracket
334-
if (content.match(/[\"\'\`][\n\r]?\)[\n\r]?\)$/)) {
335-
return content.slice(1, -3);
336-
}
337-
}
335+
in_single_line
336+
= quote
337+
content: until_end
338+
{ return content.slice(0, -1); }
338339

‎parser/pegjs/characters.pegjs

Lines changed: 7 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ break = [\n\r]
44
non_break = [^\n^\r]
55
quote = [\"\'\`]
66
code_block = '```'
7+
closing_bracket = break? ')'
78

89
content
910
= non_special_line
@@ -26,33 +27,16 @@ between_brackets
2627
')'
2728
{ return trimQuotes(adjust(content)); }
2829

29-
between_code_block
30+
in_code_block
3031
= break?
3132
code_block
3233
break?
33-
content: ( [^\`]+ / '`' [^\`]+ )+ // not three back ticks
34+
content: ( [^\`]+ / '`' [^\`]+ )+ // anything but ```
3435
code_block
3536
break?
3637
{ return adjust(content); }
3738

38-
between_code_block_and_brackets
39-
= '('
40-
content: between_code_block
41-
')'
42-
{ return content; }
43-
44-
between_code_block_with_closing_bracket
45-
= content: between_code_block
46-
')'
47-
break?
48-
')'
49-
{ return content; }
50-
51-
until_end_quote_bracket
52-
= content: until_end
53-
{
54-
// trim off final quote & bracket
55-
if (content.match(/[\"\'\`][\n\r]?\)[\n\r]?\)$/)) {
56-
return content.slice(1, -3);
57-
}
58-
}
39+
in_single_line
40+
= quote
41+
content: until_end
42+
{ return content.slice(0, -1); }

‎parser/pegjs/task-actions.pegjs

Lines changed: 46 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -12,50 +12,68 @@ task_action
1212

1313
action_type
1414
= action_open
15-
/ action_set
16-
/ action_insert
17-
/ action_write
15+
// test for multi-line actions first
16+
/ action_set_multi
17+
/ action_insert_multi
18+
/ action_write_multi
19+
// single-line actions
20+
/ action_set_single
21+
/ action_insert_single
22+
/ action_write_single
1823
/ action_write_from_file
1924

2025
action_open
2126
= 'open'
2227
'('
2328
file: file_path
24-
')'
25-
break?
26-
')'
29+
closing_bracket
30+
closing_bracket
2731
{ return `open(${file})`; }
2832

29-
action_insert
33+
action_insert_single
34+
= 'insert'
35+
'('
36+
content: in_single_line
37+
{ return `insert(\"${content.slice(0, -2)}\")`; }
38+
39+
action_insert_multi
3040
= 'insert'
31-
content:
32-
(
33-
between_code_block_and_brackets
34-
/ between_brackets
35-
)
36-
break?
37-
')'
41+
'('
42+
content: in_code_block
43+
closing_bracket
44+
closing_bracket
3845
{ return `insert(\"${content}\")`; }
3946

40-
action_set
47+
action_set_single
48+
= 'set'
49+
'('
50+
content: in_single_line
51+
{ return `set(\"${content.slice(0, -2)}\")`; }
52+
53+
action_set_multi
4154
= 'set'
42-
content: (
43-
between_code_block_and_brackets
44-
/ between_brackets
45-
)
46-
break?
47-
')'
55+
'('
56+
content: in_code_block
57+
closing_bracket
58+
closing_bracket
4859
{ return `set(\"${content}\")`; }
4960

50-
action_write
61+
action_write_single
62+
= 'write'
63+
'('
64+
to: file_path
65+
',' space?
66+
content: in_single_line
67+
{ return `write(${to}, \"${content.slice(0, -2)}\")`}
68+
69+
action_write_multi
5170
= 'write'
5271
'('
5372
to: file_path
5473
',' space?
55-
content: ( between_code_block_with_closing_bracket
56-
/ until_end_quote_bracket ) // TODO: make this more flexible
57-
break?
58-
74+
content: in_code_block
75+
closing_bracket
76+
closing_bracket
5977
{ return `write(${to}, \"${content}\")`}
6078

6179
action_write_from_file
@@ -64,7 +82,6 @@ action_write_from_file
6482
to: file_path
6583
',' space?
6684
from: file_path
67-
')'
68-
break?
69-
')'
85+
closing_bracket
86+
closing_bracket
7087
{ return `writeFromFile(${to}, ${from})`; }

‎test/actions/set.js

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ import test from 'ava';
22
const parse = require('../_parser');
33
const start = require('./_setup');
44

5+
// single-line (within quotes or string literal)
6+
57
test('parses an action: set (single-line)', t => {
68
const data = `${start}@action(set('var a = 42;'))
79
`;
@@ -10,6 +12,32 @@ test('parses an action: set (single-line)', t => {
1012
t.deepEqual(result.pages[0].tasks[0].actions, expected);
1113
});
1214

15+
test.skip('parses an action: set(single-line, \` inside)', t => {
16+
const data = `${start}@action(set('var a = \`hello\`;'))
17+
`;
18+
const expected = ["set(\"var a = \`hello\`;\")"];
19+
const result = parse(data);
20+
t.deepEqual(result.pages[0].tasks[0].actions, expected);
21+
});
22+
23+
test.skip('parses an action: set(single-line, () inside)', t => {
24+
const data = `${start}@action(set('var a = function() {};'))
25+
`;
26+
const expected = ["set(\"var a = function() {};\")"];
27+
const result = parse(data);
28+
t.deepEqual(result.pages[0].tasks[0].actions, expected);
29+
});
30+
31+
test.skip('parses an action: set(single-line, ) inside)', t => {
32+
const data = `${start}@action(set('var a = 'hello :) world\';'))
33+
`;
34+
const expected = ["set(\"var a = \'hello :) world\';\")"];
35+
const result = parse(data);
36+
t.deepEqual(result.pages[0].tasks[0].actions, expected);
37+
});
38+
39+
// multi-line (within a ``` codeblock)
40+
1341
test('parses an action: set (multi-line, ```)', t => {
1442
const data = `${start}@action(set(\`\`\`
1543
var a = 42;
@@ -21,3 +49,29 @@ var b = 43;
2149
const result = parse(data);
2250
t.deepEqual(result.pages[0].tasks[0].actions, expected);
2351
});
52+
53+
test('parses an action: set (multi-line, () inside)', t => {
54+
const data = `${start}@action(set(\`\`\`
55+
function() {
56+
return;
57+
}
58+
\`\`\`
59+
))
60+
`;
61+
const expected = ["set(\"function() {\n return;\n}\")"];
62+
const result = parse(data);
63+
t.deepEqual(result.pages[0].tasks[0].actions, expected);
64+
});
65+
66+
test('parses an action: set (multi-line, ) inside)', t => {
67+
const data = `${start}@action(set(\`\`\`
68+
function() {
69+
return ':)';
70+
}
71+
\`\`\`
72+
))
73+
`;
74+
const expected = ["set(\"function() {\n return \':)\';\n}\")"];
75+
const result = parse(data);
76+
t.deepEqual(result.pages[0].tasks[0].actions, expected);
77+
});

0 commit comments

Comments
 (0)