branch: externals/colorful-mode commit a92e2b5b9cf8310692317b618e747564bec28dbb Author: Elías Gabriel Pérez <eg642...@gmail.com> Commit: Elías Gabriel Pérez <eg642...@gmail.com>
Use jit-lock region positions for css color variables highlighting. * README.org (Disable colorful in regions): * colorful-mode.el (colorful--shorten-hex): Rename function... (colorful--short-hex): ... to this. (colorful--name-to-hex): Remove unnecessary computation. (colorful--get-css-variable-color): Convert macro to function. (colorful--colorize): Add optional argument. (colorful-mode-fontify-region): Add better case-insensitive colors detection. (colorful-color-name-font-lock-keywords): Remove lambda. --- README.org | 2 +- colorful-mode.el | 145 ++++++++++++++++++++++++++++++++----------------------- 2 files changed, 86 insertions(+), 61 deletions(-) diff --git a/README.org b/README.org index 71ef058a91..36b5cf763a 100644 --- a/README.org +++ b/README.org @@ -211,7 +211,7 @@ for you: ;; the region is. (dolist (ov (overlays-in beg end)) (when (overlay-get ov 'colorful--overlay) - (remove-overlays (overlay-start ov) (overlay-end ov) 'colorful--overlay t)))))) + (delete-overlay ov)))))) (add-hook 'deactivate-mark-hook (lambda () diff --git a/colorful-mode.el b/colorful-mode.el index 5f24c30884..bf2d72377d 100644 --- a/colorful-mode.el +++ b/colorful-mode.el @@ -257,11 +257,19 @@ Available functions are: "If non-nil, use a prefix to preview color instead of highlighting them." :type 'boolean) +;; (defcustom colorful-use-indicator nil +;; "If non-nil, use a string as indicator instead highlight. +;; :type 'boolean) + +;; (define-obsolete-variable-alias colorful-use-prefix colorful-use-indicator "1.3.0") + (defcustom colorful-prefix-string "●" "String to be used in highlights. Only relevant if `colorful-use-prefix' is non-nil." :type 'string) +;; (define-obsolete-variable-alias colorful-prefix-string colorful-indicator-string "1.3.0") + (defcustom colorful-prefix-alignment 'left "The position to place the prefix string. The value can be `left' or `right'. @@ -269,21 +277,30 @@ Only relevant if `colorful-use-prefix' is non-nil." :type '(choice (const :tag "Left" left) (const :tag "Right" right))) +;; (defcustom colorful-indicator-alignment 'left +;; "The position to place the indicator string. +;; The value can be `left' or `right'. +;; Only relevant if `colorful-use-prefix' is non-nil." +;; :type '(choice (const :tag "Left" left) +;; (const :tag "Right" right))) + +;; (define-obsolete-variable-alias colorful-prefix-alignment colorful-indicator-alignment "1.3.0") + (defcustom colorful-exclude-colors '("#define") "List of keywords not to highlight." :type '(repeat string)) -;; XXX: deprecate? (defcustom colorful-excluded-buffers nil "Do not activate colorful in these buffers. In case colorful breaks a buffer, such as a buffer derived from `help-mode', this option can be useful for you." :type '(repeat string)) +;; (make-obsolete-variable colorful-excluded-buffers nil "1.3.0") + (defcustom colorful-short-hex-conversions t - "If non-nil, hex values converted by colorful should be as short as possible. -Setting this to non-nil will make hex values follow a 24-bit -specification (#RRGGBB[AA]) and can make them inaccurate." + "If non-nil, colorful will converted long hex colors to \"#RRGGBB\" format. +Setting this to non-nil can make converted hex inaccurate." :type 'boolean) (defcustom colorful-only-strings nil @@ -313,10 +330,9 @@ If PERCENTAGE is above 100%, it is converted to 100." (/ (* (min (string-to-number percentage) 100) 255) 100) (string-to-number percentage))) -(defun colorful--shorten-hex (hex) - "Convert a 6-digit hexadecimal color representation to a 3-digit representation. -HEX should be a string in the format `#RRGGBB' (6-digit form). -If ALPHA is non-nil then use `#RRGGBBAA' format" +(defun colorful--short-hex (hex) + "Convert a 12-digit hexadecimal color form to a 6-digit form. +HEX should be a string in the format `#RRRRGGGGBBBB' (12-digit form)." (if colorful-short-hex-conversions (let ((r (substring hex 1 5)) (g (substring hex 5 9)) @@ -372,8 +388,8 @@ H must be a float not divided." (defun colorful--name-to-hex (name) "Return color NAME as hex color format." - (if-let* ((color-name (color-name-to-rgb name))) - (apply #'color-rgb-to-hex color-name) + (if (color-defined-p name) + name (cdr (assoc-string name colorful-html-colors-alist t)))) ;;;;; Overlay functions @@ -513,11 +529,11 @@ CHOICE is used for get kind of color." (pcase kind ('hex "%s is already a Hex color. Try again: ") ;; Is COLOR a Name? - ('color-name (list (colorful--shorten-hex color-value) beg end)) + ('color-name (list (colorful--short-hex color-value) beg end)) ;; Is COLOR a CSS rgb? - ('css-rgb (list (colorful--shorten-hex color-value) beg end)) + ('css-rgb (list (colorful--short-hex color-value) beg end)) ;; Is COLOR a HSL? - ('css-hsl (list (colorful--shorten-hex color-value) beg end)))) + ('css-hsl (list (colorful--short-hex color-value) beg end)))) ('name ; COLOR to NAME (pcase kind ('color-name "%s is already a color name. Try again: ") @@ -584,37 +600,41 @@ from `readable-foreground-color'." (:background ,color) (:inherit colorful-base))))))) -;; FIXME: SLOW? -(defmacro colorful--get-css-variable-color (regexp) - "Get CSS variable color value matching REGEXP from end to beginning. -REGEXP must have a group that contains the color value." - (declare (indent 1) (debug t)) - `(save-excursion - (goto-char (point-max)) - (when (re-search-backward ,regexp nil t) - ;; Get color value from colorful overlay. - ;; if not color value found, use the one from REGEXP 1st group. - (setq color (or (and (colorful--find-overlay (match-beginning 1)) ; Ensure overlay exists. - (overlay-get (colorful--find-overlay - (match-beginning 1)) - 'colorful--overlay-color)) - (match-string-no-properties 1)))))) +(defun colorful--get-css-variable-color (j-l-end regexp) + "Return CSS variable color value matching REGEXP from end to beginning. +REGEXP must have a group that contains the color value. +J-L-END is the position where jit-lock region ends." + (save-excursion + (goto-char j-l-end) + (when (re-search-backward regexp nil t) + ;; Get color value from colorful overlay. + ;; if not color value found, use the one from REGEXP 1st group. + (or (and (colorful--find-overlay (match-beginning 1)) ; Ensure overlay exists. + (overlay-get (colorful--find-overlay + (match-beginning 1)) + 'colorful--overlay-color)) + (match-string-no-properties 1))))) ;; NOTE: Modify this functions for handle new colors added to this package. -(defun colorful--colorize (kind color beg end) - "Helper function to colorize each KIND of MATCH with itself." +(defun colorful--colorize (kind color beg end &optional j-l-end) + "Helper function to colorize each KIND of MATCH with itself. +KIND is the color type. +COLOR is the string which contains the color matched. +BEG and END are color match positions. +J-L-END is the position where jit-lock region ends." (when-let* (;; Check if match isn't blacklisted and is not in a comment ... ((and (not (member color colorful-exclude-colors)) (not (nth 4 (syntax-ppss))) - ;; ... or is in a string ... - (or (and colorful-only-strings (nth 3 (syntax-ppss))) - ;; ... or current major-mode is not derived from prog-mode. + ;; ... and wheter color is in a string according colorful-only-strings... + (or (not colorful-only-strings) (and (eq colorful-only-strings 'only-prog) - ;; CSS is prog-mode derived so ignore only-strings - ;; in CSS derived modes. + (derived-mode-p 'prog-mode) + (nth 3 (syntax-ppss))) + ;; CSS is prog-mode derived so ignore only-strings + ;; in CSS derived modes. + (and colorful-only-strings (or (derived-mode-p 'css-mode) - (not (derived-mode-p 'prog-mode)))) - (not colorful-only-strings))))) + (nth 3 (syntax-ppss)))))))) (let* ((match-1 (match-string-no-properties 1)) (match-2 (match-string-no-properties 2)) @@ -670,18 +690,20 @@ REGEXP must have a group that contains the color value." (cond ((and (string= match-1 "@") (not (string= match-2 "define_color"))) - (colorful--get-css-variable-color - (rx (seq "@define_color" - (one-or-more space) - (literal match-2) - (one-or-more space) - (group (opt "#") (one-or-more alphanumeric)))))) + (setq color + (colorful--get-css-variable-color j-l-end + (rx (seq "@define_color" + (one-or-more space) + (literal match-2) + (one-or-more space) + (group (opt "#") (one-or-more alphanumeric))))))) ((string= match-1 "var") - (colorful--get-css-variable-color - (rx (seq (literal match-2) ":" (zero-or-more space) - (group (opt "#") (one-or-more alphanumeric))))))))) + (setq color + (colorful--get-css-variable-color j-l-end + (rx (seq (literal match-2) ":" (zero-or-more space) + (group (opt "#") (one-or-more alphanumeric)))))))))) - ;; Ensure that string is a valid color and that string is non-nil + ;; Ensure that COLOR is a valid color (if (and color (color-defined-p color)) (colorful--colorize-match color beg end kind))))) @@ -692,28 +714,31 @@ REGEXP must have a group that contains the color value." (setq end (progn (goto-char end) (line-end-position))) (save-excursion - (remove-overlays (or start (point-min)) (or end (point-max)) 'colorful--overlay t) + (remove-overlays start end 'colorful--overlay t) (dolist (el colorful-color-keywords) (let* ((keywords (car el)) (type (nth 1 el)) - (match (or (nth 2 el) 0))) + (match (or (nth 2 el) 0)) + (ignore-case (nth 3 el))) (goto-char start) (cond ((stringp keywords) (while (re-search-forward keywords end t) - (funcall #'colorful--colorize type (match-string-no-properties match) - (match-beginning match) (match-end match)))) - ((functionp keywords) - (while (funcall keywords end) - (funcall #'colorful--colorize type (match-string-no-properties match) - (match-beginning match) (match-end match))))))) + (colorful--colorize type (match-string-no-properties match) + (match-beginning match) (match-end match) + end))) + (ignore-case + (let ((case-fold-search t)) + (while (re-search-forward keywords end t) + (colorful--colorize type (match-string-no-properties match) + (match-beginning match) (match-end match)))))))) `(jit-lock-bounds ,start . ,end))) ;;;; Extra coloring definitions ;; Each element of these lists must be in the form: -;; (KEYWORDS TYPE MATCH) +;; (KEYWORDS TYPE MATCH IGNORE-CASE) ;; ;; KEYWORDS must be a regexp string which contains the keywords ;; to highlight @@ -722,6 +747,8 @@ REGEXP must have a group that contains the color value." ;; ;; MATCH is optional, must be a number which specifies the match to ;; use, if not set, it will use 0 instead. +;; +;; if IGNORE-CASE is non-nil, then match will be case-insensitive ;;; Hex (defvar colorful-hex-font-lock-keywords @@ -751,10 +778,8 @@ This is intended to be used with `colorful-extra-color-keyword-functions'." 'symbols)) (defvar colorful-color-name-font-lock-keywords - `((,(lambda (limit) - (let ((case-fold-search t)) - (re-search-forward colorful--color-names-regexp limit t))) - color-name)) + `((,colorful--color-names-regexp + color-name 0 t)) "Font-lock keywords to add color names.") (defun colorful-add-color-names ()