123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234 |
- (function (Prism) {
- var attributes = {
- pattern: /(^[ \t]*)\[(?!\[)(?:(["'$`])(?:(?!\2)[^\\]|\\.)*\2|\[(?:[^\[\]\\]|\\.)*\]|[^\[\]\\"'$`]|\\.)*\]/m,
- lookbehind: true,
- inside: {
- 'quoted': {
- pattern: /([$`])(?:(?!\1)[^\\]|\\.)*\1/,
- inside: {
- 'punctuation': /^[$`]|[$`]$/
- }
- },
- 'interpreted': {
- pattern: /'(?:[^'\\]|\\.)*'/,
- inside: {
- 'punctuation': /^'|'$/
- // See rest below
- }
- },
- 'string': /"(?:[^"\\]|\\.)*"/,
- 'variable': /\w+(?==)/,
- 'punctuation': /^\[|\]$|,/,
- 'operator': /=/,
- // The negative look-ahead prevents blank matches
- 'attr-value': /(?!^\s+$).+/
- }
- };
- var asciidoc = Prism.languages.asciidoc = {
- 'comment-block': {
- pattern: /^(\/{4,})$[\s\S]*?^\1/m,
- alias: 'comment'
- },
- 'table': {
- pattern: /^\|={3,}(?:(?:\r?\n|\r(?!\n)).*)*?(?:\r?\n|\r)\|={3,}$/m,
- inside: {
- 'specifiers': {
- pattern: /(?:(?:(?:\d+(?:\.\d+)?|\.\d+)[+*](?:[<^>](?:\.[<^>])?|\.[<^>])?|[<^>](?:\.[<^>])?|\.[<^>])[a-z]*|[a-z]+)(?=\|)/,
- alias: 'attr-value'
- },
- 'punctuation': {
- pattern: /(^|[^\\])[|!]=*/,
- lookbehind: true
- }
- // See rest below
- }
- },
- 'passthrough-block': {
- pattern: /^(\+{4,})$[\s\S]*?^\1$/m,
- inside: {
- 'punctuation': /^\++|\++$/
- // See rest below
- }
- },
- // Literal blocks and listing blocks
- 'literal-block': {
- pattern: /^(-{4,}|\.{4,})$[\s\S]*?^\1$/m,
- inside: {
- 'punctuation': /^(?:-+|\.+)|(?:-+|\.+)$/
- // See rest below
- }
- },
- // Sidebar blocks, quote blocks, example blocks and open blocks
- 'other-block': {
- pattern: /^(--|\*{4,}|_{4,}|={4,})$[\s\S]*?^\1$/m,
- inside: {
- 'punctuation': /^(?:-+|\*+|_+|=+)|(?:-+|\*+|_+|=+)$/
- // See rest below
- }
- },
- // list-punctuation and list-label must appear before indented-block
- 'list-punctuation': {
- pattern: /(^[ \t]*)(?:-|\*{1,5}|\.{1,5}|(?:[a-z]|\d+)\.|[xvi]+\))(?= )/im,
- lookbehind: true,
- alias: 'punctuation'
- },
- 'list-label': {
- pattern: /(^[ \t]*)[a-z\d].+(?::{2,4}|;;)(?=\s)/im,
- lookbehind: true,
- alias: 'symbol'
- },
- 'indented-block': {
- pattern: /((\r?\n|\r)\2)([ \t]+)\S.*(?:(?:\r?\n|\r)\3.+)*(?=\2{2}|$)/,
- lookbehind: true
- },
- 'comment': /^\/\/.*/m,
- 'title': {
- pattern: /^.+(?:\r?\n|\r)(?:={3,}|-{3,}|~{3,}|\^{3,}|\+{3,})$|^={1,5} .+|^\.(?![\s.]).*/m,
- alias: 'important',
- inside: {
- 'punctuation': /^(?:\.|=+)|(?:=+|-+|~+|\^+|\++)$/
- // See rest below
- }
- },
- 'attribute-entry': {
- pattern: /^:[^:\r\n]+:(?: .*?(?: \+(?:\r?\n|\r).*?)*)?$/m,
- alias: 'tag'
- },
- 'attributes': attributes,
- 'hr': {
- pattern: /^'{3,}$/m,
- alias: 'punctuation'
- },
- 'page-break': {
- pattern: /^<{3,}$/m,
- alias: 'punctuation'
- },
- 'admonition': {
- pattern: /^(?:CAUTION|IMPORTANT|NOTE|TIP|WARNING):/m,
- alias: 'keyword'
- },
- 'callout': [
- {
- pattern: /(^[ \t]*)<?\d*>/m,
- lookbehind: true,
- alias: 'symbol'
- },
- {
- pattern: /<\d+>/,
- alias: 'symbol'
- }
- ],
- 'macro': {
- pattern: /\b[a-z\d][a-z\d-]*::?(?:[^\s\[\]]*\[(?:[^\]\\"']|(["'])(?:(?!\1)[^\\]|\\.)*\1|\\.)*\])/,
- inside: {
- 'function': /^[a-z\d-]+(?=:)/,
- 'punctuation': /^::?/,
- 'attributes': {
- pattern: /(?:\[(?:[^\]\\"']|(["'])(?:(?!\1)[^\\]|\\.)*\1|\\.)*\])/,
- inside: attributes.inside
- }
- }
- },
- 'inline': {
- /*
- The initial look-behind prevents the highlighting of escaped quoted text.
- Quoted text can be multi-line but cannot span an empty line.
- All quoted text can have attributes before [foobar, 'foobar', baz="bar"].
- First, we handle the constrained quotes.
- Those must be bounded by non-word chars and cannot have spaces between the delimiter and the first char.
- They are, in order: _emphasis_, ``double quotes'', `single quotes', `monospace`, 'emphasis', *strong*, +monospace+ and #unquoted#
- Then we handle the unconstrained quotes.
- Those do not have the restrictions of the constrained quotes.
- They are, in order: __emphasis__, **strong**, ++monospace++, +++passthrough+++, ##unquoted##, $$passthrough$$, ~subscript~, ^superscript^, {attribute-reference}, [[anchor]], [[[bibliography anchor]]], <<xref>>, (((indexes))) and ((indexes))
- */
- pattern: /(^|[^\\])(?:(?:\B\[(?:[^\]\\"']|(["'])(?:(?!\2)[^\\]|\\.)*\2|\\.)*\])?(?:\b_(?!\s)(?: _|[^_\\\r\n]|\\.)+(?:(?:\r?\n|\r)(?: _|[^_\\\r\n]|\\.)+)*_\b|\B``(?!\s).+?(?:(?:\r?\n|\r).+?)*''\B|\B`(?!\s)(?:[^`'\s]|\s+\S)+['`]\B|\B(['*+#])(?!\s)(?: \3|(?!\3)[^\\\r\n]|\\.)+(?:(?:\r?\n|\r)(?: \3|(?!\3)[^\\\r\n]|\\.)+)*\3\B)|(?:\[(?:[^\]\\"']|(["'])(?:(?!\4)[^\\]|\\.)*\4|\\.)*\])?(?:(__|\*\*|\+\+\+?|##|\$\$|[~^]).+?(?:(?:\r?\n|\r).+?)*\5|\{[^}\r\n]+\}|\[\[\[?.+?(?:(?:\r?\n|\r).+?)*\]?\]\]|<<.+?(?:(?:\r?\n|\r).+?)*>>|\(\(\(?.+?(?:(?:\r?\n|\r).+?)*\)?\)\)))/m,
- lookbehind: true,
- inside: {
- 'attributes': attributes,
- 'url': {
- pattern: /^(?:\[\[\[?.+?\]?\]\]|<<.+?>>)$/,
- inside: {
- 'punctuation': /^(?:\[\[\[?|<<)|(?:\]\]\]?|>>)$/
- }
- },
- 'attribute-ref': {
- pattern: /^\{.+\}$/,
- inside: {
- 'variable': {
- pattern: /(^\{)[a-z\d,+_-]+/,
- lookbehind: true
- },
- 'operator': /^[=?!#%@$]|!(?=[:}])/,
- 'punctuation': /^\{|\}$|::?/
- }
- },
- 'italic': {
- pattern: /^(['_])[\s\S]+\1$/,
- inside: {
- 'punctuation': /^(?:''?|__?)|(?:''?|__?)$/
- }
- },
- 'bold': {
- pattern: /^\*[\s\S]+\*$/,
- inside: {
- punctuation: /^\*\*?|\*\*?$/
- }
- },
- 'punctuation': /^(?:``?|\+{1,3}|##?|\$\$|[~^]|\(\(\(?)|(?:''?|\+{1,3}|##?|\$\$|[~^`]|\)?\)\))$/
- }
- },
- 'replacement': {
- pattern: /\((?:C|R|TM)\)/,
- alias: 'builtin'
- },
- 'entity': /&#?[\da-z]{1,8};/i,
- 'line-continuation': {
- pattern: /(^| )\+$/m,
- lookbehind: true,
- alias: 'punctuation'
- }
- };
- // Allow some nesting. There is no recursion though, so cloning should not be needed.
- function copyFromAsciiDoc(keys) {
- keys = keys.split(' ');
- var o = {};
- for (var i = 0, l = keys.length; i < l; i++) {
- o[keys[i]] = asciidoc[keys[i]];
- }
- return o;
- }
- attributes.inside['interpreted'].inside.rest = copyFromAsciiDoc('macro inline replacement entity');
- asciidoc['passthrough-block'].inside.rest = copyFromAsciiDoc('macro');
- asciidoc['literal-block'].inside.rest = copyFromAsciiDoc('callout');
- asciidoc['table'].inside.rest = copyFromAsciiDoc('comment-block passthrough-block literal-block other-block list-punctuation indented-block comment title attribute-entry attributes hr page-break admonition list-label callout macro inline replacement entity line-continuation');
- asciidoc['other-block'].inside.rest = copyFromAsciiDoc('table list-punctuation indented-block comment attribute-entry attributes hr page-break admonition list-label macro inline replacement entity line-continuation');
- asciidoc['title'].inside.rest = copyFromAsciiDoc('macro inline replacement entity');
- // Plugin to make entity title show the real entity, idea by Roman Komarov
- Prism.hooks.add('wrap', function (env) {
- if (env.type === 'entity') {
- env.attributes['title'] = env.content.replace(/&/, '&');
- }
- });
- Prism.languages.adoc = Prism.languages.asciidoc;
- }(Prism));
|