Skip to content

Commit c7d577a

Browse files
committed
feat: support column headings
1 parent cf9aff1 commit c7d577a

File tree

6 files changed

+607
-99
lines changed

6 files changed

+607
-99
lines changed

corpus/column_heading.txt

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
================================================================================
2+
Simple uppercase heading
3+
================================================================================
4+
HELLO
5+
6+
Test
7+
--------------------------------------------------------------------------------
8+
9+
(help_file
10+
(column_heading
11+
(uppercase_name))
12+
(line
13+
(word)))
14+
15+
================================================================================
16+
Multiple words uppercase heading
17+
================================================================================
18+
HELLO WORLD
19+
20+
Test
21+
--------------------------------------------------------------------------------
22+
23+
(help_file
24+
(column_heading
25+
(uppercase_name))
26+
(line
27+
(word)))
28+
29+
================================================================================
30+
Heading with tag
31+
================================================================================
32+
HELLO WORLD *abc*
33+
34+
Test
35+
--------------------------------------------------------------------------------
36+
37+
(help_file
38+
(column_heading
39+
(uppercase_name)
40+
(tag
41+
(word)))
42+
(line
43+
(word)))
44+
45+
================================================================================
46+
Heading lowercase
47+
================================================================================
48+
Test~
49+
50+
Below
51+
--------------------------------------------------------------------------------
52+
53+
(help_file
54+
(column_heading
55+
(column_name
56+
(word)))
57+
(line
58+
(word)))
59+
60+
================================================================================
61+
Heading with multiple words
62+
================================================================================
63+
Multiple words~
64+
65+
Bleh
66+
--------------------------------------------------------------------------------
67+
68+
(help_file
69+
(column_heading
70+
(column_name
71+
(word)
72+
(word)))
73+
(line
74+
(word)))

corpus/header.txt

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,3 +21,20 @@ text
2121
(word))
2222
(line
2323
(word)))
24+
25+
================================================================================
26+
Empty line
27+
================================================================================
28+
An
29+
Empty
30+
31+
line
32+
--------------------------------------------------------------------------------
33+
34+
(help_file
35+
(line
36+
(word))
37+
(line
38+
(word))
39+
(line
40+
(word)))

