From 4521796dc9bc60dedc1f095a01c2c526e790ae29 Mon Sep 17 00:00:00 2001 From: Andreas Gerler Date: Sun, 22 Dec 2024 13:04:15 +0100 Subject: [PATCH] update htmlize Signed-off-by: Andreas Gerler --- elpa/htmlize-20210825.2150/htmlize-pkg.el | 12 - .../htmlize-autoloads.el | 46 +- elpa/htmlize-20240915.1657/htmlize-pkg.el | 10 + .../htmlize.el | 639 +++++++++--------- elpa/htmlize-readme.txt | 54 -- 5 files changed, 360 insertions(+), 401 deletions(-) delete mode 100644 elpa/htmlize-20210825.2150/htmlize-pkg.el rename elpa/{htmlize-20210825.2150 => htmlize-20240915.1657}/htmlize-autoloads.el (73%) create mode 100644 elpa/htmlize-20240915.1657/htmlize-pkg.el rename elpa/{htmlize-20210825.2150 => htmlize-20240915.1657}/htmlize.el (79%) delete mode 100644 elpa/htmlize-readme.txt diff --git a/elpa/htmlize-20210825.2150/htmlize-pkg.el b/elpa/htmlize-20210825.2150/htmlize-pkg.el deleted file mode 100644 index 18f5dedf..00000000 --- a/elpa/htmlize-20210825.2150/htmlize-pkg.el +++ /dev/null @@ -1,12 +0,0 @@ -(define-package "htmlize" "20210825.2150" "Convert buffer text and decorations to HTML." 'nil :commit "dd27bc3f26efd728f2b1f01f9e4ac4f61f2ffbf9" :authors - '(("Hrvoje Niksic" . "hniksic@gmail.com")) - :maintainers - '(("Hrvoje Niksic" . "hniksic@gmail.com")) - :maintainer - '("Hrvoje Niksic" . "hniksic@gmail.com") - :keywords - '("hypermedia" "extensions") - :url "https://github.com/hniksic/emacs-htmlize") -;; Local Variables: -;; no-byte-compile: t -;; End: diff --git a/elpa/htmlize-20210825.2150/htmlize-autoloads.el b/elpa/htmlize-20240915.1657/htmlize-autoloads.el similarity index 73% rename from elpa/htmlize-20210825.2150/htmlize-autoloads.el rename to elpa/htmlize-20240915.1657/htmlize-autoloads.el index af5b68b0..81239209 100644 --- a/elpa/htmlize-20210825.2150/htmlize-autoloads.el +++ b/elpa/htmlize-20240915.1657/htmlize-autoloads.el @@ -1,21 +1,24 @@ -;;; htmlize-autoloads.el --- automatically extracted autoloads -*- lexical-binding: t -*- -;; +;;; htmlize-autoloads.el --- automatically extracted autoloads (do not edit) -*- lexical-binding: t -*- +;; Generated by the `loaddefs-generate' function. + +;; This file is part of GNU Emacs. + ;;; Code: -(add-to-list 'load-path (directory-file-name - (or (file-name-directory #$) (car load-path)))) +(add-to-list 'load-path (or (and load-file-name (directory-file-name (file-name-directory load-file-name))) (car load-path))) + -;;;### (autoloads nil "htmlize" "htmlize.el" (0 0 0 0)) ;;; Generated autoloads from htmlize.el (autoload 'htmlize-buffer "htmlize" "\ Convert BUFFER to HTML, preserving colors and decorations. The generated HTML is available in a new buffer, which is returned. -When invoked interactively, the new buffer is selected in the current -window. The title of the generated document will be set to the buffer's -file name or, if that's not available, to the buffer's name. +When invoked interactively (or if optional INTERACTIVE is non-nil), +the new buffer is selected in the current window. The title of the +generated document will be set to the buffer's file name or, if that +is not available, to the buffer's name. Note that htmlize doesn't fontify your buffers, it only uses the decorations that are already present. If you don't set up font-lock or @@ -23,14 +26,12 @@ something else to fontify your buffers, the resulting HTML will be plain. Likewise, if you don't like the choice of colors, fix the mode that created them, or simply alter the faces it uses. -\(fn &optional BUFFER)" t nil) - +(fn &optional BUFFER INTERACTIVE)" t) (autoload 'htmlize-region "htmlize" "\ Convert the region to HTML, preserving colors and decorations. See `htmlize-buffer' for details. -\(fn BEG END)" t nil) - +(fn BEG END &optional INTERACTIVE)" t) (autoload 'htmlize-file "htmlize" "\ Load FILE, fontify it, convert it to HTML, and save the result. @@ -48,8 +49,7 @@ If TARGET is specified and names a directory, the resulting file will be saved there instead of to FILE's directory. If TARGET is specified and does not name a directory, it will be used as output file name. -\(fn FILE &optional TARGET)" t nil) - +(fn FILE &optional TARGET)" t) (autoload 'htmlize-many-files "htmlize" "\ Convert FILES to HTML and save the corresponding HTML versions. @@ -62,25 +62,23 @@ If TARGET-DIRECTORY is specified, the HTML files will be saved to that directory. Normally, each HTML file is saved to the directory of the corresponding source file. -\(fn FILES &optional TARGET-DIRECTORY)" t nil) - +(fn FILES &optional TARGET-DIRECTORY)" t) (autoload 'htmlize-many-files-dired "htmlize" "\ HTMLize dired-marked files. -\(fn ARG &optional TARGET-DIRECTORY)" t nil) - +(fn ARG &optional TARGET-DIRECTORY)" t) (register-definition-prefixes "htmlize" '("htmlize-")) - -;;;*** -;;;### (autoloads nil nil ("htmlize-pkg.el") (0 0 0 0)) +;;; End of scraped data + +(provide 'htmlize-autoloads) -;;;*** - ;; Local Variables: ;; version-control: never ;; no-byte-compile: t ;; no-update-autoloads: t -;; coding: utf-8 +;; no-native-compile: t +;; coding: utf-8-emacs-unix ;; End: + ;;; htmlize-autoloads.el ends here diff --git a/elpa/htmlize-20240915.1657/htmlize-pkg.el b/elpa/htmlize-20240915.1657/htmlize-pkg.el new file mode 100644 index 00000000..7f0bda3c --- /dev/null +++ b/elpa/htmlize-20240915.1657/htmlize-pkg.el @@ -0,0 +1,10 @@ +;; -*- no-byte-compile: t; lexical-binding: nil -*- +(define-package "htmlize" "20240915.1657" + "Convert buffer text and decorations to HTML." + '((emacs "25.1")) + :url "https://github.com/hniksic/emacs-htmlize" + :commit "8e3841c837b4b78bd72ad7f0436e919f39315a46" + :revdesc "8e3841c837b4" + :keywords '("hypermedia" "extensions") + :authors '(("Hrvoje Niksic" . "hniksic@gmail.com")) + :maintainers '(("Hrvoje Niksic" . "hniksic@gmail.com"))) diff --git a/elpa/htmlize-20210825.2150/htmlize.el b/elpa/htmlize-20240915.1657/htmlize.el similarity index 79% rename from elpa/htmlize-20210825.2150/htmlize.el rename to elpa/htmlize-20240915.1657/htmlize.el index b158a65d..a6ae8804 100644 --- a/elpa/htmlize-20210825.2150/htmlize.el +++ b/elpa/htmlize-20240915.1657/htmlize.el @@ -5,7 +5,9 @@ ;; Author: Hrvoje Niksic ;; Homepage: https://github.com/hniksic/emacs-htmlize ;; Keywords: hypermedia, extensions -;; Version: 1.57 +;; Package-Version: 20240915.1657 +;; Package-Revision: 8e3841c837b4 +;; Package-Requires: ((emacs "25.1")) ;; This program is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by @@ -219,7 +221,7 @@ normally achieved by using the correct file coding system for the buffer.) If you don't understand what that means, you should probably leave this option in its default setting." :type '(choice (const :tag "Unset" nil) - string) + string) :group 'htmlize) (defcustom htmlize-convert-nonascii-to-entities t @@ -255,8 +257,8 @@ If this is nil, face sizes are used. If set to t, sizes are ignored If set to `absolute', only absolute size specifications are ignored. Please note that font sizes only work with CSS-based output types." :type '(choice (const :tag "Don't ignore" nil) - (const :tag "Ignore all" t) - (const :tag "Ignore absolute" absolute)) + (const :tag "Ignore all" t) + (const :tag "Ignore absolute" absolute)) :group 'htmlize) (defcustom htmlize-css-name-prefix "" @@ -296,7 +298,7 @@ naming the face and values are the overriding definitions. For example: (setq htmlize-face-overrides - '(font-lock-warning-face \"black\" + \\='(font-lock-warning-face \"black\" font-lock-function-name-face \"red\" font-lock-comment-face \"blue\" default (:foreground \"dark-green\" :background \"yellow\"))) @@ -312,8 +314,8 @@ This variable can be also be `let' bound when running `htmlize-buffer'.") "The mode the newly created HTML buffer will be put in. Set this to nil if you prefer the default (fundamental) mode." :type '(radio (const :tag "No mode (fundamental)" nil) - (function-item html-mode) - (function :tag "User-defined major mode")) + (function-item html-mode) + (function :tag "User-defined major mode")) :group 'htmlize) (defcustom htmlize-pre-style nil @@ -338,6 +340,12 @@ output.") "Hook run by `htmlize-file' after htmlizing a file, but before saving it.") (defvar htmlize-buffer-places) + +(defconst htmlize-image-mime-type-alist + '((svg . "svg+xml") + ) + "Alist mapping Emacs image types to Mime media types. +https://www.iana.org/assignments/media-types/media-types.xhtml#image") ;;; Some cross-Emacs compatibility. @@ -391,8 +399,8 @@ output.") ;; &#CODE entities; (dotimes (i 128) (setf (aref table i) (if (and (>= i 32) (<= i 126)) - (char-to-string i) - (format "&#%d;" i)))) + (char-to-string i) + (format "&#%d;" i)))) ;; Set exceptions manually. (setf ;; Don't escape newline, carriage return, and TAB. @@ -427,34 +435,34 @@ output.") (if (not (string-match "[^\r\n\t -%'-;=?-~]" string)) string (mapconcat (lambda (char) - (cond - ((< char 128) - ;; ASCII: use htmlize-basic-character-table. - (aref htmlize-basic-character-table char)) - ((gethash char htmlize-extended-character-cache) - ;; We've already seen this char; return the cached - ;; string. - ) - ((not htmlize-convert-nonascii-to-entities) - ;; If conversion to entities is not desired, always - ;; copy the char literally. - (setf (gethash char htmlize-extended-character-cache) - (char-to-string char))) - ((< char 256) - ;; Latin 1: no need to call encode-char. - (setf (gethash char htmlize-extended-character-cache) - (format "&#%d;" char))) - ((encode-char char 'ucs) + (cond + ((< char 128) + ;; ASCII: use htmlize-basic-character-table. + (aref htmlize-basic-character-table char)) + ((gethash char htmlize-extended-character-cache) + ;; We've already seen this char; return the cached + ;; string. + ) + ((not htmlize-convert-nonascii-to-entities) + ;; If conversion to entities is not desired, always + ;; copy the char literally. + (setf (gethash char htmlize-extended-character-cache) + (char-to-string char))) + ((< char 256) + ;; Latin 1: no need to call encode-char. + (setf (gethash char htmlize-extended-character-cache) + (format "&#%d;" char))) + ((encode-char char 'ucs) ;; Must check if encode-char works for CHAR; ;; it fails for Arabic and possibly elsewhere. - (setf (gethash char htmlize-extended-character-cache) - (format "&#%d;" (encode-char char 'ucs)))) - (t - ;; encode-char doesn't work for this char. Copy it - ;; unchanged and hope for the best. - (setf (gethash char htmlize-extended-character-cache) - (char-to-string char))))) - string ""))) + (setf (gethash char htmlize-extended-character-cache) + (format "&#%d;" (encode-char char 'ucs)))) + (t + ;; encode-char doesn't work for this char. Copy it + ;; unchanged and hope for the best. + (setf (gethash char htmlize-extended-character-cache) + (char-to-string char))))) + string ""))) (defun htmlize-attr-escape (string) ;; Like htmlize-protect-string, but also escapes double-quoted @@ -588,13 +596,13 @@ list." (htmlize-attr-escape (file-relative-name file)) alt-attr))) ((plist-get imgprops :data) - (format "" - (or (plist-get imgprops :type) "") - (base64-encode-string (plist-get imgprops :data)) - alt-attr))))) + (let ((image-type (plist-get imgprops :type))) + (format "" + (or (alist-get image-type htmlize-image-mime-type-alist) image-type "") + (base64-encode-string (plist-get imgprops :data)) + alt-attr)))))) -(defconst htmlize-ellipsis "...") -(put-text-property 0 (length htmlize-ellipsis) 'htmlize-ellipsis t htmlize-ellipsis) +(defconst htmlize-ellipsis (propertize "..." 'htmlize-ellipsis t)) (defun htmlize-match-inv-spec (inv) (cl-member inv buffer-invisibility-spec @@ -602,7 +610,8 @@ list." (if (symbolp i) i (car i))))) (defun htmlize-decode-invisibility-spec (invisible) - ;; Return t, nil, or `ellipsis', depending on how invisible text should be inserted. + ;; Return t, nil, or `ellipsis', depending on how invisible text should + ;; be inserted. (if (not (listp buffer-invisibility-spec)) ;; If buffer-invisibility-spec is not a list, then all @@ -681,16 +690,16 @@ list." ;; parts of the region. Where buffer-substring-no-properties ;; mandates an ellipsis to be shown, htmlize-ellipsis is inserted. (let ((pos beg) - visible-list invisible show last-show next-change) + visible-list invisible show last-show next-change) ;; Iterate over the changes in the `invisible' property and filter ;; out the portions where it's non-nil, i.e. where the text is ;; invisible. (while (< pos end) (setq invisible (get-char-property pos 'invisible) - next-change (htmlize-next-change pos 'invisible end) + next-change (htmlize-next-change pos 'invisible end) show (htmlize-decode-invisibility-spec invisible)) (cond ((eq show t) - (push (htmlize-get-text-with-display pos next-change) + (push (htmlize-get-text-with-display pos next-change) visible-list)) ((and (eq show 'ellipsis) (not (eq last-show 'ellipsis)) @@ -719,41 +728,42 @@ list." (defun htmlize-untabify-string (text start-column) "Untabify TEXT, assuming it starts at START-COLUMN." (let ((column start-column) - (last-match 0) - (chunk-start 0) - chunks match-pos tab-size) + (last-match 0) + (chunk-start 0) + chunks match-pos tab-size) (while (string-match "[\t\n]" text last-match) (setq match-pos (match-beginning 0)) (cond ((eq (aref text match-pos) ?\t) - ;; Encountered a tab: create a chunk of text followed by - ;; the expanded tab. - (push (substring text chunk-start match-pos) chunks) - ;; Increase COLUMN by the length of the text we've - ;; skipped since last tab or newline. (Encountering - ;; newline resets it.) - (cl-incf column (- match-pos last-match)) - ;; Calculate tab size based on tab-width and COLUMN. - (setq tab-size (- tab-width (% column tab-width))) - ;; Expand the tab, carefully recreating the `display' - ;; property if one was on the TAB. + ;; Encountered a tab: create a chunk of text followed by + ;; the expanded tab. + (push (substring text chunk-start match-pos) chunks) + ;; Increase COLUMN by the length of the text we've + ;; skipped since last tab or newline. (Encountering + ;; newline resets it.) + (cl-incf column (- match-pos last-match)) + ;; Calculate tab size based on tab-width and COLUMN. + (setq tab-size (- tab-width (% column tab-width))) + ;; Expand the tab, carefully recreating the `display' + ;; property if one was on the TAB. (let ((display (get-text-property match-pos 'display text)) (expanded-tab (aref htmlize-tab-spaces tab-size))) (when display + (setq expanded-tab (copy-sequence expanded-tab)) (put-text-property 0 tab-size 'display display expanded-tab)) (push expanded-tab chunks)) - (cl-incf column tab-size) - (setq chunk-start (1+ match-pos))) - (t - ;; Reset COLUMN at beginning of line. - (setq column 0))) + (cl-incf column tab-size) + (setq chunk-start (1+ match-pos))) + (t + ;; Reset COLUMN at beginning of line. + (setq column 0))) (setq last-match (1+ match-pos))) ;; If no chunks have been allocated, it means there have been no ;; tabs to expand. Return TEXT unmodified. (if (null chunks) - text + text (when (< chunk-start (length text)) - ;; Push the remaining chunk. - (push (substring text chunk-start) chunks)) + ;; Push the remaining chunk. + (push (substring text chunk-start) chunks)) ;; Generate the output from the available chunks. (htmlize-concat (nreverse chunks))))) @@ -823,8 +833,7 @@ This is used to protect mailto links without modifying their meaning." ;; (defun htmlize-shadow-form-feeds () - (let ((s "\n
")) - (put-text-property 0 (length s) 'htmlize-literal t s) + (let ((s (propertize "\n
" 'htmlize-literal t))) (let ((disp `(display ,s))) (while (re-search-forward "\n\^L" nil t) (let* ((beg (match-beginning 0)) @@ -845,7 +854,7 @@ This is used to protect mailto links without modifying their meaning." (goto-char (point-min)) (while (search-forward "Local Variables:" nil t) (replace-match "Local Variables:" nil t))) - + ;;; Color handling. @@ -885,30 +894,30 @@ in the system directories. If no rgb.txt file is found, return nil." (let ((rgb-file (or rgb-file (locate-file - "rgb.txt" - htmlize-x-library-search-path))) - (hash nil)) + "rgb.txt" + htmlize-x-library-search-path))) + (hash nil)) (when rgb-file (with-temp-buffer - (insert-file-contents rgb-file) - (setq hash (make-hash-table :test 'equal)) - (while (not (eobp)) - (cond ((looking-at "^\\s-*\\([!#]\\|$\\)") - ;; Skip comments and empty lines. - ) - ((looking-at - "[ \t]*\\([0-9]+\\)[ \t]+\\([0-9]+\\)[ \t]+\\([0-9]+\\)[ \t]+\\(.*\\)") - (setf (gethash (downcase (match-string 4)) hash) - (format "#%02x%02x%02x" - (string-to-number (match-string 1)) - (string-to-number (match-string 2)) - (string-to-number (match-string 3))))) - (t - (error - "Unrecognized line in %s: %s" - rgb-file - (buffer-substring (point) (progn (end-of-line) (point)))))) - (forward-line 1)))) + (insert-file-contents rgb-file) + (setq hash (make-hash-table :test 'equal)) + (while (not (eobp)) + (cond ((looking-at "^\\s-*\\([!#]\\|$\\)") + ;; Skip comments and empty lines. + ) + ((looking-at + "[ \t]*\\([0-9]+\\)[ \t]+\\([0-9]+\\)[ \t]+\\([0-9]+\\)[ \t]+\\(.*\\)") + (setf (gethash (downcase (match-string 4)) hash) + (format "#%02x%02x%02x" + (string-to-number (match-string 1)) + (string-to-number (match-string 2)) + (string-to-number (match-string 3))))) + (t + (error + "Unrecognized line in %s: %s" + rgb-file + (buffer-substring (point) (progn (end-of-line) (point)))))) + (forward-line 1)))) hash)) ;; Compile the RGB map when loaded. On systems where rgb.txt is @@ -924,16 +933,16 @@ If no rgb.txt file is found, return nil." ;; `default' and the color is unspecified, look up the color in ;; frame parameters. (let* ((function (if fg #'face-foreground #'face-background)) - (color (funcall function face nil t))) + (color (funcall function face nil t))) (when (and (eq face 'default) (null color)) (setq color (cdr (assq (if fg 'foreground-color 'background-color) - (frame-parameters))))) + (frame-parameters))))) (when (or (eq color 'unspecified) - (equal color "unspecified-fg") - (equal color "unspecified-bg")) + (equal color "unspecified-fg") + (equal color "unspecified-bg")) (setq color nil)) (when (and (eq face 'default) - (null color)) + (null color)) ;; Assuming black on white doesn't seem right, but I can't think ;; of anything better to do. (setq color (if fg "black" "white"))) @@ -956,25 +965,25 @@ If no rgb.txt file is found, return nil." (defun htmlize-color-to-rgb (color) (let ((rgb-string nil)) (cond ((null color) - ;; Ignore nil COLOR because it means that the face is not - ;; specifying any color. Hence (htmlize-color-to-rgb nil) - ;; returns nil. - ) - ((string-match "\\`#" color) - ;; The color is already in #rrggbb format. - (setq rgb-string color)) - ((and htmlize-use-rgb-txt - htmlize-color-rgb-hash) - ;; Use of rgb.txt is requested, and it's available on the - ;; system. Use it. - (setq rgb-string (gethash (downcase color) htmlize-color-rgb-hash))) - (t - ;; We're getting the RGB components from Emacs. - (let ((rgb (mapcar (lambda (arg) + ;; Ignore nil COLOR because it means that the face is not + ;; specifying any color. Hence (htmlize-color-to-rgb nil) + ;; returns nil. + ) + ((string-match "\\`#" color) + ;; The color is already in #rrggbb format. + (setq rgb-string color)) + ((and htmlize-use-rgb-txt + htmlize-color-rgb-hash) + ;; Use of rgb.txt is requested, and it's available on the + ;; system. Use it. + (setq rgb-string (gethash (downcase color) htmlize-color-rgb-hash))) + (t + ;; We're getting the RGB components from Emacs. + (let ((rgb (mapcar (lambda (arg) (/ arg 256)) (color-values color)))) - (when rgb - (setq rgb-string (apply #'format "#%02x%02x%02x" rgb)))))) + (when rgb + (setq rgb-string (apply #'format "#%02x%02x%02x" rgb)))))) ;; If RGB-STRING is still nil, it means the color cannot be found, ;; for whatever reason. In that case just punt and return COLOR. ;; Most browsers support a decent set of color names anyway. @@ -989,15 +998,15 @@ If no rgb.txt file is found, return nil." ;; faces. (cl-defstruct htmlize-fstruct - foreground ; foreground color, #rrggbb - background ; background color, #rrggbb - size ; size - boldp ; whether face is bold - italicp ; whether face is italic - underlinep ; whether face is underlined - overlinep ; whether face is overlined - strikep ; whether face is struck through - css-name ; CSS name of face + foreground ; foreground color, #rrggbb + background ; background color, #rrggbb + size ; size + boldp ; whether face is bold + italicp ; whether face is italic + underlinep ; whether face is underlined + overlinep ; whether face is overlined + strikep ; whether face is struck through + css-name ; CSS name of face ) (defun htmlize-face-set-from-keyword-attr (fstruct attr value) @@ -1014,7 +1023,7 @@ If no rgb.txt file is found, return nil." (setf (htmlize-fstruct-boldp fstruct) t))) (:slant (setf (htmlize-fstruct-italicp fstruct) (or (eq value 'italic) - (eq value 'oblique)))) + (eq value 'oblique)))) (:bold (setf (htmlize-fstruct-boldp fstruct) value)) (:italic @@ -1035,8 +1044,7 @@ If no rgb.txt file is found, return nil." (while head (let ((inherit (face-attribute (car head) :inherit))) (cond ((listp inherit) - (setcdr tail (cl-copy-list inherit)) - (setq tail (last tail))) + (setq tail (last inherit))) ((eq inherit 'unspecified)) (t (setcdr tail (list inherit)) @@ -1077,10 +1085,10 @@ If no rgb.txt file is found, return nil." (defun htmlize-face-to-fstruct-1 (face) "Convert Emacs face FACE to fstruct, internal." (let ((fstruct (make-htmlize-fstruct - :foreground (htmlize-color-to-rgb - (htmlize-face-foreground face)) - :background (htmlize-color-to-rgb - (htmlize-face-background face))))) + :foreground (htmlize-color-to-rgb + (htmlize-face-foreground face)) + :background (htmlize-color-to-rgb + (htmlize-face-background face))))) ;; GNU Emacs (dolist (attr '(:weight :slant :underline :overline :strike-through)) (let ((value (face-attribute face attr nil t))) @@ -1115,39 +1123,39 @@ If no rgb.txt file is found, return nil." ;; ...) ;; for the given list of boolean attributes. (cons 'progn - (cl-loop for attr in attr-list - for attr-sym = (intern (format "htmlize-fstruct-%s" attr)) - collect `(when (,attr-sym ,source) + (cl-loop for attr in attr-list + for attr-sym = (intern (format "htmlize-fstruct-%s" attr)) + collect `(when (,attr-sym ,source) (setf (,attr-sym ,dest) (,attr-sym ,source)))))) (defun htmlize-merge-size (merged next) ;; Calculate the size of the merge of MERGED and NEXT. (cond ((null merged) next) - ((integerp next) next) - ((null next) merged) - ((floatp merged) (* merged next)) - ((integerp merged) (round (* merged next))))) + ((integerp next) next) + ((null next) merged) + ((floatp merged) (* merged next)) + ((integerp merged) (round (* merged next))))) (defun htmlize-merge-two-faces (merged next) (htmlize-copy-attr-if-set (foreground background boldp italicp underlinep overlinep strikep) merged next) (setf (htmlize-fstruct-size merged) - (htmlize-merge-size (htmlize-fstruct-size merged) - (htmlize-fstruct-size next))) + (htmlize-merge-size (htmlize-fstruct-size merged) + (htmlize-fstruct-size next))) merged) (defun htmlize-merge-faces (fstruct-list) (cond ((null fstruct-list) - ;; Nothing to do, return a dummy face. - (make-htmlize-fstruct)) - ((null (cdr fstruct-list)) - ;; Optimize for the common case of a single face, simply - ;; return it. - (car fstruct-list)) - (t - (cl-reduce #'htmlize-merge-two-faces - (cons (make-htmlize-fstruct) fstruct-list))))) + ;; Nothing to do, return a dummy face. + (make-htmlize-fstruct)) + ((null (cdr fstruct-list)) + ;; Optimize for the common case of a single face, simply + ;; return it. + (car fstruct-list)) + (t + (cl-reduce #'htmlize-merge-two-faces + (cons (make-htmlize-fstruct) fstruct-list))))) ;; GNU Emacs 20+ supports attribute lists in `face' properties. For ;; example, you can use `(:foreground "red" :weight bold)' as an @@ -1161,20 +1169,20 @@ If no rgb.txt file is found, return nil." ;; Like htmlize-face-to-fstruct, but accepts an ATTRLIST as input. (let ((fstruct (make-htmlize-fstruct))) (cond ((eq (car attrlist) 'foreground-color) - ;; ATTRLIST is (foreground-color . COLOR) - (setf (htmlize-fstruct-foreground fstruct) - (htmlize-color-to-rgb (cdr attrlist)))) - ((eq (car attrlist) 'background-color) - ;; ATTRLIST is (background-color . COLOR) - (setf (htmlize-fstruct-background fstruct) - (htmlize-color-to-rgb (cdr attrlist)))) - (t - ;; ATTRLIST is a plist. - (while attrlist - (let ((attr (pop attrlist)) - (value (pop attrlist))) - (when (and value (not (eq value 'unspecified))) - (htmlize-face-set-from-keyword-attr fstruct attr value)))))) + ;; ATTRLIST is (foreground-color . COLOR) + (setf (htmlize-fstruct-foreground fstruct) + (htmlize-color-to-rgb (cdr attrlist)))) + ((eq (car attrlist) 'background-color) + ;; ATTRLIST is (background-color . COLOR) + (setf (htmlize-fstruct-background fstruct) + (htmlize-color-to-rgb (cdr attrlist)))) + (t + ;; ATTRLIST is a plist. + (while attrlist + (let ((attr (pop attrlist)) + (value (pop attrlist))) + (when (and value (not (eq value 'unspecified))) + (htmlize-face-set-from-keyword-attr fstruct attr value)))))) (setf (htmlize-fstruct-css-name fstruct) (or name "custom")) fstruct)) @@ -1228,23 +1236,23 @@ If no rgb.txt file is found, return nil." ;; The keys are either face symbols or attrlists, so the test ;; function must be `equal'. (let ((face-map (make-hash-table :test 'equal)) - css-names) + css-names) (dolist (face faces) (unless (gethash face face-map) - ;; Haven't seen FACE yet; convert it to an fstruct and cache - ;; it. - (let ((fstruct (htmlize-face-to-fstruct face))) - (setf (gethash face face-map) fstruct) - (let* ((css-name (htmlize-fstruct-css-name fstruct)) - (new-name css-name) - (i 0)) - ;; Uniquify the face's css-name by using NAME-1, NAME-2, - ;; etc. - (while (member new-name css-names) - (setq new-name (format "%s-%s" css-name (cl-incf i)))) - (unless (equal new-name css-name) - (setf (htmlize-fstruct-css-name fstruct) new-name)) - (push new-name css-names))))) + ;; Haven't seen FACE yet; convert it to an fstruct and cache + ;; it. + (let ((fstruct (htmlize-face-to-fstruct face))) + (setf (gethash face face-map) fstruct) + (let* ((css-name (htmlize-fstruct-css-name fstruct)) + (new-name css-name) + (i 0)) + ;; Uniquify the face's css-name by using NAME-1, NAME-2, + ;; etc. + (while (member new-name css-names) + (setq new-name (format "%s-%s" css-name (cl-incf i)))) + (unless (equal new-name css-name) + (setf (htmlize-fstruct-css-name fstruct) new-name)) + (push new-name css-names))))) face-map)) (defun htmlize-unstringify-face (face) @@ -1310,7 +1318,7 @@ overlays that specify `face'." ;; `insert-head', `body-tag', `pre-tag', and `text-markup'. Not all ;; output types define all methods. ;; -;; Methods are called either with (htmlize-method METHOD ARGS...) +;; Methods are called either with (htmlize-method METHOD ARGS...) ;; special form, or by accessing the function with ;; (htmlize-method-function 'METHOD) and calling (funcall FUNCTION). ;; The latter form is useful in tight loops because `htmlize-method' @@ -1326,12 +1334,12 @@ overlays that specify `face'." ;; The returned object can be safely funcalled. (let ((sym (intern (format "htmlize-%s-%s" htmlize-output-type method)))) (indirect-function (if (fboundp sym) - sym - (let ((default (intern (concat "htmlize-default-" - (symbol-name method))))) - (if (fboundp default) - default - 'ignore)))))) + sym + (let ((default (intern (concat "htmlize-default-" + (symbol-name method))))) + (if (fboundp default) + default + 'ignore)))))) (defvar htmlize-memoization-table (make-hash-table :test 'equal)) @@ -1343,26 +1351,26 @@ it's called with the same value of KEY. All other times, the cached (let ((value (cl-gensym))) `(let ((,value (gethash ,key htmlize-memoization-table))) (unless ,value - (setq ,value ,generator) - (setf (gethash ,key htmlize-memoization-table) ,value)) + (setq ,value ,generator) + (setf (gethash ,key htmlize-memoization-table) ,value)) ,value))) ;;; Default methods. (defun htmlize-default-doctype () - nil ; no doc-string + nil ; no doc-string ;; Note that the `font' output is technically invalid under this DTD ;; because the DTD doesn't allow embedding in
.
   ""
   )
 
 (defun htmlize-default-body-tag (face-map)
-  nil					; no doc-string
+  nil                                   ; no doc-string
   face-map ; shut up the byte-compiler
   "")
 
 (defun htmlize-default-pre-tag (face-map)
-  nil					; no doc-string
+  nil                                   ; no doc-string
   face-map ; shut up the byte-compiler
   "
")
 
@@ -1374,17 +1382,17 @@ it's called with the same value of KEY.  All other times, the cached
   (let (result)
     (when (htmlize-fstruct-foreground fstruct)
       (push (format "color: %s;" (htmlize-fstruct-foreground fstruct))
-	    result))
+            result))
     (when (htmlize-fstruct-background fstruct)
       (push (format "background-color: %s;"
-		    (htmlize-fstruct-background fstruct))
-	    result))
+                    (htmlize-fstruct-background fstruct))
+            result))
     (let ((size (htmlize-fstruct-size fstruct)))
       (when (and size (not (eq htmlize-ignore-face-size t)))
-	(cond ((floatp size)
-	       (push (format "font-size: %d%%;" (* 100 size)) result))
-	      ((not (eq htmlize-ignore-face-size 'absolute))
-	       (push (format "font-size: %spt;" (/ size 10.0)) result)))))
+        (cond ((floatp size)
+               (push (format "font-size: %d%%;" (* 100 size)) result))
+              ((not (eq htmlize-ignore-face-size 'absolute))
+               (push (format "font-size: %spt;" (/ size 10.0)) result)))))
     (when (htmlize-fstruct-boldp fstruct)
       (push "font-weight: bold;" result))
     (when (htmlize-fstruct-italicp fstruct)
@@ -1400,35 +1408,36 @@ it's called with the same value of KEY.  All other times, the cached
 (defun htmlize-css-insert-head (buffer-faces face-map)
   (insert "    \n"))
+          "    -->\n    \n"))
 
 (defun htmlize-css-text-markup (fstruct-list buffer)
   ;; Open the markup needed to insert text colored with FACES into
@@ -1450,23 +1459,26 @@ it's called with the same value of KEY.  All other times, the cached
 
 (defun htmlize-inline-css-body-tag (face-map)
   (format ""
-	  (mapconcat #'identity (htmlize-css-specs (gethash 'default face-map))
-		     " ")))
+          (mapconcat #'identity (htmlize-css-specs (gethash 'default face-map))
+                     " ")))
 
 (defun htmlize-inline-css-pre-tag (face-map)
   (if htmlize-pre-style
       (format "
"
-              (mapconcat #'identity (htmlize-css-specs (gethash 'default face-map))
+              (mapconcat #'identity
+                         (htmlize-css-specs (gethash 'default face-map))
                          " "))
     (format "
")))
 
 (defun htmlize-inline-css-text-markup (fstruct-list buffer)
   (let* ((merged (htmlize-merge-faces fstruct-list))
-	 (style (htmlize-memoize
-		 merged
-		 (let ((specs (htmlize-css-specs merged)))
-		   (and specs
-			(mapconcat #'identity (htmlize-css-specs merged) " "))))))
+         (style (htmlize-memoize
+                 merged
+                 (let ((specs (htmlize-css-specs merged)))
+                   (and specs
+                        (mapconcat #'identity
+                                   (htmlize-css-specs merged)
+                                   " "))))))
     (when style
       (princ ""
-	    (htmlize-fstruct-foreground fstruct)
-	    (htmlize-fstruct-background fstruct))))
+            (htmlize-fstruct-foreground fstruct)
+            (htmlize-fstruct-background fstruct))))
 
 (defun htmlize-font-pre-tag (face-map)
   (if htmlize-pre-style
@@ -1491,27 +1503,28 @@ it's called with the same value of KEY.  All other times, the cached
                 (htmlize-fstruct-foreground fstruct)
                 (htmlize-fstruct-background fstruct)))
     (format "
")))
-       
+
 (defun htmlize-font-text-markup (fstruct-list buffer)
   ;; In `font' mode, we use the traditional HTML means of altering
   ;; presentation:  tag for colors,  for bold,  for
   ;; underline, and  for strike-through.
   (let* ((merged (htmlize-merge-faces fstruct-list))
-	 (markup (htmlize-memoize
-		  merged
-		  (cons (concat
-			 (and (htmlize-fstruct-foreground merged)
-			      (format "" (htmlize-fstruct-foreground merged)))
-			 (and (htmlize-fstruct-boldp merged)      "")
-			 (and (htmlize-fstruct-italicp merged)    "")
-			 (and (htmlize-fstruct-underlinep merged) "")
-			 (and (htmlize-fstruct-strikep merged)    ""))
-			(concat
-			 (and (htmlize-fstruct-strikep merged)    "")
-			 (and (htmlize-fstruct-underlinep merged) "")
-			 (and (htmlize-fstruct-italicp merged)    "")
-			 (and (htmlize-fstruct-boldp merged)      "")
-			 (and (htmlize-fstruct-foreground merged) ""))))))
+         (markup (htmlize-memoize
+                  merged
+                  (cons (concat
+                         (and (htmlize-fstruct-foreground merged)
+                              (format ""
+                                      (htmlize-fstruct-foreground merged)))
+                         (and (htmlize-fstruct-boldp merged)      "")
+                         (and (htmlize-fstruct-italicp merged)    "")
+                         (and (htmlize-fstruct-underlinep merged) "")
+                         (and (htmlize-fstruct-strikep merged)    ""))
+                        (concat
+                         (and (htmlize-fstruct-strikep merged)    "")
+                         (and (htmlize-fstruct-underlinep merged) "")
+                         (and (htmlize-fstruct-italicp merged)    "")
+                         (and (htmlize-fstruct-boldp merged)      "")
+                         (and (htmlize-fstruct-foreground merged) ""))))))
     (princ (car markup) buffer)
     (htmlize-lexlet ((markup markup) (buffer buffer))
       (lambda ()
@@ -1541,7 +1554,8 @@ it's called with the same value of KEY.  All other times, the cached
           (completed nil))
       (unwind-protect
           (let* ((buffer-faces (htmlize-faces-in-buffer))
-                 (face-map (htmlize-make-face-map (cl-adjoin 'default buffer-faces)))
+                 (face-map (htmlize-make-face-map
+                            (cl-adjoin 'default buffer-faces)))
                  (places (cl-gensym))
                  (title (if (buffer-file-name)
                             (file-name-nondirectory (buffer-file-name))
@@ -1562,9 +1576,10 @@ it's called with the same value of KEY.  All other times, the cached
               (insert "\n"
                       "    " (htmlize-protect-string title) "\n"
                       (if htmlize-html-charset
-                          (format (concat "    \n")
-                                  htmlize-html-charset)
+                          (format
+                           (concat "    \n")
+                           htmlize-html-charset)
                         "")
                       htmlize-head-tags)
               (htmlize-method insert-head buffer-faces face-map)
@@ -1611,8 +1626,9 @@ it's called with the same value of KEY.  All other times, the cached
                   ;; Open the new markup if necessary and insert the text.
                   (when (not (cl-equalp fstruct-list last-fstruct-list))
                     (funcall close-markup)
-                    (setq last-fstruct-list fstruct-list
-                          close-markup (funcall text-markup fstruct-list htmlbuf)))
+                    (setq last-fstruct-list fstruct-list)
+                    (setq close-markup
+                          (funcall text-markup fstruct-list htmlbuf)))
                   (princ text htmlbuf))
                 (goto-char next-change))
 
@@ -1652,12 +1668,12 @@ it's called with the same value of KEY.  All other times, the cached
   ;; font-lock, not for htmlize to finish.
   `(progn
      (if (> (buffer-size) 65536)
-	 (message "Forcing fontification of %s..."
-		  (buffer-name (current-buffer))))
+         (message "Forcing fontification of %s..."
+                  (buffer-name (current-buffer))))
      ,@body
      (if (> (buffer-size) 65536)
-	 (message "Forcing fontification of %s...done"
-		  (buffer-name (current-buffer))))))
+         (message "Forcing fontification of %s...done"
+                  (buffer-name (current-buffer))))))
 
 (defun htmlize-ensure-fontified ()
   ;; If font-lock is being used, ensure that the "support" modes
@@ -1680,38 +1696,39 @@ it's called with the same value of KEY.  All other times, the cached
 
 
 ;;;###autoload
-(defun htmlize-buffer (&optional buffer)
+(defun htmlize-buffer (&optional buffer interactive)
   "Convert BUFFER to HTML, preserving colors and decorations.
 
 The generated HTML is available in a new buffer, which is returned.
-When invoked interactively, the new buffer is selected in the current
-window.  The title of the generated document will be set to the buffer's
-file name or, if that's not available, to the buffer's name.
+When invoked interactively (or if optional INTERACTIVE is non-nil),
+the new buffer is selected in the current window.  The title of the
+generated document will be set to the buffer's file name or, if that
+is not available, to the buffer's name.
 
 Note that htmlize doesn't fontify your buffers, it only uses the
 decorations that are already present.  If you don't set up font-lock or
 something else to fontify your buffers, the resulting HTML will be
 plain.  Likewise, if you don't like the choice of colors, fix the mode
 that created them, or simply alter the faces it uses."
-  (interactive)
+  (interactive "i\np")
   (let ((htmlbuf (with-current-buffer (or buffer (current-buffer))
-		   (htmlize-buffer-1))))
-    (when (interactive-p)
+                   (htmlize-buffer-1))))
+    (when interactive
       (switch-to-buffer htmlbuf))
     htmlbuf))
 
 ;;;###autoload
-(defun htmlize-region (beg end)
+(defun htmlize-region (beg end &optional interactive)
   "Convert the region to HTML, preserving colors and decorations.
 See `htmlize-buffer' for details."
-  (interactive "r")
+  (interactive "r\np")
   ;; Don't let zmacs region highlighting end up in HTML.
   (when (fboundp 'zmacs-deactivate-region)
     (zmacs-deactivate-region))
   (let ((htmlbuf (save-restriction
-		   (narrow-to-region beg end)
-		   (htmlize-buffer-1))))
-    (when (interactive-p)
+                   (narrow-to-region beg end)
+                   (htmlize-buffer-1))))
+    (when interactive
       (switch-to-buffer htmlbuf))
     htmlbuf))
 
@@ -1721,11 +1738,11 @@ This forces the `inline-css' style and only returns the HTML body,
 but without the BODY tag.  This should make it useful for inserting
 the text to another HTML buffer."
   (let* ((htmlize-output-type 'inline-css)
-	 (htmlbuf (htmlize-region beg end)))
+         (htmlbuf (htmlize-region beg end)))
     (unwind-protect
-	(with-current-buffer htmlbuf
-	  (buffer-substring (plist-get htmlize-buffer-places 'content-start)
-			    (plist-get htmlize-buffer-places 'content-end)))
+        (with-current-buffer htmlbuf
+          (buffer-substring (plist-get htmlize-buffer-places 'content-start)
+                            (plist-get htmlize-buffer-places 'content-end)))
       (kill-buffer htmlbuf))))
 
 (defun htmlize-region-save-screenshot (beg end)
@@ -1752,14 +1769,14 @@ overload this function to do it and htmlize will comply."
 
 ;; Older implementation of htmlize-make-file-name that changes FILE's
 ;; extension to ".html".
-;(defun htmlize-make-file-name (file)
-;  (let ((extension (file-name-extension file))
-;	(sans-extension (file-name-sans-extension file)))
-;    (if (or (equal extension "html")
-;	    (equal extension "htm")
-;	    (equal sans-extension ""))
-;	(concat file ".html")
-;      (concat sans-extension ".html"))))
+;; (defun htmlize-make-file-name (file)
+;;  (let ((extension (file-name-extension file))
+;;      (sans-extension (file-name-sans-extension file)))
+;;    (if (or (equal extension "html")
+;;          (equal extension "htm")
+;;          (equal sans-extension ""))
+;;      (concat file ".html")
+;;      (concat sans-extension ".html"))))
 
 ;;;###autoload
 (defun htmlize-file (file &optional target)
@@ -1779,22 +1796,20 @@ If TARGET is specified and names a directory, the resulting file will be
 saved there instead of to FILE's directory.  If TARGET is specified and
 does not name a directory, it will be used as output file name."
   (interactive (list (read-file-name
-		      "HTML-ize file: "
-		      nil nil nil (and (buffer-file-name)
-				       (file-name-nondirectory
-					(buffer-file-name))))))
+                      "HTML-ize file: "
+                      nil nil nil (and (buffer-file-name)
+                                       (file-name-nondirectory
+                                        (buffer-file-name))))))
   (let ((output-file (if (and target (not (file-directory-p target)))
-			 target
-		       (expand-file-name
-			(htmlize-make-file-name (file-name-nondirectory file))
-			(or target (file-name-directory file)))))
-	;; Try to prevent `find-file-noselect' from triggering
-	;; font-lock because we'll fontify explicitly below.
-	(font-lock-mode nil)
-	(font-lock-auto-fontify nil)
-	(global-font-lock-mode nil)
-	;; Ignore the size limit for the purposes of htmlization.
-	(font-lock-maximum-size nil))
+                         target
+                       (expand-file-name
+                        (htmlize-make-file-name (file-name-nondirectory file))
+                        (or target (file-name-directory file)))))
+        ;; Try to prevent `find-file-noselect' from triggering
+        ;; font-lock because we'll fontify explicitly below.
+        (font-lock-mode nil)
+        (font-lock-auto-fontify nil)
+        (global-font-lock-mode nil))
     (with-temp-buffer
       ;; Insert FILE into the temporary buffer.
       (insert-file-contents file)
@@ -1802,15 +1817,15 @@ does not name a directory, it will be used as output file name."
       ;; up.  Restore it afterwards so with-temp-buffer's kill-buffer
       ;; doesn't complain about killing a modified buffer.
       (let ((buffer-file-name file))
-	;; Set the major mode for the sake of font-lock.
-	(normal-mode)
-	;; htmlize the buffer and save the HTML.
-	(with-current-buffer (htmlize-buffer-1)
-	  (unwind-protect
-	      (progn
-		(run-hooks 'htmlize-file-hook)
-		(write-region (point-min) (point-max) output-file))
-	    (kill-buffer (current-buffer)))))))
+        ;; Set the major mode for the sake of font-lock.
+        (normal-mode)
+        ;; htmlize the buffer and save the HTML.
+        (with-current-buffer (htmlize-buffer-1)
+          (unwind-protect
+              (progn
+                (run-hooks 'htmlize-file-hook)
+                (write-region (point-min) (point-max) output-file))
+            (kill-buffer (current-buffer)))))))
   ;; I haven't decided on a useful return value yet, so just return
   ;; nil.
   nil)
@@ -1833,12 +1848,12 @@ corresponding source file."
       ;; Use empty string as DEFAULT because setting DEFAULT to nil
       ;; defaults to the directory name, which is not what we want.
       (while (not (equal (setq file (read-file-name
-				     "HTML-ize file (RET to finish): "
-				     (and list (file-name-directory
-						(car list)))
-				     "" t))
-			 ""))
-	(push file list))
+                                     "HTML-ize file (RET to finish): "
+                                     (and list (file-name-directory
+                                                (car list)))
+                                     "" t))
+                         ""))
+        (push file list))
       (nreverse list))))
   ;; Verify that TARGET-DIRECTORY is indeed a directory.  If it's a
   ;; file, htmlize-file will use it as target, and that doesn't make
@@ -1849,6 +1864,9 @@ corresponding source file."
   (dolist (file files)
     (htmlize-file file target-directory)))
 
+(declare-function dired-get-marked-files "dired"
+                  (&optional localp arg filter distinguish-one-marked error))
+
 ;;;###autoload
 (defun htmlize-many-files-dired (arg &optional target-directory)
   "HTMLize dired-marked files."
@@ -1858,7 +1876,6 @@ corresponding source file."
 (provide 'htmlize)
 
 ;; Local Variables:
-;; byte-compile-warnings: (not unresolved obsolete)
+;; indent-tabs-mode: nil
 ;; End:
-
 ;;; htmlize.el ends here
diff --git a/elpa/htmlize-readme.txt b/elpa/htmlize-readme.txt
deleted file mode 100644
index 5dcd6cd8..00000000
--- a/elpa/htmlize-readme.txt
+++ /dev/null
@@ -1,54 +0,0 @@
-This package converts the buffer text and the associated
-decorations to HTML.  Mail to  to discuss
-features and additions.  All suggestions are more than welcome.
-
-To use it, just switch to the buffer you want HTML-ized and type
-`M-x htmlize-buffer'.  You will be switched to a new buffer that
-contains the resulting HTML code.  You can edit and inspect this
-buffer, or you can just save it with C-x C-w.  `M-x htmlize-file'
-will find a file, fontify it, and save the HTML version in
-FILE.html, without any additional intervention.  `M-x
-htmlize-many-files' allows you to htmlize any number of files in
-the same manner.  `M-x htmlize-many-files-dired' does the same for
-files marked in a dired buffer.
-
-htmlize supports three types of HTML output, selected by setting
-`htmlize-output-type': `css', `inline-css', and `font'.  In `css'
-mode, htmlize uses cascading style sheets to specify colors; it
-generates classes that correspond to Emacs faces and uses ... to color parts of text.  In this mode, the
-produced HTML is valid under the 4.01 strict DTD, as confirmed by
-the W3C validator.  `inline-css' is like `css', except the CSS is
-put directly in the STYLE attribute of the SPAN element, making it
-possible to paste the generated HTML into existing HTML documents.
-In `font' mode, htmlize uses ... to
-colorize HTML, which is not standard-compliant, but works better in
-older browsers.  `css' mode is the default.
-
-You can also use htmlize from your Emacs Lisp code.  When called
-non-interactively, `htmlize-buffer' and `htmlize-region' will
-return the resulting HTML buffer, but will not change current
-buffer or move the point.  htmlize will do its best to work on
-non-windowing Emacs sessions but the result will be limited to
-colors supported by the terminal.
-
-htmlize aims for compatibility with older Emacs versions.  Please
-let me know if it doesn't work on the version of GNU Emacs that you
-are using.  The package relies on the presence of CL extensions;
-please don't try to remove that dependency.  I see no practical
-problems with using the full power of the CL extensions, except
-that one might learn to like them too much.
-
-The latest version is available at:
-
-       
-       
-
-
-Thanks go to the many people who have sent reports and contributed
-comments, suggestions, and fixes.  They include Ron Gut, Bob
-Weiner, Toni Drabik, Peter Breton, Ville Skytta, Thomas Vogels,
-Juri Linkov, Maciek Pasternacki, and many others.
-
-User quotes: "You sir, are a sick, sick, _sick_ person. :)"
-                 -- Bill Perry, author of Emacs/W3
-- 
2.47.3