]> gitweb.factorcode.org Git - factor.git/blob - basis/xmode/modes/markdown.xml
xmode.modes: updating with recent xmode files
[factor.git] / basis / xmode / modes / markdown.xml
1 <?xml version="1.0"?>
2 <!DOCTYPE MODE SYSTEM "xmode.dtd"><!--
3
4   Markdown mode for jEdit by Peter Lynch (http://peterlynch.ca)
5   Original inspiration drawn from Ali Rantakari's jEdit mode at http://hasseg.org
6   Markdown home: http://daringfireball.net/projects/markdown/
7
8   Suggested Habits and limitations for using this syntax
9   * first rule - avoid being 'lazy' as defined in the spec. This means not indenting lines 2 - n in unordered lists and
10     similar laziness. Not being lazy gives you better syntax highlighting.
11   * prefix all blockquote lines with 'greater than' char, avoid being lazy, since jedit mode regexp
12     can't cross lines
13   * try to keep code blocks 4 spaces single tab deep only
14   * add an extra space for inline links or image links that are in a paragraph and happen to wrap to
15     start on the beginning of a line. A leading space should turn coloring on for those links
16   * brackets '[' or ']' appearing in paragraphs that are not part of a link definition should have the leding bracket escaped
17     to prevent this mode thinking you are starting a link reference
18   * block level html in a blockquote will still be parsed for markdown syntax, even though the spec says
19     markdown is not parsed for in block level html
20   * determining the difference between a code block and list paragraph indented 4 spaces(or tab) is impossible
21     so to help identify code blocks any paragraph indented four spaces is treated as such
22   * tabs are assumed to be taken as four spaces.
23   * link label definitions should start at the beginning of a line and NOT up to 3 spaces leading as allowed by the spec
24
25 -->
26 <MODE>
27   <PROPS>
28     <PROPERTY NAME="tabSize" VALUE="4" />
29     <PROPERTY NAME="indentSize" VALUE="4" />
30     <PROPERTY NAME="maxLineLen" VALUE="120" />
31     <PROPERTY NAME="commentStart" VALUE="&lt;!--" />
32     <PROPERTY NAME="commentEnd" VALUE="--&gt;" />
33   </PROPS>
34
35   <!-- ================ MAIN ================================= -->
36   <RULES IGNORE_CASE="TRUE">
37
38     <!-- HANDLE BLOCK LEVEL HTML ELEMENTS -->
39     <!-- SGML comment -->
40     <SPAN TYPE="COMMENT1">
41       <BEGIN>&lt;!--</BEGIN>
42       <END>--&gt;</END>
43     </SPAN>
44     <!-- JavaScript -->
45     <SPAN AT_LINE_START="TRUE" TYPE="MARKUP" DELEGATE="html::JAVASCRIPT">
46       <BEGIN>&lt;script</BEGIN>
47       <END>&lt;/script&gt;</END>
48     </SPAN>
49     <!-- special hr case -->
50     <SEQ_REGEXP AT_LINE_START="TRUE" TYPE="MARKUP">&lt;hr\b([^&lt;&gt;])*?/?&gt;</SEQ_REGEXP>
51     <!-- block level html must be at the start of a line we isolate this because block
52     level html should not be parsed for markdown syntax -->
53     <SPAN_REGEXP HASH_CHAR="&lt;" AT_LINE_START="TRUE" TYPE="MARKUP" DELEGATE="BLOCK_HTML_TAGS">
54       <BEGIN>&lt;(p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|noscript|form|fieldset|iframe|math|ins|del)\b</BEGIN>
55       <END>&lt;/$1&gt;</END>
56     </SPAN_REGEXP>
57     <!-- ignore dangling less thans to allow for things like 4 < 5 -->
58     <SEQ TYPE="NULL"> &lt; </SEQ>
59     <!-- HANDLE OTHER INLINE HTML ELEMENTS -->
60     <SPAN TYPE="MARKUP" DELEGATE="INLINE_MARKUP">
61       <BEGIN>&lt;</BEGIN>
62       <END>&gt;</END>
63     </SPAN>
64     <!-- THE REST IS MARKDOWN -->
65     <IMPORT DELEGATE="MARKDOWN" />
66   </RULES>
67
68   <!-- ================ INLINE HTML ================================= -->
69   <RULES SET="INLINE_MARKUP" DEFAULT="MARKUP">
70     <IMPORT DELEGATE="html::TAGS" />
71   </RULES>
72
73   <!-- ================ BLOCK LEVEL HTML ================================= -->
74   <RULES SET="BLOCK_HTML_TAGS" DEFAULT="MARKUP">
75     <!-- any line indented less than 4 spaces is not valid markdown in block html -->
76     <EOL_SPAN_REGEXP AT_LINE_START="TRUE" TYPE="INVALID">[\S]+</EOL_SPAN_REGEXP>
77     <EOL_SPAN_REGEXP AT_LINE_START="TRUE" TYPE="INVALID"> {1,3}[\S]+</EOL_SPAN_REGEXP>
78     <EOL_SPAN_REGEXP AT_LINE_START="TRUE" DELEGATE="html::MAIN">( {4}|\t)</EOL_SPAN_REGEXP>
79     <SPAN TYPE="LITERAL1">
80       <BEGIN>"</BEGIN>
81       <END>"</END>
82     </SPAN>
83     <SPAN TYPE="LITERAL1">
84       <BEGIN>'</BEGIN>
85       <END>'</END>
86     </SPAN>
87     <SEQ TYPE="OPERATOR">=</SEQ>
88   </RULES>
89
90   <!-- ================ MARKDOWN ================================= -->
91   <RULES SET="MARKDOWN" IGNORE_CASE="FALSE">
92     <!-- blockquotes, also handles nested blockquote chars &#09; is tab -->
93     <EOL_SPAN_REGEXP HASH_CHARS=" &gt;" AT_LINE_START="TRUE" MATCH_TYPE="LITERAL3" DELEGATE="MARKDOWN_BLOCKQUOTE">[ \t]*(&gt;[ \t]{1})+</EOL_SPAN_REGEXP>
94     <!-- literal characters (i.e. cases where they won't specify formatting)  -->
95     <SEQ TYPE="NULL"> * </SEQ>
96     <SEQ TYPE="NULL"> _ </SEQ>
97     <SEQ TYPE="NULL">\][</SEQ>
98     <SEQ_REGEXP TYPE="NULL" HASH_CHAR="\">\\[\Q*_\`[](){}#+.!-\E]</SEQ_REGEXP>
99                 <!-- GitHub-flavored code blocks -->
100                 <SPAN TYPE="LITERAL2" AT_LINE_START="TRUE" DELEGATE="ruby::MAIN">
101                   <BEGIN>``` ruby</BEGIN>
102                   <END>```</END>
103                 </SPAN>
104                 <SPAN TYPE="LITERAL2" AT_LINE_START="TRUE">
105                   <BEGIN>```</BEGIN>
106                   <END>```</END>
107                 </SPAN>
108     <!-- inline code: `NSString* str = @"hi!";` using backticks-->
109     <SPAN_REGEXP TYPE="LITERAL2" HASH_CHARS="`">
110       <BEGIN>(`{1,2})</BEGIN>
111       <END>$1</END>
112     </SPAN_REGEXP>
113     <!-- telling difference between code blocks and list paragraphs is impossible until regexp cross line boundaries -->
114     <EOL_SPAN_REGEXP TYPE="LITERAL2" AT_LINE_START="TRUE" HASH_CHARS=" &#09;">( {4,}|\t+)\S</EOL_SPAN_REGEXP>
115     <!-- <EOL_SPAN_REGEXP TYPE="LITERAL2" AT_LINE_START="TRUE" HASH_CHARS=" &#09;">( {4,}|\t+){2,}</EOL_SPAN_REGEXP> -->
116     <!-- headers (setext-style:) -->
117     <EOL_SPAN_REGEXP TYPE="KEYWORD1" AT_LINE_START="TRUE" HASH_CHARS="=-">[=-]+</EOL_SPAN_REGEXP>
118     <!-- headers (atx-style:) -->
119     <EOL_SPAN_REGEXP TYPE="KEYWORD1" AT_LINE_START="TRUE" HASH_CHAR="#">#{1,6}[ \t]*(.+?)</EOL_SPAN_REGEXP>
120     <!-- horizontal rules -->
121     <EOL_SPAN_REGEXP TYPE="KEYWORD1" HASH_CHARS="-*_ &#09;" AT_LINE_START="TRUE">[ ]{0,2}([ ]?[-_*][ ]?){3,}[ \t]*</EOL_SPAN_REGEXP>
122     <!-- lists (unordered) -->
123     <!-- <SEQ_REGEXP TYPE="KEYWORD2" AT_LINE_START="TRUE" HASH_CHARS="*+- &#09;">[ \t]{0,3}[*+-][ \t]+</SEQ_REGEXP> -->
124     <SEQ_REGEXP TYPE="KEYWORD2" AT_LINE_START="TRUE" HASH_CHARS="+-* &#09;">[ \t]{0,}[*+-][ \t]+</SEQ_REGEXP>
125     <!-- lists (ordered) -->
126     <SEQ_REGEXP TYPE="KEYWORD2" AT_LINE_START="TRUE" HASH_CHARS="0123456789 &#09;">[ \t]{0,}\d+\.[ \t]+</SEQ_REGEXP>
127     <!-- Link Label definitions all on one line -->
128     <EOL_SPAN_REGEXP TYPE="LABEL" AT_WHITESPACE_END="TRUE" DELEGATE="LINK_LABEL_DEFINITION">\[(.*?)\]\:</EOL_SPAN_REGEXP>
129     <!-- Inline images and page links and pointers ![alt text](/path/to/img.jpg "Title for this") -->
130     <SPAN_REGEXP TYPE="KEYWORD4" MATCH_TYPE="OPERATOR" NO_LINE_BREAK="TRUE" AT_LINE_START="FALSE" HASH_CHARS=" ![" DELEGATE="LINK_INLINE_URL_TITLE">
131       <BEGIN> !?\[[\p{Alnum}\p{Blank}]*</BEGIN>
132       <END>\]</END>
133     </SPAN_REGEXP>
134     <!-- emphasis (strong) -->
135     <SPAN_REGEXP TYPE="LITERAL3" HASH_CHARS="*_" AT_WORD_START="TRUE" NO_LINE_BREAK="TRUE">
136       <BEGIN>(\*\*|__)</BEGIN>
137       <END>$1</END>
138     </SPAN_REGEXP>
139     <!-- emphasis (em) -->
140     <SPAN_REGEXP TYPE="LITERAL4" HASH_CHARS="*_" AT_WORD_START="TRUE" NO_LINE_BREAK="TRUE">
141       <BEGIN>(\*|_)</BEGIN>
142       <END>$1</END>
143     </SPAN_REGEXP>
144   </RULES>
145
146   <!-- ================ LINK PROCESSING ================================= -->
147   <RULES DEFAULT="KEYWORD3" SET="LINK_LABEL_DEFINITION">
148     <SEQ_REGEXP TYPE="NULL" HASH_CHAR="\">\\[\Q*_\`[](){}#+.!-\E]</SEQ_REGEXP>
149     <SEQ TYPE="OPERATOR">"</SEQ>
150     <SEQ TYPE="OPERATOR">(</SEQ>
151     <SEQ TYPE="OPERATOR">)</SEQ>
152     <IMPORT DELEGATE="MARKDOWN" />
153   </RULES>
154   <RULES SET="LINK_INLINE_URL_TITLE">
155     <!-- the closing bracket of the link text-->
156     <SEQ TYPE="OPERATOR">]</SEQ>
157     <!-- span containing the link label pointer to the definition -->
158     <SPAN_REGEXP TYPE="KEYWORD4" MATCH_TYPE="OPERATOR" NO_LINE_BREAK="TRUE" AT_LINE_START="FALSE" HASH_CHAR="[" DELEGATE="LINK_INLINE_LABEL_CLOSE">
159       <BEGIN>\[</BEGIN>
160       <END>\]</END>
161     </SPAN_REGEXP>
162     <!-- span containing the url and optional title -->
163     <SPAN_REGEXP TYPE="KEYWORD4" MATCH_TYPE="OPERATOR" NO_LINE_BREAK="TRUE" AT_LINE_START="FALSE" HASH_CHAR="(" DELEGATE="LINK_INLINE_URL_TITLE_CLOSE">
164       <BEGIN>\(</BEGIN>
165       <END>\)</END>
166     </SPAN_REGEXP>
167   </RULES>
168   <RULES DEFAULT="KEYWORD3" SET="LINK_INLINE_URL_TITLE_CLOSE">
169     <!-- the closing paren and loop back to MAIN -->
170     <EOL_SPAN TYPE="NULL" MATCH_TYPE="OPERATOR" DELEGATE="MAIN">)</EOL_SPAN>
171   </RULES>
172   <RULES DEFAULT="LABEL" SET="LINK_INLINE_LABEL_CLOSE">
173     <!-- the closing bracket and loop back to MAIN -->
174     <EOL_SPAN TYPE="NULL" MATCH_TYPE="OPERATOR" DELEGATE="MAIN">]</EOL_SPAN>
175   </RULES>
176
177   <!-- ================ MARKDOWN EMBEDDED IN A BLOCKQUOTE  ================================= -->
178    <!--
179     repetitive: these are the same markdown rules but no AT_LINE_START=TRUE because they are
180     part of a blockquote match which already matched at line start didn't see a better way at
181     the time
182     -->
183   <RULES SET="MARKDOWN_BLOCKQUOTE" IGNORE_CASE="FALSE">
184     <!-- ignore dangling less thans to allow for things like 4 < 5 -->
185     <SEQ TYPE="NULL"> &lt; </SEQ>
186     <!-- HANDLE OTHER INLINE HTML ELEMENTS -->
187     <SPAN TYPE="MARKUP" DELEGATE="INLINE_MARKUP">
188       <BEGIN>&lt;</BEGIN>
189       <END>&gt;</END>
190     </SPAN>
191     <!-- literal characters (i.e. cases where they won't specify formatting)  -->
192     <SEQ TYPE="NULL"> * </SEQ>
193     <SEQ TYPE="NULL"> _ </SEQ>
194     <SEQ TYPE="NULL">\][</SEQ>
195     <SEQ_REGEXP TYPE="NULL" HASH_CHAR="\">\\[\Q*_\`[](){}#+.!-\E]</SEQ_REGEXP>
196     <!-- inline code: `NSString* str = @"hi!";` using backticks-->
197     <SPAN_REGEXP TYPE="LITERAL2" HASH_CHARS="`">
198       <BEGIN>(`{1,2})</BEGIN>
199       <END>$1</END>
200     </SPAN_REGEXP>
201     <!-- telling difference between code blocks and list paragraphs is impossible until regexp cross line boundaries -->
202     <EOL_SPAN_REGEXP TYPE="LITERAL2" HASH_CHARS=" &#09;">( {4,}|\t+)\S</EOL_SPAN_REGEXP>
203     <!-- <EOL_SPAN_REGEXP TYPE="LITERAL2" AT_LINE_START="TRUE" HASH_CHARS=" &#09;">( {4,}|\t+){2,}</EOL_SPAN_REGEXP> -->
204     <!-- headers (setext-style:) -->
205     <EOL_SPAN_REGEXP TYPE="KEYWORD1" HASH_CHARS="=-">[=-]+</EOL_SPAN_REGEXP>
206     <!-- headers (atx-style:) -->
207     <EOL_SPAN_REGEXP TYPE="KEYWORD1" HASH_CHAR="#">#{1,6}[ \t]*(.+?)</EOL_SPAN_REGEXP>
208     <!-- horizontal rules -->
209     <EOL_SPAN_REGEXP TYPE="KEYWORD1" HASH_CHARS="-*_ &#09;">[ ]{0,2}([ ]?[-_*][ ]?){3,}[ \t]*</EOL_SPAN_REGEXP>
210     <!-- lists (unordered) -->
211     <SEQ_REGEXP TYPE="KEYWORD2" HASH_CHARS="*+- &#09;">[ \t]{0,}[*+-][ \t]+</SEQ_REGEXP>
212     <!-- lists (ordered) -->
213     <SEQ_REGEXP TYPE="KEYWORD2" HASH_CHARS="0123456789 &#09;">[ \t]{0,}\d+\.[ \t]+</SEQ_REGEXP>
214     <!-- Link Label definitions all on one line -->
215     <EOL_SPAN_REGEXP TYPE="LABEL" DELEGATE="LINK_LABEL_DEFINITION">\[(.*?)\]\:</EOL_SPAN_REGEXP>
216     <!-- Inline images and page links and pointers ![alt text](/path/to/img.jpg "Title for this") -->
217     <SPAN_REGEXP TYPE="KEYWORD4" MATCH_TYPE="OPERATOR" NO_LINE_BREAK="TRUE" AT_LINE_START="FALSE" HASH_CHARS=" ![" DELEGATE="LINK_INLINE_URL_TITLE">
218       <BEGIN> !?\[[\p{Alnum}\p{Blank}]*</BEGIN>
219       <END>\]</END>
220     </SPAN_REGEXP>
221     <!-- emphasis (strong) -->
222     <SPAN_REGEXP TYPE="LITERAL3" HASH_CHARS="*_">
223       <BEGIN>(\*\*|__)</BEGIN>
224       <END>$1</END>
225     </SPAN_REGEXP>
226     <!-- emphasis (em) -->
227     <SPAN_REGEXP TYPE="LITERAL4" HASH_CHARS="*_">
228       <BEGIN>(\*|_)</BEGIN>
229       <END>$1</END>
230     </SPAN_REGEXP>
231   </RULES>
232 </MODE>