2 <!DOCTYPE MODE SYSTEM "xmode.dtd"><!--
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/
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
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
28 <PROPERTY NAME="tabSize" VALUE="4" />
29 <PROPERTY NAME="indentSize" VALUE="4" />
30 <PROPERTY NAME="maxLineLen" VALUE="120" />
31 <PROPERTY NAME="commentStart" VALUE="<!--" />
32 <PROPERTY NAME="commentEnd" VALUE="-->" />
35 <!-- ================ MAIN ================================= -->
36 <RULES IGNORE_CASE="TRUE">
38 <!-- HANDLE BLOCK LEVEL HTML ELEMENTS -->
40 <SPAN TYPE="COMMENT1">
41 <BEGIN><!--</BEGIN>
45 <SPAN AT_LINE_START="TRUE" TYPE="MARKUP" DELEGATE="html::JAVASCRIPT">
46 <BEGIN><script</BEGIN>
47 <END></script></END>
49 <!-- special hr case -->
50 <SEQ_REGEXP AT_LINE_START="TRUE" TYPE="MARKUP"><hr\b([^<>])*?/?></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="<" AT_LINE_START="TRUE" TYPE="MARKUP" DELEGATE="BLOCK_HTML_TAGS">
54 <BEGIN><(p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|noscript|form|fieldset|iframe|math|ins|del)\b</BEGIN>
55 <END></$1></END>
57 <!-- ignore dangling less thans to allow for things like 4 < 5 -->
58 <SEQ TYPE="NULL"> < </SEQ>
59 <!-- HANDLE OTHER INLINE HTML ELEMENTS -->
60 <SPAN TYPE="MARKUP" DELEGATE="INLINE_MARKUP">
64 <!-- THE REST IS MARKDOWN -->
65 <IMPORT DELEGATE="MARKDOWN" />
68 <!-- ================ INLINE HTML ================================= -->
69 <RULES SET="INLINE_MARKUP" DEFAULT="MARKUP">
70 <IMPORT DELEGATE="html::TAGS" />
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">
83 <SPAN TYPE="LITERAL1">
87 <SEQ TYPE="OPERATOR">=</SEQ>
90 <!-- ================ MARKDOWN ================================= -->
91 <RULES SET="MARKDOWN" IGNORE_CASE="FALSE">
92 <!-- blockquotes, also handles nested blockquote chars 	 is tab -->
93 <EOL_SPAN_REGEXP HASH_CHARS=" >" AT_LINE_START="TRUE" MATCH_TYPE="LITERAL3" DELEGATE="MARKDOWN_BLOCKQUOTE">[ \t]*(>[ \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>
104 <SPAN TYPE="LITERAL2" AT_LINE_START="TRUE">
108 <!-- inline code: `NSString* str = @"hi!";` using backticks-->
109 <SPAN_REGEXP TYPE="LITERAL2" HASH_CHARS="`">
110 <BEGIN>(`{1,2})</BEGIN>
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=" 	">( {4,}|\t+)\S</EOL_SPAN_REGEXP>
115 <!-- <EOL_SPAN_REGEXP TYPE="LITERAL2" AT_LINE_START="TRUE" HASH_CHARS=" 	">( {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="-*_ 	" 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="*+- 	">[ \t]{0,3}[*+-][ \t]+</SEQ_REGEXP> -->
124 <SEQ_REGEXP TYPE="KEYWORD2" AT_LINE_START="TRUE" HASH_CHARS="+-* 	">[ \t]{0,}[*+-][ \t]+</SEQ_REGEXP>
125 <!-- lists (ordered) -->
126 <SEQ_REGEXP TYPE="KEYWORD2" AT_LINE_START="TRUE" HASH_CHARS="0123456789 	">[ \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>
134 <!-- emphasis (strong) -->
135 <SPAN_REGEXP TYPE="LITERAL3" HASH_CHARS="*_" AT_WORD_START="TRUE" NO_LINE_BREAK="TRUE">
136 <BEGIN>(\*\*|__)</BEGIN>
139 <!-- emphasis (em) -->
140 <SPAN_REGEXP TYPE="LITERAL4" HASH_CHARS="*_" AT_WORD_START="TRUE" NO_LINE_BREAK="TRUE">
141 <BEGIN>(\*|_)</BEGIN>
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" />
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">
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">
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>
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>
177 <!-- ================ MARKDOWN EMBEDDED IN A BLOCKQUOTE ================================= -->
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
183 <RULES SET="MARKDOWN_BLOCKQUOTE" IGNORE_CASE="FALSE">
184 <!-- ignore dangling less thans to allow for things like 4 < 5 -->
185 <SEQ TYPE="NULL"> < </SEQ>
186 <!-- HANDLE OTHER INLINE HTML ELEMENTS -->
187 <SPAN TYPE="MARKUP" DELEGATE="INLINE_MARKUP">
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>
201 <!-- telling difference between code blocks and list paragraphs is impossible until regexp cross line boundaries -->
202 <EOL_SPAN_REGEXP TYPE="LITERAL2" HASH_CHARS=" 	">( {4,}|\t+)\S</EOL_SPAN_REGEXP>
203 <!-- <EOL_SPAN_REGEXP TYPE="LITERAL2" AT_LINE_START="TRUE" HASH_CHARS=" 	">( {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="-*_ 	">[ ]{0,2}([ ]?[-_*][ ]?){3,}[ \t]*</EOL_SPAN_REGEXP>
210 <!-- lists (unordered) -->
211 <SEQ_REGEXP TYPE="KEYWORD2" HASH_CHARS="*+- 	">[ \t]{0,}[*+-][ \t]+</SEQ_REGEXP>
212 <!-- lists (ordered) -->
213 <SEQ_REGEXP TYPE="KEYWORD2" HASH_CHARS="0123456789 	">[ \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>
221 <!-- emphasis (strong) -->
222 <SPAN_REGEXP TYPE="LITERAL3" HASH_CHARS="*_">
223 <BEGIN>(\*\*|__)</BEGIN>
226 <!-- emphasis (em) -->
227 <SPAN_REGEXP TYPE="LITERAL4" HASH_CHARS="*_">
228 <BEGIN>(\*|_)</BEGIN>