Commit 93964dd2b4dfbefe3826a9db7432d5ec2654ead0

Golmote 2015-09-06T11:19:33

Textile: Fix table modifiers, fix blank punctuation and modifiers, fix phrases, fix image title, simplified regexps, simplified nesting.

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>