1#
2#
3#  Copyright (c) 2018, Red Hat, Inc.
4#  Copyright (c) 2018, Masatake YAMATO
5#
6#  Author: Masatake YAMATO <yamato@redhat.com>
7#
8# This program is free software; you can redistribute it and/or
9# modify it under the terms of the GNU General Public License
10# as published by the Free Software Foundation; either version 2
11# of the License, or (at your option) any later version.
12#
13# This program is distributed in the hope that it will be useful,
14# but WITHOUT ANY WARRANTY; without even the implied warranty of
15# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16# GNU General Public License for more details.
17#
18# You should have received a copy of the GNU General Public License
19# along with this program; if not, write to the Free Software
20# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
21# USA.
22#
23#
24
25--langdef=Markdown
26--map-Markdown=+.md
27--map-Markdown=+.markdown
28
29--_scopesep-Markdown=*/*:""
30
31--kinddef-Markdown=c,chapter,chapsters
32--kinddef-Markdown=s,section,sections
33--kinddef-Markdown=S,subsection,subsections
34--kinddef-Markdown=t,subsubsection,subsubsections
35--kinddef-Markdown=T,l4subsection,level 4 subsections
36--kinddef-Markdown=u,l5subsection,level 5 subsections
37
38--_fielddef-Markdown=sectionMarker,character used for declaring section(#, ##, =, or -)
39
40
41--_prelude-Markdown={{
42    % group:int SCOPEPOPWITHADJUSTMENT -
43    /scopePopWithAdjustment {
44         _scopetop {
45            % group:int index:int
46            dup 3 -1 roll
47            % index:int index:int group:int
48            _matchloc end:
49            % index:int
50            dup :end
51            % index:int endline:int true
52            % or index:int false
53            {
54                dup 1 gt {
55                    1 sub end:
56                } { pop } ifelse
57            } if
58            _scopepop
59        } if
60    } def
61}}
62
63--_tabledef-Markdown=frontmatter
64--_tabledef-Markdown=main
65--_tabledef-Markdown=main_sharp
66--_tabledef-Markdown=chapter
67--_tabledef-Markdown=chapter_sharp
68--_tabledef-Markdown=section
69--_tabledef-Markdown=section_sharp
70--_tabledef-Markdown=subsection
71--_tabledef-Markdown=subsection_sharp
72--_tabledef-Markdown=subsubsection
73--_tabledef-Markdown=subsubsection_sharp
74--_tabledef-Markdown=l4subsection
75--_tabledef-Markdown=l4subsection_sharp
76--_tabledef-Markdown=l5subsection
77--_tabledef-Markdown=l5subsection_sharp
78
79--_tabledef-Markdown=emptyLine
80--_tabledef-Markdown=gfmLeave
81--_tabledef-Markdown=rest
82--_tabledef-Markdown=code
83
84# Handle GFM style codeblock in this table.
85# https://github.github.com/gfm/#fenced-code-blocks
86--_tabledef-Markdown=codeblockBacktick
87--_tabledef-Markdown=codeblockTildes
88
89
90--_mtable-regex-Markdown=emptyLine/^([\t ]*)[\n]+//
91
92--_mtable-extend-Markdown=gfmLeave+emptyLine
93--_mtable-regex-Markdown=gfmLeave/^([^\n]+)[\n](=+|-+)[\n]//{tleave}{_advanceTo=0start}{{
94    1 scopePopWithAdjustment
95}}
96
97--_mtable-regex-Markdown=rest/^[^\n]*[\n]+//
98--_mtable-regex-Markdown=rest/^[^\n]*//{tquit}
99
100--_mtable-regex-Markdown=code/^[ \t]*````*[ \t]*([a-zA-Z0-9][-#+a-zA-Z0-9]*)?[^`\n]*[\n]//{tenter=codeblockBacktick}{_guest=\1,0end,}
101--_mtable-regex-Markdown=code/^[ \t]*~~~~*[ \t]*([a-zA-Z0-9][-#+a-zA-Z0-9]*)?[^~\n]*[\n]//{tenter=codeblockTildes}{_guest=\1,0end,}
102
103#
104# Frontmatter
105#
106# https://gohugo.io/content-management/front-matter/
107#
108
109# YAML area
110--_mtable-regex-Markdown=frontmatter/(---[\n]).*(---[\n])//{tjump=main}
111
112# JSON area
113--_mtable-regex-Markdown=frontmatter/(;;;[\n]).*(;;;[\n])//{tjump=main}
114
115# TOML area
116--_mtable-regex-Markdown=frontmatter/(\+\+\+[\n]).*(\+\+\+[\n])//{tjump=main}
117
118# No frontmatter
119--_mtable-regex-Markdown=frontmatter/.//{_advanceTo=0start}{tjump=main}
120
121
122#
123# Main
124#
125--_mtable-regex-Markdown=main_sharp/^#[ \t]+([^\n]+)([ \t]+#+)[\n]*/\1/c/{_field=sectionMarker:##}{scope=push}{tenter=chapter,main}
126--_mtable-regex-Markdown=main_sharp/^#[ \t]+([^\n]+)[\n]*/\1/c/{_field=sectionMarker:#}{scope=push}{tenter=chapter,main}
127--_mtable-regex-Markdown=main_sharp/^##[ \t]+([^\n]+)([ \t]+#+)[\n]*/\1/s/{_field=sectionMarker:##}{scope=push}{tenter=section,main}
128--_mtable-regex-Markdown=main_sharp/^##[ \t]+([^\n]+)[\n]*/\1/s/{_field=sectionMarker:#}{scope=push}{tenter=section,main}
129--_mtable-regex-Markdown=main_sharp/^###[ \t]+([^\n]+)([ \t]+#+)[\n]*/\1/S/{_field=sectionMarker:##}{scope=push}{tenter=subsection,main}
130--_mtable-regex-Markdown=main_sharp/^###[ \t]+([^\n]+)[\n]*/\1/S/{_field=sectionMarker:#}{scope=push}{tenter=subsection,main}
131--_mtable-regex-Markdown=main_sharp/^####[ \t]+([^\n]+)([ \t]+#+)[\n]*/\1/t/{_field=sectionMarker:##}{scope=push}{tenter=subsubsection,main}
132--_mtable-regex-Markdown=main_sharp/^####[ \t]+([^\n]+)[\n]*/\1/t/{_field=sectionMarker:#}{scope=push}{tenter=subsubsection,main}
133--_mtable-regex-Markdown=main_sharp/^#####[ \t]+([^\n]+)([ \t]+#+)[\n]*/\1/T/{_field=sectionMarker:##}{scope=push}{tenter=l4subsection,main}
134--_mtable-regex-Markdown=main_sharp/^#####[ \t]+([^\n]+)[\n]*/\1/T/{_field=sectionMarker:#}{scope=push}{tenter=l4subsection,main}
135--_mtable-regex-Markdown=main_sharp/^######[ \t]+([^\n]+)([ \t]+#+)[\n]*/\1/u/{_field=sectionMarker:##}{scope=push}{tenter=l5subsection,main}
136--_mtable-regex-Markdown=main_sharp/^######[ \t]+([^\n]+)[\n]*/\1/u/{_field=sectionMarker:#}{scope=push}{tenter=l5subsection,main}
137--_mtable-regex-Markdown=main_sharp/.//{tjump=main}
138
139--_mtable-regex-Markdown=main/^#//{_advanceTo=0start}{tjump=main_sharp}
140--_mtable-extend-Markdown=main+emptyLine
141--_mtable-extend-Markdown=main+code
142--_mtable-regex-Markdown=main/^([^\n]+)[\n]=+[\n]/\1/c/{_field=sectionMarker:=}{scope=push}{tenter=chapter}
143--_mtable-regex-Markdown=main/^([^\n]+)[\n]-+[\n]/\1/s/{_field=sectionMarker:-}{scope=push}{tenter=section}
144--_mtable-extend-Markdown=main+rest
145
146
147#
148# Chapter
149#
150--_mtable-regex-Markdown=chapter_sharp/(^#{1,1}[ \t]+[^\n]+)//{tleave}{_advanceTo=0start}{{
151    1 scopePopWithAdjustment
152}}
153--_mtable-regex-Markdown=chapter_sharp/^##[ \t]+([^\n]+)([ \t]+#+)[\n]*/\1/s/{_field=sectionMarker:##}{scope=push}{tenter=section,chapter}
154--_mtable-regex-Markdown=chapter_sharp/^##[ \t]+([^\n]+)[\n]*/\1/s/{_field=sectionMarker:#}{scope=push}{tenter=section,chapter}
155--_mtable-regex-Markdown=chapter_sharp/^###[ \t]+([^\n]+)([ \t]+#+)[\n]*/\1/S/{_field=sectionMarker:##}{scope=push}{tenter=subsection,chapter}
156--_mtable-regex-Markdown=chapter_sharp/^###[ \t]+([^\n]+)[\n]*/\1/S/{_field=sectionMarker:#}{scope=push}{tenter=subsection,chapter}
157--_mtable-regex-Markdown=chapter_sharp/^####[ \t]+([^\n]+)([ \t]+#+)[\n]*/\1/t/{_field=sectionMarker:##}{scope=push}{tenter=subsubsection,chapter}
158--_mtable-regex-Markdown=chapter_sharp/^####[ \t]+([^\n]+)[\n]*/\1/t/{_field=sectionMarker:#}{scope=push}{tenter=subsubsection,chapter}
159--_mtable-regex-Markdown=chapter_sharp/^#####[ \t]+([^\n]+)([ \t]+#+)[\n]*/\1/T/{_field=sectionMarker:##}{scope=push}{tenter=l4subsection,chapter}
160--_mtable-regex-Markdown=chapter_sharp/^#####[ \t]+([^\n]+)[\n]*/\1/T/{_field=sectionMarker:#}{scope=push}{tenter=l4subsection,chapter}
161--_mtable-regex-Markdown=chapter_sharp/^######[ \t]+([^\n]+)([ \t]+#+)[\n]*/\1/u/{_field=sectionMarker:##}{scope=push}{tenter=l5subsection,chapter}
162--_mtable-regex-Markdown=chapter_sharp/^######[ \t]+([^\n]+)[\n]*/\1/u/{_field=sectionMarker:#}{scope=push}{tenter=l5subsection,chapter}
163--_mtable-regex-Markdown=chapter_sharp/.//{tjump=chapter}
164
165--_mtable-regex-Markdown=chapter/^#//{_advanceTo=0start}{tjump=chapter_sharp}
166--_mtable-extend-Markdown=chapter+emptyLine
167--_mtable-regex-Markdown=chapter/^([^\n]+)[\n]-+[\n]/\1/s/{_field=sectionMarker:-}{scope=push}{tenter=section}
168--_mtable-regex-Markdown=chapter/^([^\n]+)[\n]=+[\n]//{tleave}{_advanceTo=0start}{{
169    1 scopePopWithAdjustment
170}}
171--_mtable-extend-Markdown=chapter+code
172--_mtable-extend-Markdown=chapter+rest
173
174#
175# Section
176#
177--_mtable-regex-Markdown=section_sharp/(^#{1,2}[ \t]+[^\n]+)//{tleave}{_advanceTo=0start}{{
178    1 scopePopWithAdjustment
179}}
180--_mtable-regex-Markdown=section_sharp/^###[ \t]+([^\n]+)([ \t]+#+)[\n]*/\1/S/{_field=sectionMarker:##}{scope=push}{tenter=subsection,section}
181--_mtable-regex-Markdown=section_sharp/^###[ \t]+([^\n]+)[\n]*/\1/S/{_field=sectionMarker:#}{scope=push}{tenter=subsection,section}
182--_mtable-regex-Markdown=section_sharp/^####[ \t]+([^\n]+)([ \t]+#+)[\n]*/\1/t/{_field=sectionMarker:##}{scope=push}{tenter=subsubsection,section}
183--_mtable-regex-Markdown=section_sharp/^####[ \t]+([^\n]+)[\n]*/\1/t/{_field=sectionMarker:#}{scope=push}{tenter=subsubsection,section}
184--_mtable-regex-Markdown=section_sharp/^#####[ \t]+([^\n]+)([ \t]+#+)[\n]*/\1/T/{_field=sectionMarker:##}{scope=push}{tenter=l4subsection,section}
185--_mtable-regex-Markdown=section_sharp/^#####[ \t]+([^\n]+)[\n]*/\1/T/{_field=sectionMarker:#}{scope=push}{tenter=l4subsection,section}
186--_mtable-regex-Markdown=section_sharp/^######[ \t]+([^\n]+)([ \t]+#+)[\n]*/\1/u/{_field=sectionMarker:##}{scope=push}{tenter=l5subsection,section}
187--_mtable-regex-Markdown=section_sharp/^######[ \t]+([^\n]+)[\n]*/\1/u/{_field=sectionMarker:#}{scope=push}{tenter=l5subsection,section}
188--_mtable-regex-Markdown=section_sharp/.//{tjump=section}
189
190--_mtable-regex-Markdown=section/^#//{_advanceTo=0start}{tjump=section_sharp}
191--_mtable-extend-Markdown=section+gfmLeave
192--_mtable-extend-Markdown=section+code
193--_mtable-extend-Markdown=section+rest
194
195
196#
197# Subsection
198#
199--_mtable-regex-Markdown=subsection_sharp/(^#{1,3}[ \t]+[^\n]+)//{tleave}{_advanceTo=0start,subsection}{{
200    1 scopePopWithAdjustment
201}}
202--_mtable-regex-Markdown=subsection_sharp/^####[ \t]+([^\n]+)([ \t]+#+)[\n]*/\1/t/{_field=sectionMarker:##}{scope=push}{tenter=subsubsection,subsection}
203--_mtable-regex-Markdown=subsection_sharp/^####[ \t]+([^\n]+)[\n]*/\1/t/{_field=sectionMarker:#}{scope=push}{tenter=subsubsection,subsection}
204--_mtable-regex-Markdown=subsection_sharp/^#####[ \t]+([^\n]+)([ \t]+#+)[\n]*/\1/T/{_field=sectionMarker:##}{scope=push}{tenter=l4subsection,subsection}
205--_mtable-regex-Markdown=subsection_sharp/^#####[ \t]+([^\n]+)[\n]*/\1/T/{_field=sectionMarker:#}{scope=push}{tenter=l4subsection,subsection}
206--_mtable-regex-Markdown=subsection_sharp/^######[ \t]+([^\n]+)([ \t]+#+)[\n]*/\1/u/{_field=sectionMarker:##}{scope=push}{tenter=l5subsection,subsection}
207--_mtable-regex-Markdown=subsection_sharp/^######[ \t]+([^\n]+)[\n]*/\1/u/{_field=sectionMarker:#}{scope=push}{tenter=l5subsection,subsection}
208--_mtable-regex-Markdown=subsection_sharp/.//{tjump=subsection}
209
210--_mtable-regex-Markdown=subsection/^#//{_advanceTo=0start}{tjump=subsection_sharp}
211--_mtable-extend-Markdown=subsection+gfmLeave
212--_mtable-extend-Markdown=subsection+code
213--_mtable-extend-Markdown=subsection+rest
214
215
216#
217# SubSubsection
218#
219--_mtable-regex-Markdown=subsubsection_sharp/(^#{1,4}[ \t]+[^\n]+)//{tleave}{_advanceTo=0start}{{
220    1 scopePopWithAdjustment
221}}
222--_mtable-regex-Markdown=subsubsection_sharp/^#####[ \t]+([^\n]+)([ \t]+#+)[\n]*/\1/T/{_field=sectionMarker:##}{scope=push}{tenter=l4subsection,subsubsection}
223--_mtable-regex-Markdown=subsubsection_sharp/^#####[ \t]+([^\n]+)[\n]*/\1/T/{_field=sectionMarker:#}{scope=push}{tenter=l4subsection,subsubsection}
224--_mtable-regex-Markdown=subsubsection_sharp/^######[ \t]+([^\n]+)([ \t]+#+)[\n]*/\1/u/{_field=sectionMarker:##}{scope=push}{tenter=l5subsection,subsubsection}
225--_mtable-regex-Markdown=subsubsection_sharp/^######[ \t]+([^\n]+)[\n]*/\1/u/{_field=sectionMarker:#}{scope=push}{tenter=l5subsection,subsubsection}
226--_mtable-regex-Markdown=subsubsection_sharp/.//{tjump=subsubsection}
227
228--_mtable-regex-Markdown=subsubsection/^#//{_advanceTo=0start}{tjump=subsubsection_sharp}
229--_mtable-extend-Markdown=subsubsection+gfmLeave
230--_mtable-extend-Markdown=subsubsection+code
231--_mtable-extend-Markdown=subsubsection+rest
232
233
234#
235# L4subsection
236#
237--_mtable-regex-Markdown=l4subsection_sharp/(^#{1,5}[ \t]+[^\n]+)//{tleave}{_advanceTo=0start}{{
238    1 scopePopWithAdjustment
239}}
240--_mtable-regex-Markdown=l4subsection_sharp/^######[ \t]+([^\n]+)([ \t]+#+)[\n]*/\1/u/{_field=sectionMarker:##}{scope=push}{tenter=l5subsection,l4subsection}
241--_mtable-regex-Markdown=l4subsection_sharp/^######[ \t]+([^\n]+)[\n]*/\1/u/{_field=sectionMarker:#}{scope=push}{tenter=l5subsection,l4subsection}
242--_mtable-regex-Markdown=l4subsection_sharp/.//{tjump=l4subsection}
243
244--_mtable-regex-Markdown=l4subsection/^#//{_advanceTo=0start}{tjump=l4subsection_sharp}
245--_mtable-extend-Markdown=l4subsection+gfmLeave
246--_mtable-extend-Markdown=l4subsection+code
247--_mtable-extend-Markdown=l4subsection+rest
248
249
250#
251# L5subsection
252#
253--_mtable-regex-Markdown=l5subsection_sharp/^#{1,6}[ \t]+([^\n]+)//{tleave}{_advanceTo=0start}{{
254    1 scopePopWithAdjustment
255}}
256--_mtable-regex-Markdown=l5subsection_sharp/.//{tjump=l5subsection}
257
258--_mtable-regex-Markdown=l5subsection/^#//{_advanceTo=0start}{tjump=l5subsection_sharp}
259--_mtable-extend-Markdown=l5subsection+gfmLeave
260--_mtable-extend-Markdown=l5subsection+code
261--_mtable-extend-Markdown=l5subsection+rest
262
263
264#
265# Codeblock
266#
267--_mtable-regex-Markdown=codeblockBacktick/^[ \t]*````*[ \t]*[\n]//{tleave}{_guest=,,0start}
268--_mtable-extend-Markdown=codeblockBacktick+rest
269
270--_mtable-regex-Markdown=codeblockTildes/^[ \t]*~~~~*[ \t]*[\n]//{tleave}{_guest=,,0start}
271--_mtable-extend-Markdown=codeblockTildes+rest
272