branch: externals/colorful-mode commit dd2de311d8d710e174bc502065b912dbc37528ec Author: Elias G. B. Perez <eg642...@gmail.com> Commit: Elias G. B. Perez <eg642...@gmail.com>
Add experimental support for HTML color names. * colorful-mode.el: (colorful-hex-font-lock-keywords) (colorful-add-hex-colors): Separate hex keyword into a separated function and variable. (colorful-color-name-font-lock-keywords): Add some missing colors names. * README.org: Update changes. --- README.org | 18 +++-- colorful-mode.el | 204 +++++++++++++++++++++++++++++++------------------------ 2 files changed, 125 insertions(+), 97 deletions(-) diff --git a/README.org b/README.org index 2b204078ae..71e1ecdbf7 100644 --- a/README.org +++ b/README.org @@ -54,8 +54,10 @@ in real time and in a user friendly way based on 🌈[[https://elpa.gnu.org/pack Only relevant if `colorful-use-prefix' is non-nil. - =colorful-extra-color-keyword-functions= default: - '((emacs-lisp-mode . (colorful-add-color-names colorful-add-rgb-colors)) - ((css-mode css-ts-mode) . colorful-add-rgb-colors)) + '((emacs-lisp-mode . colorful-add-color-names) + ((mhtml-mode html-ts-mode css-mode css-ts-mode) + . (colorful-add-rgb-colors colorful-add-hsl-colors colorful-add-color-names)) + colorful-add-hex-colors) List of functions to add extra color keywords to colorful-color-keywords. It can be a cons cell specifing the mode (or a list of modes) @@ -73,6 +75,7 @@ in real time and in a user friendly way based on 🌈[[https://elpa.gnu.org/pack colorful-add-rgb-colors) Available functions are: + + colorful-add-hex-colors. + colorful-add-color-names. + colorful-add-rgb-colors. + colorful-add-hsl-colors. @@ -108,9 +111,10 @@ These key bindings are defined by: =colorful-mode-map= Colorful by default provides extra functions that highlight additional colors: -- =colorful-add-color-names= Add emacs color names to colorful-color-keywords. -- =colorful-add-rgb-colors= Add CSS RGB colors to colorful-color-keywords. -- =colorful-add-hsl-colors= Add CSS HSL colors to ‘colorful-color-keywords’. +- =colorful-add-hex-colors= Add Hexadecimal Colors. +- =colorful-add-color-names= Add color names. +- =colorful-add-rgb-colors= Add CSS RGB colors. +- =colorful-add-hsl-colors= Add CSS HSL colors. For use them add it to: #+begin_src emacs-lisp @@ -190,5 +194,5 @@ this package, However I would like if someone would be able to be the mantainer (if you are interested please email me <eg642...@gmail.com>). -#+html: <img src="https://raw.githubusercontent.com/DevelopmentCool2449/emacs-svg-badges/main/powered_by_emacs.svg" align="left" width="10%"> -#+html: <img src="https://raw.githubusercontent.com/DevelopmentCool2449/emacs-svg-badges/main/powered_by_org_mode.svg" align="center" width="10%"> +#+html: <img src="https://raw.githubusercontent.com/DevelopmentCool2449/emacs-svg-badges/main/powered_by_emacs.svg" align="left" width="10%" alt="Powered by GNU Emacs"> +#+html: <img src="https://raw.githubusercontent.com/DevelopmentCool2449/emacs-svg-badges/main/powered_by_org_mode.svg" align="right" width="10%" alt="Powered by Org Mode"> diff --git a/colorful-mode.el b/colorful-mode.el index 3e56ce7b75..1487a119a1 100644 --- a/colorful-mode.el +++ b/colorful-mode.el @@ -3,11 +3,11 @@ ;; Copyright (C) 2024 Elias G.B. Perez ;; Author: Elias G.B. Perez <eg642...@gmail.com> -;; Maintainer: Elias G.B. Perez <eg642...@gmail.com> -;; Created: 2024 +;; Maintainer: Elias G.B. Perez +;; Created: 2024-04-10 ;; Package-Requires: ((emacs "28.1") (compat "29.1.4.5")) ;; Homepage: https://github.com/DevelopmentCool2449/colorful-mode -;; Keywords: faces +;; Keywords: faces, tools, matching ;; Version: 0.3.0 ;; This file is not part of GNU Emacs. @@ -39,62 +39,16 @@ (require 'compat) ; This should add compatibility for emacs-28.X and higher. (require 'color) -(require 'subr-x) +(eval-when-compile (require 'subr-x)) ;; (require 'rx) ; Not sure if this should be added. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; Buffer-local variables ; +;; Internal variables ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -(defvar-local colorful-color-keywords - `((,(rx (seq (not (any "&")) - (group "#" (repeat 1 4 (= 3 (any "0-9A-Fa-f")))) - word-boundary)) - (1 (colorful-colorize-itself 1))) - (,(rx (seq bol - (group "#" (repeat 1 4 (= 3 (any "0-9A-Fa-f")))) - word-boundary)) - (0 (colorful-colorize-itself))) - (,(rx (seq (any "Rr") (any "Gg") (any "Bb") ":" - (repeat 1 4 (any "0-9A-Fa-f")) "/" - (repeat 1 4 (any "0-9A-Fa-f")) "/" - (repeat 1 4 (any "0-9A-Fa-f")))) - (0 (colorful-colorize-itself))) - (,(rx (seq (any "Rr") (any "Gg") (any "Bb") (any "Ii") ":" - (one-or-more (any "0-9" ".")) "/" - (one-or-more (any "0-9" ".")) "/" - (one-or-more (any "0-9" ".")))) - (0 (colorful-colorize-itself))) - (,(rx (seq (or (seq (any "Cc") (any "Ii") (any "Ee") - (or (seq (any "Xx") (any "Yy") (any "Zz")) - (seq (any "Uu") (any "Vv") (any "Yy")) - (seq (any "Xx") (any "Yy") (any "Yy")) - (seq (any "Ll") (any "Aa") (any "Bb")) - (seq (any "Ll") (any "Uu") (any "Vv")))) - (seq (any "Tt") (any "Ee") (any "Kk") (any "Hh") - (any "Vv") (any "Cc"))) - ":" - (opt (any "+-")) - (one-or-more (any "0-9" ".")) - (opt (any "Ee") - (opt (any "+-")) - (one-or-more (any "0-9"))) - "/" - (opt (any "+-")) - (one-or-more (any "0-9" ".")) - (opt (any "Ee") - (opt (any "+-")) - (one-or-more (any "0-9"))) - "/" - (opt (any "+-")) - (one-or-more (any "0-9" ".")) - (opt (any "Ee") - (opt (any "+-")) - (one-or-more (any "0-9"))))) - (0 (colorful-colorize-itself)))) - "Font-lock keywords to add for hexadecimal colors. -Must be a list containing regex strings.") +(defvar-local colorful-color-keywords nil + "Font-lock colors keyword to highlight.") ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -105,7 +59,8 @@ Must be a list containing regex strings.") "Preview hex colors values in current buffer.." :tag "Colorful mode" :group 'faces - :group 'display) + :group 'tools + :group 'matching) (defface colorful-base '((t (:box (:line-width -1 :color "grey75" :style flat-button)))) @@ -113,8 +68,9 @@ Must be a list containing regex strings.") (defcustom colorful-extra-color-keyword-functions '((emacs-lisp-mode . colorful-add-color-names) - ((css-mode css-ts-mode) . (colorful-add-rgb-colors - colorful-add-hsl-colors))) + ((mhtml-mode html-ts-mode css-mode css-ts-mode) + . (colorful-add-rgb-colors colorful-add-hsl-colors colorful-add-color-names)) + colorful-add-hex-colors) "List of functions to add extra color keywords to `colorful-color-keywords'. It can be a cons cell specifing the mode (or a list of modes) e.g: @@ -129,6 +85,7 @@ Or a simple list of functions for executing wherever colorful is active: `colorful-add-rgb-colors') Available functions are: + - `colorful-add-hex-colors' - `colorful-add-color-names'. - `colorful-add-rgb-colors'. - `colorful-add-hsl-colors'" @@ -225,8 +182,8 @@ mode is derived from `prog-mode'." ;;;;;;;;;; Base Convertion functions ;;;;;;;;;; -;; TEMP: Since CSS derived modes allow converting hexs to rgb -;; this may be deleted when release colorful 1.0.0 +;; TEMP: Since CSS derived modes allow converting hexs to rgb/hsl +;; this may be deleted when colorful 1.0.0 is released. ;; (defun colorful--hex-to-rgb (hex) ;; "Return HEX color as CSS rgb format." ;; (let* ((rgb (color-name-to-rgb hex)) @@ -237,13 +194,12 @@ mode is derived from `prog-mode'." (defun colorful--percentage-to-absolute (percentage) "Convert PERCENTAGE to a absolute number. -If NUMBER is absolute, return NUMBER. +If PERCENTAGE is absolute, return PERCENTAGE. This will convert \"80 %\" to 204, \"100 %\" to 255 but \"123\" to \"123\". -If the percentage value is above 100, it's converted to 100." - (let ((string-length (- (length percentage) 1))) - ;; Is this a number with %? - (if (eq (elt percentage string-length) ?%) - (/ (* (min (string-to-number (substring percentage 0 string-length)) 100) 255) 100) +If PERCENTAGE is above 100%, it's converted to 100." + (let ((percentage (string-remove-suffix ")" percentage))) + (if (string-suffix-p "%" percentage) + (/ (* (min (string-to-number percentage) 100) 255) 100) (string-to-number percentage)))) (defun colorful--rgb-to-hex (rgb &optional digit) @@ -251,9 +207,8 @@ If the percentage value is above 100, it's converted to 100." DIGIT specifies which how much digits per component must have return value. RGB must be a string." (let* ((rgb (string-split - (if (string-prefix-p "rgba(" rgb) - (string-remove-prefix "rgba(" rgb) - (string-remove-prefix "rgb(" rgb)) + (string-remove-prefix "rgba(" + (string-remove-prefix "rgb(" rgb)) ",")) (r (/ (colorful--percentage-to-absolute (nth 0 rgb)) 255.0)) (g (/ (colorful--percentage-to-absolute (nth 1 rgb)) 255.0)) @@ -265,9 +220,8 @@ RGB must be a string." DIGIT specifies which how much digits per component must have return value. HSL must be a string." (let* ((hsl (string-split - (if (string-prefix-p "hsl(" hsl) - (string-remove-prefix "hsl(" hsl) - (string-remove-prefix "hsla(" hsl)) + (string-remove-prefix "hsla(" + (string-remove-prefix "hsl(" hsl)) ",")) (h (/ (string-to-number (nth 0 hsl)) 360.0)) (s (/ (string-to-number (nth 1 hsl)) 100.0)) @@ -449,11 +403,9 @@ it can be white or black." 'keymap map) (propertize colorful-prefix-string 'face `(:foreground ,color)))) - ;; NOTE: This fixs an error for invalid face when using prefix + ;; Use no face for matched color (overlay-put ov 'face nil)) (t - ;; NOTE: Using colorful prefix bugs background color, - ;; this is the way i found for fix this. (when colorful-allow-mouse-clicks (overlay-put ov 'mouse-face 'highlight) (overlay-put ov 'keymap map)) @@ -491,14 +443,93 @@ it can be white or black." ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; Functions for Extra Coloring ; +;; Extra coloring definitions ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(defvar colorful-hex-font-lock-keywords + `((,(rx (seq (not (any "&")) + (group "#" (repeat 1 4 (= 3 (any "0-9A-Fa-f")))) + word-boundary)) + (1 (colorful-colorize-itself 1))) + (,(rx (seq bol + (group "#" (repeat 1 4 (= 3 (any "0-9A-Fa-f")))) + word-boundary)) + (0 (colorful-colorize-itself))) + (,(rx (seq (any "Rr") (any "Gg") (any "Bb") ":" + (repeat 1 4 (any "0-9A-Fa-f")) "/" + (repeat 1 4 (any "0-9A-Fa-f")) "/" + (repeat 1 4 (any "0-9A-Fa-f")))) + (0 (colorful-colorize-itself))) + (,(rx (seq (any "Rr") (any "Gg") (any "Bb") (any "Ii") ":" + (one-or-more (any "0-9" ".")) "/" + (one-or-more (any "0-9" ".")) "/" + (one-or-more (any "0-9" ".")))) + (0 (colorful-colorize-itself))) + (,(rx (seq (or (seq (any "Cc") (any "Ii") (any "Ee") + (or (seq (any "Xx") (any "Yy") (any "Zz")) + (seq (any "Uu") (any "Vv") (any "Yy")) + (seq (any "Xx") (any "Yy") (any "Yy")) + (seq (any "Ll") (any "Aa") (any "Bb")) + (seq (any "Ll") (any "Uu") (any "Vv")))) + (seq (any "Tt") (any "Ee") (any "Kk") (any "Hh") + (any "Vv") (any "Cc"))) + ":" + (opt (any "+-")) + (one-or-more (any "0-9" ".")) + (opt (any "Ee") + (opt (any "+-")) + (one-or-more (any "0-9"))) + "/" + (opt (any "+-")) + (one-or-more (any "0-9" ".")) + (opt (any "Ee") + (opt (any "+-")) + (one-or-more (any "0-9"))) + "/" + (opt (any "+-")) + (one-or-more (any "0-9" ".")) + (opt (any "Ee") + (opt (any "+-")) + (one-or-more (any "0-9"))))) + (0 (colorful-colorize-itself))))) + +(defun colorful-add-hex-colors () + "Function for add hex colors to `colorful-color-keywords'. +This is intended to be used with `colorful-extra-color-keyword-functions'." + (dolist (colors colorful-hex-font-lock-keywords) + (add-to-list 'colorful-color-keywords colors t))) + (defvar colorful-color-name-font-lock-keywords - `((,(regexp-opt (defined-colors) 'words) + `((,(regexp-opt (append ; TEMP: ? + (defined-colors) + '("Aquamarine" ;; "Aqua" ("Aqua" . "#00FFFF") + "Azure" "Beige" "Bisque" "Black" "Blue" + "Brown" "BurlyWood" "Chartreuse" "Chocolate" + "Coral" "Cornsilk" ;; "Crimson" ("Crimson" . "#DC143C") + "Cyan" "Darkorange" "FireBrick" + ;; "Fuchsia" ("Fuchsia" . "#FF00FF") + "Gainsboro" "Gold" "GoldenRod" + "Gray" "Grey" ;; "Green" ("Green" . "#008000") + "HoneyDew" ;; "Indigo" () + "Ivory" "Khaki" "Lavender" ;; "Lime" + "Linen" "Magenta" "Maroon" "MediumAquaMarine" + "Moccasin" "Navy" ;; "Olive" + "Orange" "Orchid" "PaleGoldenRod" "Peru" "Pink" + "Plum" "Purple" "Red" "Salmon" "SeaShell" + "Sienna" ;; "Silver" + "Snow" "Tan" ;; "Teal" + "Thistle" "Tomato" "Turquoise" "Violet" "Wheat" + "White" "Yellow")) + 'words) (0 (colorful-colorize-itself)))) "Font-lock keywords to add for `colorful-color-keywords'.") +(defun colorful-add-color-names () + "Function for add Color names to `colorful-color-keywords'. +This is intended to be used with `colorful-extra-color-keyword-functions'." + (dolist (colors colorful-color-name-font-lock-keywords) + (add-to-list 'colorful-color-keywords colors t))) + (defvar colorful-rgb-font-lock-keywords `((,(rx (seq "rgb" (opt "a") "(" (zero-or-more " ") (group (repeat 1 3 (any "0-9")) @@ -522,6 +553,12 @@ it can be white or black." (0 (colorful-colorize-itself)))) "Font-lock keywords for add RGB colors.") +(defun colorful-add-rgb-colors () + "Function for add CSS RGB colors to `colorful-color-keywords'. +This is intended to be used with `colorful-extra-color-keyword-functions'." + (dolist (colors colorful-rgb-font-lock-keywords) + (add-to-list 'colorful-color-keywords colors t))) + (defvar colorful-hsl-font-lock-keywords `((,(rx (seq "hsl" (opt "a") "(" (zero-or-more " ") (group (repeat 1 3 (any "0-9"))) @@ -539,18 +576,6 @@ it can be white or black." (0 (colorful-colorize-itself)))) "Font-lock keywords for add HSL colors.") -(defun colorful-add-color-names () - "Function for add Emacs color names to `colorful-color-keywords'. -This is intended to be used with `colorful-extra-color-keyword-functions'." - (dolist (colors colorful-color-name-font-lock-keywords) - (add-to-list 'colorful-color-keywords colors t))) - -(defun colorful-add-rgb-colors () - "Function for add CSS RGB colors to `colorful-color-keywords'. -This is intended to be used with `colorful-extra-color-keyword-functions'." - (dolist (colors colorful-rgb-font-lock-keywords) - (add-to-list 'colorful-color-keywords colors t))) - (defun colorful-add-hsl-colors () "Function for add CSS HSL colors to `colorful-color-keywords'. This is intended to be used with `colorful-extra-color-keyword-functions'." @@ -584,8 +609,7 @@ This is intended to be used with `colorful-extra-color-keyword-functions'." (defun colorful--turn-off () "Helper function for clear colorful overlays." - (font-lock-remove-keywords - nil `(,@colorful-color-keywords)) + (font-lock-remove-keywords nil `(,@colorful-color-keywords)) (remove-overlays nil nil 'colorful--overlay t) ;; Refresh font-lock (font-lock-flush)) @@ -599,7 +623,7 @@ This will fontify colors strings like \"#aabbcc\" or \"blue\"." (colorful--turn-on) (colorful--turn-off))) -;; Silcense a bye-compile warning about global-colorful-modes not +;; Silence a byte-compile warning about global-colorful-modes not ;; being defined, if anyone knows why this happens please open an ;; issue. (defvar global-colorful-modes)