[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[elpa] master d885920 231/271: Merge branch 'feature/comments-and-string
From: |
Jackson Ray Hamilton |
Subject: |
[elpa] master d885920 231/271: Merge branch 'feature/comments-and-strings' into develop |
Date: |
Thu, 05 Feb 2015 18:31:30 +0000 |
branch: master
commit d8859208d5ef9b2cf7734d601edf937e45b098a9
Merge: 127b312 ef461da
Author: Jackson Ray Hamilton <address@hidden>
Commit: Jackson Ray Hamilton <address@hidden>
Merge branch 'feature/comments-and-strings' into develop
---
README.md | 32 +++++-------
context-coloring.el | 23 +++++----
languages/javascript/scopifier.js | 12 ----
scopifier.png | Bin 2516 -> 2609 bytes
screenshot.png | Bin 21829 -> 22006 bytes
test/context-coloring-test.el | 96 +++++++++++++++++++++++++-------
test/fixtures/comments-and-strings.js | 3 +
7 files changed, 104 insertions(+), 62 deletions(-)
diff --git a/README.md b/README.md
index b2e2c57..bb53dde 100644
--- a/README.md
+++ b/README.md
@@ -9,20 +9,21 @@ Highlights code according to function context.
- Code in the global scope is one color. Code in functions within the global
scope is a different color, and code within such functions is another color,
and so on.
-- Identifiers retain the color of the scope in which they were declared.
-- Comments are a neutral color.
+- Identifiers retain the color of the scope in which they are declared.
Lexical scope information at-a-glance can assist a programmer in understanding
-the overall structure of a program. It can also help curb nasty bugs like name
-shadowing or unexpected assignment. A rainbow can indicate excessive
-complexity. A spot of contrast followed by an assignment expression could be a
-side-effect. The state of a closure could be undergoing change.
+the overall structure of a program. It can help to curb nasty bugs like name
+shadowing. A rainbow can indicate excessive complexity. State change within a
+closure is easily monitored.
-This coloring strategy is probably more useful than conventional *syntax*
-highlighting. Highlighting keywords can help one to detect spelling errors, and
-highlighting the content between quotation marks can alert one to unclosed
-string literals. But a [linter][] could also spot those errors, and if
-integrated via [flycheck][], an extra spot opens up in your editing toolbelt.
+By default, Context Coloring still highlights comments and strings
+syntactically. It is still easy to differentiate code from non-code, and
strings
+cannot be confused for variables.
+
+This coloring strategy is probably more useful than conventional syntax
+highlighting. Highlighting keywords can help one to detect spelling errors, but
+a [linter][] could also spot those errors, and if integrated with [flycheck][],
+an extra spot opens up in your editing toolbelt.
Give context coloring a try; you may find that it *changes the way you write
code*.
@@ -31,14 +32,7 @@ code*.
- Supported languages: JavaScript
- Light and dark (customizable) color schemes.
-- Insanely fast for regular files, quick for big ones too.
- - jQuery (9191 lines): 0.20 seconds (js2-mode), 0.57 seconds (js-mode)
- - Lodash (6786 lines): 0.07 seconds (js2-mode), 0.35 seconds (js-mode)
- - Async (1124 lines): 0.03 seconds (js2-mode), 0.17 seconds (js-mode)
- - mkdirp (98 lines): 0.002 seconds (js2-mode), 0.09 seconds (js-mode)
-
-\* js2-mode parses idly, irrespective of this plugin; its benchmarks represent
-coloring only. js-mode benchmarks represent parsing and coloring.
+- Very fast for files under 1000 lines.
## Usage
diff --git a/context-coloring.el b/context-coloring.el
index 88660e0..d0579d1 100644
--- a/context-coloring.el
+++ b/context-coloring.el
@@ -51,6 +51,10 @@ Increase this if your machine is high-performing. Decrease
it if it ain't.
Supported modes: `js-mode', `js3-mode'"
:group 'context-coloring)
+(defcustom context-coloring-comments-and-strings t
+ "If non-nil, also color comments and strings using `font-lock'."
+ :group 'context-coloring)
+
(defcustom context-coloring-js-block-scopes nil
"If non-nil, also color block scopes in the scope hierarchy in JavaScript.
@@ -97,7 +101,6 @@ used.")
,doc
:group 'context-coloring)))
-(context-coloring-defface -1 "white" "#7f7f7f" "#7f7f7f")
(context-coloring-defface 0 "white" "#000000" "#ffffff")
(context-coloring-defface 1 "yellow" "#007f80" "#ffff80")
(context-coloring-defface 2 "green" "#001580" "#cdfacd")
@@ -139,9 +142,6 @@ Determines level at which to cycle through faces again."
(dolist (pair pairs)
(let ((level (car pair))
(color (cdr pair)))
- (cond
- ((eq level 'comment)
- (setq level -1)))
(set-face-foreground (context-coloring-face-symbol level) color))))
(defsubst context-coloring-level-face (level)
@@ -159,6 +159,11 @@ END (exclusive) with the face corresponding to LEVEL."
end
`(face ,(context-coloring-level-face level))))
+(defsubst context-coloring-maybe-colorize-comments-and-strings ()
+ (when context-coloring-comments-and-strings
+ (save-excursion
+ (font-lock-fontify-syntactically-region (point-min) (point-max)))))
+
;;; js2-mode colorization
@@ -216,10 +221,6 @@ generated by js2-mode."
(lambda (node end-p)
(when (null end-p)
(cond
- ((js2-comment-node-p node)
- (context-coloring-js2-colorize-node
- node
- -1))
((js2-scope-p node)
(context-coloring-js2-colorize-node
node
@@ -238,7 +239,8 @@ generated by js2-mode."
node
(context-coloring-js2-scope-level defining-scope))))))
;; The `t' indicates to search children.
- t)))))
+ t)))
+ (context-coloring-maybe-colorize-comments-and-strings)))
;;; Shell command scopification / colorization
@@ -256,7 +258,8 @@ level. The vector is flat, with a new token occurring after
every
(elt tokens i)
(elt tokens (+ i 1))
(elt tokens (+ i 2)))
- (setq i (+ i 3))))))
+ (setq i (+ i 3))))
+ (context-coloring-maybe-colorize-comments-and-strings)))
(defun context-coloring-parse-array (input)
"Specialized JSON parser for a flat array of numbers."
diff --git a/languages/javascript/scopifier.js
b/languages/javascript/scopifier.js
index 6b46392..0171ab2 100644
--- a/languages/javascript/scopifier.js
+++ b/languages/javascript/scopifier.js
@@ -11,7 +11,6 @@ function scopifier(code) {
var analyzedScopes,
ast,
- comment,
definition,
definitionsCount,
definitionsIndex,
@@ -30,7 +29,6 @@ function scopifier(code) {
// Gracefully handle parse errors by doing nothing.
try {
ast = esprima.parse(code, {
- comment: true,
range: true
});
analyzedScopes = escope.analyze(ast).scopes;
@@ -109,16 +107,6 @@ function scopifier(code) {
}
}
- for (i = 0; i < ast.comments.length; i += 1) {
- comment = ast.comments[i];
- range = comment.range;
- tokens.push(
- range[0] + 1,
- range[1] + 1,
- -1
- );
- }
-
return scopes.concat(tokens);
}
diff --git a/scopifier.png b/scopifier.png
index 1d690cb..1ec5d10 100644
Binary files a/scopifier.png and b/scopifier.png differ
diff --git a/screenshot.png b/screenshot.png
index fe45d9b..89665b7 100644
Binary files a/screenshot.png and b/screenshot.png differ
diff --git a/test/context-coloring-test.el b/test/context-coloring-test.el
index 52a93fb..64ed6e4 100644
--- a/test/context-coloring-test.el
+++ b/test/context-coloring-test.el
@@ -14,7 +14,11 @@
(defun context-coloring-test-read-file (path)
(get-string-from-file (context-coloring-test-resolve-path path)))
+(defun context-coloring-test-setup ()
+ (setq context-coloring-comments-and-strings nil))
+
(defun context-coloring-test-cleanup ()
+ (setq context-coloring-comments-and-strings t)
(setq context-coloring-after-colorize-hook nil)
(setq context-coloring-js-block-scopes nil))
@@ -24,6 +28,7 @@ FIXTURE."
`(with-temp-buffer
(unwind-protect
(progn
+ (context-coloring-test-setup)
(insert (context-coloring-test-read-file ,fixture))
,@body)
(context-coloring-test-cleanup))))
@@ -43,12 +48,15 @@ is done."
(kill-buffer temp-buffer))
(set-buffer previous-buffer))))))
-(defun context-coloring-test-with-fixture-async (fixture callback)
+(defun context-coloring-test-with-fixture-async (fixture callback &optional
setup)
"Evaluate CALLBACK in a temporary buffer with the relative
FIXTURE. A teardown callback is passed to CALLBACK for it to
-invoke when it is done."
+invoke when it is done. An optional SETUP callback can be passed
+to run arbitrary code before the mode is invoked."
(context-coloring-test-with-temp-buffer-async
(lambda (done-with-temp-buffer)
+ (context-coloring-test-setup)
+ (if setup (funcall setup))
(insert (context-coloring-test-read-file fixture))
(funcall
callback
@@ -56,7 +64,7 @@ invoke when it is done."
(context-coloring-test-cleanup)
(funcall done-with-temp-buffer))))))
-(defun context-coloring-test-js-mode (fixture callback)
+(defun context-coloring-test-js-mode (fixture callback &optional setup)
(context-coloring-test-with-fixture-async
fixture
(lambda (done-with-test)
@@ -64,7 +72,8 @@ invoke when it is done."
(context-coloring-mode)
(context-coloring-colorize
(lambda ()
- (funcall callback done-with-test))))))
+ (funcall callback done-with-test))))
+ setup))
(defmacro context-coloring-test-js2-mode (fixture &rest body)
`(context-coloring-test-with-fixture
@@ -76,27 +85,46 @@ invoke when it is done."
(context-coloring-mode)
,@body))
+(defmacro context-coloring-test-assert-region (&rest body)
+ `(let ((i 0)
+ (length (- end start)))
+ (while (< i length)
+ (let* ((point (+ i start))
+ (face (get-text-property point 'face))
+ actual-level)
+ ,@body)
+ (setq i (+ i 1)))))
+
(defconst context-coloring-test-level-regexp
"context-coloring-level-\\([[:digit:]]+\\)-face")
(defun context-coloring-test-assert-region-level (start end level)
- (let ((i 0)
- (length (- end start)))
- (while (< i length)
- (let* ((point (+ i start))
- (face (get-text-property point 'face))
- actual-level)
- (when (not (when face
- (let* ((face-string (symbol-name face))
- (matches (string-match
context-coloring-test-level-regexp face-string)))
- (when matches
- (setq actual-level (string-to-number (substring
face-string
-
(match-beginning 1)
-
(match-end 1))))
- (= level actual-level)))))
- (ert-fail (format "Expected level in region [%s, %s), which is
\"%s\", to be %s; but at point %s, it was %s"
- start end (buffer-substring-no-properties start
end) level point actual-level))))
- (setq i (+ i 1)))))
+ (context-coloring-test-assert-region
+ (when (not (when face
+ (let* ((face-string (symbol-name face))
+ (matches (string-match
context-coloring-test-level-regexp face-string)))
+ (when matches
+ (setq actual-level (string-to-number (substring face-string
+
(match-beginning 1)
+ (match-end
1))))
+ (= level actual-level)))))
+ (ert-fail (format "Expected level in region [%s, %s), which is \"%s\", to
be %s; but at point %s, it was %s"
+ start end (buffer-substring-no-properties start end)
level point actual-level)))))
+
+(defun context-coloring-test-assert-region-face (start end expected-face)
+ (context-coloring-test-assert-region
+ (when (not (eq face expected-face))
+ (ert-fail (format "Expected face in region [%s, %s), which is \"%s\", to
be %s; but at point %s, it was %s"
+ start end (buffer-substring-no-properties start end)
expected-face point face)))))
+
+(defun context-coloring-test-assert-region-comment-delimiter (start end)
+ (context-coloring-test-assert-region-face start end
'font-lock-comment-delimiter-face))
+
+(defun context-coloring-test-assert-region-comment (start end)
+ (context-coloring-test-assert-region-face start end 'font-lock-comment-face))
+
+(defun context-coloring-test-assert-region-string (start end)
+ (context-coloring-test-assert-region-face start end 'font-lock-string-face))
(defun context-coloring-test-assert-message (expected)
(with-current-buffer "*Messages*"
@@ -252,4 +280,30 @@ invoke when it is done."
"./fixtures/key-values.js"
(context-coloring-test-js-key-values)))
+(defun context-coloring-test-js-comments-and-strings ()
+ (context-coloring-test-assert-region-comment-delimiter 1 4)
+ (context-coloring-test-assert-region-comment 4 8)
+ (context-coloring-test-assert-region-comment-delimiter 9 12)
+ (context-coloring-test-assert-region-comment 12 19)
+ (context-coloring-test-assert-region-string 20 32)
+ (context-coloring-test-assert-region-level 32 33 0))
+
+(ert-deftest-async context-coloring-test-js-mode-comments-and-strings (done)
+ (context-coloring-test-js-mode
+ "./fixtures/comments-and-strings.js"
+ (lambda (teardown)
+ (unwind-protect
+ (context-coloring-test-js-comments-and-strings)
+ (funcall teardown))
+ (funcall done))
+ (lambda ()
+ (setq context-coloring-comments-and-strings t))))
+
+(ert-deftest context-coloring-test-js2-mode-comments-and-strings ()
+ (context-coloring-test-js2-mode
+ "./fixtures/comments-and-strings.js"
+ (setq context-coloring-comments-and-strings t)
+ (context-coloring-colorize)
+ (context-coloring-test-js-comments-and-strings)))
+
(provide 'context-coloring-test)
diff --git a/test/fixtures/comments-and-strings.js
b/test/fixtures/comments-and-strings.js
new file mode 100644
index 0000000..9910b02
--- /dev/null
+++ b/test/fixtures/comments-and-strings.js
@@ -0,0 +1,3 @@
+// Foo.
+/* Bar. */
+'use strict';
- [elpa] master d157167 258/271: Strip headers. Use make dependencies., (continued)
- [elpa] master d157167 258/271: Strip headers. Use make dependencies., Jackson Ray Hamilton, 2015/02/05
- [elpa] master 63e2590 207/271: Merge branch 'develop', Jackson Ray Hamilton, 2015/02/05
- [elpa] master d4ddaa6 160/271: Use edge js2-mode., Jackson Ray Hamilton, 2015/02/05
- [elpa] master ef461da 230/271: Stop maintaining benchmarks in readme., Jackson Ray Hamilton, 2015/02/05
- [elpa] master 5e46686 173/271: Remove JS tests and benchmarks. Remove color schemer., Jackson Ray Hamilton, 2015/02/05
- [elpa] master f9c3de8 252/271: Version 3.1.1., Jackson Ray Hamilton, 2015/02/05
- [elpa] master f2b5d79 264/271: Remove unnecessary .elpaignore., Jackson Ray Hamilton, 2015/02/05
- [elpa] master 75f6705 251/271: Fix on Windows., Jackson Ray Hamilton, 2015/02/05
- [elpa] master 8665ff3 233/271: Simplify `context-coloring-set-colors'., Jackson Ray Hamilton, 2015/02/05
- [elpa] master eaece82 263/271: Version 4.0.0., Jackson Ray Hamilton, 2015/02/05
- [elpa] master d885920 231/271: Merge branch 'feature/comments-and-strings' into develop,
Jackson Ray Hamilton <=
- [elpa] master 96da8de 219/271: Merge branch 'master' into develop, Jackson Ray Hamilton, 2015/02/05
- [elpa] master c947690 238/271: Documentation. Cleanup. Copyright notices., Jackson Ray Hamilton, 2015/02/05
- [elpa] master 68824f6 193/271: Add failing test for key names., Jackson Ray Hamilton, 2015/02/05
- [elpa] master 784910c 266/271: externals-list: Add context-coloring, Jackson Ray Hamilton, 2015/02/05
- [elpa] master 079a5a8 237/271: Document tests., Jackson Ray Hamilton, 2015/02/05
- [elpa] master 5c8855f 212/271: Merge branch 'feature/key-values' into develop, Jackson Ray Hamilton, 2015/02/05
- [elpa] master 3944181 223/271: Renames. Cleanup., Jackson Ray Hamilton, 2015/02/05
- [elpa] master 1f06301 198/271: Pass property lookup test., Jackson Ray Hamilton, 2015/02/05
- [elpa] master f836bd2 141/271: Add js2-mode test., Jackson Ray Hamilton, 2015/02/05
- [elpa] master 32aacc9 216/271: Add customization interface., Jackson Ray Hamilton, 2015/02/05