From ce4912366fc7a4ce0ae663f9f789552bf0fdd380 Mon Sep 17 00:00:00 2001 From: nightwing Date: Tue, 11 Sep 2012 10:39:32 +0400 Subject: [PATCH] convert regexps with x flag to js form --- tool/tmlanguage.js | 31 +++++++++++++++++++++++-------- tool/tmtheme.js | 38 +++++++++++++++++++------------------- 2 files changed, 42 insertions(+), 27 deletions(-) diff --git a/tool/tmlanguage.js b/tool/tmlanguage.js index 14a79854..6a6fcb03 100644 --- a/tool/tmlanguage.js +++ b/tool/tmlanguage.js @@ -82,6 +82,21 @@ function checkForLookBehind(str) { return lookbehindRegExp.test(str) ? str + " // ERROR: This contains a lookbehind, which JS does not support :(" : str; } +function removeXFlag(str) { + if (str.slice(0,4) == "(?x)") { + str = str.substr(4).replace(/\\[\s#]|\s+|(?:#[^\n]*)/g, function(s) { + return s[0] == "\\" ? s[1] : ""; + }); + } + return str; +} + +function transformRegExp(str) { + str = removeXFlag(str); + str = checkForLookBehind(str); + return str; +} + function assembleStateObjs(strState, pattern) { var patterns = pattern.patterns; var stateObj = {}; @@ -96,19 +111,19 @@ function assembleStateObjs(strState, pattern) { } else { stateObj.token = patterns[p].name; - stateObj.regex = checkForLookBehind(patterns[p].match); + stateObj.regex = transformRegExp(patterns[p].match); } statesObj[strState].push(stateObj); } stateObj = {}; stateObj.token = "TODO"; - stateObj.regex = checkForLookBehind(pattern.end); + stateObj.regex = transformRegExp(pattern.end); stateObj.next = "start"; } else { stateObj.token = "TODO"; - stateObj.regex = checkForLookBehind(pattern.end); + stateObj.regex = transformRegExp(pattern.end); stateObj.next = "start"; statesObj[strState].push(stateObj); @@ -132,7 +147,7 @@ function extractPatterns(patterns) { var stateObj = {}; if (pattern.comment) { - startState.start.push(" // " + pattern.comment); + startState.start.push(" // " + pattern.comment.trim()); } // it needs a state transition @@ -162,7 +177,7 @@ function extractPatterns(patterns) { statesObj[strState] = [ ]; statesObj[strState].push(assembleStateObjs(strState, pattern)); - tokenObj.regex = checkForLookBehind(pattern.begin); + tokenObj.regex = transformRegExp(pattern.begin); tokenObj.next = strState; } else if( ( pattern.begin || pattern.end ) && !( pattern.begin && pattern.end ) ) { @@ -172,12 +187,12 @@ function extractPatterns(patterns) { else if (pattern.captures) { tokenObj.token.push([]); tokenObj.token.push(pattern.captures); - tokenObj.regex = checkForLookBehind(pattern.match); + tokenObj.regex = transformRegExp(pattern.match); } else if (pattern.match) { tokenObj.token.push(pattern.name); - tokenObj.regex = checkForLookBehind(pattern.match); + tokenObj.regex = transformRegExp(pattern.match); } else if (pattern.include) { @@ -251,7 +266,7 @@ function convertLanguage(name) { var languageHighlightRules = fillTemplate(modeHighlightTemplate, { language: languageNameSanitized, languageTokens: patterns, - respositoryRules: "/*** START REPOSITORY RULES " + repository + "END REPOSITORY RULES ***/", + respositoryRules: "/*** START REPOSITORY RULES\n" + repository + "\nEND REPOSITORY RULES ***/", uuid: language.uuid }); diff --git a/tool/tmtheme.js b/tool/tmtheme.js index b7e31370..fca5453b 100755 --- a/tool/tmtheme.js +++ b/tool/tmtheme.js @@ -2,9 +2,9 @@ var fs = require("fs"); var parseString = require("plist").parseString; function parseTheme(themeXml, callback) { - parseString(themeXml, function(_, theme) { - callback(theme[0]) - }); + parseString(themeXml, function(_, theme) { + callback(theme[0]) + }); } var supportedScopes = { @@ -209,25 +209,25 @@ var themes = { function convertTheme(name) { console.log("Converting " + name); var tmTheme = fs.readFileSync(__dirname + "/tmthemes/" + themes[name] + ".tmTheme", "utf8"); - parseTheme(tmTheme, function(theme) { - var styles = extractStyles(theme); + parseTheme(tmTheme, function(theme) { + var styles = extractStyles(theme); - styles.cssClass = "ace-" + hyphenate(name); - styles.uuid = theme.uuid; - var css = fillTemplate(cssTemplate, styles); - css = css.replace(/[^\{\}]+{\s*}/g, ""); + styles.cssClass = "ace-" + hyphenate(name); + styles.uuid = theme.uuid; + var css = fillTemplate(cssTemplate, styles); + css = css.replace(/[^\{\}]+{\s*}/g, ""); - var js = fillTemplate(jsTemplate, { - name: name, - css: "require('ace/requirejs/text!./" + name + ".css')", // quoteString(css), // - cssClass: "ace-" + hyphenate(name), - isDark: styles.isDark - }); + var js = fillTemplate(jsTemplate, { + name: name, + css: "require('ace/requirejs/text!./" + name + ".css')", // quoteString(css), // + cssClass: "ace-" + hyphenate(name), + isDark: styles.isDark + }); - fs.writeFileSync(__dirname + "/../lib/ace/theme/" + name + ".js", js); - fs.writeFileSync(__dirname + "/../lib/ace/theme/" + name + ".css", css); - }) + fs.writeFileSync(__dirname + "/../lib/ace/theme/" + name + ".js", js); + fs.writeFileSync(__dirname + "/../lib/ace/theme/" + name + ".css", css); + }) } for (var name in themes) - convertTheme(name); \ No newline at end of file + convertTheme(name); \ No newline at end of file