Index: lib/src/prism/components/prism-textile.js |
diff --git a/lib/src/prism/components/prism-textile.js b/lib/src/prism/components/prism-textile.js |
new file mode 100644 |
index 0000000000000000000000000000000000000000..4fa0a1137fc5d54b1471c91f1a0cc51c12958be4 |
--- /dev/null |
+++ b/lib/src/prism/components/prism-textile.js |
@@ -0,0 +1,254 @@ |
+(function(Prism) { |
+ // We don't allow for pipes inside parentheses |
+ // to not break table pattern |(. foo |). bar | |
+ var modifierRegex = '(?:\\([^|)]+\\)|\\[[^\\]]+\\]|\\{[^}]+\\})+'; |
+ var modifierTokens = { |
+ 'css': { |
+ pattern: /\{[^}]+\}/, |
+ inside: { |
+ rest: Prism.languages.css |
+ } |
+ }, |
+ 'class-id': { |
+ pattern: /(\()[^)]+(?=\))/, |
+ lookbehind: true, |
+ alias: 'attr-value' |
+ }, |
+ 'lang': { |
+ pattern: /(\[)[^\]]+(?=\])/, |
+ lookbehind: true, |
+ alias: 'attr-value' |
+ }, |
+ // Anything else is punctuation (the first pattern is for row/col spans inside tables) |
+ 'punctuation': /[\\\/]\d+|\S/ |
+ }; |
+ |
+ |
+ Prism.languages.textile = Prism.languages.extend('markup', { |
+ 'phrase': { |
+ pattern: /(^|\r|\n)\S[\s\S]*?(?=$|\r?\n\r?\n|\r\r)/, |
+ lookbehind: true, |
+ inside: { |
+ |
+ // h1. Header 1 |
+ 'block-tag': { |
+ pattern: RegExp('^[a-z]\\w*(?:' + modifierRegex + '|[<>=()])*\\.'), |
+ inside: { |
+ 'modifier': { |
+ pattern: RegExp('(^[a-z]\\w*)(?:' + modifierRegex + '|[<>=()])+(?=\\.)'), |
+ lookbehind: true, |
+ inside: Prism.util.clone(modifierTokens) |
+ }, |
+ 'tag': /^[a-z]\w*/, |
+ 'punctuation': /\.$/ |
+ } |
+ }, |
+ |
+ // # List item |
+ // * List item |
+ 'list': { |
+ pattern: RegExp('^[*#]+(?:' + modifierRegex + ')?\\s+.+', 'm'), |
+ inside: { |
+ 'modifier': { |
+ pattern: RegExp('(^[*#]+)' + modifierRegex), |
+ lookbehind: true, |
+ inside: Prism.util.clone(modifierTokens) |
+ }, |
+ 'punctuation': /^[*#]+/ |
+ } |
+ }, |
+ |
+ // | cell | cell | cell | |
+ 'table': { |
+ // Modifiers can be applied to the row: {color:red}.|1|2|3| |
+ // or the cell: |{color:red}.1|2|3| |
+ pattern: RegExp('^(?:(?:' + modifierRegex + '|[<>=()^~])+\\.\\s*)?(?:\\|(?:(?:' + modifierRegex + '|[<>=()^~_]|[\\\\/]\\d+)+\\.)?[^|]*)+\\|', 'm'), |
+ inside: { |
+ 'modifier': { |
+ // Modifiers for rows after the first one are |
+ // preceded by a pipe and a line feed |
+ pattern: RegExp('(^|\\|(?:\\r?\\n|\\r)?)(?:' + modifierRegex + '|[<>=()^~_]|[\\\\/]\\d+)+(?=\\.)'), |
+ lookbehind: true, |
+ inside: Prism.util.clone(modifierTokens) |
+ }, |
+ 'punctuation': /\||^\./ |
+ } |
+ }, |
+ |
+ 'inline': { |
+ pattern: RegExp('(\\*\\*|__|\\?\\?|[*_%@+\\-^~])(?:' + modifierRegex + ')?.+?\\1'), |
+ inside: { |
+ // Note: superscripts and subscripts are not handled specifically |
+ |
+ // *bold*, **bold** |
+ 'bold': { |
+ pattern: RegExp('((^\\*\\*?)(?:' + modifierRegex + ')?).+?(?=\\2)'), |
+ lookbehind: true |
+ }, |
+ |
+ // _italic_, __italic__ |
+ 'italic': { |
+ pattern: RegExp('((^__?)(?:' + modifierRegex + ')?).+?(?=\\2)'), |
+ lookbehind: true |
+ }, |
+ |
+ // ??cite?? |
+ 'cite': { |
+ pattern: RegExp('(^\\?\\?(?:' + modifierRegex + ')?).+?(?=\\?\\?)'), |
+ lookbehind: true, |
+ alias: 'string' |
+ }, |
+ |
+ // @code@ |
+ 'code': { |
+ pattern: RegExp('(^@(?:' + modifierRegex + ')?).+?(?=@)'), |
+ lookbehind: true, |
+ alias: 'keyword' |
+ }, |
+ |
+ // +inserted+ |
+ 'inserted': { |
+ pattern: RegExp('(^\\+(?:' + modifierRegex + ')?).+?(?=\\+)'), |
+ lookbehind: true |
+ }, |
+ |
+ // -deleted- |
+ 'deleted': { |
+ pattern: RegExp('(^-(?:' + modifierRegex + ')?).+?(?=-)'), |
+ lookbehind: true |
+ }, |
+ |
+ // %span% |
+ 'span': { |
+ pattern: RegExp('(^%(?:' + modifierRegex + ')?).+?(?=%)'), |
+ lookbehind: true |
+ }, |
+ |
+ 'modifier': { |
+ pattern: RegExp('(^\\*\\*|__|\\?\\?|[*_%@+\\-^~])' + modifierRegex), |
+ lookbehind: true, |
+ inside: Prism.util.clone(modifierTokens) |
+ }, |
+ 'punctuation': /[*_%?@+\-^~]+/ |
+ } |
+ }, |
+ |
+ // [alias]http://example.com |
+ 'link-ref': { |
+ pattern: /^\[[^\]]+\]\S+$/m, |
+ inside: { |
+ 'string': { |
+ pattern: /(\[)[^\]]+(?=\])/, |
+ lookbehind: true |
+ }, |
+ 'url': { |
+ pattern: /(\])\S+$/, |
+ lookbehind: true |
+ }, |
+ 'punctuation': /[\[\]]/ |
+ } |
+ }, |
+ |
+ // "text":http://example.com |
+ // "text":link-ref |
+ 'link': { |
+ pattern: RegExp('"(?:' + modifierRegex + ')?[^"]+":.+?(?=[^\\w/]?(?:\\s|$))'), |
+ inside: { |
+ 'text': { |
+ pattern: RegExp('(^"(?:' + modifierRegex + ')?)[^"]+(?=")'), |
+ lookbehind: true |
+ }, |
+ 'modifier': { |
+ pattern: RegExp('(^")' + modifierRegex), |
+ lookbehind: true, |
+ inside: Prism.util.clone(modifierTokens) |
+ }, |
+ 'url': { |
+ pattern: /(:).+/, |
+ lookbehind: true |
+ }, |
+ 'punctuation': /[":]/ |
+ } |
+ }, |
+ |
+ // !image.jpg! |
+ // !image.jpg(Title)!:http://example.com |
+ 'image': { |
+ pattern: RegExp('!(?:' + modifierRegex + '|[<>=()])*[^!\\s()]+(?:\\([^)]+\\))?!(?::.+?(?=[^\\w/]?(?:\\s|$)))?'), |
+ inside: { |
+ 'source': { |
+ pattern: RegExp('(^!(?:' + modifierRegex + '|[<>=()])*)[^!\\s()]+(?:\\([^)]+\\))?(?=!)'), |
+ lookbehind: true, |
+ alias: 'url' |
+ }, |
+ 'modifier': { |
+ pattern: RegExp('(^!)(?:' + modifierRegex + '|[<>=()])+'), |
+ lookbehind: true, |
+ inside: Prism.util.clone(modifierTokens) |
+ }, |
+ 'url': { |
+ pattern: /(:).+/, |
+ lookbehind: true |
+ }, |
+ 'punctuation': /[!:]/ |
+ } |
+ }, |
+ |
+ // Footnote[1] |
+ 'footnote': { |
+ pattern: /\b\[\d+\]/, |
+ alias: 'comment', |
+ inside: { |
+ 'punctuation': /\[|\]/ |
+ } |
+ }, |
+ |
+ // CSS(Cascading Style Sheet) |
+ 'acronym': { |
+ pattern: /\b[A-Z\d]+\([^)]+\)/, |
+ inside: { |
+ 'comment': { |
+ pattern: /(\()[^)]+(?=\))/, |
+ lookbehind: true |
+ }, |
+ 'punctuation': /[()]/ |
+ } |
+ }, |
+ |
+ // Prism(C) |
+ 'mark': { |
+ pattern: /\b\((TM|R|C)\)/, |
+ alias: 'comment', |
+ inside: { |
+ 'punctuation':/[()]/ |
+ } |
+ } |
+ } |
+ } |
+ }); |
+ |
+ var nestedPatterns = { |
+ '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 = 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'] = 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)); |