1
0
mirror of https://git.savannah.gnu.org/git/emacs.git synced 2025-01-07 15:21:46 +00:00
emacs/lisp/net/shr-color.el

364 lines
13 KiB
EmacsLisp
Raw Normal View History

;;; shr-color.el --- Simple HTML Renderer color management -*- lexical-binding:t -*-
;; Copyright (C) 2010-2020 Free Software Foundation, Inc.
;; Author: Julien Danjou <julien@danjou.info>
;; Keywords: html
;; This file is part of GNU Emacs.
;; GNU Emacs is free software: you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
;; the Free Software Foundation, either version 3 of the License, or
;; (at your option) any later version.
;; GNU Emacs is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
;; GNU General Public License for more details.
;; You should have received a copy of the GNU General Public License
;; along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>.
;;; Commentary:
;; This package handles colors display for shr.
;;; Code:
(require 'color)
(eval-when-compile (require 'cl-lib))
(defgroup shr-color nil
"Simple HTML Renderer colors"
:group 'shr)
(defcustom shr-color-visible-luminance-min 40
"Minimum luminance distance between two colors to be considered visible.
Must be between 0 and 100."
Misc custom group fixes * cus-start.el (show-trailing-whitespace): Move to editing basics. * faces.el (trailing-whitespace): Don't use whitespace-faces group. * obsolete/old-whitespace.el (whitespace-faces): Remove group. (whitespace-highlight): Move to whitespace group. * comint.el (comint-source): * pcmpl-linux.el (pcmpl-linux): * shell.el (shell-faces): * eshell/esh-opt.el (eshell-opt): * international/ccl.el (ccl): Remove empty custom groups. * completion.el (dynamic-completion-mode): * jit-lock.el (jit-lock-debug-mode): * minibuffer.el (completion-in-region-mode): * type-break.el (type-break-mode-line-message-mode) (type-break-query-mode): * emulation/tpu-edt.el (tpu-edt-mode): * progmodes/subword.el (global-subword-mode, global-superword-mode): * progmodes/vhdl-mode.el (vhdl-electric-mode, vhdl-stutter-mode): * term/vt100.el (vt100-wide-mode): Specify explicit :group. * term/xterm.el (xterm): Change parent group to terminals. * master.el (master): Remove empty custom group. (master-mode): Remove unused :group argument. * textmodes/refill.el (refill): Remove empty custom group. (refill-mode): Remove unused :group argument. * textmodes/rst.el (rst-compile-toolsets): Use rst-compile group. * cedet/semantic/symref/list.el (semantic-symref-auto-expand-results) (semantic-symref-results-mode-hook) (semantic-symref-results-summary-function): Fix :group. * erc/erc-list.el (erc-list): * erc/erc-menu.el (erc-menu): * erc/erc-ring.el (erc-ring): Define custom groups, for define-erc-module. * gnus/shr-color.el (shr-color-visible-luminance-min) (shr-color-visible-distance-min): Use shr-color group. * url/url-news.el (url-news): Remove empty custom group.
2013-05-15 23:55:41 +00:00
:group 'shr-color
Fix a bunch of custom types (thank you cus-test.el) * lisp/bookmark.el (bookmark-search-delay): * lisp/cus-start.el (vertical-centering-font-regexp): * lisp/ps-mule.el (ps-mule-font-info-database-default): * lisp/ps-print.el (ps-default-fg, ps-default-bg): * lisp/type-break.el (type-break-good-break-interval): * lisp/whitespace.el (whitespace-indentation-regexp) (whitespace-space-after-tab-regexp): * lisp/emacs-lisp/testcover.el (testcover-1value-functions) (testcover-noreturn-functions, testcover-progn-functions) (testcover-prog1-functions): * lisp/emulation/viper-init.el (viper-emacs-state-cursor-color): * lisp/erc/erc-desktop-notifications.el (erc-notifications-icon): * lisp/eshell/em-glob.el (eshell-glob-translate-alist): * lisp/gnus/gnus-art.el (gnus-article-date-headers, gnus-blocked-images): * lisp/gnus/gnus-async.el (gnus-async-post-fetch-function): * lisp/gnus/gnus-gravatar.el (gnus-gravatar-size, gnus-gravatar-properties): * lisp/gnus/gnus-html.el (gnus-html-image-cache-ttl): * lisp/gnus/gnus-notifications.el (gnus-notifications-timeout): * lisp/gnus/gnus-picon.el (gnus-picon-properties): * lisp/gnus/gnus-util.el (gnus-completion-styles): * lisp/gnus/gnus.el (gnus-other-frame-resume-function): * lisp/gnus/message.el (message-user-organization-file) (message-cite-reply-position): * lisp/gnus/nnir.el (nnir-summary-line-format) (nnir-retrieve-headers-override-function): * lisp/gnus/shr-color.el (shr-color-visible-luminance-min): * lisp/gnus/shr.el (shr-blocked-images): * lisp/gnus/spam-report.el (spam-report-resend-to): * lisp/gnus/spam.el (spam-summary-exit-behavior): * lisp/mh-e/mh-e.el (mh-sortm-args, mh-default-folder-for-message-function): * lisp/play/tetris.el (tetris-tty-colors): * lisp/progmodes/cpp.el (cpp-face-default-list): * lisp/progmodes/flymake.el (flymake-allowed-file-name-masks): * lisp/progmodes/idlw-help.el (idlwave-help-browser-generic-program) (idlwave-help-browser-generic-args): * lisp/progmodes/make-mode.el (makefile-special-targets-list): * lisp/progmodes/python.el (python-shell-virtualenv-path): * lisp/progmodes/verilog-mode.el (verilog-active-low-regexp) (verilog-auto-input-ignore-regexp, verilog-auto-inout-ignore-regexp) (verilog-auto-output-ignore-regexp, verilog-auto-tieoff-ignore-regexp) (verilog-auto-unused-ignore-regexp, verilog-typedef-regexp): * lisp/textmodes/reftex-vars.el (reftex-format-label-function): * lisp/textmodes/remember.el (remember-diary-file): Fix custom types. * lisp/cedet/semantic/db-find.el (semanticdb-find-throttle-custom-list): Fix value. * lisp/gnus/gnus-salt.el (gnus-selected-tree-face): Fix default.
2013-05-09 01:40:20 +00:00
:type 'number)
(defcustom shr-color-visible-distance-min 5
"Minimum color distance between two colors to be considered visible.
2011-11-15 00:54:19 +00:00
This value is used to compare result for `ciede2000'. It's an
absolute value without any unit."
Misc custom group fixes * cus-start.el (show-trailing-whitespace): Move to editing basics. * faces.el (trailing-whitespace): Don't use whitespace-faces group. * obsolete/old-whitespace.el (whitespace-faces): Remove group. (whitespace-highlight): Move to whitespace group. * comint.el (comint-source): * pcmpl-linux.el (pcmpl-linux): * shell.el (shell-faces): * eshell/esh-opt.el (eshell-opt): * international/ccl.el (ccl): Remove empty custom groups. * completion.el (dynamic-completion-mode): * jit-lock.el (jit-lock-debug-mode): * minibuffer.el (completion-in-region-mode): * type-break.el (type-break-mode-line-message-mode) (type-break-query-mode): * emulation/tpu-edt.el (tpu-edt-mode): * progmodes/subword.el (global-subword-mode, global-superword-mode): * progmodes/vhdl-mode.el (vhdl-electric-mode, vhdl-stutter-mode): * term/vt100.el (vt100-wide-mode): Specify explicit :group. * term/xterm.el (xterm): Change parent group to terminals. * master.el (master): Remove empty custom group. (master-mode): Remove unused :group argument. * textmodes/refill.el (refill): Remove empty custom group. (refill-mode): Remove unused :group argument. * textmodes/rst.el (rst-compile-toolsets): Use rst-compile group. * cedet/semantic/symref/list.el (semantic-symref-auto-expand-results) (semantic-symref-results-mode-hook) (semantic-symref-results-summary-function): Fix :group. * erc/erc-list.el (erc-list): * erc/erc-menu.el (erc-menu): * erc/erc-ring.el (erc-ring): Define custom groups, for define-erc-module. * gnus/shr-color.el (shr-color-visible-luminance-min) (shr-color-visible-distance-min): Use shr-color group. * url/url-news.el (url-news): Remove empty custom group.
2013-05-15 23:55:41 +00:00
:group 'shr-color
:type 'integer)
(defconst shr-color-html-colors-alist
'(("AliceBlue" . "#F0F8FF")
("AntiqueWhite" . "#FAEBD7")
("Aqua" . "#00FFFF")
("Aquamarine" . "#7FFFD4")
("Azure" . "#F0FFFF")
("Beige" . "#F5F5DC")
("Bisque" . "#FFE4C4")
("Black" . "#000000")
("BlanchedAlmond" . "#FFEBCD")
("Blue" . "#0000FF")
("BlueViolet" . "#8A2BE2")
("Brown" . "#A52A2A")
("BurlyWood" . "#DEB887")
("CadetBlue" . "#5F9EA0")
("Chartreuse" . "#7FFF00")
("Chocolate" . "#D2691E")
("Coral" . "#FF7F50")
("CornflowerBlue" . "#6495ED")
("Cornsilk" . "#FFF8DC")
("Crimson" . "#DC143C")
("Cyan" . "#00FFFF")
("DarkBlue" . "#00008B")
("DarkCyan" . "#008B8B")
("DarkGoldenRod" . "#B8860B")
("DarkGray" . "#A9A9A9")
("DarkGrey" . "#A9A9A9")
("DarkGreen" . "#006400")
("DarkKhaki" . "#BDB76B")
("DarkMagenta" . "#8B008B")
("DarkOliveGreen" . "#556B2F")
("Darkorange" . "#FF8C00")
("DarkOrchid" . "#9932CC")
("DarkRed" . "#8B0000")
("DarkSalmon" . "#E9967A")
("DarkSeaGreen" . "#8FBC8F")
("DarkSlateBlue" . "#483D8B")
("DarkSlateGray" . "#2F4F4F")
("DarkSlateGrey" . "#2F4F4F")
("DarkTurquoise" . "#00CED1")
("DarkViolet" . "#9400D3")
("DeepPink" . "#FF1493")
("DeepSkyBlue" . "#00BFFF")
("DimGray" . "#696969")
("DimGrey" . "#696969")
("DodgerBlue" . "#1E90FF")
("FireBrick" . "#B22222")
("FloralWhite" . "#FFFAF0")
("ForestGreen" . "#228B22")
("Fuchsia" . "#FF00FF")
("Gainsboro" . "#DCDCDC")
("GhostWhite" . "#F8F8FF")
("Gold" . "#FFD700")
("GoldenRod" . "#DAA520")
("Gray" . "#808080")
("Grey" . "#808080")
("Green" . "#008000")
("GreenYellow" . "#ADFF2F")
("HoneyDew" . "#F0FFF0")
("HotPink" . "#FF69B4")
("IndianRed" . "#CD5C5C")
("Indigo" . "#4B0082")
("Ivory" . "#FFFFF0")
("Khaki" . "#F0E68C")
("Lavender" . "#E6E6FA")
("LavenderBlush" . "#FFF0F5")
("LawnGreen" . "#7CFC00")
("LemonChiffon" . "#FFFACD")
("LightBlue" . "#ADD8E6")
("LightCoral" . "#F08080")
("LightCyan" . "#E0FFFF")
("LightGoldenRodYellow" . "#FAFAD2")
("LightGray" . "#D3D3D3")
("LightGrey" . "#D3D3D3")
("LightGreen" . "#90EE90")
("LightPink" . "#FFB6C1")
("LightSalmon" . "#FFA07A")
("LightSeaGreen" . "#20B2AA")
("LightSkyBlue" . "#87CEFA")
("LightSlateGray" . "#778899")
("LightSlateGrey" . "#778899")
("LightSteelBlue" . "#B0C4DE")
("LightYellow" . "#FFFFE0")
("Lime" . "#00FF00")
("LimeGreen" . "#32CD32")
("Linen" . "#FAF0E6")
("Magenta" . "#FF00FF")
("Maroon" . "#800000")
("MediumAquaMarine" . "#66CDAA")
("MediumBlue" . "#0000CD")
("MediumOrchid" . "#BA55D3")
("MediumPurple" . "#9370DB")
("MediumSeaGreen" . "#3CB371")
("MediumSlateBlue" . "#7B68EE")
("MediumSpringGreen" . "#00FA9A")
("MediumTurquoise" . "#48D1CC")
("MediumVioletRed" . "#C71585")
("MidnightBlue" . "#191970")
("MintCream" . "#F5FFFA")
("MistyRose" . "#FFE4E1")
("Moccasin" . "#FFE4B5")
("NavajoWhite" . "#FFDEAD")
("Navy" . "#000080")
("OldLace" . "#FDF5E6")
("Olive" . "#808000")
("OliveDrab" . "#6B8E23")
("Orange" . "#FFA500")
("OrangeRed" . "#FF4500")
("Orchid" . "#DA70D6")
("PaleGoldenRod" . "#EEE8AA")
("PaleGreen" . "#98FB98")
("PaleTurquoise" . "#AFEEEE")
("PaleVioletRed" . "#DB7093")
("PapayaWhip" . "#FFEFD5")
("PeachPuff" . "#FFDAB9")
("Peru" . "#CD853F")
("Pink" . "#FFC0CB")
("Plum" . "#DDA0DD")
("PowderBlue" . "#B0E0E6")
("Purple" . "#800080")
("RebeccaPurple" . "#663399")
("Red" . "#FF0000")
("RosyBrown" . "#BC8F8F")
("RoyalBlue" . "#4169E1")
("SaddleBrown" . "#8B4513")
("Salmon" . "#FA8072")
("SandyBrown" . "#F4A460")
("SeaGreen" . "#2E8B57")
("SeaShell" . "#FFF5EE")
("Sienna" . "#A0522D")
("Silver" . "#C0C0C0")
("SkyBlue" . "#87CEEB")
("SlateBlue" . "#6A5ACD")
("SlateGray" . "#708090")
("SlateGrey" . "#708090")
("Snow" . "#FFFAFA")
("SpringGreen" . "#00FF7F")
("SteelBlue" . "#4682B4")
("Tan" . "#D2B48C")
("Teal" . "#008080")
("Thistle" . "#D8BFD8")
("Tomato" . "#FF6347")
("Turquoise" . "#40E0D0")
("Violet" . "#EE82EE")
("Wheat" . "#F5DEB3")
("White" . "#FFFFFF")
("WhiteSmoke" . "#F5F5F5")
("Yellow" . "#FFFF00")
("YellowGreen" . "#9ACD32"))
"Alist of HTML colors.
Each entry should have the form (COLOR-NAME . HEXADECIMAL-COLOR).")
(defun shr-color-relative-to-absolute (number)
2011-11-15 00:54:19 +00:00
"Convert a relative NUMBER to absolute.
If NUMBER is absolute, return NUMBER.
This will convert \"80 %\" to 204, \"100 %\" to 255 but \"123\" to \"123\"."
(let ((string-length (- (length number) 1)))
;; Is this a number with %?
(if (eq (elt number string-length) ?%)
(/ (* (string-to-number (substring number 0 string-length)) 255) 100)
(string-to-number number))))
(defun shr-color-hue-to-rgb (x y h)
"Convert X Y H to RGB value."
(when (< h 0) (cl-incf h))
(when (> h 1) (cl-decf h))
(cond ((< h (/ 6.0)) (+ x (* (- y x) h 6)))
((< h 0.5) y)
((< h (/ 2.0 3.0)) (+ x (* (- y x) (- (/ 2.0 3.0) h) 6)))
(t x)))
(defun shr-color-hsl-to-rgb-fractions (h s l)
"Convert H S L to fractional RGB values."
(let (m1 m2)
(if (<= l 0.5)
(setq m2 (* l (+ s 1)))
(setq m2 (- (+ l s) (* l s))))
(setq m1 (- (* l 2) m2))
(list (shr-color-hue-to-rgb m1 m2 (+ h (/ 3.0)))
(shr-color-hue-to-rgb m1 m2 h)
(shr-color-hue-to-rgb m1 m2 (- h (/ 3.0))))))
(defun shr-color->hexadecimal (color)
"Convert any color format to hexadecimal representation.
Like rgb() or hsl()."
(when color
(cond
;; Hexadecimal color: #abc or #aabbcc
((string-match
Replace manually crafted hex regexes with [:xdigit:] * admin/charsets/mapconv: * build-aux/gitlog-to-changelog (parse_amend_file, git_dir_option): * lisp/progmodes/verilog-mode.el (verilog-delay-re): (verilog-type-font-keywords, verilog-read-always-signals-recurse): (verilog-is-number): * lisp/progmodes/vera-mode.el (vera-font-lock-keywords): * test/src/emacs-module-tests.el (mod-test-sum-test): * lisp/xml.el: (xml--entity-replacement-text): * lisp/version.el (emacs-repository-version-git): * lisp/textmodes/sgml-mode.el (sgml-quote): * lisp/textmodes/css-mode.el (css-escapes-re) (css--colors-regexp): * lisp/progmodes/prolog.el (prolog-syntax-propertize-function): * lisp/progmodes/hideif.el (hif-token-regexp, hif-tokenize): * lisp/progmodes/ebnf-dtd.el: (ebnf-dtd-attlistdecl) (ebnf-dtd-entitydecl, ebnf-dtd-lex): * lisp/progmodes/ebnf-ebx.el (ebnf-ebx-hex-character): * lisp/progmodes/ebnf-abn.el (ebnf-abn-character): * lisp/progmodes/cperl-mode.el (cperl-highlight-charclass) (cperl-find-pods-heres): * lisp/progmodes/cc-mode.el (c-maybe-quoted-number-head) (c-maybe-quoted-number, c-parse-quotes-before-change) (c-parse-quotes-after-change, c-quoted-number-head-before-point) (c-quoted-number-straddling-point): * lisp/progmodes/ada-mode.el (featurep, ada-in-numeric-literal-p) (ada-font-lock-keywords): * lisp/org/org-mobile.el (org-mobile-copy-agenda-files) * lisp/org/org-table.el (org-table-number-regexp): (org-mobile-update-checksum-for-capture-file): * lisp/nxml/xsd-regexp.el (xsdre-gen-categories): * lisp/nxml/xmltok.el (let*): * lisp/nxml/rng-xsd.el (rng-xsd-convert-hex-binary) (rng-xsd-convert-any-uri): * lisp/nxml/rng-uri.el (rng-uri-file-name-1) (rng-uri-unescape-multibyte, rng-uri-unescape-unibyte) (rng-uri-unescape-unibyte-match) (rng-uri-unescape-unibyte-replace): * lisp/nxml/rng-cmpct.el (rng-c-process-escapes): * lisp/nxml/nxml-maint.el (nxml-insert-target-repertoire-glyph-set): * lisp/net/shr-color.el (shr-color->hexadecimal): * lisp/mail/rfc2231.el (rfc2231-decode-encoded-string): * lisp/international/mule-cmds.el (read-char-by-name): * lisp/htmlfontify.el (hfy-hex-regex): * lisp/gnus/nneething.el (nneething-decode-file-name): * lisp/gnus/mml-sec.el (mml-secure-find-usable-keys): * lisp/gnus/gnus-art.el (gnus-button-mid-or-mail-heuristic-alist): * lisp/faces.el (read-color): * lisp/epg.el (epg--status-ERRSIG, epg--status-VALIDSIG) (epg--status-SIG_CREATED, epg--decode-percent-escape) (epg--decode-hexstring, epg--decode-quotedstring) (epg-dn-from-string): * lisp/emulation/cua-rect.el (cua-incr-rectangle): * lisp/dnd.el (dnd-unescape-uri): * lisp/cedet/semantic/lex.el (semantic-lex-number-expression): * lisp/cedet/semantic/java.el (semantic-java-number-regexp): * lisp/calc/calc-lang.el (pascal): * lisp/calc/calc-ext.el (math-read-number-fancy): * lisp/calc/calc-aent.el (math-read-token): Replace various combinations of [0-9a-fA-F] with [[:xdigit:]]. (Bug#36167)
2019-06-13 00:18:43 +00:00
"\\(#[[:xdigit:]]\\{3\\}[[:xdigit:]]\\{3\\}?\\)"
color)
(match-string 1 color))
;; rgb() or rgba() colors
((or (string-match
"rgb(\s*\\([0-9]\\{1,3\\}\\(?:\s*%\\)?\\)\s*,\s*\\([0-9]\\{1,3\\}\\(?:\s*%\\)?\\)\s*,\s*\\([0-9]\\{1,3\\}\\(?:\s*%\\)?\\)\s*)"
color)
(string-match
Fix several backslash typos in Elisp strings * lisp/calendar/todo-mode.el (todo-files, todo-rename-file) (todo-find-filtered-items-file, todo-reset-nondiary-marker) (todo-reset-done-string, todo-reset-comment-string) (todo-reset-highlight-item): * lisp/erc/erc-networks.el (erc-networks-alist): * lisp/gnus/gnus-art.el (gnus-button-handle-library): * lisp/gnus/gnus-group.el (gnus-read-ephemeral-gmane-group-url): * lisp/gnus/nntp.el (nntp-via-shell-prompt) (nntp-telnet-shell-prompt): * lisp/gnus/spam-report.el (spam-report-gmane-regex): * lisp/image-dired.el (image-dired-rotate-original): (image-dired-get-exif-file-name): * lisp/international/latin1-disp.el (latin1-display-ucs-per-lynx): * lisp/mail/undigest.el (rmail-digest-parse-rfc1153strict): * lisp/mh-e/mh-letter.el (mh-file-is-vcard-p): * lisp/mh-e/mh-mime.el (mh-file-mime-type-substitutions): * lisp/net/shr-color.el (shr-color->hexadecimal): * lisp/org/org-bibtex.el (org-bibtex-fields): * lisp/org/org-docview.el (org-docview-export): * lisp/org/org-entities.el (org-entities): * lisp/org/ox-icalendar.el (org-icalendar-cleanup-string): * lisp/progmodes/cperl-mode.el (cperl-indent-exp): * lisp/progmodes/ebnf2ps.el (ebnf-file-suffix-regexp) (ebnf-style-database): * lisp/progmodes/idlw-help.el (idlwave-do-context-help1): * lisp/progmodes/ruby-mode.el (ruby-imenu-create-index-in-block): * lisp/progmodes/sql.el (sql-product-alist): * lisp/progmodes/verilog-mode.el (verilog-error-regexp-emacs-alist) (verilog-error-font-lock-keywords) (verilog-assignment-operator-re): * lisp/progmodes/vhdl-mode.el (vhdl-compiler-alist): * lisp/textmodes/reftex-parse.el (reftex-parse-from-file): * lisp/vc/add-log.el (change-log-version-number-regexp-list): Fix typo by replacing ‘\’ with ‘\\’ in a string literal. For example, to get the regular expression ‘\.’ use the string literal "\\.", not "\." (which is equivalent to "."). * lisp/emulation/viper-util.el (viper-glob-unix-files): Remove stray ‘\j’ from string. * lisp/gnus/nntp.el (nntp-via-shell-prompt) (nntp-telnet-shell-prompt): Treat > like $ when matching a shell prompt. * lisp/progmodes/make-mode.el (makefile-browse): Properly quote a diagnostic.
2015-09-17 19:28:45 +00:00
"rgba(\s*\\([0-9]\\{1,3\\}\\(?:\s*%\\)?\\)\s*,\s*\\([0-9]\\{1,3\\}\\(?:\s*%\\)?\\)\s*,\s*\\([0-9]\\{1,3\\}\\(?:\s*%\\)?\\)\s*,\s*[0-9]*\\.?[0-9]+\s*%?\s*)"
color))
(format "#%02X%02X%02X"
(shr-color-relative-to-absolute (match-string-no-properties 1 color))
(shr-color-relative-to-absolute (match-string-no-properties 2 color))
(shr-color-relative-to-absolute (match-string-no-properties 3 color))))
;; hsl() or hsla() colors
((or (string-match
"hsl(\s*\\([0-9]\\{1,3\\}\\)\s*,\s*\\([0-9]\\{1,3\\}\\)\s*%\s*,\s*\\([0-9]\\{1,3\\}\\)\s*%\s*)"
color)
(string-match
Fix several backslash typos in Elisp strings * lisp/calendar/todo-mode.el (todo-files, todo-rename-file) (todo-find-filtered-items-file, todo-reset-nondiary-marker) (todo-reset-done-string, todo-reset-comment-string) (todo-reset-highlight-item): * lisp/erc/erc-networks.el (erc-networks-alist): * lisp/gnus/gnus-art.el (gnus-button-handle-library): * lisp/gnus/gnus-group.el (gnus-read-ephemeral-gmane-group-url): * lisp/gnus/nntp.el (nntp-via-shell-prompt) (nntp-telnet-shell-prompt): * lisp/gnus/spam-report.el (spam-report-gmane-regex): * lisp/image-dired.el (image-dired-rotate-original): (image-dired-get-exif-file-name): * lisp/international/latin1-disp.el (latin1-display-ucs-per-lynx): * lisp/mail/undigest.el (rmail-digest-parse-rfc1153strict): * lisp/mh-e/mh-letter.el (mh-file-is-vcard-p): * lisp/mh-e/mh-mime.el (mh-file-mime-type-substitutions): * lisp/net/shr-color.el (shr-color->hexadecimal): * lisp/org/org-bibtex.el (org-bibtex-fields): * lisp/org/org-docview.el (org-docview-export): * lisp/org/org-entities.el (org-entities): * lisp/org/ox-icalendar.el (org-icalendar-cleanup-string): * lisp/progmodes/cperl-mode.el (cperl-indent-exp): * lisp/progmodes/ebnf2ps.el (ebnf-file-suffix-regexp) (ebnf-style-database): * lisp/progmodes/idlw-help.el (idlwave-do-context-help1): * lisp/progmodes/ruby-mode.el (ruby-imenu-create-index-in-block): * lisp/progmodes/sql.el (sql-product-alist): * lisp/progmodes/verilog-mode.el (verilog-error-regexp-emacs-alist) (verilog-error-font-lock-keywords) (verilog-assignment-operator-re): * lisp/progmodes/vhdl-mode.el (vhdl-compiler-alist): * lisp/textmodes/reftex-parse.el (reftex-parse-from-file): * lisp/vc/add-log.el (change-log-version-number-regexp-list): Fix typo by replacing ‘\’ with ‘\\’ in a string literal. For example, to get the regular expression ‘\.’ use the string literal "\\.", not "\." (which is equivalent to "."). * lisp/emulation/viper-util.el (viper-glob-unix-files): Remove stray ‘\j’ from string. * lisp/gnus/nntp.el (nntp-via-shell-prompt) (nntp-telnet-shell-prompt): Treat > like $ when matching a shell prompt. * lisp/progmodes/make-mode.el (makefile-browse): Properly quote a diagnostic.
2015-09-17 19:28:45 +00:00
"hsla(\s*\\([0-9]\\{1,3\\}\\)\s*,\s*\\([0-9]\\{1,3\\}\\)\s*%\s*,\s*\\([0-9]\\{1,3\\}\\)\s*%\s*,\s*[0-9]*\\.?[0-9]+\s*%?\s*)"
color))
(let ((h (/ (string-to-number (match-string-no-properties 1 color)) 360.0))
(s (/ (string-to-number (match-string-no-properties 2 color)) 100.0))
(l (/ (string-to-number (match-string-no-properties 3 color)) 100.0)))
(pcase-let ((`(,r ,g ,b) (shr-color-hsl-to-rgb-fractions h s l)))
(color-rgb-to-hex r g b 2))))
;; Color names
((cdr (assoc-string color shr-color-html-colors-alist t)))
;; Unrecognized color :(
(t
nil))))
(defun shr-color-set-minimum-interval (val1 val2 min max interval
&optional fixed)
"Set minimum interval between VAL1 and VAL2 to INTERVAL.
The values are bound by MIN and MAX.
2011-11-15 00:54:19 +00:00
If FIXED is t, then VAL1 will not be touched."
(let ((diff (abs (- val1 val2))))
(unless (>= diff interval)
(if fixed
(let* ((missing (- interval diff))
;; If val2 > val1, try to increase val2
;; That's the "good direction"
(val2-good-direction
(if (> val2 val1)
(min max (+ val2 missing))
(max min (- val2 missing))))
(diff-val2-good-direction-val1 (abs (- val2-good-direction val1))))
(if (>= diff-val2-good-direction-val1 interval)
(setq val2 val2-good-direction)
;; Good-direction is not so good, compute bad-direction
(let* ((val2-bad-direction
(if (> val2 val1)
(max min (- val1 interval))
(min max (+ val1 interval))))
(diff-val2-bad-direction-val1 (abs (- val2-bad-direction val1))))
(if (>= diff-val2-bad-direction-val1 interval)
(setq val2 val2-bad-direction)
;; Still not good, pick the best and prefer good direction
(setq val2
(if (>= diff-val2-good-direction-val1 diff-val2-bad-direction-val1)
val2-good-direction
val2-bad-direction))))))
;; No fixed, move val1 and val2
(let ((missing (/ (- interval diff) 2.0)))
(if (< val1 val2)
(setq val1 (max min (- val1 missing))
val2 (min max (+ val2 missing)))
(setq val2 (max min (- val2 missing))
val1 (min max (+ val1 missing))))
(setq diff (abs (- val1 val2))) ; Recompute diff
(unless (>= diff interval)
;; Not ok, we hit a boundary
(let ((missing (- interval diff)))
(cond ((= val1 min)
(setq val2 (+ val2 missing)))
((= val2 min)
(setq val1 (+ val1 missing)))
((= val1 max)
(setq val2 (- val2 missing)))
((= val2 max)
(setq val1 (- val1 missing)))))))))
(list val1 val2)))
(defun shr-color-visible (bg fg &optional fixed-background)
"Check that BG and FG colors are visible if they are drawn on each other.
2011-11-15 00:54:19 +00:00
Return (bg fg) if they are. If they are too similar, two new
Merge changes made in Gnus trunk. shr-color.el (shr-color-visible): Really return original background if fixed. shr.el (shr-insert-color-overlay): Replace deprecated syntax. shr.el (shr-tag-body, shr-descend): Add background support. shr.el (shr-tag-title): Add. gnus-sum.el (gnus-summary-articles-in-thread): Fix a bug that causes this function to return incorrect results. shr.el (shr-parse-style): Drop !important from styles. message.el (message-goto-body): Remove the <#secure special-casing, which is too special. mm-util.el (mm-enable-multibyte): Use `to' instead of t. This fixes something or other in Emacs 23, and is backwards compatible. message.el (message-goto-body): Use called-interactively-p. message.el (message-in-body-p): message-goto-body returns point. nnimap.el (nnimap-request-move-article): It's no longer necessary to clear marks before moving, since they're synced from the Gnus side first. gnus-sum.el (gnus-summary-push-marks-to-backend): New function. gnus-sum.el (gnus-summary-move-article): Copy over all marks before moving, so that IMAP doesn't think a new article has arrived. message.el (message-goto-body): called-interactively-p needs a parameter, so use `any'. gnus-cache.el (gnus-summary-insert-cached-articles): Use it. gnus-sum.el (gnus-summary-include-articles): New function. shr.el (shr-tag-table, shr-render-td): Add bgcolor support. shr-color.el (shr-color-visible): Fix docstring. shr.el (shr-insert-background-overlay): Fix typo. shr.el (shr-render-td): Copy the background before rendering.
2010-11-24 22:54:47 +00:00
colors are returned instead.
If FIXED-BACKGROUND is set, and if the color are not visible, a
2011-11-15 00:54:19 +00:00
new background color will not be computed. Only the foreground
color will be adapted to be visible on BG."
;; Convert fg and bg to CIE Lab
(let ((fg-norm (color-name-to-rgb fg))
(bg-norm (color-name-to-rgb bg)))
(if (or (null fg-norm)
(null bg-norm))
(list bg fg)
(let* ((fg-lab (apply 'color-srgb-to-lab fg-norm))
(bg-lab (apply 'color-srgb-to-lab bg-norm))
;; Compute color distance using CIE DE 2000
(fg-bg-distance (color-cie-de2000 fg-lab bg-lab))
2011-11-15 00:54:19 +00:00
;; Compute luminance distance (subtract L component)
(luminance-distance (abs (- (car fg-lab) (car bg-lab)))))
(if (and (>= fg-bg-distance shr-color-visible-distance-min)
(>= luminance-distance shr-color-visible-luminance-min))
(list bg fg)
;; Not visible, try to change luminance to make them visible
(let ((Ls (shr-color-set-minimum-interval
(car bg-lab) (car fg-lab) 0 100
shr-color-visible-luminance-min fixed-background)))
(unless fixed-background
(setcar bg-lab (car Ls)))
(setcar fg-lab (cadr Ls))
(list
(if fixed-background
bg
(apply 'format "#%02x%02x%02x"
(mapcar (lambda (x) (* (max (min 1 x) 0) 255))
(apply 'color-lab-to-srgb bg-lab))))
(apply 'format "#%02x%02x%02x"
(mapcar (lambda (x) (* (max (min 1 x) 0) 255))
(apply 'color-lab-to-srgb fg-lab))))))))))
(provide 'shr-color)
;;; shr-color.el ends here