grammar.js

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,31 @@ module.exports = grammar({
22
name: 'help', // The actual language name is help
33

44
extras: ($) => [/[\t ]/],
5+
conflicts: ($) => [
6+
[$._atom, $.column_name],
7+
],
58

69
rules: {
7-
help_file: ($) => repeat1($.line),
10+
help_file: ($) => repeat1(choice($.line, '\n', $.column_heading)),
811

912
header: ($) => seq($.tag),
1013

1114
line: ($) => prec.right(seq(repeat1($._atom), optional('\n'))),
1215

1316
_atom: ($) => choice($.word, $.tag),
1417

15-
word: ($) => /[^*|'\n \t]+/,
18+
uppercase_name: ($) => repeat1(/[A-Z]+/),
19+
column_name: ($) => repeat1($.word),
20+
column_heading: ($) =>
21+
seq(
22+
choice(
23+
seq(field('name', $.uppercase_name), optional($.tag)),
24+
seq(field('name', $.column_name), '~'),
25+
),
26+
'\n',
27+
),
28+
29+
word: ($) => /[^*|'\n \t]*[^*|'\n \t~]/,
1630
tag: ($) => wrapped_word($, '*', 'name'),
1731
option: ($) => wrapped_word($, "'", 'name'),
1832
hotlink: ($) => wrapped_word($, '|', 'destination'),

src/grammar.json

Lines changed: 92 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,21 @@
44
"help_file": {
55
"type": "REPEAT1",
66
"content": {
7-
"type": "SYMBOL",
8-
"name": "line"
7+
"type": "CHOICE",
8+
"members": [
9+
{
10+
"type": "SYMBOL",
11+
"name": "line"
12+
},
13+
{
14+
"type": "STRING",
15+
"value": "\n"
16+
},
17+
{
18+
"type": "SYMBOL",
19+
"name": "column_heading"
20+
}
21+
]
922
}
1023
},
1124
"header": {
@@ -58,9 +71,79 @@
5871
}
5972
]
6073
},
74+
"uppercase_name": {
75+
"type": "REPEAT1",
76+
"content": {
77+
"type": "PATTERN",
78+
"value": "[A-Z]+"
79+
}
80+
},
81+
"column_name": {
82+
"type": "REPEAT1",
83+
"content": {
84+
"type": "SYMBOL",
85+
"name": "word"
86+
}
87+
},
88+
"column_heading": {
89+
"type": "SEQ",
90+
"members": [
91+
{
92+
"type": "CHOICE",
93+
"members": [
94+
{
95+
"type": "SEQ",
96+
"members": [
97+
{
98+
"type": "FIELD",
99+
"name": "name",
100+
"content": {
101+
"type": "SYMBOL",
102+
"name": "uppercase_name"
103+
}
104+
},
105+
{
106+
"type": "CHOICE",
107+
"members": [
108+
{
109+
"type": "SYMBOL",
110+
"name": "tag"
111+
},
112+
{
113+
"type": "BLANK"
114+
}
115+
]
116+
}
117+
]
118+
},
119+
{
120+
"type": "SEQ",
121+
"members": [
122+
{
123+
"type": "FIELD",
124+
"name": "name",
125+
"content": {
126+
"type": "SYMBOL",
127+
"name": "column_name"
128+
}
129+
},
130+
{
131+
"type": "STRING",
132+
"value": "~"
133+
}
134+
]
135+
}
136+
]
137+
},
138+
{
139+
"type": "STRING",
140+
"value": "\n"
141+
}
142+
]
143+
},
61144
"word": {
62145
"type": "PATTERN",
63-
"value": "[^*|'\\n \\t]+"
146+
"value": "[^*|'\\n \\t]*[^*|'\\n \\t~]"
64147
},
65148
"tag": {
66149
"type": "SEQ",
@@ -132,7 +215,12 @@
132215
"value": "[\\t ]"
133216
}
134217
],
135-
"conflicts": [],
218+
"conflicts": [
219+
[
220+
"_atom",
221+
"column_name"
222+
]
223+
],
136224
"precedences": [],
137225
"externals": [],
138226
"inline": [],

src/node-types.json

Lines changed: 59 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,61 @@
11
[
22
{
3-
"type": "help_file",
3+
"type": "column_heading",
4+
"named": true,
5+
"fields": {
6+
"name": {
7+
"multiple": false,
8+
"required": true,
9+
"types": [
10+
{
11+
"type": "column_name",
12+
"named": true
13+
},
14+
{
15+
"type": "uppercase_name",
16+
"named": true
17+
}
18+
]
19+
}
20+
},
21+
"children": {
22+
"multiple": false,
23+
"required": false,
24+
"types": [
25+
{
26+
"type": "tag",
27+
"named": true
28+
}
29+
]
30+
}
31+
},
32+
{
33+
"type": "column_name",
434
"named": true,
535
"fields": {},
636
"children": {
737
"multiple": true,
838
"required": true,
939
"types": [
40+
{
41+
"type": "word",
42+
"named": true
43+
}
44+
]
45+
}
46+
},
47+
{
48+
"type": "help_file",
49+
"named": true,
50+
"fields": {},
51+
"children": {
52+
"multiple": true,
53+
"required": false,
54+
"types": [
55+
{
56+
"type": "column_heading",
57+
"named": true
58+
},
1059
{
1160
"type": "line",
1261
"named": true
@@ -49,6 +98,11 @@
4998
}
5099
}
51100
},
101+
{
102+
"type": "uppercase_name",
103+
"named": true,
104+
"fields": {}
105+
},
52106
{
53107
"type": "\n",
54108
"named": false
@@ -68,5 +122,9 @@
68122
{
69123
"type": "|",
70124
"named": false
125+
},
126+
{
127+
"type": "~",
128+
"named": false
71129
}
72130
]

0 commit comments

Comments
 (0)