UNPKG

6.87 kBJavaScriptView Raw
1(function (Prism) {
2 // We don't allow for pipes inside parentheses
3 // to not break table pattern |(. foo |). bar |
4 var modifierRegex = /(?:\([^|)]+\)|\[[^\]]+\]|\{[^}]+\})+/.source;
5 var modifierTokens = {
6 'css': {
7 pattern: /\{[^}]+\}/,
8 inside: {
9 rest: Prism.languages.css
10 }
11 },
12 'class-id': {
13 pattern: /(\()[^)]+(?=\))/,
14 lookbehind: true,
15 alias: 'attr-value'
16 },
17 'lang': {
18 pattern: /(\[)[^\]]+(?=\])/,
19 lookbehind: true,
20 alias: 'attr-value'
21 },
22 // Anything else is punctuation (the first pattern is for row/col spans inside tables)
23 'punctuation': /[\\\/]\d+|\S/
24 };
25
26
27 var textile = Prism.languages.textile = Prism.languages.extend('markup', {
28 'phrase': {
29 pattern: /(^|\r|\n)\S[\s\S]*?(?=$|\r?\n\r?\n|\r\r)/,
30 lookbehind: true,
31 inside: {
32
33 // h1. Header 1
34 'block-tag': {
35 pattern: RegExp('^[a-z]\\w*(?:' + modifierRegex + '|[<>=()])*\\.'),
36 inside: {
37 'modifier': {
38 pattern: RegExp('(^[a-z]\\w*)(?:' + modifierRegex + '|[<>=()])+(?=\\.)'),
39 lookbehind: true,
40 inside: modifierTokens
41 },
42 'tag': /^[a-z]\w*/,
43 'punctuation': /\.$/
44 }
45 },
46
47 // # List item
48 // * List item
49 'list': {
50 pattern: RegExp('^[*#]+(?:' + modifierRegex + ')?\\s+.+', 'm'),
51 inside: {
52 'modifier': {
53 pattern: RegExp('(^[*#]+)' + modifierRegex),
54 lookbehind: true,
55 inside: modifierTokens
56 },
57 'punctuation': /^[*#]+/
58 }
59 },
60
61 // | cell | cell | cell |
62 'table': {
63 // Modifiers can be applied to the row: {color:red}.|1|2|3|
64 // or the cell: |{color:red}.1|2|3|
65 pattern: RegExp('^(?:(?:' + modifierRegex + '|[<>=()^~])+\\.\\s*)?(?:\\|(?:(?:' + modifierRegex + '|[<>=()^~_]|[\\\\/]\\d+)+\\.)?[^|]*)+\\|', 'm'),
66 inside: {
67 'modifier': {
68 // Modifiers for rows after the first one are
69 // preceded by a pipe and a line feed
70 pattern: RegExp('(^|\\|(?:\\r?\\n|\\r)?)(?:' + modifierRegex + '|[<>=()^~_]|[\\\\/]\\d+)+(?=\\.)'),
71 lookbehind: true,
72 inside: modifierTokens
73 },
74 'punctuation': /\||^\./
75 }
76 },
77
78 'inline': {
79 pattern: RegExp('(\\*\\*|__|\\?\\?|[*_%@+\\-^~])(?:' + modifierRegex + ')?.+?\\1'),
80 inside: {
81 // Note: superscripts and subscripts are not handled specifically
82
83 // *bold*, **bold**
84 'bold': {
85 pattern: RegExp('(^(\\*\\*?)(?:' + modifierRegex + ')?).+?(?=\\2)'),
86 lookbehind: true
87 },
88
89 // _italic_, __italic__
90 'italic': {
91 pattern: RegExp('(^(__?)(?:' + modifierRegex + ')?).+?(?=\\2)'),
92 lookbehind: true
93 },
94
95 // ??cite??
96 'cite': {
97 pattern: RegExp('(^\\?\\?(?:' + modifierRegex + ')?).+?(?=\\?\\?)'),
98 lookbehind: true,
99 alias: 'string'
100 },
101
102 // @code@
103 'code': {
104 pattern: RegExp('(^@(?:' + modifierRegex + ')?).+?(?=@)'),
105 lookbehind: true,
106 alias: 'keyword'
107 },
108
109 // +inserted+
110 'inserted': {
111 pattern: RegExp('(^\\+(?:' + modifierRegex + ')?).+?(?=\\+)'),
112 lookbehind: true
113 },
114
115 // -deleted-
116 'deleted': {
117 pattern: RegExp('(^-(?:' + modifierRegex + ')?).+?(?=-)'),
118 lookbehind: true
119 },
120
121 // %span%
122 'span': {
123 pattern: RegExp('(^%(?:' + modifierRegex + ')?).+?(?=%)'),
124 lookbehind: true
125 },
126
127 'modifier': {
128 pattern: RegExp('(^\\*\\*|__|\\?\\?|[*_%@+\\-^~])' + modifierRegex),
129 lookbehind: true,
130 inside: modifierTokens
131 },
132 'punctuation': /[*_%?@+\-^~]+/
133 }
134 },
135
136 // [alias]http://example.com
137 'link-ref': {
138 pattern: /^\[[^\]]+\]\S+$/m,
139 inside: {
140 'string': {
141 pattern: /(\[)[^\]]+(?=\])/,
142 lookbehind: true
143 },
144 'url': {
145 pattern: /(\])\S+$/,
146 lookbehind: true
147 },
148 'punctuation': /[\[\]]/
149 }
150 },
151
152 // "text":http://example.com
153 // "text":link-ref
154 'link': {
155 pattern: RegExp('"(?:' + modifierRegex + ')?[^"]+":.+?(?=[^\\w/]?(?:\\s|$))'),
156 inside: {
157 'text': {
158 pattern: RegExp('(^"(?:' + modifierRegex + ')?)[^"]+(?=")'),
159 lookbehind: true
160 },
161 'modifier': {
162 pattern: RegExp('(^")' + modifierRegex),
163 lookbehind: true,
164 inside: modifierTokens
165 },
166 'url': {
167 pattern: /(:).+/,
168 lookbehind: true
169 },
170 'punctuation': /[":]/
171 }
172 },
173
174 // !image.jpg!
175 // !image.jpg(Title)!:http://example.com
176 'image': {
177 pattern: RegExp('!(?:' + modifierRegex + '|[<>=()])*[^!\\s()]+(?:\\([^)]+\\))?!(?::.+?(?=[^\\w/]?(?:\\s|$)))?'),
178 inside: {
179 'source': {
180 pattern: RegExp('(^!(?:' + modifierRegex + '|[<>=()])*)[^!\\s()]+(?:\\([^)]+\\))?(?=!)'),
181 lookbehind: true,
182 alias: 'url'
183 },
184 'modifier': {
185 pattern: RegExp('(^!)(?:' + modifierRegex + '|[<>=()])+'),
186 lookbehind: true,
187 inside: modifierTokens
188 },
189 'url': {
190 pattern: /(:).+/,
191 lookbehind: true
192 },
193 'punctuation': /[!:]/
194 }
195 },
196
197 // Footnote[1]
198 'footnote': {
199 pattern: /\b\[\d+\]/,
200 alias: 'comment',
201 inside: {
202 'punctuation': /\[|\]/
203 }
204 },
205
206 // CSS(Cascading Style Sheet)
207 'acronym': {
208 pattern: /\b[A-Z\d]+\([^)]+\)/,
209 inside: {
210 'comment': {
211 pattern: /(\()[^)]+(?=\))/,
212 lookbehind: true
213 },
214 'punctuation': /[()]/
215 }
216 },
217
218 // Prism(C)
219 'mark': {
220 pattern: /\b\((?:TM|R|C)\)/,
221 alias: 'comment',
222 inside: {
223 'punctuation': /[()]/
224 }
225 }
226 }
227 }
228 });
229
230 var phraseInside = textile['phrase'].inside;
231 var nestedPatterns = {
232 'inline': phraseInside['inline'],
233 'link': phraseInside['link'],
234 'image': phraseInside['image'],
235 'footnote': phraseInside['footnote'],
236 'acronym': phraseInside['acronym'],
237 'mark': phraseInside['mark']
238 };
239
240 // Only allow alpha-numeric HTML tags, not XML tags
241 textile.tag.pattern = /<\/?(?!\d)[a-z0-9]+(?:\s+[^\s>\/=]+(?:=(?:("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|[^\s'">=]+))?)*\s*\/?>/i;
242
243 // Allow some nesting
244 var phraseInlineInside = phraseInside['inline'].inside;
245 phraseInlineInside['bold'].inside = nestedPatterns;
246 phraseInlineInside['italic'].inside = nestedPatterns;
247 phraseInlineInside['inserted'].inside = nestedPatterns;
248 phraseInlineInside['deleted'].inside = nestedPatterns;
249 phraseInlineInside['span'].inside = nestedPatterns;
250
251 // Allow some styles inside table cells
252 var phraseTableInside = phraseInside['table'].inside;
253 phraseTableInside['inline'] = nestedPatterns['inline'];
254 phraseTableInside['link'] = nestedPatterns['link'];
255 phraseTableInside['image'] = nestedPatterns['image'];
256 phraseTableInside['footnote'] = nestedPatterns['footnote'];
257 phraseTableInside['acronym'] = nestedPatterns['acronym'];
258 phraseTableInside['mark'] = nestedPatterns['mark'];
259
260}(Prism));