From 5a081f748efcb00ac559c53bb1a55c0e4ee0069e Mon Sep 17 00:00:00 2001 From: Garen Torikian Date: Fri, 7 Sep 2012 16:50:06 -0700 Subject: [PATCH] Stash --- lib/ace/mode/jade_highlight_rules.js | 164 +++------ tool/Jade.tmLanguage | 513 +++++++++++++++++++++++++++ tool/tmlanguage.js | 24 +- 3 files changed, 579 insertions(+), 122 deletions(-) create mode 100755 tool/Jade.tmLanguage diff --git a/lib/ace/mode/jade_highlight_rules.js b/lib/ace/mode/jade_highlight_rules.js index 3c81f747..e70755ba 100644 --- a/lib/ace/mode/jade_highlight_rules.js +++ b/lib/ace/mode/jade_highlight_rules.js @@ -33,24 +33,6 @@ * * ***** END LICENSE BLOCK ***** */ -/* - THIS FILE WAS AUTOGENERATED BY theme_mode.tmpl.js - - IT MIGHT NOT BE PERFECT, PARTICULARLY: - - IN DECIDING STATES TO TRANSITION TO, - - IGNORING WHITESPACE, - - EXTENDING EXISTING MODES, - - GATHERING KEYWORDS, OR - - RULE PREFERENCE ORDER. - - ...But it's a good start from an existing *.tmlanguage file. -*/ - define(function(require, exports, module) { "use strict"; @@ -66,111 +48,63 @@ var JadeHighlightRules = function() { { "start": [ { - "token": { - "1": { - "name": "keyword.control.import.include.jade" - } - }, - "regex": "^\\s*\\b(include)\\b" + "token": "keyword.control.import.include.jade", + "regex": "^\\s*\\binclude\\b" }, { "token": "keyword.other.doctype.jade", - "regex": "^(!!!)(\\s*[a-zA-Z0-9-_]+)?" + "regex": "^!!!\\s*[a-zA-Z0-9-_]+?" }, { - "token": { - "1": { - "name": "punctuation.section.comment.jade" - } - }, - "regex": "^ *(//)\\s*\\S.*$\\n?" + "token": "punctuation.section.comment.jade", + "regex": "^ *//\\s*\\S.*$\\n?" }, { - "token": { - "2": { - "name": "punctuation.section.comment.jade" - } - }, - "regex": "^(\\s*)(//)\\s*$", - "next": "state_4" + "token": "punctuation.section.comment.jade", + "regex": "^\\s*//\\s*$", + "next": "block_comment" + }, + /*{ + "token": "entity.name.function.jade", + "regex": "^\\s*\\:markdown", + "next": "markdown_filter" }, { - "token": { - "2": { - "name": "entity.name.function.jade" - } - }, - "regex": "^(\\s*)(\\:markdown)", - "next": "state_5" + "token": "entity.name.function.jade", + "regex": "^\\s*\\:sass", + "next": "sass_filter" }, { - "token": { - "2": { - "name": "entity.name.function.jade" - } - }, - "regex": "^(\\s*)(\\:sass)", - "next": "state_6" + "token": "entity.name.function.jade", + "regex": "^\\s*\\:less", + "next": "less_filter" }, { - "token": { - "2": { - "name": "entity.name.function.jade" - } - }, - "regex": "^(\\s*)(\\:less)", - "next": "state_7" + "token": "entity.name.function.jade", + "regex": "^\\s*\\:coffeescript", + "next": "coffeescript_filter" }, { - "token": { - "2": { - "name": "entity.name.function.jade" - } - }, - "regex": "^(\\s*)(\\:coffeescript)", - "next": "state_8" - }, - { - "token": { - "2": { - "name": "entity.name.function.jade" - } - }, - "regex": "^(\\s*)(\\:cdata)", - "next": "state_9" - }, + "token": "entity.name.function.jade", + "regex": "^\\s*\\:cdata", + "next": "cdata_9" + },*/ // match stuff like: mixin dialog-title-desc(title, desc) { - "token": { - "1": { - "name": "storage.type.function.jade" - }, - "2": { - "name": "entity.name.function.jade" - }, - "3": { - "name": "punctuation.definition.parameters.begin.jade" - }, - "4": { - "name": "variable.parameter.function.jade" - }, - "5": { - "name": "punctuation.definition.parameters.end.jade" - } - }, - "regex": "^\\s*(mixin) ([\\w\\-]+)\\s*(\\()(.*?)(\\))" + "token": [ "storage.type.function.jade", + "entity.name.function.jade", + "punctuation.definition.parameters.begin.jade", + "variable.parameter.function.jade", + "punctuation.definition.parameters.end.jade" + ], + "regex": "^(\\s*mixin) ([\\w\\-]+)(\\s*\\()(.*?)(\\))" }, // match stuff like: mixin dialog-title-desc { - "token": { - "1": { - "name": "storage.type.function.jade" - }, - "2": { - "name": "entity.name.function.jade" - } - }, - "regex": "^\\s*(mixin) ([\\w\\-]+)" + "token": ["storage.type.function.jade", + "entity.name.function.jade" + ], + "regex": "^(\\s*mixin)( [\\w\\-]+)" }, { "regex": "^\\s*(-|=|!=)", @@ -203,23 +137,23 @@ var JadeHighlightRules = function() { "next": "state_15" }, { - "regex": "(?<=\\w)\\s*\\(", + "regex": "(?<=\\w)\\s*\\(", // ERROR: This contains a lookbehind, which JS does not support :(", "next": "state_16" } ], - "state_4": [ + "block_comment": [ { - "token": "TODO", - "regex": "^(?!\\1\\s+)", + "token": "text", + "regex": "^(?!\\1\\s+|$)", "next": "start" }, { - "token": "TODO", + "token": "text", "regex": ".+", - "next": "state_4" + "next": "block_comment" } ], - "state_5": [ + /*"markdown_filter": [ { "include": "text.html.markdown" }, @@ -229,7 +163,7 @@ var JadeHighlightRules = function() { "next": "start" } ], - "state_6": [ + "sass_filter": [ { "include": "source.sass" }, @@ -239,7 +173,7 @@ var JadeHighlightRules = function() { "next": "start" } ], - "state_7": [ + "less_filter": [ { "include": "source.css.less" }, @@ -249,7 +183,7 @@ var JadeHighlightRules = function() { "next": "start" } ], - "state_8": [ + "coffee_filter": [ { "include": "source.coffee" }, @@ -259,7 +193,7 @@ var JadeHighlightRules = function() { "next": "start" } ], - "state_9": [ + "cdata_filter": [ { "token": "TODO", "regex": "^(?!\\1\\s+)", @@ -270,7 +204,7 @@ var JadeHighlightRules = function() { "regex": ".+", "next": "state_9" } - ], + ],*/ "state_12": [ { "include": "source.js" diff --git a/tool/Jade.tmLanguage b/tool/Jade.tmLanguage new file mode 100755 index 00000000..6cc45b7e --- /dev/null +++ b/tool/Jade.tmLanguage @@ -0,0 +1,513 @@ + + + + + fileTypes + + jade + + keyEquivalent + ^~J + name + Jade + patterns + + + captures + + 1 + + name + keyword.control.import.include.jade + + + match + ^\s*\b(include)\b + + + match + ^(!!!)(\s*[a-zA-Z0-9-_]+)? + name + keyword.other.doctype.jade + + + captures + + 1 + + name + punctuation.section.comment.jade + + + match + ^\s*(//-?)(?:\s*[^-\s]|\s+\S).*$\n? + name + comment.line.double-slash.jade + + + begin + ^(\s*)(//-?)\s*$ + beginCaptures + + 2 + + name + punctuation.section.comment.jade + + + end + ^(?!\1\s+|$) + name + comment.block.jade + + + begin + ^(\s*)(\:markdown) + beginCaptures + + 2 + + name + entity.name.function.jade + + + end + ^(?!\1\s+) + name + meta.filter.markdown.jade + patterns + + + include + text.html.markdown + + + + + begin + ^(\s*)(\:sass) + beginCaptures + + 2 + + name + entity.name.function.jade + + + end + ^(?!\1\s+) + name + meta.filter.sass.jade + patterns + + + include + source.sass + + + + + begin + ^(\s*)(\:less) + beginCaptures + + 2 + + name + entity.name.function.jade + + + end + ^(?!\1\s+) + name + meta.filter.less.jade + patterns + + + include + source.css.less + + + + + begin + ^(\s*)(\:coffeescript) + beginCaptures + + 2 + + name + entity.name.function.jade + + + end + ^(?!\1\s+)(?=\s*.) + name + meta.filter.coffee.jade + patterns + + + include + source.coffee + + + + + begin + ^(\s*)(\:cdata) + beginCaptures + + 2 + + name + entity.name.function.jade + + + end + ^(?!\1\s+) + name + meta.filter.cdata.jade + + + captures + + 1 + + name + storage.type.function.jade + + 2 + + name + entity.name.function.jade + + 3 + + name + punctuation.definition.parameters.begin.jade + + 4 + + name + variable.parameter.function.jade + + 5 + + name + punctuation.definition.parameters.end.jade + + + comment + match stuff like: mixin dialog-title-desc(title, desc) + match + ^\s*(mixin) ([\w\-]+)\s*(\()(.*?)(\)) + name + meta.mixin.jade + + + captures + + 1 + + name + storage.type.function.jade + + 2 + + name + entity.name.function.jade + + + comment + match stuff like: mixin dialog-title-desc + match + ^\s*(mixin) ([\w\-]+) + name + meta.mixin.jade + + + begin + ^\s*(-|=|!=) + end + $ + name + source.js.embedded.jade + patterns + + + include + source.js + + + match + \b(each)\b + name + keyword.control.js + + + + + begin + ^(\s*)(script) + beginCaptures + + 2 + + name + entity.name.tag.script.jade + + + end + ^((?=(\1)([\w#\.]|$\n?))|^$\n?) + name + source.js.embedded.jade + patterns + + + begin + (?<=script)\s*\( + end + \) + patterns + + + include + #tag-stuff + + + + + include + source.js + + + + + match + [#!]\{[^\}]+\} + name + string.interpolated.jade + + + begin + ^\s*(?!\w+\:)(?:(([\w]+))|(?=\.|#)) + captures + + 1 + + name + meta.tag.any.jade + + 2 + + name + entity.name.tag.jade + + + comment + Match any tag, id or class. skip AST filters + end + $|(?!\.|#|=|-) + patterns + + + match + \.[\w-]+ + name + meta.tag.attribute.class.jade + + + match + #[\w-]+ + name + meta.tag.attribute.id.jade + + + + + begin + (?<=\w)\s*\( + end + \) + name + meta.tag.attribute.jade + patterns + + + include + #tag-stuff + + + + + repository + + entities + + patterns + + + captures + + 1 + + name + punctuation.definition.entity.jade + + 3 + + name + punctuation.definition.entity.jade + + + match + (&)([a-zA-Z0-9]+|#[0-9]+|#x[0-9a-fA-F]+)(;) + name + constant.character.entity.jade + + + match + & + name + invalid.illegal.bad-ampersand.jade + + + + filter-langs + + patterns + + + include + #markdown + + + include + #sass + + + + markdown + + begin + markdown\s*$\n? + end + (?!^\1\s+) + patterns + + + include + text.html.markdown + + + + sass + + begin + ^(\s*)\:sass + end + (?!^\1\s+) + patterns + + + include + source.sass + + + + string-double-quoted + + begin + " + beginCaptures + + 0 + + name + punctuation.definition.string.begin.jade + + + end + " + endCaptures + + 0 + + name + punctuation.definition.string.end.jade + + + name + string.quoted.double.jade + patterns + + + include + #entities + + + + string-single-quoted + + begin + ' + beginCaptures + + 0 + + name + punctuation.definition.string.begin.jade + + + end + ' + endCaptures + + 0 + + name + punctuation.definition.string.end.jade + + + name + string.quoted.single.jade + patterns + + + include + #entities + + + + tag-generic-attribute + + match + \b([a-zA-Z\-:]+) + name + entity.other.attribute-name.jade + + tag-stuff + + patterns + + + include + #string-double-quoted + + + include + #string-single-quoted + + + include + #tag-generic-attribute + + + + + scopeName + source.jade + uuid + C5B73B98-5F2A-42E3-9F0E-028A74A9FE4B + + diff --git a/tool/tmlanguage.js b/tool/tmlanguage.js index 008f5f0e..dac92e1a 100755 --- a/tool/tmlanguage.js +++ b/tool/tmlanguage.js @@ -69,7 +69,12 @@ function cleanMultiCapture(match) { // stupid yet necessary function, to transform JSON id comments into real comments function restoreComments(objStr) { - return objStr.replace(/"\s+(\/\/.+)",/g, "\$1") + return objStr.replace(/"\s+(\/\/.+)",/g, "\$1").replace(/ \/\/ ERROR/g, '", // ERROR'); +} + +function checkForLookBehind(str) { + var lookbehindRegExp = new RegExp("\\?<[=|!]"); + return lookbehindRegExp.test(str) ? str + " // ERROR: This contains a lookbehind, which JS does not support :(" : str; } function assembleStateObjs(strState, pattern) { @@ -86,19 +91,19 @@ function assembleStateObjs(strState, pattern) { } else { stateObj.token = patterns[p].name; - stateObj.regex = patterns[p].match; + stateObj.regex = checkForLookBehind(patterns[p].match); } statesObj[strState].push(stateObj); } stateObj = {}; stateObj.token = "TODO"; - stateObj.regex = pattern.end; + stateObj.regex = checkForLookBehind(pattern.end); stateObj.next = "start"; } else { stateObj.token = "TODO"; - stateObj.regex = pattern.end; + stateObj.regex = checkForLookBehind(pattern.end); stateObj.next = "start"; statesObj[strState].push(stateObj); @@ -141,7 +146,7 @@ function extractPatterns(patterns) { statesObj[strState] = [ ]; statesObj[strState].push(assembleStateObjs(strState, pattern)); - tokenObj.regex = pattern.begin; + tokenObj.regex = checkForLookBehind(pattern.begin); tokenObj.next = strState; startState.start.push(tokenObj); } @@ -151,14 +156,14 @@ function extractPatterns(patterns) { else if (pattern.captures) { tokenObj.token = pattern.captures; - tokenObj.regex = pattern.match; + tokenObj.regex = checkForLookBehind(pattern.match); startState.start.push(tokenObj); } else if (pattern.match) { tokenObj.token = pattern.name; - tokenObj.regex = pattern.match; + tokenObj.regex = checkForLookBehind(pattern.match); startState.start.push(tokenObj); } @@ -203,4 +208,9 @@ function convertLanguage(name) { } var tmLanguageFile = process.argv.splice(2)[0]; + +if (tmLanguageFile === undefined) { + console.error("Please pass in a language file via the command line."); + process.exit(1); +} convertLanguage(tmLanguageFile); \ No newline at end of file