Skip to content

Commit

Permalink
Merge pull request #544 from Golmote/prism-textile
Browse files Browse the repository at this point in the history
Add Textile language
  • Loading branch information
Golmote committed Sep 6, 2015
2 parents 125e91f + 78890e4 commit d0c6764
Show file tree
Hide file tree
Showing 18 changed files with 1,258 additions and 3 deletions.
5 changes: 5 additions & 0 deletions components.js
Original file line number Diff line number Diff line change
Expand Up @@ -351,6 +351,11 @@ var components = {
"title": "Tcl",
"owner": "PeterChaplin"
},
"textile": {
"title": "Textile",
"require": "markup",
"owner": "Golmote"
},
"twig": {
"title": "Twig",
"require": "markup",
Expand Down
2 changes: 1 addition & 1 deletion components/prism-markup.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ Prism.languages.markup = {
'doctype': /<!DOCTYPE[\w\W]+?>/,
'cdata': /<!\[CDATA\[[\w\W]*?]]>/i,
'tag': {
pattern: /<\/?[^\s>\/=]+(?:\s+[^\s>\/=]+(?:=(?:("|')(?:\\\1|\\?(?!\1)[\w\W])*\1|[^\s'">=]+))?)*\s*\/?>/i,
pattern: /<\/?[^\s>\/=.]+(?:\s+[^\s>\/=]+(?:=(?:("|')(?:\\\1|\\?(?!\1)[\w\W])*\1|[^\s'">=]+))?)*\s*\/?>/i,
inside: {
'tag': {
pattern: /^<\/?[^\s>\/]+/i,
Expand Down
2 changes: 1 addition & 1 deletion components/prism-markup.min.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

254 changes: 254 additions & 0 deletions components/prism-textile.js
Original file line number Diff line number Diff line change
@@ -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));
1 change: 1 addition & 0 deletions components/prism-textile.min.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading

0 comments on commit d0c6764

Please sign in to comment.