@@ -1,283 +1,997 @@
3# http://www.sublimetext.com/docs/3/syntax.html
3# http://www.sublimetext.com/docs/3/syntax.html
4−name: AsciiDoc
4+name: AsciiDoc (Asciidoctor)
6− A very early hack. Mostly ripped from other syntaxes.
7− Only the very basic stuff is working.
8file_extensions:
5file_extensions:
10 - asciidoc
8 - asciidoc
12−scope: text.html.asciidoc
9+scope: text.asciidoc
15− - include: heading_inline
12+ - include: lists
16− - include: heading-block
13+ - include: blocks
17− - include: heading-blockattr
14+ - include: section_titles
17+ - include: characters
18− - match: \$\$(?!\$)
19+ - match: |-
21+ ^(:) # opening delimiter
22+ (!)? # bang symbol (unset attribute)
23+ ([A-Za-z0-9_][A-Za-z0-9_-]*) # attribute name
24+ (!)? # bang symbol (unset attribute)
25+ (:) # closing delimiter
35+ 1: punctuation.definition.attributeentry.attrname.begin.asciidoc
36+ 2: punctuation.definition.attributeentry.unset.asciidoc
37+ 3: support.variable.attribute.asciidoc
38+ 4: punctuation.definition.attributeentry.unset.asciidoc
39+ 5: punctuation.definition.attributeentry.attrname.end.asciidoc
20− - meta_scope: comment.block.passthrough.macro.doubledollar.asciidoc
41+ - meta_scope: meta.attributeentry.asciidoc
42+ - meta_content_scope: meta.attributeentry.value.asciidoc
21− - match: \$\$(?!\$)
43+ - match: $\n?
45+ - include: characters
47+ - match: '^(\[)[^\[\]]*(\])\s*$\n?'
48+ comment: "Attribute list as paragraph: single brackets. No need for special treatment of escape; follows literal block, section template as being a more general regex."
49+ scope: support.variable.attributelist.asciidoc
51+ 1: punctuation.definition.attributelistline.begin.asciidoc
52+ 2: punctuation.definition.attributelistline.end.asciidoc
23− - match: \+\+\+(?!\+)
54+ - match: "({)([A-Za-z0-9_][A-Za-z0-9_-]*)(})"
58+ scope: variable.other
60+ 1: constant.character.attributes.reference.begin.asciidoc
61+ 2: support.variable.attribute.asciidoc
62+ 3: constant.character.attributes.reference.end.asciidoc
64+ - match: '(?<!\[)(\[\[\[).*?(\]\]\])(?!\])'
70+ scope: storage.type.reference.biblioanchor.asciidoc
72+ 1: punctuation.definition.biblioanchor.begin.asciidoc
73+ 2: punctuation.definition.biblioanchor.end.asciidoc
74+ block_admonition_label:
75+ - match: ^(NOTE|TIP|IMPORTANT|WARNING|CAUTION):(?=\s+)
77+ Label of an admonition block.
80+ NOTE: This is a admonition block.
81+ WARNING: Be aware of them!
82+ scope: support.constant.admonitionword.asciidoc
84+ - match: '^(/{4,})\s*$\n?'
88+ A multi-line comment.
89+ Notice it's a delimited block.
92+ 0: punctuation.definition.comment.begin.asciidoc
25− - meta_scope: comment.block.passthrough.macro.tripeplus.asciidoc
94+ - meta_scope: comment.block.asciidoc
95+ - meta_content_scope: meta.block.comment.content.asciidoc
26− - match: \+\+\+(?!\+)
96+ - match: ^\1\s*$\n?
98+ 0: punctuation.definition.comment.end.asciidoc
28− - match: (//).*$\n?
102+ - match: '^(={4,})\s*$\n?'
29− scope: comment.line.double-slash.asciidoc
103+ comment: |
30− - match: |-
104+ Examples:
32− (?= ([/+-.*_=]{4,})\s*$
106+ Lorem ipsum.
33− | ([ \t]{1,})
107+ ====
35− | [ ]{,3}(?<marker>[-*_])([ ]{,2}\k<marker>){2,}[ \t]*+$
109+ Note: Might need to add more includes, but these are the ones that arise in
36− )
110+ practice for me.
112+ 0: constant.delimiter.example.begin.asciidoc
114+ - meta_scope: string.unquoted.block.example.asciidoc
38− - meta_scope: meta.block-level.asciidoc
115+ - meta_content_scope: meta.block.example.content.asciidoc
39− - match: |-
116+ - match: ^\1\s*$\n?
41− (?! \1
118+ 0: constant.delimiter.example.end.asciidoc
44− | [ ]{,3}(?<marker>[-*_])([ ]{,2}\k<marker>){2,}[ \t]*+$
46 pop: true
119 pop: true
47− - include: block_quote
120+ - include: lists
48− - include: block_raw
121+ - include: block_listing
49− - include: heading_inline
122+ - include: lines
50− - include: heading-block
123+ - include: inline
51− - include: separator
124+ - include: characters
126+ - match: '^(\[\[)([^\[].*)(\]\])\s*$\n?'
128+ A block id (i.e. anchor).
133+ scope: meta.tag.blockid.asciidoc
135+ 1: punctuation.definition.blockid.begin.asciidoc
136+ 2: markup.underline.blockid.id.asciidoc
137+ 3: punctuation.definition.blockid.end.asciidoc
52− - match: '^[ ]{0,3}([*+-])(?=\s)'
139+ - match: '^(\-{4,})\s*$\n?'
53− captures:
145+ captures:
54− 1: punctuation.definition.list_item.asciidoc
146+ 0: constant.delimiter.listing.begin.asciidoc
56− - meta_scope: markup.list.unnumbered.asciidoc
148+ - meta_scope: meta.embedded.block.listing.asciidoc
149+ - meta_content_scope: source.block.listing.content.asciidoc
57− - match: ^(?=\S)
150+ - match: ^\1\s*$\n?
58 captures:
151 captures:
59− 1: punctuation.definition.list_item.asciidoc
152+ 0: constant.delimiter.listing.end.asciidoc
60 pop: true
153 pop: true
61− - include: list-paragraph
154+ - include: inline_callout
62− - match: '^[ ]{0,3}[0-9]+(\.)(?=\s)'
156+ - match: '^(\.{4,})\s*$\n?'
63 captures:
162 captures:
64− 1: punctuation.definition.list_item.asciidoc
163+ 0: constant.delimiter.block.literal.begin.asciidoc
66− - meta_scope: markup.list.numbered.asciidoc
165+ - meta_scope: string.literal.block.delimited.asciidoc
166+ - meta_content_scope: meta.block.literal.content.asciidoc
67− - match: ^(?=\S)
167+ - match: ^\1\s*$\n?
68 captures:
168 captures:
69− 1: punctuation.definition.list_item.asciidoc
169+ 0: constant.delimiter.block.literal.end.asciidoc
70 pop: true
170 pop: true
71− - include: list-paragraph
171+ - include: inline_callout
72− - match: '^([/+-.*_=]){4,}\s*$'
173+ - match: ^\-\-\s*$\n?
179+ Note: Might need to check on these includes.
181+ 0: constant.delimiter.block.open.begin.asciidoc
74− - meta_scope: comment.block.asciidoc
183+ - meta_scope: meta.block.open.asciidoc
184+ - meta_content_scope: meta.block.open.content.asciidoc
75− - match: '^\1{4,}\s*$'
185+ - match: ^\-\-\s*$\n?
187+ 0: constant.delimiter.block.open.end.asciidoc
76 pop: true
188 pop: true
190+ - include: block_comment
191+ - include: block_listing
192+ - include: block_pass
195+ - include: characters
197+ - match: '^<{3,}$\n?'
204+ scope: meta.separator.pagebreak.asciidoc
77− - match: '^([/+.]){4,}\s*$'
206+ - match: '^(\+{4,})\s*$\n?'
78− comment: asciidoc formatting is disabled inside certain blocks.
207+ captures:
208+ 0: constant.delimiter.block.passthrough.begin.asciidoc
80− - meta_scope: meta.disable-asciidoc
210+ - meta_scope: meta.embedded.block.passthrough.asciidoc
211+ - meta_content_scope: text.xml.block.passthrough.content.asciidoc
81− - match: '^[/+.]{4,}\s*$'
212+ - match: ^\1\s*$\n?
214+ 0: constant.delimiter.block.passthrough.end.asciidoc
82 pop: true
215 pop: true
216+ - include: scope:text.xml
83− - match: '^(?=\S)(?![=-]{3,}(?=$))(?!\.\S+)'
218+ - match: '^(_{4,})\s*$\n?'
225+ Note: Might need to add more includes, but these are the ones that arise for me in practice.
227+ 0: constant.delimiter.block.quote.begin.asciidoc
85− - meta_scope: meta.paragraph.asciidoc
229+ - meta_scope: markup.quote.block.asciidoc
230+ - meta_content_scope: meta.block.quote.content.asciidoc
86− - match: '^(?:\s*$|(?=[ ]{,3}>.))|(?=[ \t]*\n)(?<=^===|^====|=====|^---|^----|-----)[ \t]*\n'
231+ - match: ^\1\s*$\n?
233+ 0: constant.delimiter.block.quote.end.asciidoc
87 pop: true
234 pop: true
88 - include: inline
236 - include: inline
89− - include: scope:text.html.basic
237+ - include: characters
90− - match: '^(={3,})(?=[ \t]*$)'
239+ - match: '^(\*{4,})\s*$\n?'
91− scope: markup.heading.0.asciidoc
240+ comment: |
92− captures:
241+ Examples:
93− 1: punctuation.definition.heading.asciidoc
242+ ****
94− - match: '^(-{3,})(?=[ \t]*$)'
243+ Lorem ipsum
95− scope: markup.heading.1.asciidoc
244+ ****
246+ Note: Might need to add more includes, but these are the ones that arise
249+ 0: constant.delimiter.block.sidebar.begin.asciidoc
251+ - meta_scope: string.quoted.block.sidebar.asciidoc
252+ - meta_content_scope: meta.block.sidebar.content.asciidoc
96 captures:
254 captures:
97− 1: punctuation.definition.heading.asciidoc
255+ 0: constant.delimiter.block.sidebar.end.asciidoc
98− - match: '^(~{3,})(?=[ \t]*$)'
256+ pop: true
99− scope: markup.heading.2.asciidoc
257+ - include: lists
258+ - include: block_comment
259+ - include: block_listing
262+ - include: characters
263+ block_source_fenced:
264+ - match: ^(```)(\w+)?\s*$\n?
266+ Fenced code block (ala Markdown)
273+ 0: constant.delimiter.listing.begin.asciidoc
275+ - meta_scope: meta.embedded.block.listing.asciidoc
276+ - meta_content_scope: source.block.listing.content.asciidoc
100 captures:
278 captures:
279+ 0: constant.delimiter.listing.end.asciidoc
281+ - include: inline_callout
282+ block_thematic_break:
283+ - match: '^''{3,}$\n?'
285+ A thematic break (aka horizontal rule).
290+ scope: meta.separator.ruler.asciidoc
292+ - match: ^(\.)\w.*$\n?
299+ scope: markup.heading.block.asciidoc
101− 1: punctuation.definition.heading.asciidoc
301+ 1: punctuation.definition.blockheading.asciidoc
303+ - include: block_literal
304+ - include: block_comment
305+ - include: block_listing
306+ - include: block_source_fenced
307+ - include: block_sidebar
308+ - include: block_pass
309+ - include: block_quote
310+ - include: block_example
311+ - include: block_open
313+ - include: attribute_reference
314+ - include: entity_number
315+ - include: entity_name
317+ - include: replacement
318+ - include: macro_pass
321+ - include: biblio_anchor
322+ - include: indexterm_triple
323+ - include: indexterm_double
102− - match: '^(\^{3,})(?=[ \t]*$)'
325+ - match: ^(\s*((<)\d+?(>)))\s+(?=\S)
327+ Marker of a callout list item.
331+ <42> another callout
332+ scope: markup.list.numbered.callout.asciidoc
334+ 1: string.unquoted.list.callout.asciidoc
335+ 2: constant.numeric.callout.asciidoc
336+ 3: punctuation.definition.calloutlistnumber.begin.asciidoc
337+ 4: punctuation.definition.calloutlistnumber.end.asciidoc
339+ - match: '^\s*(?=.*:{2,4}(?:\s|$))'
341+ Label of a definition (labeled) list item.
344+ Label level 1:: lorem ipsum
345+ Label level 2::: dolor sit amet
346+ Label level 3:::: consectetur
349+ Another label :: lorem ipsum
350+ Last::label:: dolor sit amet
352+ Note: This rule is not strictly correct, because Asciidoctor allows
353+ double colon followed by a space inside a label, i.e. it matches the
354+ *last* double colon, not the first. I don't know how to do that
103− scope: markup.heading.3.asciidoc
357+ - meta_scope: markup.list.labeled.asciidoc
358+ - meta_content_scope: meta.list.label.asciidoc
359+ - match: '(:{2,4})(?:\s|$\n?)'
104 captures:
360 captures:
105− 1: punctuation.definition.heading.asciidoc
361+ 1: constant.labeledlist.separator.asciidoc
364+ - include: characters
106− - match: '^(\+{3,})(?=[ \t]*$)'
366+ - match: |-
107− scope: markup.heading.4.asciidoc
367+ (?x)
368+ (\[[^\]]*?\])? # might be preceded by an attributes list
369+ (?<=^|\W)(?<!\\|}) # must be preceded by nonword character, and not by escape or } (attribute)
370+ (_)(?=\S) # delimiter underscore that must be followed by a nonspace character
372+ Emphasized (italic) text (constrained variant).
376+ [red]_Lorem ipsum_ dolor
378+ 1: support.variable.attributelist.asciidoc
379+ 2: punctuation.definition.italic.single.begin.asciidoc
381+ - meta_scope: markup.italic.single.asciidoc
382+ - meta_content_scope: meta.italicinner.single.asciidoc
385+ (?<=\S)(_) # delimiter underscore that must be preceded by a nonspace character
386+ (?!\w) # ...and followed by a nonword character
108 captures:
387 captures:
109− 1: punctuation.definition.heading.asciidoc
388+ 1: punctuation.definition.italic.single.end.asciidoc
110− attribute-entry:
389+ pop: true
111− - match: '^:[-_. A-Za-z0-9]+:\s*(.*)\s*$'
390+ - include: strong_double
112− scope: variable.other
391+ - include: monospaced_double
113− attribute-reference:
392+ - include: mark_double
114− - match: "{[-_. A-Za-z0-9]+}"
393+ - include: strong
115− scope: variable.other
394+ - include: monospaced
116− attribute-reference-predefined:
395+ - include: mark
117− - match: "{(?i:amp|asciidoc-dir|asciidoc-file|asciidoc-version|author|authored|authorinitials|backend-docbook|backend-xhtml11|backend-html4|docbook-article|xhtml11-article|html4-article|docbook-book|xhtml11-book|html4-book|docbook-manpage|xhtml11-manpage|html4-manpage|backend|backslash|basebackend|brvbar|date|docdate|doctime|docname|docfile|docdir|doctitle|doctype-article|doctype-book|doctype-manpage|doctype|email|empty|encoding|filetype|firstname|gt|id|indir|infile|lastname|level|listindex|localdate|localtime|lt|manname|manpurpose|mantitle|manvolnum|middlename|nbsp|outdir|outfile|reftext|revision|sectnum|showcomments|title|two_colons|two_semicolons|user-dir|verbose)}"
396+ - include: superscript
397+ - include: subscript
398+ - include: characters
402+ (\[[^\]]*?\])? # might start with attribute list
403+ (?<!\\) # must not be preceded by escape
406+ Emphasized (italic) text (unconstrained variant).
409+ Lo__re__m __ipsum dolor__.
118− scope: support.variable
412+ 1: support.variable.attributelist.asciidoc
119− block_quote:
413+ 2: punctuation.definition.italic.double.begin.asciidoc
120− - match: '^([/+-.*_=]){4,}\s*$'
122− - meta_scope: comment.block.asciidoc
415+ - meta_scope: markup.italic.double.asciidoc
416+ - meta_content_scope: meta.italicinner.double.asciidoc
123− - match: '^\1{4,}\s*$'
417+ - match: __
419+ 0: punctuation.definition.italic.double.end.asciidoc
124 pop: true
420 pop: true
125− block_raw:
421+ - include: strong_double
422+ - include: monospaced_double
423+ - include: mark_double
425+ - include: monospaced
427+ - include: superscript
428+ - include: subscript
429+ - include: characters
126− - match: '\G([ ]{4}|\t).*$\n?'
431+ - match: '(?<!\\)&([a-zA-Z][a-zA-Z0-9]*);'
127− scope: markup.raw.block.asciidoc
432+ comment: |
128− bracket:
433+ Character entity reference
129− - match: '<(?![a-z/?\$!])'
434+
438+ scope: constant.character.entity.xml.asciidoc
440+ - match: '(?<!\\)&#(x?[0-9a-fA-f]{2,4});'
130− comment: |
441+ comment: |
131− asciidoc will convert this for us. We match it so that the
442+ Numeric character reference
132− HTML grammar will not mark it up as invalid.
443+
133− scope: meta.other.valid-bracket.asciidoc
444+ Examples:
134− character-replacements:
445+ ➊
135− - match: \(C\)|\(R\)|\(TM\)|--(?!-)|\.\.\.(?!\.)|->|<-|=>|<=
446+ ¶
136− scope: constant.character.asciidoc
447+ scope: constant.character.entity.asciidoc
138− - match: '\\[-`*_#+.!(){}\[\]\\>:]'
449+ - match: '\\(?=[-`*_#+.!(){}\[\]\\>:])'
451+ List of special characters that may be escaped.
453+ Note: I do not really know if this is a good list, adopted wholesale from
139 scope: constant.character.escape.asciidoc
455 scope: constant.character.escape.asciidoc
140− heading:
456+ indexterm_double:
141− - match: '(?m)^(\S+)$([=-~^+])+\s*$'
457+ - match: '(?<!\()(\({2})([^\(\s].*?)(\){2})(?!\))'
142− scope: markup.heading.asciidoc
458+ comment: |
459+ Double parenthesis indexterm.
463+ scope: variable.other.indexterm.double.asciidoc
143 captures:
464 captures:
144− 1: punctuation.definition.heading.asciidoc
465+ 1: constant.character.indexterm.double.begin.asciidoc
145− heading-block:
466+ 3: constant.character.indexterm.double.end.asciidoc
146− - match: ^\.(\w.*)$
468+ - match: '(?<!\()(\({3})([^\(].*?)(\){3})(?!\))'
147− scope: markup.heading.asciidoc
469+ comment: |
470+ Triple parenthesis indexterm.
473+ (((Sword, Broadsword, Excalibur)))
474+ scope: variable.other.indexterm.triple.asciidoc
148 captures:
475 captures:
149− 1: punctuation.definition.heading.asciidoc
476+ 1: constant.character.indexterm.triple.begin.asciidoc
150− heading-blockattr:
477+ 3: constant.character.indexterm.triple.end.asciidoc
479+ - include: passthrough
480+ - include: strong_double
481+ - include: emphasis_double
482+ - include: monospaced_double
483+ - include: mark_double
486+ - include: monospaced
488+ - include: superscript
489+ - include: subscript
151− - match: '^\[\[?(\w.*)\]$'
491+ - match: (?<=\s)\+$\n?
493+ Line hard break with a plus sign (+).
498+ scope: constant.linebreak.asciidoc
500+ - match: (?<!\\)(<)\d+(>)
152− scope: markup.heading.asciidoc
507+ scope: constant.other.callout.asciidoc
153 captures:
508 captures:
154− 1: punctuation.definition.heading.asciidoc
509+ 1: punctuation.definition.callout.begin.asciidoc
155− heading_inline:
510+ 2: punctuation.definition.callout.end.asciidoc
156− - match: '\G(={1,6})(?!=)\s*(?=\S)'
512+ - match: '^(//)([^/\n].*|)$\n?'
517+ // This is just a comment!
518+ scope: comment.line.double-slash.asciidoc
157 captures:
519 captures:
158− 1: punctuation.definition.heading.asciidoc
520+ 1: punctuation.definition.comment.line.asciidoc
521+ 2: meta.line.comment.content.asciidoc
523+ - include: inline_comment
524+ - include: list_continuation
525+ - include: inline_break
526+ - include: block_page_break
527+ - include: block_thematic_break
528+ - include: block_title
530+ - include: section_template
531+ - include: attribute_list_line
532+ - include: attribute_entry
535+ scope: constant.listcontinuation.asciidoc
537+ - include: block_admonition_label
538+ - include: ulist_item_marker
539+ - include: olist_item_marker
540+ - include: dlist_item_label
541+ - include: colist_item_marker
546+ ((?:https?|mailto|ftp|file) # specify separately so we can mark them as links that TextMate opens
548+ \S*) # (others such as image are partial URLs and/or TextMate cannot handle them)
550+ (([a-zA-Z0-9][a-zA-Z0-9_]*)
554+ (?:(\[)([^\]]*)(\]))
556+ Note: There are other macro notations, but I match only those that end in
558+ scope: meta.macro.asciidoc
560+ 1: markup.underline.link.macro.asciidoc
561+ 3: keyword.control.name.macro.asciidoc
562+ 4: constant.character.separator.macro.asciidoc
563+ 5: markup.underline.target.macro.asciidoc
564+ 6: constant.character.attributes.macro.begin.asciidoc
565+ 7: variable.parameter.attributes.macro.asciidoc
566+ 8: constant.character.attributes.macro.end.asciidoc
581+ 1: keyword.control.name.macro.pass.asciidoc
582+ 2: constant.character.separator.macro.asciidoc
583+ 3: markup.underline.target.macro.asciidoc
584+ 4: constant.character.attributes.macro.begin.asciidoc
160− - meta_scope: markup.heading.asciidoc
586+ - meta_scope: meta.macro.pass.asciidoc
161− - meta_content_scope: entity.name.section.asciidoc
587+ - meta_content_scope: variable.parameter.attributes.macro.pass.asciidoc
162− - match: \s*(=*)$\n?
588+ - match: '\]'
163 captures:
589 captures:
164− 1: punctuation.definition.heading.asciidoc
590+ 0: constant.character.attributes.macro.end.asciidoc
165 pop: true
591 pop: true
166− - include: inline
592+ - include: scope:text.xml
168− - include: line-break
169− - include: line-page-break
170− - include: line-ruler
172− - include: passthrough-macro-trippleplus-inline
173− - include: passthrough-macro-doubledollar-inline
174− - include: character-replacements
177− - include: text-quote-single
178− - include: text-quote-double
179− - include: text-quote-other
180− - include: text-bold-unconstrained
181− - include: text-italic-unconstrained
182− - include: text-monospace-unconstrained
183− - include: text-unquoted-unconstrained
184− - include: text-bold
185− - include: text-italic
186− - include: text-monospace
187− - include: text-unquoted
188− - include: attribute-entry
189− - include: attribute-reference-predefined
190− - include: attribute-reference
192− - match: (?<=\S)\s+\+$
193− scope: constant.character.escape.asciidoc
195− - match: "^<{3,}$"
594+ - match: |-
196− scope: constant.character.escape.asciidoc
595+ (?x)
197− line-ruler:
596+ (\[[^\]]*?\])? # might start with attribute list (darned well better or why are we here)
198− - match: "^'{3,}$"
597+ (?<=^|\W)(?<!\\|}) # must be preceded by nonword character, and not by escape or } (attribute)
199− scope: constant.character.escape.asciidoc
598+ (\#)(?=\S) # delimiter hash that must be followed by a nonspace character
200− list-paragraph:
599+ comment: |
201− - match: \G\s+(?=\S)
600+ Marked text (constrained variant).
604+ [red]#Lorem ipsum# dolor
606+ 1: support.variable.attributelist.asciidoc
607+ 2: punctuation.definition.string.unquoted.single.begin.asciidoc
203− - meta_scope: meta.paragraph.list.asciidoc
609+ - meta_scope: string.other.unquoted.single.asciidoc
610+ - meta_content_scope: string.unquoted.unquotedinner.single.asciidoc
204− - match: ^\s*$
611+ - match: |-
613+ (?<=\S)(\#) # delimiter hash that must be preceded by a nonspace character
614+ (?!\w) # ...and followed by a nonword character
616+ 1: punctuation.definition.string.unquoted.single.end.asciidoc
205 pop: true
617 pop: true
206− - include: inline
618+ - include: strong_double
207− passthrough-macro-doubledollar-inline:
619+ - include: emphasis_double
620+ - include: monospaced_double
623+ - include: monospaced
624+ - include: superscript
625+ - include: subscript
626+ - include: characters
208− - match: '(?:\[.*\])?\$\$(?!\$).+\$\$(?!\$)'
628+ - match: |-
209− scope: comment.block.passthrough.asciidoc
629+ (?x)
210− passthrough-macro-trippleplus-inline:
630+ (\[[^\]]*?\])? # might start with an attribute list (indeed, that is its purpose)
631+ (?<!\\) # must not be preceded by escape
634+ Marked text (unconstrained variant).
637+ Lo##re##m ##ipsum dolor##.
640+ 1: support.variable.attributelist.asciidoc
641+ 2: punctuation.definition.string.unquoted.double.begin.asciidoc
643+ - meta_scope: string.other.unquoted.double.asciidoc
644+ - meta_content_scope: string.unquoted.unquotedinner.double.asciidoc
647+ 0: punctuation.definition.string.unquoted.double.end.asciidoc
649+ - include: strong_double
650+ - include: emphasis_double
651+ - include: monospaced_double
654+ - include: monospaced
655+ - include: superscript
656+ - include: subscript
657+ - include: characters
211− - match: '(?:\[.*\])?\+\+\+(?!\+).+\+\+\+(?!\+)'
659+ - match: |-
212− scope: comment.block.passthrough.asciidoc
660+ (?x)
213− raw:
661+ (\[[^\]]*?\])? # might start with attributes list
214− - match: '(`+)(?:[^`]|(?!(?<!`)\1(?!`))`)*+(\1)'
662+ (?<=^|\W)(?<!\\|}) # must be preceded by nonword character, and not by escape or } (attribute)
215− scope: markup.raw.inline.asciidoc
663+ (`)(?=\S) # delimiter backtick that must be followed by a nonspace character
665+ Monospaced text (constrained variant).
669+ [red]`Lorem ipsum` dolor
216− captures:
670+ captures:
217− 1: punctuation.definition.raw.asciidoc
671+ 1: support.variable.attributelist.asciidoc
218− 2: punctuation.definition.raw.asciidoc
672+ 2: punctuation.definition.literal.single.begin.asciidoc
219− separator:
673+ push:
220− - match: '\G[ ]{,3}([-*_])([ ]{,2}\1){2,}[ \t]*$\n?'
674+ - meta_scope: string.other.literal.single.asciidoc
221− scope: meta.separator.asciidoc
675+ - meta_content_scope: meta.literalinner.single.asciidoc
222− text-bold:
676+ - match: |-
223− - match: (?<!\w)(\*)(?=\S)
677+ (?x)
678+ (?<=\S)(`) # delimiter backtick that must be preceded by a nonspace character
679+ (?!\w) # ...and followed by a nonword character
681+ 1: punctuation.definition.literal.single.end.asciidoc
683+ - include: strong_double
684+ - include: emphasis_double
685+ - include: mark_double
689+ - include: superscript
690+ - include: subscript
691+ - include: characters
695+ (\[[^\]]*?\])? # might start with attribute list
696+ (?<!\\) # must not be preceded by escape
699+ Monospaced text (unconstrained variant).
702+ Lo``re``m ``ipsum dolor``.
705+ 1: support.variable.attributelist.asciidoc
706+ 2: punctuation.definition.literal.double.begin.asciidoc
708+ - meta_scope: string.other.literal.double.asciidoc
709+ - meta_content_scope: meta.literalinner.double.asciidoc
712+ 0: punctuation.definition.literal.double.end.asciidoc
714+ - include: strong_double
715+ - include: emphasis_double
716+ - include: mark_double
720+ - include: superscript
721+ - include: subscript
722+ - include: characters
724+ - match: '^(\s*(\.{1,5}))\s+(?=\S)'
726+ Marker of an ordered (numbered) list item.
735+ Note: The space distinguishes it from a block title.
736+ scope: markup.list.numbered.dotted.asciidoc
224− captures:
737+ captures:
225− 1: punctuation.definition.bold.asciidoc
738+ 1: string.unquoted.list.dotted.asciidoc
739+ 2: constant.numeric.list.dot.asciidoc
741+ - match: (\+\+\+|\$\$)
743+ Inline triple-plus and double dolar passthrough.
746+ Lo+++re++++m +++ipsum dolor+++.
747+ Lo$$re$$m $$ipsum dolor$$.
749+ Note: Must be dead first among the inlines, so as to take priority.
751+ 1: constant.character.passthru.begin.asciidoc
227− - meta_scope: markup.bold.asciidoc
753+ - meta_scope: meta.passthru.inline.asciidoc
754+ - meta_content_scope: variable.parameter.passthruinner.asciidoc
228− - match: (?<=\S)(\1)(?!\w)
755+ - match: \1
229 captures:
756 captures:
230− 1: punctuation.definition.bold.asciidoc
757+ 0: constant.character.passthru.end.asciidoc
231 pop: true
758 pop: true
232− text-bold-unconstrained:
759+ replacement:
762+ (?<!\\) # must not be escaped
767+ | ((?<!\-)\-\-(?!\-)) # exactly two, and even this may not rule out all that I want to
768+ | ((?<!\.)\.\.\.(?!\.)) # exactly three
774+ scope: constant.character.replacement.asciidoc
233− - match: (\*\*)(?=\S)
776+ - match: |-
778+ (\[) # in square brackets
779+ (template\s*=\s*)?(")? # might start with template-equals and might have template name in quotes
781+ sect\d|abstract|preface|colophon|dedication|glossary|bibliography|synopsis|appendix|index # fixed list of known templates
783+ (".*(\])|(\])) # either close the quote (and perhaps go on) and close the bracket, or close the bracket immediately
785+ comment: fixed list of known template names
786+ scope: variable.parameter.sectiontemplate.asciidoc
234 captures:
787 captures:
235− 1: punctuation.definition.bold.asciidoc
788+ 1: punctuation.definition.sectiontemplate.begin.asciidoc
789+ 4: meta.tag.sectiontemplate.asciidoc
790+ 6: punctuation.definition.sectiontemplate.end.asciidoc
791+ 7: punctuation.definition.sectiontemplate.end.asciidoc
793+ - include: title_level_5
794+ - include: title_level_4
795+ - include: title_level_3
796+ - include: title_level_2
797+ - include: title_level_1
798+ - include: title_level_0
802+ (\[[^\]]*?\])? # might start with an attributes list
803+ (?<=^|\W)(?<!\\|}) # must be preceded by nonword character, and not by escape or } (attribute)
804+ (\*)(?=\S) # delimiter star that must be followed by a nonspace character
806+ Strong (bold) text (constrained variant).
810+ [red]*Lorem ipsum* dolor
812+ 1: support.variable.attributelist.asciidoc
813+ 2: punctuation.definition.bold.single.begin.asciidoc
237− - meta_scope: markup.bold.asciidoc
815+ - meta_scope: markup.bold.single.asciidoc
816+ - meta_content_scope: meta.boldinner.single.asciidoc
238− - match: (?<=\S)(\1)
817+ - match: |-
819+ (?<=\S)(\*) # delimiter star that must be preceded by a nonspace character
820+ (?!\w) # ...and followed by a nonword character
239 captures:
821 captures:
240− 1: punctuation.definition.bold.asciidoc
822+ 1: punctuation.definition.bold.single.end.asciidoc
241 pop: true
823 pop: true
242− text-italic:
824+ - include: emphasis_double
825+ - include: monospaced_double
826+ - include: mark_double
828+ - include: monospaced
830+ - include: superscript
831+ - include: subscript
832+ - include: characters
243− - match: (?<!\w)('|_)(?=\S)
834+ - match: |-
836+ (\[[^\]]*?\])? # might start with an attribute list
837+ (?<!\\) # must not be preceded by escape
840+ Strong (bold) text (unconstrained variant).
843+ Lo**re**m **ipsum dolor**.
244 captures:
845 captures:
846+ 1: support.variable.attributelist.asciidoc
245− 1: punctuation.definition.italic.asciidoc
847+ 2: punctuation.definition.bold.double.begin.asciidoc
247− - meta_scope: markup.italic.asciidoc
849+ - meta_scope: markup.bold.double.asciidoc
850+ - meta_content_scope: meta.boldinner.double.asciidoc
248− - match: (?<=\S)(\1)((?!\1)|(?=\1\1))(?!\w)
851+ - match: \*\*
249 captures:
852 captures:
250− 1: punctuation.definition.italic.asciidoc
853+ 0: punctuation.definition.bold.double.end.asciidoc
251 pop: true
854 pop: true
252− text-italic-unconstrained:
855+ - include: emphasis_double
856+ - include: monospaced_double
857+ - include: mark_double
859+ - include: monospaced
861+ - include: superscript
862+ - include: subscript
863+ - include: characters
253− - match: (__)(?=\S)
865+ - match: |-
867+ (\[[^\]]*?\])? # might start with attribute list
868+ (?<!\\) # must not be preceded by escape
254 captures:
876 captures:
877+ 1: support.variable.attributelist.asciidoc
255− 1: punctuation.definition.italic.asciidoc
878+ 2: punctuation.definition.string.subscript.begin.asciidoc
257− - meta_scope: markup.italic.asciidoc
880+ - meta_scope: string.other.subscript.asciidoc
258− - match: (?<=\S)(\1)
881+ - meta_content_scope: meta.subscriptinner.asciidoc
882+ - match: '~' # this tilda a problem if unquoted
259 captures:
883 captures:
260− 1: punctuation.definition.italic.asciidoc
884+ 0: punctuation.definition.string.subscript.end.asciidoc
261 pop: true
885 pop: true
262− text-monospace:
886+ - include: strong_double
263− - match: '(?<!\w)([\+`])[^\+]*(\1)(?!\w)'
887+ - include: emphasis_double
264− scope: string.interpolated.asciidoc
888+ - include: monospaced_double
265− text-monospace-unconstrained:
889+ - include: mark_double
266− - match: (\+\+).*(\1)
890+ - include: strong
267− scope: string.interpolated.asciidoc
891+ - include: emphasis
268− text-quote-double:
892+ - include: monospaced
894+ - include: superscript
895+ - include: characters
269− - match: '(?<!\w)(?:\[.*\])?``(?!`).*''''(?!'')(?!\w)'
897+ - match: |-
270− scope: string.quoted.double.asciidoc
898+ (?x)
271− text-quote-other:
899+ (\[[^\]]*?\])? # might start with attribute list
272− - match: '(?<!\w)(?:\[.*\])?([~^]).*(\1)(?!\w)'
900+ (?<!\\) # no preceding escape
273− scope: string.quoted.single.asciidoc
901+ (\^)
274− text-quote-single:
902+ comment: |
909+ 1: support.variable.attributelist.asciidoc
910+ 2: punctuation.definition.string.superscript.begin.asciidoc
912+ - meta_scope: string.other.superscript.asciidoc
913+ - meta_content_scope: meta.superscriptinner.asciidoc
916+ 0: punctuation.definition.string.superscript.end.asciidoc
918+ - include: strong_double
919+ - include: emphasis_double
920+ - include: monospaced_double
921+ - include: mark_double
924+ - include: monospaced
926+ - include: subscript
927+ - include: characters
929+ - match: ^(=) (\w.*)$\n?
930+ scope: markup.heading.level.0.asciidoc
932+ 1: punctuation.definition.heading.asciidoc
933+ 2: entity.name.section.asciidoc
935+ - match: ^(==) (\w.*)$\n?
936+ scope: markup.heading.level.1.asciidoc
938+ 1: punctuation.definition.heading.asciidoc
939+ 2: entity.name.section.asciidoc
941+ - match: ^(===) (\w.*)$\n?
942+ scope: markup.heading.level.2.asciidoc
944+ 1: punctuation.definition.heading.asciidoc
945+ 2: entity.name.section.asciidoc
947+ - match: ^(====) (\w.*)$\n?
948+ scope: markup.heading.level.3.asciidoc
950+ 1: punctuation.definition.heading.asciidoc
951+ 2: entity.name.section.asciidoc
953+ - match: ^(=====) (\w.*)$\n?
954+ scope: markup.heading.level.4.asciidoc
956+ 1: punctuation.definition.heading.asciidoc
957+ 2: entity.name.section.asciidoc
959+ - match: ^(======) (\w.*)$\n?
960+ scope: markup.heading.level.5.asciidoc
962+ 1: punctuation.definition.heading.asciidoc
963+ 2: entity.name.section.asciidoc
965+ - match: '^(\s*(\-|\*{1,5}))\s+(?=\S)'
967+ Marker of an unordered (bullet) list item.
980+ scope: markup.list.bulleted.asciidoc
982+ 1: string.unquoted.list.bullet.asciidoc
983+ 2: constant.numeric.list.bullet.asciidoc
275− - match: '(?<!\w)(?:\[.*\])?`(?!`).*''(?!'')(?!\w)'
985+ - match: '(?<!<)(<<)([^,]*?)((,\s*)(.*?))?(>>)(?!<)'
276− comment: "TODO: Sub- and Superscript are really unconstrained"
986+ comment: |
987+ Internal cross-reference
277− scope: string.quoted.single.asciidoc
992+ scope: meta.xref.asciidoc
278− text-unquoted:
993+ captures:
279− - match: (?<!\w)(#).*(\1)(?!\w)
994+ 1: constant.character.xref.begin.asciidoc
280− scope: string.unquoted.asciidoc
995+ 2: markup.underline.term.xref.asciidoc
281− text-unquoted-unconstrained:
996+ 5: variable.parameter.xref.asciidoc
282− - match: (##).*(\1)
997+ 6: constant.character.xref.end.asciidoc
283− scope: string.unquoted.asciidoc