branch: master commit c81c3fd9370b0f758637370e4078fdbf769271d8 Author: Jackson Ray Hamilton <jack...@jacksonrayhamilton.com> Commit: Jackson Ray Hamilton <jack...@jacksonrayhamilton.com>
Make declarations bold. --- bin/cli.js | 2 +- context-coloring.el | 46 ++++++++++++++++++++++++++++++++++++++++++---- scopifier.js | 20 ++++++++++++++------ test/fixtures/monad.js | 47 +++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 104 insertions(+), 11 deletions(-) diff --git a/bin/cli.js b/bin/cli.js index 9fdea5c..721dae0 100644 --- a/bin/cli.js +++ b/bin/cli.js @@ -4,7 +4,7 @@ 'use strict'; -var scopifier = require('../scopifier-microoptimized'), +var scopifier = require('../scopifier'), whole = ''; process.stdin.setEncoding('utf8'); diff --git a/context-coloring.el b/context-coloring.el index 436cf4a..018a94e 100644 --- a/context-coloring.el +++ b/context-coloring.el @@ -42,8 +42,9 @@ ;;; Faces (defface context-coloring-depth--1-face - '((((background light)) (:foreground "#7f7f7f" :slant italic)) - (((background dark)) (:foreground "#7f7f7f" :slant italic))) + '((default (:slant italic)) + (((background light)) (:foreground "#7f7f7f")) + (((background dark)) (:foreground "#7f7f7f"))) "Nested blocks face, depth -1; comments." :group 'context-coloring-faces) @@ -93,10 +94,45 @@ "Number of faces defined for highlighting delimiter levels. Determines depth at which to cycle through faces again.") +(defface context-coloring-depth-0-bold-face + '((default (:inherit context-coloring-depth-0-face :weight bold))) + "Nested blocks face, depth 0; bold; global scope." + :group 'context-coloring-faces) + +(defface context-coloring-depth-1-bold-face + '((default (:inherit context-coloring-depth-1-face :weight bold))) + "Nested blocks face, depth 1; bold; global scope." + :group 'context-coloring-faces) + +(defface context-coloring-depth-2-bold-face + '((default (:inherit context-coloring-depth-2-face :weight bold))) + "Nested blocks face, depth 2; bold; global scope." + :group 'context-coloring-faces) + +(defface context-coloring-depth-3-bold-face + '((default (:inherit context-coloring-depth-3-face :weight bold))) + "Nested blocks face, depth 3; bold; global scope." + :group 'context-coloring-faces) + +(defface context-coloring-depth-4-bold-face + '((default (:inherit context-coloring-depth-4-face :weight bold))) + "Nested blocks face, depth 4; bold; global scope." + :group 'context-coloring-faces) + +(defface context-coloring-depth-5-bold-face + '((default (:inherit context-coloring-depth-5-face :weight bold))) + "Nested blocks face, depth 5; bold; global scope." + :group 'context-coloring-faces) + +(defface context-coloring-depth-6-bold-face + '((default (:inherit context-coloring-depth-6-face :weight bold))) + "Nested blocks face, depth 6; bold; global scope." + :group 'context-coloring-faces) + ;;; Face utility functions -(defun context-coloring-level-face (depth) +(defun context-coloring-level-face (depth style) "Return face-name for DEPTH as a string \"context-coloring-depth-DEPTH-face\". For example: \"context-coloring-depth-1-face\"." (intern-soft @@ -111,6 +147,8 @@ For example: \"context-coloring-depth-1-face\"." (+ 1 (mod (- depth 1) (- context-coloring-face-count 1))))) + (cond ((= 1 style) "-bold") + (t "")) "-face"))) @@ -143,7 +181,7 @@ For example: \"context-coloring-depth-1-face\"." (len (length tokens))) (while (< i len) (let ((token (elt tokens i))) - (let ((face (context-coloring-level-face (elt token 0))) + (let ((face (context-coloring-level-face (elt token 0) (elt token 3))) (start (elt token 1)) (end (elt token 2))) (add-text-properties start end `(face ,face rear-nonsticky t)))) diff --git a/scopifier.js b/scopifier.js index c1ccff2..7e4c64e 100644 --- a/scopifier.js +++ b/scopifier.js @@ -12,7 +12,10 @@ var escope = require('escope'), return definition[1] === range[0] && definition[2] === range[1]; }); - }; + }, + + normal = 0, + bold = 1; // Given code, returns an array of `[level, start, end]' tokens for // context-coloring. @@ -62,7 +65,8 @@ module.exports = function (code) { scopes = scopes.concat([[ scope.level, scope.block.range[0], - scope.block.range[1] + scope.block.range[1], + normal ]]); definitions = scope.variables.reduce(function (definitions, variable) { var mappedDefinitions = variable.defs.map(function (definition) { @@ -70,7 +74,8 @@ module.exports = function (code) { return [ scope.level, range[0], - range[1] + range[1], + bold ]; }); return definitions.concat(mappedDefinitions); @@ -84,7 +89,8 @@ module.exports = function (code) { // Handle global references too. reference.resolved ? reference.resolved.scope.level : 0, range[0], - range[1] + range[1], + normal ]]); }, []); symbols = symbols.concat(definitions).concat(references); @@ -96,7 +102,8 @@ module.exports = function (code) { return [ -1, range[0], - range[1] + range[1], + normal ]; }); @@ -108,7 +115,8 @@ module.exports = function (code) { return [ token[0], token[1] + 1, - token[2] + 1 + token[2] + 1, + token[3] ]; }); diff --git a/test/fixtures/monad.js b/test/fixtures/monad.js new file mode 100644 index 0000000..cd625db --- /dev/null +++ b/test/fixtures/monad.js @@ -0,0 +1,47 @@ +// The MONAD function is a macroid that produces monad constructor functions. +// It can take an optional modifier function, which is a function that is +// allowed to modify new monads at the end of the construction processes. + +// A monad constructor (sometimes called 'unit' or 'return' in some mythologies) +// comes with three methods, lift, lift_value, and method, all of which can add +// methods and properties to the monad's prototype. + +// A monad has a 'bind' method that takes a function that receives a value and +// is usually expected to return a monad. + +function MONAD(modifier) { + 'use strict'; + var prototype = Object.create(null); + prototype.is_monad = true; + function unit(value) { + var monad = Object.create(prototype); + monad.bind = function (func, args) { + return func.apply( + undefined, + [value].concat(Array.prototype.slice.apply(args || [])) + ); + }; + if (typeof modifier === 'function') { + value = modifier(monad, value); + } + return monad; + } + unit.method = function (name, func) { + prototype[name] = func; + return unit; + }; + unit.lift_value = function (name, func) { + prototype[name] = function () { + return this.bind(func, arguments); + }; + return unit; + }; + unit.lift = function (name, func) { + prototype[name] = function () { + var result = this.bind(func, arguments); + return result && result.is_monad === true ? result : unit(result); + }; + return unit; + }; + return unit; +}