X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=common%2Fmodules%2Fhighlight.jsm;h=501edde272d2406b3f2043df60678caa0ce2f3e5;hb=247daf849abc85f4cfb10fa358c62c8daf8db95b;hp=35288942f54c24afb5b97cfa1e8b09a65fee63da;hpb=eeed0be1a8abf7e3c97f43b63c1d595e940fef21;p=dactyl.git diff --git a/common/modules/highlight.jsm b/common/modules/highlight.jsm index 3528894..501edde 100644 --- a/common/modules/highlight.jsm +++ b/common/modules/highlight.jsm @@ -1,15 +1,16 @@ -// Copyright (c) 2008-2011 by Kris Maglione +// Copyright (c) 2008-2014 Kris Maglione // // This work is licensed for reuse under an MIT license. Details are // given in the LICENSE.txt file included with this file. "use strict"; -Components.utils.import("resource://dactyl/bootstrap.jsm"); defineModule("highlight", { exports: ["Highlight", "Highlights", "highlight"], - require: ["services", "styles", "util"], - use: ["messages", "template"] -}, this); + require: ["services", "util"] +}); + +lazyRequire("styles", ["Styles", "styles"]); +lazyRequire("template", ["template"]); var Highlight = Struct("class", "selector", "sites", "defaultExtends", "defaultValue", @@ -33,6 +34,8 @@ Highlight.liveProperty = function (name, prop) { h.style.css = h.css; this.style[prop || name] = this[prop || name]; + if (this.onChange) + this.onChange(); }); } Highlight.liveProperty("agent"); @@ -54,22 +57,22 @@ Highlight.defaultValue("sites", function () Highlight.defaultValue("style", function () styles.system.add("highlight:" + this.class, this.sites, this.css, this.agent, true)); -Highlight.defaultValue("defaultExtends", function () []); -Highlight.defaultValue("defaultValue", function () ""); +Highlight.defaultValue("defaultExtends", () => []); +Highlight.defaultValue("defaultValue", () => ""); Highlight.defaultValue("extends", function () this.defaultExtends); Highlight.defaultValue("value", function () this.defaultValue); update(Highlight.prototype, { get base() this.baseClass != this.class && highlight.highlight[this.baseClass] || null, - get bases() array.compact(this.extends.map(function (name) highlight.get(name))), + get bases() array.compact(this.extends.map(name => highlight.get(name))), get inheritedCSS() { if (this.gettingCSS) return ""; try { this.gettingCSS = true; - return this.bases.map(function (b) b.cssText.replace(/;?\s*$/, "; ")).join(""); + return this.bases.map(b => b.cssText.replace(/;?\s*$/, "; ")).join(""); } finally { this.gettingCSS = false; @@ -97,10 +100,10 @@ var Highlights = Module("Highlight", { keys: function keys() Object.keys(this.highlight).sort(), - __iterator__: function () values(this.highlight).sort(function (a, b) String.localeCompare(a.class, b.class)) + __iterator__: function () values(this.highlight).sort((a, b) => String.localeCompare(a.class, b.class)) .iterValues(), - _create: function (agent, args) { + _create: function _create(agent, args) { let obj = Highlight.apply(Highlight, args); if (!isArray(obj.sites)) @@ -122,7 +125,7 @@ var Highlights = Module("Highlight", { if (/^[[>+: ]/.test(args[1])) obj.selector = this.selector(obj.class) + args[1]; else if (args[1]) - obj.selector = this.selector(args[1]); + obj.selector = this.selector(args[1].replace(/^,/, "")); if (old && old.value != old.defaultValue) obj.value = old.value; @@ -131,8 +134,12 @@ var Highlights = Module("Highlight", { obj.style.enabled = true; else this.loaded.__defineSetter__(obj.class, function () { - delete this[obj.class]; - this[obj.class] = true; + Object.defineProperty(this, obj.class, { + value: true, + configurable: true, + enumerable: true, + writable: true + }); if (obj.class === obj.baseClass) for (let h in highlight) @@ -143,14 +150,14 @@ var Highlights = Module("Highlight", { return obj; }, - get: function (k) this.highlight[k], + get: function get(k) this.highlight[k], - set: function (key, newStyle, force, append, extend) { + set: function set(key, newStyle, force, append, extend) { let [, class_, selectors] = key.match(/^([a-zA-Z_-]+)(.*)/); let highlight = this.highlight[key] || this._create(false, [key]); - let bases = extend || highlight.extend; + let bases = extend || highlight.extends; if (append) { newStyle = Styles.append(highlight.value || "", newStyle); bases = highlight.extends.concat(bases); @@ -181,7 +188,7 @@ var Highlights = Module("Highlight", { * Clears all highlighting rules. Rules with default values are * reset. */ - clear: function () { + clear: function clear() { for (let [k, v] in Iterator(this.highlight)) this.set(k, null, true); }, @@ -193,15 +200,15 @@ var Highlights = Module("Highlight", { * @param {Node} node * @param {string} group */ - highlightNode: function (node, group, applyBindings) { - node.setAttributeNS(NS.uri, "highlight", group); + highlightNode: function highlightNode(node, group, applyBindings) { + node.setAttributeNS(NS, "highlight", group); let groups = group.split(" "); - for each (let group in groups) + for (let group of groups) this.loaded[group] = true; if (applyBindings) - for each (let group in groups) { + for (let group of groups) { if (applyBindings.bindings && group in applyBindings.bindings) applyBindings.bindings[group](node, applyBindings); else if (group in template.bindings) @@ -214,21 +221,22 @@ var Highlights = Module("Highlight", { * * @param {string} class */ - selector: function (class_) - let (self = this) - class_.replace(/(^|[>\s])([A-Z][\w-]+)\b/g, - function (m, n1, hl) n1 + - (self.highlight[hl] && self.highlight[hl].class != class_ - ? self.highlight[hl].selector : "[dactyl|highlight~=" + hl + "]")), - - groupRegexp: util.regexp(\s])([A-Z][\w-]+)\b/g, + (m, n1, hl) => { + if (this.highlight[hl] && this.highlight[hl].class != class_) + return n1 + this.highlight[hl].selector; + return n1 + "[dactyl|highlight~=" + hl + "]"; + }), + + groupRegexp: util.regexp(literal(/* ^ (\s* (?:\S|\s\S)+ \s+) \{ ([^}]*) \} \s* $ - ]]>, "gmx"), - sheetRegexp: util.regexp( (?:[^;\s]|\s[^;\s])+ ) @@ -237,7 +245,8 @@ var Highlights = Module("Highlight", { (?:; (?P (?:[^;\s]|\s[^;\s])+ )? )? \s* (?P .*) $ - ]]>, "x"), + */), "x"), + // /** * Bulk loads new CSS rules, in the format of, @@ -270,14 +279,15 @@ var Highlights = Module("Highlight", { * If Star is provided, the style is applied as an agent sheet. * * The new styles are lazily activated unless Bang or *eager* is - * provided. See {@link Util#xmlToDom}. + * provided. * * @param {string} css The rules to load. See {@link Highlights#css}. * @param {boolean} eager When true, load all provided rules immediately. */ - loadCSS: function (css, eager) { - String.replace(css, this.groupRegexp, function (m, m1, m2) m1 + " " + m2.replace(/\n\s*/g, " ")) - .split("\n").filter(function (s) /\S/.test(s) && !/^\s*\/\//.test(s)) + loadCSS: function loadCSS(css, eager) { + String.replace(css, /\\\n/g, "") + .replace(this.groupRegexp, (m, m1, m2) => (m1 + " " + m2.replace(/\n\s*/g, " "))) + .split("\n").filter(s => (/\S/.test(s) && !/^\s*\/\//.test(s))) .forEach(function (highlight) { let bang = eager || /^\s*!/.test(highlight); @@ -291,7 +301,7 @@ var Highlights = Module("Highlight", { } }, { }, { - commands: function (dactyl, modules) { + commands: function initCommands(dactyl, modules) { const { autocommands, commands, completion, CommandOption, config, io } = modules; let lastScheme; @@ -318,7 +328,7 @@ var Highlights = Module("Highlight", { commands.add(["hi[ghlight]"], "Set the style of certain display elements", function (args) { - let style = ; + */); let clear = args[0] == "clear"; if (clear) args.shift(); @@ -337,7 +347,7 @@ var Highlights = Module("Highlight", { if (!modify && /&$/.test(key)) [clear, modify, key] = [true, true, key.replace(/&$/, "")]; - dactyl.assert(!(clear && css), _("error.trailing")); + dactyl.assert(!(clear && css), _("error.trailingCharacters")); if (!modify) modules.commandline.commandOutput( @@ -345,11 +355,13 @@ var Highlights = Module("Highlight", { ["padding: 0 1em 0 0; vertical-align: top; max-width: 16em; overflow: hidden;", "text-align: center"], ([h.class, - XXX, - template.map(h.extends, template.highlight), - template.highlightRegexp(h.value, /\b[-\w]+(?=:)/g)] - for (h in highlight) - if (!key || h.class.indexOf(key) > -1)))); + ["span", { style: "text-align: center; line-height: 1em;" + h.value + style }, "XXX"], + template.map(h.extends, s => template.highlight(s), ","), + template.highlightRegexp(h.value, /\b[-\w]+(?=:)|\/\*.*?\*\//g, + match => ["span", { highlight: match[0] == "/" ? "Comment" : "Key" }, match]) + ] + for (h in highlight) + if (!key || h.class.indexOf(key) > -1)))); else if (!key && clear) highlight.clear(); else if (key) @@ -369,7 +381,10 @@ var Highlights = Module("Highlight", { else if (args.completeArg == 1) { let hl = highlight.get(args[0]); if (hl) - context.completions = [[hl.value, "Current Value"], [hl.defaultValue || "", "Default Value"]]; + context.completions = [ + [hl.value, _("option.currentValue")], + [hl.defaultValue || "", _("option.defaultValue")] + ]; context.fork("css", 0, completion, "css"); } }, @@ -384,9 +399,9 @@ var Highlights = Module("Highlight", { completer: function (context, args) { let group = args[0] && highlight.get(args[0]); if (group) - context.fork("extra", 0, this, function (context) [ - [String(group.extends), "Current Value"], - [String(group.defaultExtends) || "", "Default Value"] + context.fork("extra", 0, this, context => [ + [String(group.extends), _("option.currentValue")], + [String(group.defaultExtends) || "", _("option.defaultValue")] ]); context.fork("groups", 0, completion, "highlightGroup"); } @@ -396,24 +411,33 @@ var Highlights = Module("Highlight", { { command: this.name, arguments: [v.class], - literalArg: v.value + literalArg: v.value, + options: { + "-link": v.extends.length ? v.extends : undefined + } } for (v in Iterator(highlight)) if (v.value != v.defaultValue) ] }); }, - completion: function (dactyl, modules) { + completion: function initCompletion(dactyl, modules) { const { completion, config, io } = modules; + completion.colorScheme = function colorScheme(context) { let extRe = RegExp("\\." + config.fileExtension + "$"); context.title = ["Color Scheme", "Runtime Path"]; - context.keys = { text: function (f) f.leafName.replace(extRe, ""), description: ".parent.path" }; - context.completions = array.flatten( - io.getRuntimeDirectories("colors").map( - function (dir) dir.readDirectory().filter( - function (file) extRe.test(file.leafName)))); + context.keys = { text: f => f.leafName.replace(extRe, ""), + description: ".parent.path" }; + context.completions = + array.flatten( + io.getRuntimeDirectories("colors").map( + dir => dir.readDirectory() + .filter(file => extRe.test(file.leafName)))) + .concat([ + { leafName: "default", parent: { path: /*L*/"Revert to builtin colorscheme" } } + ]); }; @@ -422,11 +446,11 @@ var Highlights = Module("Highlight", { context.completions = [[v.class, v.value] for (v in highlight)]; }; }, - javascript: function (dactyl, modules, window) { - modules.JavaScript.setCompleter(["get", "set"].map(function (m) highlight[m]), - [ function (context, obj, args) Iterator(highlight.highlight) ]); - modules.JavaScript.setCompleter(["highlightNode"].map(function (m) highlight[m]), - [ null, function (context, obj, args) Iterator(highlight.highlight) ]); + javascript: function initJavascript(dactyl, modules, window) { + modules.JavaScript.setCompleter(["get", "set"].map(m => highlight[m]), + [ (context, obj, args) => Iterator(highlight.highlight) ]); + modules.JavaScript.setCompleter(["highlightNode"].map(m => highlight[m]), + [ null, (context, obj, args) => Iterator(highlight.highlight) ]); } }); @@ -434,4 +458,4 @@ var Highlights = Module("Highlight", { endModule(); -// vim: set fdm=marker sw=4 ts=4 et ft=javascript: +// vim: set fdm=marker sw=4 sts=4 ts=8 et ft=javascript: