Textile: Fix table modifiers, fix blank punctuation and modifiers, fix phrases, fix image title, simplified regexps, simplified nesting.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157
diff --git a/components/prism-textile.js b/components/prism-textile.js
index 84475ee..4fa0a11 100644
--- a/components/prism-textile.js
+++ b/components/prism-textile.js
@@ -1,5 +1,7 @@
(function(Prism) {
- var modifierRegex = '(?:\\([^)]+\\)|\\[[^\\]]+\\]|\\{[^}]+\\})+';
+ // We don't allow for pipes inside parentheses
+ // to not break table pattern |(. foo |). bar |
+ var modifierRegex = '(?:\\([^|)]+\\)|\\[[^\\]]+\\]|\\{[^}]+\\})+';
var modifierTokens = {
'css': {
pattern: /\{[^}]+\}/,
@@ -18,23 +20,22 @@
alias: 'attr-value'
},
// Anything else is punctuation (the first pattern is for row/col spans inside tables)
- 'punctuation': /[\\\/]\d+|./
+ 'punctuation': /[\\\/]\d+|\S/
};
-
Prism.languages.textile = Prism.languages.extend('markup', {
'phrase': {
- pattern: /(^|\r|\n)[\S][\s\S]*?(?=$|(?:\r?\n|\r)\s*?(?:\r?\n|\r))/,
+ pattern: /(^|\r|\n)\S[\s\S]*?(?=$|\r?\n\r?\n|\r\r)/,
lookbehind: true,
inside: {
// h1. Header 1
- 'block': {
+ 'block-tag': {
pattern: RegExp('^[a-z]\\w*(?:' + modifierRegex + '|[<>=()])*\\.'),
inside: {
'modifier': {
- pattern: RegExp('(^[a-z]\\w*)(?:' + modifierRegex + '|[<>=()])*(?=\\.)'),
+ pattern: RegExp('(^[a-z]\\w*)(?:' + modifierRegex + '|[<>=()])+(?=\\.)'),
lookbehind: true,
inside: Prism.util.clone(modifierTokens)
},
@@ -46,8 +47,7 @@
// # List item
// * List item
'list': {
- pattern: RegExp('(^|\\r|\\n)[*#]+(?:' + modifierRegex + ')?\\s+.+'),
- lookbehind: true,
+ pattern: RegExp('^[*#]+(?:' + modifierRegex + ')?\\s+.+', 'm'),
inside: {
'modifier': {
pattern: RegExp('(^[*#]+)' + modifierRegex),
@@ -62,8 +62,7 @@
'table': {
// Modifiers can be applied to the row: {color:red}.|1|2|3|
// or the cell: |{color:red}.1|2|3|
- pattern: RegExp('(^|\r|\n)(?:(?:' + modifierRegex + '|[<>=()^~])+\\.\\s*)?(?:\\|(?:(?:' + modifierRegex + '|[<>=()^~_]|[\\\\/]\\d+)+\\.)?[^|]*)+\\|'),
- lookbehind: true,
+ pattern: RegExp('^(?:(?:' + modifierRegex + '|[<>=()^~])+\\.\\s*)?(?:\\|(?:(?:' + modifierRegex + '|[<>=()^~_]|[\\\\/]\\d+)+\\.)?[^|]*)+\\|', 'm'),
inside: {
'modifier': {
// Modifiers for rows after the first one are
@@ -130,7 +129,7 @@
lookbehind: true,
inside: Prism.util.clone(modifierTokens)
},
- 'punctuation': /[*_%?@+\-^~]/
+ 'punctuation': /[*_%?@+\-^~]+/
}
},
@@ -175,15 +174,15 @@
// !image.jpg!
// !image.jpg(Title)!:http://example.com
'image': {
- pattern: RegExp('!(?:' + modifierRegex + '|[<>=()])*[^!\\s]+!(?::.+?(?=[^\\w/]?(?:\\s|$)))?'),
+ pattern: RegExp('!(?:' + modifierRegex + '|[<>=()])*[^!\\s()]+(?:\\([^)]+\\))?!(?::.+?(?=[^\\w/]?(?:\\s|$)))?'),
inside: {
'source': {
- pattern: RegExp('(^!(?:' + modifierRegex + '|[<>=()])*)[^!]+(?=!)'),
+ pattern: RegExp('(^!(?:' + modifierRegex + '|[<>=()])*)[^!\\s()]+(?:\\([^)]+\\))?(?=!)'),
lookbehind: true,
alias: 'url'
},
'modifier': {
- pattern: RegExp('(^!)(?:' + modifierRegex + '|[<>=()])*'),
+ pattern: RegExp('(^!)(?:' + modifierRegex + '|[<>=()])+'),
lookbehind: true,
inside: Prism.util.clone(modifierTokens)
},
@@ -229,27 +228,27 @@
});
var nestedPatterns = {
- 'inline': Prism.languages.textile['phrase'].inside['inline'],
- 'link': Prism.languages.textile['phrase'].inside['link'],
- 'image': Prism.languages.textile['phrase'].inside['image'],
- 'footnote': Prism.languages.textile['phrase'].inside['footnote'],
- 'acronym': Prism.languages.textile['phrase'].inside['acronym'],
- 'mark': Prism.languages.textile['phrase'].inside['mark']
+ 'inline': Prism.util.clone(Prism.languages.textile['phrase'].inside['inline']),
+ 'link': Prism.util.clone(Prism.languages.textile['phrase'].inside['link']),
+ 'image': Prism.util.clone(Prism.languages.textile['phrase'].inside['image']),
+ 'footnote': Prism.util.clone(Prism.languages.textile['phrase'].inside['footnote']),
+ 'acronym': Prism.util.clone(Prism.languages.textile['phrase'].inside['acronym']),
+ 'mark': Prism.util.clone(Prism.languages.textile['phrase'].inside['mark'])
};
// Allow some nesting
- Prism.languages.textile['phrase'].inside['inline'].inside['bold'].inside = Prism.util.clone(nestedPatterns);
- Prism.languages.textile['phrase'].inside['inline'].inside['italic'].inside = Prism.util.clone(nestedPatterns);
- Prism.languages.textile['phrase'].inside['inline'].inside['inserted'].inside = Prism.util.clone(nestedPatterns);
- Prism.languages.textile['phrase'].inside['inline'].inside['deleted'].inside = Prism.util.clone(nestedPatterns);
- Prism.languages.textile['phrase'].inside['inline'].inside['span'].inside = Prism.util.clone(nestedPatterns);
+ Prism.languages.textile['phrase'].inside['inline'].inside['bold'].inside = nestedPatterns;
+ Prism.languages.textile['phrase'].inside['inline'].inside['italic'].inside = nestedPatterns;
+ Prism.languages.textile['phrase'].inside['inline'].inside['inserted'].inside = nestedPatterns;
+ Prism.languages.textile['phrase'].inside['inline'].inside['deleted'].inside = nestedPatterns;
+ Prism.languages.textile['phrase'].inside['inline'].inside['span'].inside = nestedPatterns;
// Allow some styles inside table cells
- Prism.languages.textile['phrase'].inside['table'].inside['inline'] = Prism.util.clone(nestedPatterns['inline']);
- Prism.languages.textile['phrase'].inside['table'].inside['link'] = Prism.util.clone(nestedPatterns['link']);
- Prism.languages.textile['phrase'].inside['table'].inside['image'] = Prism.util.clone(nestedPatterns['image']);
- Prism.languages.textile['phrase'].inside['table'].inside['footnote'] = Prism.util.clone(nestedPatterns['footnote']);
- Prism.languages.textile['phrase'].inside['table'].inside['acronym'] = Prism.util.clone(nestedPatterns['acronym']);
- Prism.languages.textile['phrase'].inside['table'].inside['mark'] = Prism.util.clone(nestedPatterns['mark']);
+ Prism.languages.textile['phrase'].inside['table'].inside['inline'] = nestedPatterns['inline'];
+ Prism.languages.textile['phrase'].inside['table'].inside['link'] = nestedPatterns['link'];
+ Prism.languages.textile['phrase'].inside['table'].inside['image'] = nestedPatterns['image'];
+ Prism.languages.textile['phrase'].inside['table'].inside['footnote'] = nestedPatterns['footnote'];
+ Prism.languages.textile['phrase'].inside['table'].inside['acronym'] = nestedPatterns['acronym'];
+ Prism.languages.textile['phrase'].inside['table'].inside['mark'] = nestedPatterns['mark'];
}(Prism));
\ No newline at end of file
diff --git a/components/prism-textile.min.js b/components/prism-textile.min.js
index ab01292..1dd8b59 100644
--- a/components/prism-textile.min.js
+++ b/components/prism-textile.min.js
@@ -1 +1 @@
-!function(e){var i="(?:\\([^)]+\\)|\\[[^\\]]+\\]|\\{[^}]+\\})+",n={css:{pattern:/\{[^}]+\}/,inside:{rest:e.languages.css}},"class-id":{pattern:/(\()[^)]+(?=\))/,lookbehind:!0,alias:"attr-value"},lang:{pattern:/(\[)[^\]]+(?=\])/,lookbehind:!0,alias:"attr-value"},punctuation:/[\\\/]\d+|./};e.languages.textile=e.languages.extend("markup",{phrase:{pattern:/(^|\r|\n)[\S][\s\S]*?(?=$|(?:\r?\n|\r)\s*?(?:\r?\n|\r))/,lookbehind:!0,inside:{block:{pattern:RegExp("^[a-z]\\w*(?:"+i+"|[<>=()])*\\."),inside:{modifier:{pattern:RegExp("(^[a-z]\\w*)(?:"+i+"|[<>=()])*(?=\\.)"),lookbehind:!0,inside:e.util.clone(n)},tag:/^[a-z]\w*/,punctuation:/\.$/}},list:{pattern:RegExp("(^|\\r|\\n)[*#]+(?:"+i+")?\\s+.+"),lookbehind:!0,inside:{modifier:{pattern:RegExp("(^[*#]+)"+i),lookbehind:!0,inside:e.util.clone(n)},punctuation:/^[*#]+/}},table:{pattern:RegExp("(^|\r|\n)(?:(?:"+i+"|[<>=()^~])+\\.\\s*)?(?:\\|(?:(?:"+i+"|[<>=()^~_]|[\\\\/]\\d+)+\\.)?[^|]*)+\\|"),lookbehind:!0,inside:{modifier:{pattern:RegExp("(^|\\|(?:\\r?\\n|\\r)?)(?:"+i+"|[<>=()^~_]|[\\\\/]\\d+)+(?=\\.)"),lookbehind:!0,inside:e.util.clone(n)},punctuation:/\||^\./}},inline:{pattern:RegExp("(\\*\\*|__|\\?\\?|[*_%@+\\-^~])(?:"+i+")?.+?\\1"),inside:{bold:{pattern:RegExp("((^\\*\\*?)(?:"+i+")?).+?(?=\\2)"),lookbehind:!0},italic:{pattern:RegExp("((^__?)(?:"+i+")?).+?(?=\\2)"),lookbehind:!0},cite:{pattern:RegExp("(^\\?\\?(?:"+i+")?).+?(?=\\?\\?)"),lookbehind:!0,alias:"string"},code:{pattern:RegExp("(^@(?:"+i+")?).+?(?=@)"),lookbehind:!0,alias:"keyword"},inserted:{pattern:RegExp("(^\\+(?:"+i+")?).+?(?=\\+)"),lookbehind:!0},deleted:{pattern:RegExp("(^-(?:"+i+")?).+?(?=-)"),lookbehind:!0},span:{pattern:RegExp("(^%(?:"+i+")?).+?(?=%)"),lookbehind:!0},modifier:{pattern:RegExp("(^\\*\\*|__|\\?\\?|[*_%@+\\-^~])"+i),lookbehind:!0,inside:e.util.clone(n)},punctuation:/[*_%?@+\-^~]/}},"link-ref":{pattern:/^\[[^\]]+\]\S+$/m,inside:{string:{pattern:/(\[)[^\]]+(?=\])/,lookbehind:!0},url:{pattern:/(\])\S+$/,lookbehind:!0},punctuation:/[\[\]]/}},link:{pattern:RegExp('"(?:'+i+')?[^"]+":.+?(?=[^\\w/]?(?:\\s|$))'),inside:{text:{pattern:RegExp('(^"(?:'+i+')?)[^"]+(?=")'),lookbehind:!0},modifier:{pattern:RegExp('(^")'+i),lookbehind:!0,inside:e.util.clone(n)},url:{pattern:/(:).+/,lookbehind:!0},punctuation:/[":]/}},image:{pattern:RegExp("!(?:"+i+"|[<>=()])*[^!\\s]+!(?::.+?(?=[^\\w/]?(?:\\s|$)))?"),inside:{source:{pattern:RegExp("(^!(?:"+i+"|[<>=()])*)[^!]+(?=!)"),lookbehind:!0,alias:"url"},modifier:{pattern:RegExp("(^!)(?:"+i+"|[<>=()])*"),lookbehind:!0,inside:e.util.clone(n)},url:{pattern:/(:).+/,lookbehind:!0},punctuation:/[!:]/}},footnote:{pattern:/\b\[\d+\]/,alias:"comment",inside:{punctuation:/\[|\]/}},acronym:{pattern:/\b[A-Z\d]+\([^)]+\)/,inside:{comment:{pattern:/(\()[^)]+(?=\))/,lookbehind:!0},punctuation:/[()]/}},mark:{pattern:/\b\((TM|R|C)\)/,alias:"comment",inside:{punctuation:/[()]/}}}}});var t={inline:e.languages.textile.phrase.inside.inline,link:e.languages.textile.phrase.inside.link,image:e.languages.textile.phrase.inside.image,footnote:e.languages.textile.phrase.inside.footnote,acronym:e.languages.textile.phrase.inside.acronym,mark:e.languages.textile.phrase.inside.mark};e.languages.textile.phrase.inside.inline.inside.bold.inside=e.util.clone(t),e.languages.textile.phrase.inside.inline.inside.italic.inside=e.util.clone(t),e.languages.textile.phrase.inside.inline.inside.inserted.inside=e.util.clone(t),e.languages.textile.phrase.inside.inline.inside.deleted.inside=e.util.clone(t),e.languages.textile.phrase.inside.inline.inside.span.inside=e.util.clone(t),e.languages.textile.phrase.inside.table.inside.inline=e.util.clone(t.inline),e.languages.textile.phrase.inside.table.inside.link=e.util.clone(t.link),e.languages.textile.phrase.inside.table.inside.image=e.util.clone(t.image),e.languages.textile.phrase.inside.table.inside.footnote=e.util.clone(t.footnote),e.languages.textile.phrase.inside.table.inside.acronym=e.util.clone(t.acronym),e.languages.textile.phrase.inside.table.inside.mark=e.util.clone(t.mark)}(Prism);
\ No newline at end of file
+!function(e){var i="(?:\\([^|)]+\\)|\\[[^\\]]+\\]|\\{[^}]+\\})+",n={css:{pattern:/\{[^}]+\}/,inside:{rest:e.languages.css}},"class-id":{pattern:/(\()[^)]+(?=\))/,lookbehind:!0,alias:"attr-value"},lang:{pattern:/(\[)[^\]]+(?=\])/,lookbehind:!0,alias:"attr-value"},punctuation:/[\\\/]\d+|\S/};e.languages.textile=e.languages.extend("markup",{phrase:{pattern:/(^|\r|\n)\S[\s\S]*?(?=$|\r?\n\r?\n|\r\r)/,lookbehind:!0,inside:{"block-tag":{pattern:RegExp("^[a-z]\\w*(?:"+i+"|[<>=()])*\\."),inside:{modifier:{pattern:RegExp("(^[a-z]\\w*)(?:"+i+"|[<>=()])+(?=\\.)"),lookbehind:!0,inside:e.util.clone(n)},tag:/^[a-z]\w*/,punctuation:/\.$/}},list:{pattern:RegExp("^[*#]+(?:"+i+")?\\s+.+","m"),inside:{modifier:{pattern:RegExp("(^[*#]+)"+i),lookbehind:!0,inside:e.util.clone(n)},punctuation:/^[*#]+/}},table:{pattern:RegExp("^(?:(?:"+i+"|[<>=()^~])+\\.\\s*)?(?:\\|(?:(?:"+i+"|[<>=()^~_]|[\\\\/]\\d+)+\\.)?[^|]*)+\\|","m"),inside:{modifier:{pattern:RegExp("(^|\\|(?:\\r?\\n|\\r)?)(?:"+i+"|[<>=()^~_]|[\\\\/]\\d+)+(?=\\.)"),lookbehind:!0,inside:e.util.clone(n)},punctuation:/\||^\./}},inline:{pattern:RegExp("(\\*\\*|__|\\?\\?|[*_%@+\\-^~])(?:"+i+")?.+?\\1"),inside:{bold:{pattern:RegExp("((^\\*\\*?)(?:"+i+")?).+?(?=\\2)"),lookbehind:!0},italic:{pattern:RegExp("((^__?)(?:"+i+")?).+?(?=\\2)"),lookbehind:!0},cite:{pattern:RegExp("(^\\?\\?(?:"+i+")?).+?(?=\\?\\?)"),lookbehind:!0,alias:"string"},code:{pattern:RegExp("(^@(?:"+i+")?).+?(?=@)"),lookbehind:!0,alias:"keyword"},inserted:{pattern:RegExp("(^\\+(?:"+i+")?).+?(?=\\+)"),lookbehind:!0},deleted:{pattern:RegExp("(^-(?:"+i+")?).+?(?=-)"),lookbehind:!0},span:{pattern:RegExp("(^%(?:"+i+")?).+?(?=%)"),lookbehind:!0},modifier:{pattern:RegExp("(^\\*\\*|__|\\?\\?|[*_%@+\\-^~])"+i),lookbehind:!0,inside:e.util.clone(n)},punctuation:/[*_%?@+\-^~]+/}},"link-ref":{pattern:/^\[[^\]]+\]\S+$/m,inside:{string:{pattern:/(\[)[^\]]+(?=\])/,lookbehind:!0},url:{pattern:/(\])\S+$/,lookbehind:!0},punctuation:/[\[\]]/}},link:{pattern:RegExp('"(?:'+i+')?[^"]+":.+?(?=[^\\w/]?(?:\\s|$))'),inside:{text:{pattern:RegExp('(^"(?:'+i+')?)[^"]+(?=")'),lookbehind:!0},modifier:{pattern:RegExp('(^")'+i),lookbehind:!0,inside:e.util.clone(n)},url:{pattern:/(:).+/,lookbehind:!0},punctuation:/[":]/}},image:{pattern:RegExp("!(?:"+i+"|[<>=()])*[^!\\s()]+(?:\\([^)]+\\))?!(?::.+?(?=[^\\w/]?(?:\\s|$)))?"),inside:{source:{pattern:RegExp("(^!(?:"+i+"|[<>=()])*)[^!\\s()]+(?:\\([^)]+\\))?(?=!)"),lookbehind:!0,alias:"url"},modifier:{pattern:RegExp("(^!)(?:"+i+"|[<>=()])+"),lookbehind:!0,inside:e.util.clone(n)},url:{pattern:/(:).+/,lookbehind:!0},punctuation:/[!:]/}},footnote:{pattern:/\b\[\d+\]/,alias:"comment",inside:{punctuation:/\[|\]/}},acronym:{pattern:/\b[A-Z\d]+\([^)]+\)/,inside:{comment:{pattern:/(\()[^)]+(?=\))/,lookbehind:!0},punctuation:/[()]/}},mark:{pattern:/\b\((TM|R|C)\)/,alias:"comment",inside:{punctuation:/[()]/}}}}});var t={inline:e.util.clone(e.languages.textile.phrase.inside.inline),link:e.util.clone(e.languages.textile.phrase.inside.link),image:e.util.clone(e.languages.textile.phrase.inside.image),footnote:e.util.clone(e.languages.textile.phrase.inside.footnote),acronym:e.util.clone(e.languages.textile.phrase.inside.acronym),mark:e.util.clone(e.languages.textile.phrase.inside.mark)};e.languages.textile.phrase.inside.inline.inside.bold.inside=t,e.languages.textile.phrase.inside.inline.inside.italic.inside=t,e.languages.textile.phrase.inside.inline.inside.inserted.inside=t,e.languages.textile.phrase.inside.inline.inside.deleted.inside=t,e.languages.textile.phrase.inside.inline.inside.span.inside=t,e.languages.textile.phrase.inside.table.inside.inline=t.inline,e.languages.textile.phrase.inside.table.inside.link=t.link,e.languages.textile.phrase.inside.table.inside.image=t.image,e.languages.textile.phrase.inside.table.inside.footnote=t.footnote,e.languages.textile.phrase.inside.table.inside.acronym=t.acronym,e.languages.textile.phrase.inside.table.inside.mark=t.mark}(Prism);
\ No newline at end of file
diff --git a/examples/prism-textile.html b/examples/prism-textile.html
index 9ea86b6..6720885 100644
--- a/examples/prism-textile.html
+++ b/examples/prism-textile.html
@@ -169,7 +169,7 @@ table{border:1px solid black}.
<h3>Nested styles are only partially supported</h3>
-<p>Two levels of nesting should work. Above, it depends on the order of the tokens in the grammar.</p>
+<p>Only one level of nesting is supported.</p>
<pre><code>*A bold paragraph %containing a span with broken _italic_ inside%!*</code></pre>