tweak mode converter

This commit is contained in:
nightwing 2013-02-28 14:03:14 +04:00
commit 9ab5d50e0e

View file

@ -1,4 +1,4 @@
var fs = require("fs"); var fs = require("fs");
var util = require("util"); var util = require("util");
var lib = require("./lib"); var lib = require("./lib");
var parseLanguage = lib.parsePlist; var parseLanguage = lib.parsePlist;
@ -29,7 +29,7 @@ function processRepository(r) {
var stateObj = [processPattern(r[key])]; var stateObj = [processPattern(r[key])];
else if (p.patterns && !p.repository) else if (p.patterns && !p.repository)
var stateObj = processPatterns(p.patterns); var stateObj = processPatterns(p.patterns);
else else
var stateObj = [processPattern(r[key])]; var stateObj = [processPattern(r[key])];
if (stateObj) if (stateObj)
@ -46,12 +46,12 @@ function processPattern(p) {
} }
else if (p.begin && p.end) { else if (p.begin && p.end) {
var rule = simpleRule(p.begin, p.name, p.beginCaptures || p.captures) var rule = simpleRule(p.begin, p.name, p.beginCaptures || p.captures)
var next = processPatterns(p.patterns || []); var next = processPatterns(p.patterns || []);
var endRule = simpleRule(p.end, p.name, p.endCaptures || p.captures); var endRule = simpleRule(p.end, p.name, p.endCaptures || p.captures);
endRule.next = "pop"; endRule.next = "pop";
next.push(endRule); next.push(endRule);
if (p.name || p.contentName) if (p.name || p.contentName)
next.push({defaultToken: p.name || p.contentName}); next.push({defaultToken: p.name || p.contentName});
@ -63,7 +63,7 @@ function processPattern(p) {
else if (p.include) { else if (p.include) {
var rule = {include: p.include}; var rule = {include: p.include};
} }
if (p.comment) if (p.comment)
rule.comment = (rule.comment || "") + p.comment; rule.comment = (rule.comment || "") + p.comment;
@ -74,7 +74,8 @@ function processPattern(p) {
function simpleRule(regex, name, captures) { function simpleRule(regex, name, captures) {
name = name || "text"; name = name || "text";
var rule = {}; var rule = {};
var origRegex = regex
regex = transformRegExp(regex, rule); regex = transformRegExp(regex, rule);
if (captures) { if (captures) {
var tokenArray = []; var tokenArray = [];
@ -91,9 +92,10 @@ function simpleRule(regex, name, captures) {
rule.todo = "fix grouping"; rule.todo = "fix grouping";
} }
} }
try {new RegExp(regex);} catch(e) { try {new RegExp(regex);} catch(e) {
rule.TODO = "FIXME: regexp doesn't have js equivalent"; rule.TODO = "FIXME: regexp doesn't have js equivalent";
rule.originalRegex = origRegex
} }
rule.token = name; rule.token = name;
rule.regex = regex; rule.regex = regex;
@ -111,26 +113,29 @@ function removeXFlag(str) {
if (s[0] == "\\") if (s[0] == "\\")
return /[#\s]/.test(s[1]) ? s[1] : s; return /[#\s]/.test(s[1]) ? s[1] : s;
return ""; return "";
}); }).substr(4);
} }
return str; return str;
} }
function transformRegExp(str, rule) { function transformRegExp(str, rule) {
str = removeXFlag(str); str = removeXFlag(str);
//str = str.replace(/\\n\$|\$\\n/g, '$');
str = str.replace(/\\n(?!\?).?/g, '$'); // replace newlines by $ except if its postfixed by ? str = str.replace(/\\n(?!\?).?/g, '$'); // replace newlines by $ except if its postfixed by ?
if (/\(\?[i]\:/g.test(str)) { if (/\(\?[i]\:|\(?\w*i\w*\)/g.test(str)) {
str = str.replace(/\(\?[ims\-]\:/g, "(?:"); // checkForInvariantRegex str = str.replace(/\(\?[ims\-]\:/g, "(?:"); // checkForInvariantRegex
str = str.replace(/\(\?[imsx\-]\)/g, "");
rule && (rule.caseInsensitive = true); rule && (rule.caseInsensitive = true);
} }
str = str.replace(/(\\[xu]){([a-fA-F\d]+)}/g, '$1$2');
return str; return str;
} }
// //
function extractPatterns(tmRules) { function extractPatterns(tmRules) {
var patterns = processRules(tmRules); var patterns = processRules(tmRules);
return lib.restoreJSONComments(lib.formatJSON(patterns, " ")); return lib.restoreJSONComments(lib.formatJSON(patterns, " "));
} }
@ -140,21 +145,22 @@ var modeTemplate = fs.readFileSync(__dirname + "/mode.tmpl.js", "utf8");
var modeHighlightTemplate = fs.readFileSync(__dirname + "/mode_highlight_rules.tmpl.js", "utf8"); var modeHighlightTemplate = fs.readFileSync(__dirname + "/mode_highlight_rules.tmpl.js", "utf8");
function convertLanguageFile(name) { function convertLanguageFile(name) {
var tmLanguage = fs.readFileSync(process.cwd() + "/" + name, "utf8"); var path = /^(\/|\w:)/.test(name) ? name : process.cwd() + "/" + name
var tmLanguage = fs.readFileSync(path, "utf8");
parseLanguage(tmLanguage, function(language) { parseLanguage(tmLanguage, function(language) {
var languageHighlightFilename = language.name.replace(/[-_]/g, "").toLowerCase(); var languageHighlightFilename = language.name.replace(/[-_]/g, "").toLowerCase();
var languageNameSanitized = language.name.replace(/-/g, ""); var languageNameSanitized = language.name.replace(/-/g, "");
var languageHighlightFile = __dirname + "/../lib/ace/mode/" + languageHighlightFilename + "_highlight_rules.js"; var languageHighlightFile = __dirname + "/../lib/ace/mode/" + languageHighlightFilename + "_highlight_rules.js";
var languageModeFile = __dirname + "/../lib/ace/mode/" + languageHighlightFilename + ".js"; var languageModeFile = __dirname + "/../lib/ace/mode/" + languageHighlightFilename + ".js";
console.log("Converting " + name + " to " + languageHighlightFile); console.log("Converting " + name + " to " + languageHighlightFile);
if (devMode) { if (devMode) {
console.log(util.inspect(language.patterns, false, 4)); console.log(util.inspect(language.patterns, false, 4));
console.log(util.inspect(language.repository, false, 4)); console.log(util.inspect(language.repository, false, 4));
} }
var languageMode = lib.fillTemplate(modeTemplate, { var languageMode = lib.fillTemplate(modeTemplate, {
language: languageNameSanitized, language: languageNameSanitized,
languageHighlightFilename: languageHighlightFilename languageHighlightFilename: languageHighlightFilename