Mercurial > emacs
changeset 106271:8d51419ae1f3
Misc coding convention cleanups.
* htmlfontify.el (hfy-init-kludge-hook): Rename from hfy-init-kludge-hooks.
(hfy-etags-cmd, hfy-flatten-style, hfy-invisible-name, hfy-face-at)
(hfy-fontify-buffer, hfy-prepare-index-i, hfy-subtract-maps)
(hfy-save-kill-buffers, htmlfontify-copy-and-link-dir): Use dolist and push.
(hfy-slant, hfy-weight): Use tables rather than code.
(hfy-box-to-border-assoc, hfy-box-to-style, hfy-decor)
(hfy-face-to-style-i, hfy-fontify-buffer): Use `case'.
(hfy-face-attr-for-class): Initialize `face-spec' directly.
(hfy-face-to-css): Remove `nconc' with single arg.
(hfy-p-to-face-lennart): Use `or'.
(hfy-face-at): Hoist common code. Remove spurious quotes in `case'.
(hfy-overlay-props-at, hfy-mark-tag-hrefs): Eta-reduce.
(hfy-compile-stylesheet, hfy-merge-adjacent-spans)
(hfy-compile-face-map, hfy-parse-tags-buffer): Use push.
(hfy-force-fontification): Use run-hooks.
author | Stefan Monnier <monnier@iro.umontreal.ca> |
---|---|
date | Thu, 26 Nov 2009 16:24:36 +0000 |
parents | d059492ca39b |
children | 3adb5f0ea6f6 |
files | lisp/ChangeLog lisp/htmlfontify.el |
diffstat | 2 files changed, 406 insertions(+), 388 deletions(-) [+] |
line wrap: on
line diff
--- a/lisp/ChangeLog Thu Nov 26 15:22:27 2009 +0000 +++ b/lisp/ChangeLog Thu Nov 26 16:24:36 2009 +0000 @@ -1,3 +1,24 @@ +2009-11-26 Stefan Monnier <monnier@iro.umontreal.ca> + + Misc coding convention cleanups. + * htmlfontify.el (hfy-init-kludge-hook): Rename from + hfy-init-kludge-hooks. + (hfy-etags-cmd, hfy-flatten-style, hfy-invisible-name, hfy-face-at) + (hfy-fontify-buffer, hfy-prepare-index-i, hfy-subtract-maps) + (hfy-save-kill-buffers, htmlfontify-copy-and-link-dir): Use dolist + and push. + (hfy-slant, hfy-weight): Use tables rather than code. + (hfy-box-to-border-assoc, hfy-box-to-style, hfy-decor) + (hfy-face-to-style-i, hfy-fontify-buffer): Use `case'. + (hfy-face-attr-for-class): Initialize `face-spec' directly. + (hfy-face-to-css): Remove `nconc' with single arg. + (hfy-p-to-face-lennart): Use `or'. + (hfy-face-at): Hoist common code. Remove spurious quotes in `case'. + (hfy-overlay-props-at, hfy-mark-tag-hrefs): Eta-reduce. + (hfy-compile-stylesheet, hfy-merge-adjacent-spans) + (hfy-compile-face-map, hfy-parse-tags-buffer): Use push. + (hfy-force-fontification): Use run-hooks. + 2009-11-26 Vivek Dasmohapatra <vivek@etla.org> Various minor fixes.
--- a/lisp/htmlfontify.el Thu Nov 26 15:22:27 2009 +0000 +++ b/lisp/htmlfontify.el Thu Nov 26 16:24:36 2009 +0000 @@ -183,17 +183,19 @@ :prefix "hfy-") (defcustom hfy-page-header 'hfy-default-header - "*Function called with two arguments \(the filename relative to the top + "Function called with two arguments \(the filename relative to the top level source directory being etag\'d and fontified), and a string containing the <style>...</style> text to embed in the document- the string returned will be used as the header for the htmlfontified version of the source file.\n See also: `hfy-page-footer'" :group 'htmlfontify + ;; FIXME: Why place such a :tag everywhere? Isn't it imposing your + ;; own Custom preference on your users? --Stef :tag "page-header" :type '(function)) (defcustom hfy-split-index nil - "*Whether or not to split the index `hfy-index-file' alphabetically + "Whether or not to split the index `hfy-index-file' alphabetically on the first letter of each tag. Useful when the index would otherwise be large and take a long time to render or be difficult to navigate." :group 'htmlfontify @@ -201,32 +203,32 @@ :type '(boolean)) (defcustom hfy-page-footer 'hfy-default-footer - "*As `hfy-page-header', but generates the output footer + "As `hfy-page-header', but generates the output footer \(and takes only 1 argument, the filename\)." :group 'htmlfontify :tag "page-footer" :type '(function)) (defcustom hfy-extn ".html" - "*File extension used for output files." + "File extension used for output files." :group 'htmlfontify :tag "extension" :type '(string)) (defcustom hfy-src-doc-link-style "text-decoration: underline;" - "*String to add to the \'<style> a\' variant of an htmlfontify css class." + "String to add to the \'<style> a\' variant of an htmlfontify css class." :group 'htmlfontify :tag "src-doc-link-style" :type '(string)) (defcustom hfy-src-doc-link-unstyle " text-decoration: none;" - "*Regex to remove from the <style> a variant of an htmlfontify css class." + "Regex to remove from the <style> a variant of an htmlfontify css class." :group 'htmlfontify :tag "src-doc-link-unstyle" :type '(string)) (defcustom hfy-link-extn nil - "*File extension used for href links - Useful where the htmlfontify + "File extension used for href links - Useful where the htmlfontify output files are going to be processed again, with a resulting change in file extension. If nil, then any code using this should fall back to `hfy-extn'." @@ -235,7 +237,7 @@ :type '(choice string (const nil))) (defcustom hfy-link-style-fun 'hfy-link-style-string - "*Set this to a function, which will be called with one argument + "Set this to a function, which will be called with one argument \(a \"{ foo: bar; ...}\" css style-string\) - it should return a copy of its argument, altered so as to make any changes you want made for text which is a hyperlink, in addition to being in the class to which that style would @@ -245,29 +247,31 @@ :type '(function)) (defcustom hfy-index-file "hfy-index" - "*Name \(sans extension\) of the tag definition index file produced during + "Name \(sans extension\) of the tag definition index file produced during fontification-and-hyperlinking." :group 'htmlfontify :tag "index-file" :type '(string)) (defcustom hfy-instance-file "hfy-instance" - "*Name \(sans extension\) of the tag usage index file produced during + "Name \(sans extension\) of the tag usage index file produced during fontification-and-hyperlinking." :group 'htmlfontify :tag "instance-file" :type '(string)) (defcustom hfy-html-quote-regex "\\(<\\|\"\\|&\\|>\\)" - "*Regex to match \(with a single back-reference per match\) strings in HTML + "Regex to match \(with a single back-reference per match\) strings in HTML which should be quoted with `hfy-html-quote' \(and `hfy-html-quote-map'\) to make them safe." :group 'htmlfontify :tag "html-quote-regex" :type '(regexp)) -(defcustom hfy-init-kludge-hooks '(hfy-kludge-cperl-mode) - "*List of functions to call when starting htmlfontify-buffer to do any +(define-obsolete-variable-alias 'hfy-init-kludge-hooks 'hfy-init-kludge-hook + "23.2") +(defcustom hfy-init-kludge-hook '(hfy-kludge-cperl-mode) + "List of functions to call when starting htmlfontify-buffer to do any kludging necessary to get highlighting modes to bahave as you want, even when not running under a window system." :group 'htmlfontify @@ -275,7 +279,7 @@ :type '(hook)) (defcustom hfy-post-html-hooks nil - "*List of functions to call after creating and filling the html buffer. + "List of functions to call after creating and filling the html buffer. These functions will be called with the html buffer as the current buffer" :group 'htmlfontify :tag "post-html-hooks" @@ -283,7 +287,7 @@ :type '(hook)) (defcustom hfy-default-face-def nil - "*Fallback `defface' specification for the face \'default, used when + "Fallback `defface' specification for the face \'default, used when `hfy-display-class' has been set \(the normal htmlfontify way of extracting potentially non-current face information doesn\'t necessarily work for \'default\).\n @@ -298,7 +302,7 @@ "\x01" "\\([0-9]+\\)" "," "\\([0-9]+\\)$" "\\|" ".*\x7f[0-9]+,[0-9]+$") - "*Regex used to parse an etags entry: must have 3 subexps, corresponding, + "Regex used to parse an etags entry: must have 3 subexps, corresponding, in order, to:\n 1 - The tag 2 - The line @@ -311,7 +315,7 @@ ("<" "<" ) ("&" "&" ) (">" ">" )) - "*Alist of char -> entity mappings used to make the text html-safe." + "Alist of char -> entity mappings used to make the text html-safe." :group 'htmlfontify :tag "html-quote-map" :type '(alist :key-type (string))) @@ -353,14 +357,14 @@ (defcustom hfy-etags-cmd-alist hfy-etags-cmd-alist-default - "*Alist of possible shell commands that will generate etags output that + "Alist of possible shell commands that will generate etags output that `htmlfontify' can use. \'%s\' will be replaced by `hfy-etags-bin'." :group 'htmlfontify :tag "etags-cmd-alist" :type '(alist :key-type (string) :value-type (string)) )) (defcustom hfy-etags-bin "etags" - "*Location of etags binary (we begin by assuming it\'s in your path).\n + "Location of etags binary (we begin by assuming it\'s in your path).\n Note that if etags is not in your path, you will need to alter the shell commands in `hfy-etags-cmd-alist'." :group 'htmlfontify @@ -368,7 +372,7 @@ :type '(file)) (defcustom hfy-shell-file-name "/bin/sh" - "*Shell (bourne or compatible) to invoke for complex shell operations." + "Shell (bourne or compatible) to invoke for complex shell operations." :group 'htmlfontify :tag "shell-file-name" :type '(file)) @@ -381,7 +385,7 @@ (defcustom hfy-etags-cmd (eval-and-compile (cdr (assoc (hfy-which-etags) hfy-etags-cmd-alist))) - "*The etags equivalent command to run in a source directory to generate a tags + "The etags equivalent command to run in a source directory to generate a tags file for the whole source tree from there on down. The command should emit the etags output on stdout.\n Two canned commands are provided - they drive Emacs\' etags and @@ -390,15 +394,12 @@ :tag "etags-command" :type (eval-and-compile (let ((clist (list '(string)))) - (mapc - (lambda (C) - (setq clist - (cons (list 'const :tag (car C) (cdr C)) clist))) - hfy-etags-cmd-alist) + (dolist (C hfy-etags-cmd-alist) + (push (list 'const :tag (car C) (cdr C)) clist)) (cons 'choice clist)) )) (defcustom hfy-istext-command "file %s | sed -e 's@^[^:]*:[ \t]*@@'" - "*Command to run with the name of a file, to see whether it is a text file + "Command to run with the name of a file, to see whether it is a text file or not. The command should emit a string containing the word \'text\' if the file is a text file, and a string not containing \'text\' otherwise." :group 'htmlfontify @@ -407,13 +408,13 @@ (defcustom hfy-find-cmd "find . -type f \\! -name \\*~ \\! -name \\*.flc \\! -path \\*/CVS/\\*" - "*Find command used to harvest a list of files to attempt to fontify." + "Find command used to harvest a list of files to attempt to fontify." :group 'htmlfontify :tag "find-command" :type '(string)) (defcustom hfy-display-class nil - "*Display class to use to determine which display class to use when + "Display class to use to determine which display class to use when calculating a face\'s attributes. This is useful when, for example, you are running Emacs on a tty or in batch mode, and want htmlfontify to have access to the face spec you would use if you were connected to an X display.\n @@ -451,7 +452,7 @@ (const :tag "Bright" light ))) )) (defcustom hfy-optimisations (list 'keep-overlays) - "*Optimisations to turn on: So far, the following have been implemented:\n + "Optimisations to turn on: So far, the following have been implemented:\n merge-adjacent-tags: If two (or more) span tags are adjacent, identical and separated by nothing more than whitespace, they will be merged into one span. @@ -583,8 +584,8 @@ If a window system is unavailable, calls `hfy-fallback-colour-values'." (if (string-match hfy-triplet-regex colour) (mapcar - (lambda (x) - (* (string-to-number (match-string x colour) 16) 257)) '(1 2 3)) + (lambda (x) (* (string-to-number (match-string x colour) 16) 257)) + '(1 2 3)) ;;(message ">> %s" colour) (if window-system (if (fboundp 'color-values) @@ -756,7 +757,8 @@ (apply 'format "#%02x%02x%02x" (mapcar (lambda (X) (* (/ (nth X rgb16) - (nth X white)) 255)) '(0 1 2))))) ) + (nth X white)) 255)) + '(0 1 2)))))) (defun hfy-family (family) (list (cons "font-family" family))) (defun hfy-bgcol (colour) (list (cons "background" (hfy-triplet colour)))) @@ -784,32 +786,34 @@ "Derive a font-style css specifier from the Emacs :slant attribute SLANT: CSS does not define the reverse-* styles, so just maps those to the regular specifiers." - (list (cons "font-style" (cond ((eq 'italic slant) "italic" ) - ((eq 'reverse-italic slant) "italic" ) - ((eq 'oblique slant) "oblique") - ((eq 'reverse-oblique slant) "oblique") - (t "normal" )))) ) + (list (cons "font-style" + (or (cdr (assq slant '((italic . "italic") + (reverse-italic . "italic" ) + (oblique . "oblique") + (reverse-oblique . "oblique")))) + "normal")))) (defun hfy-weight (weight) "Derive a font-weight css specifier from an Emacs weight spec symbol WEIGHT." - (list (cons "font-weight" (cond ((eq 'ultra-bold weight) "900") - ((eq 'extra-bold weight) "800") - ((eq 'bold weight) "700") - ((eq 'semi-bold weight) "600") - ((eq 'normal weight) "500") - ((eq 'semi-light weight) "400") - ((eq 'light weight) "300") - ((eq 'extra-light weight) "200") - ((eq 'ultra-light weight) "100")))) ) - + (list (cons "font-weight" (cdr (assq weight '((ultra-bold . "900") + (extra-bold . "800") + (bold . "700") + (semi-bold . "600") + (normal . "500") + (semi-light . "400") + (light . "300") + (extra-light . "200") + (ultra-light . "100"))))))) + (defun hfy-box-to-border-assoc (spec) (if spec (let ((tag (car spec)) (val (cadr spec))) - (cons (cond ((eq tag :color) (cons "colour" val)) - ((eq tag :width) (cons "width" val)) - ((eq tag :style) (cons "style" val))) - (hfy-box-to-border-assoc (cddr spec))))) ) + (cons (case tag + (:color (cons "colour" val)) + (:width (cons "width" val)) + (:style (cons "style" val))) + (hfy-box-to-border-assoc (cddr spec)))))) (defun hfy-box-to-style (spec) (let* ((css (hfy-box-to-border-assoc spec)) @@ -818,9 +822,10 @@ (list (if col (cons "border-color" (cdr (assoc "colour" css)))) (cons "border-width" (format "%dpx" (or (cdr (assoc "width" css)) 1))) - (cons "border-style" (cond ((eq s 'released-button) "outset") - ((eq s 'pressed-button ) "inset" ) - (t "solid" ))))) ) + (cons "border-style" (case s + (released-button "outset") + (pressed-button "inset" ) + (t "solid" )))))) (defun hfy-box (box) "Derive CSS border-* attributes from the Emacs :box attribute BOX." @@ -836,9 +841,10 @@ VAL is ignored." (list ;; FIXME: Why not '("text-decoration" . "underline")? --Stef - (cond ((eq tag :underline ) (cons "text-decoration" "underline" )) - ((eq tag :overline ) (cons "text-decoration" "overline" )) - ((eq tag :strike-through) (cons "text-decoration" "line-through"))))) + (case tag + (:underline (cons "text-decoration" "underline" )) + (:overline (cons "text-decoration" "overline" )) + (:strike-through (cons "text-decoration" "line-through"))))) (defun hfy-invisible (&optional val) "This text should be invisible. @@ -871,75 +877,75 @@ is magical in that Emacs' fonts behave as if they inherit implicitly from \'default, but no such behaviour exists in HTML/CSS \).\n See `hfy-display-class' for details of valid values for CLASS." - (let ((face-spec nil)) - (setq - face-spec - (if class - (let ((face-props (hfy-combined-face-spec face)) - (face-specn nil) - (face-class nil) - (face-attrs nil) - (face-score -1) - (face-match nil)) - (while face-props - (setq face-specn (car face-props) - face-class (car face-specn) - face-attrs (cdr face-specn) - face-props (cdr face-props)) - ;; if the current element CEL of CLASS is t we match - ;; if the current face-class is t, we match - ;; if the cdr of CEL has a non-nil - ;; intersection with the cdr of the first member of - ;; the current face-class with the same car as CEL, we match - ;; if we actually clash, then we can't match - (let ((cbuf class) - (cel nil) - (key nil) - (val nil) - (x nil) - (next nil) - (score 0)) - (while (and cbuf (not next)) - (setq cel (car cbuf) - cbuf (cdr cbuf) - key (car cel) - val (cdr cel) - val (if (listp val) val (list val))) - (cond - ((or (eq cel t) (memq face-class '(t default)));;default match - (setq score 0) (ignore "t match")) - ((not (cdr (assq key face-class))) ;; neither good nor bad - nil (ignore "non match, non collision")) - ((setq x (hfy-interq val (cdr (assq key face-class)))) - (setq score (+ score (length x))) - (ignore "intersection")) - (t ;; nope. - (setq next t score -10) (ignore "collision")) )) - (if (> score face-score) - (progn - (setq face-match face-attrs - face-score score ) - (ignore "%d << %S/%S" score face-class class)) - (ignore "--- %d ---- (insufficient)" score)) )) - ;; matched ? last attrs : nil - (if face-match - (if (listp (car face-match)) (car face-match) face-match) nil)) - ;; Unfortunately the default face returns a - ;; :background. Fortunately we can remove it, but how do we do - ;; that in a non-system specific way? - (let ((spec (face-attr-construct face)) - (new-spec nil)) - (if (not (memq :background spec)) - spec - (while spec - (let ((a (nth 0 spec)) - (b (nth 1 spec))) - (unless (and (eq a :background) - (stringp b) - (string= b "SystemWindow")) - (setq new-spec (cons a (cons b new-spec))))) - (setq spec (cddr spec))) - new-spec)) )) + (let ((face-spec + (if class + (let ((face-props (hfy-combined-face-spec face)) + (face-specn nil) + (face-class nil) + (face-attrs nil) + (face-score -1) + (face-match nil)) + (while face-props + (setq face-specn (car face-props) + face-class (car face-specn) + face-attrs (cdr face-specn) + face-props (cdr face-props)) + ;; if the current element CEL of CLASS is t we match + ;; if the current face-class is t, we match + ;; if the cdr of CEL has a non-nil + ;; intersection with the cdr of the first member of + ;; the current face-class with the same car as CEL, we match + ;; if we actually clash, then we can't match + (let ((cbuf class) + (cel nil) + (key nil) + (val nil) + (x nil) + (next nil) + (score 0)) + (while (and cbuf (not next)) + (setq cel (car cbuf) + cbuf (cdr cbuf) + key (car cel) + val (cdr cel) + val (if (listp val) val (list val))) + (cond + ((or (eq cel t) + (memq face-class '(t default))) ;Default match. + (setq score 0) (ignore "t match")) + ((not (cdr (assq key face-class))) ;Neither good nor bad. + nil (ignore "non match, non collision")) + ((setq x (hfy-interq val (cdr (assq key face-class)))) + (setq score (+ score (length x))) + (ignore "intersection")) + (t ;; nope. + (setq next t score -10) (ignore "collision")) )) + (if (> score face-score) + (progn + (setq face-match face-attrs + face-score score ) + (ignore "%d << %S/%S" score face-class class)) + (ignore "--- %d ---- (insufficient)" score)) )) + ;; matched ? last attrs : nil + (if face-match + (if (listp (car face-match)) (car face-match) face-match) + nil)) + ;; Unfortunately the default face returns a + ;; :background. Fortunately we can remove it, but how do we do + ;; that in a non-system specific way? + (let ((spec (face-attr-construct face)) + (new-spec nil)) + (if (not (memq :background spec)) + spec + (while spec + (let ((a (nth 0 spec)) + (b (nth 1 spec))) + (unless (and (eq a :background) + (stringp b) + (string= b "SystemWindow")) + (setq new-spec (cons a (cons b new-spec))))) + (setq spec (cddr spec))) + new-spec))))) (if (or (memq :inherit face-spec) (eq 'default face)) face-spec (nconc face-spec (list :inherit 'default))) )) @@ -988,21 +994,21 @@ (hfy-face-to-style-i (hfy-face-attr-for-class v hfy-display-class)) )))) (setq this - (if val (cond - ((eq key :family ) (hfy-family val)) - ((eq key :width ) (hfy-width val)) - ((eq key :weight ) (hfy-weight val)) - ((eq key :slant ) (hfy-slant val)) - ((eq key :foreground ) (hfy-colour val)) - ((eq key :background ) (hfy-bgcol val)) - ((eq key :box ) (hfy-box val)) - ((eq key :height ) (hfy-size val)) - ((eq key :underline ) (hfy-decor key val)) - ((eq key :overline ) (hfy-decor key val)) - ((eq key :strike-through) (hfy-decor key val)) - ((eq key :invisible ) (hfy-invisible val)) - ((eq key :bold ) (hfy-weight 'bold)) - ((eq key :italic ) (hfy-slant 'italic)))))) + (if val (case key + (:family (hfy-family val)) + (:width (hfy-width val)) + (:weight (hfy-weight val)) + (:slant (hfy-slant val)) + (:foreground (hfy-colour val)) + (:background (hfy-bgcol val)) + (:box (hfy-box val)) + (:height (hfy-size val)) + (:underline (hfy-decor key val)) + (:overline (hfy-decor key val)) + (:strike-through (hfy-decor key val)) + (:invisible (hfy-invisible val)) + (:bold (hfy-weight 'bold)) + (:italic (hfy-slant 'italic)))))) (setq that (hfy-face-to-style-i next)) ;;(lwarn t :warning "%S => %S" fn (nconc this that parent)) (nconc this that parent))) ) @@ -1032,13 +1038,12 @@ (m (list 1)) (x nil) (r nil)) - (mapc - (lambda (css) - (if (string= (car css) "font-size") - (progn - (when (not x) (setq m (nconc m (hfy-size-to-int (cdr css))))) - (when (string-match "pt" (cdr css)) (setq x t))) - (setq r (nconc r (list css))) )) style) + (dolist (css style) + (if (string= (car css) "font-size") + (progn + (when (not x) (setq m (nconc m (hfy-size-to-int (cdr css))))) + (when (string-match "pt" (cdr css)) (setq x t))) + (setq r (nconc r (list css))))) ;;(message "r: %S" r) (setq n (apply '* m)) (nconc r (hfy-size (if x (round n) (* n 1.0)))) )) @@ -1112,14 +1117,13 @@ ;;(message "(hfy-face-to-style %S)" fn) (setq css-list (hfy-face-to-style fn)) (setq css-text - (nconc - (mapcar - (lambda (E) - (if (car E) - (if (not (member (car E) seen)) - (progn - (setq seen (cons (car E) seen)) - (format " %s: %s; " (car E) (cdr E)))))) css-list))) + (mapcar + (lambda (E) + (if (car E) + (unless (member (car E) seen) + (push (car E) seen) + (format " %s: %s; " (car E) (cdr E))))) + css-list)) (cons (hfy-css-name fn) (format "{%s}" (apply 'concat css-text)))) ) ;; extract a face from a list of char properties, if there is one: @@ -1149,9 +1153,8 @@ (let* ((category (plist-get props 'category)) (face (when category (plist-get (symbol-plist category) 'face)))) face) - (if font-lock-face - font-lock-face - face))))) + (or font-lock-face + face))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; (defun hfy-get-face-at (pos) @@ -1200,11 +1203,10 @@ MAP is the invisibility map as returned by `hfy-find-invisible-ranges'." ;;(message "(hfy-invisible-name %S %S)" point map) (let (name) - (mapc - (lambda (range) - (when (and (>= point (car range)) - (< point (cdr range))) - (setq name (format "invisible-%S-%S" (car range) (cdr range))))) map) + (dolist (range map) + (when (and (>= point (car range)) + (< point (cdr range))) + (setq name (format "invisible-%S-%S" (car range) (cdr range))))) name)) ;; Fix-me: This function needs some cleanup by someone who understand @@ -1221,137 +1223,137 @@ ;;(message "hfy-face-at");;DBUG ;; Fix-me: clean up, remove face-name etc ;; not sure why we'd want to remove face-name? -- v - (let ((overlay-data nil) - (base-face nil) - ;; restored hfy-p-to-face as it handles faces like (bold) as - ;; well as face like 'bold - hfy-get-face-at doesn't dtrt -- v - (face-name (hfy-p-to-face (text-properties-at p))) - ;; (face-name (hfy-get-face-at p)) - (prop-seen nil) - (extra-props nil) - (text-props (text-properties-at p))) - ;;(message "face-name: %S" face-name) - (when (and face-name (listp face-name) (facep (car face-name))) - ;;(message "face-name is a list %S" face-name) - ;;(setq text-props (cons 'face face-name)) - (dolist (f face-name) - (if (listp f) ;; for things like (variable-pitch (:foreground "red")) - (setq extra-props (cons f extra-props)) - (setq extra-props (cons :inherit (cons f extra-props))))) - (setq base-face (car face-name) - face-name nil)) - ;; text-properties-at => (face (:foreground "red" ...)) - ;; or => (face (compilation-info underline)) list of faces - ;; overlay-properties - ;; format= (evaporate t face ((foreground-color . "red"))) + (let ((overlay-data nil) + (base-face nil) + ;; restored hfy-p-to-face as it handles faces like (bold) as + ;; well as face like 'bold - hfy-get-face-at doesn't dtrt -- v + (face-name (hfy-p-to-face (text-properties-at p))) + ;; (face-name (hfy-get-face-at p)) + (prop-seen nil) + (extra-props nil) + (text-props (text-properties-at p))) + ;;(message "face-name: %S" face-name) + (when (and face-name (listp face-name) (facep (car face-name))) + ;;(message "face-name is a list %S" face-name) + ;;(setq text-props (cons 'face face-name)) + (dolist (f face-name) + (setq extra-props (if (listp f) + ;; for things like (variable-pitch + ;; (:foreground "red")) + (cons f extra-props) + (cons :inherit (cons f extra-props))))) + (setq base-face (car face-name) + face-name nil)) + ;; text-properties-at => (face (:foreground "red" ...)) + ;; or => (face (compilation-info underline)) list of faces + ;; overlay-properties + ;; format= (evaporate t face ((foreground-color . "red"))) - ;; SO: if we have turned overlays off, - ;; or if there's no overlay data - ;; just bail out and return whatever face data we've accumulated so far - (if (or (not (hfy-opt 'keep-overlays)) - (not (setq overlay-data (hfy-overlay-props-at p)))) - (progn - ;;(message "· %d: %s; %S; %s" - ;; p face-name extra-props text-props) - (or face-name base-face)) ;; no overlays or extra properties - ;; collect any face data and any overlay data for processing: - (when text-props - (setq overlay-data (cons text-props overlay-data))) - (setq overlay-data (nreverse overlay-data)) - ;;(message "- %d: %s; %S; %s; %s" - ;; p face-name extra-props text-props overlay-data) - ;; remember the basic face name so we don't keep repeating its specs: - (when face-name (setq base-face face-name)) - (mapc - (lambda (P) - (let ((iprops (cadr (memq 'invisible P)))) - ;;(message "(hfy-prop-invisible-p %S)" iprops) - (when (and iprops (hfy-prop-invisible-p iprops)) - (setq extra-props - (cons :invisible (cons t extra-props))) )) - (let ((fprops (cadr (or (memq 'face P) - (memq 'font-lock-face P))))) - ;;(message "overlay face: %s" fprops) - (if (not (listp fprops)) - (let ((this-face (if (stringp fprops) (intern fprops) fprops))) - (when (not (eq this-face base-face)) - (setq extra-props - (cons :inherit - (cons this-face extra-props))) )) - (while fprops - (if (facep (car fprops)) - (let ((face (car fprops))) - (when (stringp face) (setq face (intern fprops))) - (setq extra-props - (cons :inherit - (cons face - extra-props))) - (setq fprops (cdr fprops))) - (let (p v) - ;; Sigh. - (if (listp (car fprops)) - (if (nlistp (cdr (car fprops))) - (progn - ;; ((prop . val)) - (setq p (caar fprops)) - (setq v (cdar fprops)) - (setq fprops (cdr fprops))) - ;; ((prop val)) - (setq p (caar fprops)) - (setq v (cadar fprops)) - (setq fprops (cdr fprops))) - (if (listp (cdr fprops)) - (progn - ;; (:prop val :prop val ...) - (setq p (car fprops)) - (setq v (cadr fprops)) - (setq fprops (cddr fprops))) - (if (and (listp fprops) - (not (listp (cdr fprops)))) - ;;(and (consp x) (cdr (last x))) - (progn - ;; (prop . val) - (setq p (car fprops)) - (setq v (cdr fprops)) - (setq fprops nil)) - (error "Eh... another format! fprops=%s" fprops) ))) - (setq p (case p - ;; These are all the properties handled - ;; in `hfy-face-to-style-i'. - ;; - ;; Are these translations right? - ;; yes, they are -- v - ('family :family ) - ('width :width ) - ('height :height ) - ('weight :weight ) - ('slant :slant ) - ('underline :underline ) - ('overline :overline ) - ('strike-through :strike-through) - ('box :box ) - ('foreground-color :foreground) - ('background-color :background) - ('bold :bold ) - ('italic :italic ) - (t p))) - (if (memq p prop-seen) nil ;; noop - (setq prop-seen (cons p prop-seen) - extra-props (cons p (cons v extra-props)))) )))))) - overlay-data) - ;;(message "+ %d: %s; %S" p face-name extra-props) - (if extra-props - (if (listp face-name) - (nconc extra-props face-name) - (nconc extra-props (face-attr-construct face-name))) - face-name)) )) + ;; SO: if we have turned overlays off, + ;; or if there's no overlay data + ;; just bail out and return whatever face data we've accumulated so far + (if (or (not (hfy-opt 'keep-overlays)) + (not (setq overlay-data (hfy-overlay-props-at p)))) + (progn + ;;(message "· %d: %s; %S; %s" + ;; p face-name extra-props text-props) + (or face-name base-face)) ;; no overlays or extra properties + ;; collect any face data and any overlay data for processing: + (when text-props + (push text-props overlay-data)) + (setq overlay-data (nreverse overlay-data)) + ;;(message "- %d: %s; %S; %s; %s" + ;; p face-name extra-props text-props overlay-data) + ;; remember the basic face name so we don't keep repeating its specs: + (when face-name (setq base-face face-name)) + (dolist (P overlay-data) + (let ((iprops (cadr (memq 'invisible P)))) ;FIXME: plist-get? + ;;(message "(hfy-prop-invisible-p %S)" iprops) + (when (and iprops (hfy-prop-invisible-p iprops)) + (setq extra-props + (cons :invisible (cons t extra-props))) )) + (let ((fprops (cadr (or (memq 'face P) + (memq 'font-lock-face P))))) + ;;(message "overlay face: %s" fprops) + (if (not (listp fprops)) + (let ((this-face (if (stringp fprops) (intern fprops) fprops))) + (when (not (eq this-face base-face)) + (setq extra-props + (cons :inherit + (cons this-face extra-props))) )) + (while fprops + (if (facep (car fprops)) + (let ((face (car fprops))) + (when (stringp face) (setq face (intern fprops))) + (setq extra-props + (cons :inherit + (cons face + extra-props))) + (setq fprops (cdr fprops))) + (let (p v) + ;; Sigh. + (if (listp (car fprops)) + (if (nlistp (cdr (car fprops))) + (progn + ;; ((prop . val)) + (setq p (caar fprops)) + (setq v (cdar fprops)) + (setq fprops (cdr fprops))) + ;; ((prop val)) + (setq p (caar fprops)) + (setq v (cadar fprops)) + (setq fprops (cdr fprops))) + (if (listp (cdr fprops)) + (progn + ;; (:prop val :prop val ...) + (setq p (car fprops)) + (setq v (cadr fprops)) + (setq fprops (cddr fprops))) + (if (and (listp fprops) + (not (listp (cdr fprops)))) + ;;(and (consp x) (cdr (last x))) + (progn + ;; (prop . val) + (setq p (car fprops)) + (setq v (cdr fprops)) + (setq fprops nil)) + (error "Eh... another format! fprops=%s" fprops) ))) + (setq p (case p + ;; These are all the properties handled + ;; in `hfy-face-to-style-i'. + ;; + ;; Are these translations right? + ;; yes, they are -- v + (family :family ) + (width :width ) + (height :height ) + (weight :weight ) + (slant :slant ) + (underline :underline ) + (overline :overline ) + (strike-through :strike-through) + (box :box ) + (foreground-color :foreground) + (background-color :background) + (bold :bold ) + (italic :italic ) + (t p))) + (if (memq p prop-seen) nil ;; noop + (setq prop-seen (cons p prop-seen) + extra-props (cons p (cons v extra-props)))))))))) + ;;(message "+ %d: %s; %S" p face-name extra-props) + (if extra-props + (if (listp face-name) + (nconc extra-props face-name) + (nconc extra-props (face-attr-construct face-name))) + face-name)) )) (defun hfy-overlay-props-at (p) "Grab overlay properties at point P. The plists are returned in descending priority order." - (sort (mapcar (lambda (O) (overlay-properties O)) (overlays-at p)) - (lambda (A B) (> (or (cadr (memq 'priority A)) 0) - (or (cadr (memq 'priority B)) 0)) ) ) ) + (sort (mapcar #'overlay-properties (overlays-at p)) + (lambda (A B) (> (or (cadr (memq 'priority A)) 0) ;FIXME: plist-get? + (or (cadr (memq 'priority B)) 0))))) ;; construct an assoc of (face-name . (css-name . "{ css-style }")) elements: (defun hfy-compile-stylesheet () @@ -1366,9 +1368,9 @@ (goto-char pt) (while (< pt (point-max)) (if (and (setq fn (hfy-face-at pt)) (not (assoc fn style))) - (setq style (cons (cons fn (hfy-face-to-css fn)) style))) + (push (cons fn (hfy-face-to-css fn)) style)) (setq pt (next-char-property-change pt))) ) - (setq style (cons (cons 'default (hfy-face-to-css 'default)) style))) ) + (push (cons 'default (hfy-face-to-css 'default)) style))) (defun hfy-fontified-p () "`font-lock' doesn't like to say it\'s been fontified when in batch @@ -1410,8 +1412,8 @@ (span-stop nil) (span-start nil) (reduced-map nil)) - ;;(setq reduced-map (cons (car tmp-map) reduced-map)) - ;;(setq reduced-map (cons (cadr tmp-map) reduced-map)) + ;;(push (car tmp-map) reduced-map) + ;;(push (cadr tmp-map) reduced-map) (while tmp-map (setq first-start (cadddr tmp-map) first-stop (caddr tmp-map) @@ -1431,8 +1433,8 @@ first-stop (caddr map-buf) last-start (cadr map-buf) last-stop (car map-buf))) - (setq reduced-map (cons span-stop reduced-map)) - (setq reduced-map (cons span-start reduced-map)) + (push span-stop reduced-map) + (push span-start reduced-map) (setq tmp-map (memq last-start tmp-map)) (setq tmp-map (cdr tmp-map))) (setq reduced-map (nreverse reduced-map)))) @@ -1459,15 +1461,15 @@ (goto-char pt) (while (< pt (point-max)) (if (setq fn (hfy-face-at pt)) - (progn (if prev-tag (setq map (cons (cons pt-narrow 'end) map))) - (setq map (cons (cons pt-narrow fn) map)) + (progn (if prev-tag (push (cons pt-narrow 'end) map)) + (push (cons pt-narrow fn) map) (setq prev-tag t)) - (if prev-tag (setq map (cons (cons pt-narrow 'end) map))) + (if prev-tag (push (cons pt-narrow 'end) map)) (setq prev-tag nil)) (setq pt (next-char-property-change pt)) (setq pt-narrow (1+ (- pt (point-min))))) (if (and map (not (eq 'end (cdar map)))) - (setq map (cons (cons (- (point-max) (point-min)) 'end) map)))) + (push (cons (- (point-max) (point-min)) 'end) map))) (if (hfy-opt 'merge-adjacent-tags) (hfy-merge-adjacent-spans map) map))) (defun hfy-buffer () @@ -1514,7 +1516,8 @@ (format "span.%s %s\nspan.%s a %s\n" (cadr style) (cddr style) - (cadr style) (hfy-link-style (cddr style)))) css)) + (cadr style) (hfy-link-style (cddr style)))) + css)) " --></style>\n")) (funcall hfy-page-header file stylesheet))) @@ -1665,38 +1668,36 @@ ;; property has already served its main purpose by this point. ;;(message "mapcar over the CSS-MAP") (message "invis-ranges:\n%S" invis-ranges) - (mapc - (lambda (point-face) - (let ((pt (car point-face)) - (fn (cdr point-face)) - (move-link nil)) - (goto-char pt) - (setq move-link - (or (get-text-property pt 'hfy-linkp) - (get-text-property pt 'hfy-endl ))) - (if (eq 'end fn) - (insert "</span>") - (if (not (and srcdir file)) - nil - (when move-link - (remove-text-properties (point) (1+ (point)) '(hfy-endl nil)) - (put-text-property pt (1+ pt) 'hfy-endl t) )) - ;; if we have invisible blocks, we need to do some extra magic: - (if invis-ranges - (let ((iname (hfy-invisible-name pt invis-ranges)) - (fname (hfy-lookup fn css-sheet ))) - (when (assq pt invis-ranges) - (insert - (format "<span onclick=\"toggle_invis('%s');\">" iname)) - (insert "…</span>")) - (insert - (format "<span class=\"%s\" id=\"%s-%d\">" fname iname pt))) - (insert (format "<span class=\"%s\">" (hfy-lookup fn css-sheet)))) - (if (not move-link) nil - ;;(message "removing prop2 @ %d" (point)) - (if (remove-text-properties (point) (1+ (point)) '(hfy-endl nil)) - (put-text-property pt (1+ pt) 'hfy-endl t))) ))) - css-map) + (dolist (point-face css-map) + (let ((pt (car point-face)) + (fn (cdr point-face)) + (move-link nil)) + (goto-char pt) + (setq move-link + (or (get-text-property pt 'hfy-linkp) + (get-text-property pt 'hfy-endl ))) + (if (eq 'end fn) + (insert "</span>") + (if (not (and srcdir file)) + nil + (when move-link + (remove-text-properties (point) (1+ (point)) '(hfy-endl nil)) + (put-text-property pt (1+ pt) 'hfy-endl t) )) + ;; if we have invisible blocks, we need to do some extra magic: + (if invis-ranges + (let ((iname (hfy-invisible-name pt invis-ranges)) + (fname (hfy-lookup fn css-sheet ))) + (when (assq pt invis-ranges) + (insert + (format "<span onclick=\"toggle_invis('%s');\">" iname)) + (insert "…</span>")) + (insert + (format "<span class=\"%s\" id=\"%s-%d\">" fname iname pt))) + (insert (format "<span class=\"%s\">" (hfy-lookup fn css-sheet)))) + (if (not move-link) nil + ;;(message "removing prop2 @ %d" (point)) + (if (remove-text-properties (point) (1+ (point)) '(hfy-endl nil)) + (put-text-property pt (1+ pt) 'hfy-endl t)))))) ;; ##################################################################### ;; Invisibility ;; Maybe just make the text invisible in XHTML? @@ -1724,13 +1725,13 @@ (if (not (setq pr (get-text-property pt lp))) nil (goto-char pt) (remove-text-properties pt (1+ pt) (list lp nil)) - (cond - ((eq lp 'hfy-link) + (case lp + (hfy-link (if (setq rr (get-text-property pt 'hfy-inst)) (insert (format "<a name=\"%s\"></a>" rr))) (insert (format "<a href=\"%s\">" pr)) (setq lp 'hfy-endl)) - ((eq lp 'hfy-endl) + (hfy-endl (insert "</a>") (setq lp 'hfy-link)) ))) )) ;; ##################################################################### @@ -1760,7 +1761,7 @@ (defun hfy-force-fontification () "Try to force font-locking even when it is optimised away." - (mapc (lambda (fun) (funcall fun)) hfy-init-kludge-hooks) + (run-hooks 'hfy-init-kludge-hook) (eval-and-compile (require 'font-lock)) (if (boundp 'font-lock-cache-position) (or font-lock-cache-position @@ -1811,6 +1812,7 @@ "Return a list of files under DIRECTORY. Strips any leading \"./\" from each filename." ;;(message "hfy-list-files");;DBUG + ;; FIXME: this changes the dir of the currrent buffer. Is that right?? (cd directory) (mapcar (lambda (F) (if (string-match "^./\\(.*\\)" F) (match-string 1 F) F)) (split-string (shell-command-to-string hfy-find-cmd))) ) @@ -1995,7 +1997,7 @@ (rmap-line nil) (tag-regex (hfy-word-regex TAG)) (tag-map (gethash TAG cache-hash)) - (tag-files (mapcar (lambda (X) (car X)) tag-map))) + (tag-files (mapcar #'car tag-map))) ;; find instances of TAG and do what needs to be done: (goto-char (point-min)) (while (search-forward TAG nil 'NOERROR) @@ -2098,17 +2100,17 @@ (setq tag-point (round (string-to-number (match-string 3)))) (setq hash-entry (gethash tag-string cache-hash)) (setq new-entry (list etags-file tag-line tag-point)) - (setq hash-entry (cons new-entry hash-entry)) + (push new-entry hash-entry) ;;(message "HASH-ENTRY %s %S" tag-string new-entry) (puthash tag-string hash-entry cache-hash)))) ))) ;; cache a list of tags in descending length order: - (maphash (lambda (K V) (setq tags-list (cons K tags-list))) cache-hash) + (maphash (lambda (K V) (push K tags-list)) cache-hash) (setq tags-list (sort tags-list (lambda (A B) (< (length B) (length A))))) ;; put the tag list into the cache: (if tlist-cache (setcar (cdr tlist-cache) tags-list) - (setq hfy-tags-sortl (cons (list srcdir tags-list) hfy-tags-sortl))) + (push (list srcdir tags-list) hfy-tags-sortl)) ;; return the number of tags found: (length tags-list) )) @@ -2134,36 +2136,33 @@ (setq cache-hash (cadr cache-entry)) (setq index-buf (get-buffer-create index-file)))) nil ;; noop - (maphash (lambda (K V) (setq tag-list (cons K tag-list))) cache-hash) + (maphash (lambda (K V) (push K tag-list)) cache-hash) (setq tag-list (sort tag-list 'string<)) (set-buffer index-buf) (erase-buffer) (insert (funcall hfy-page-header filename "<!-- CSS -->")) (insert "<table class=\"index\">\n") - (mapc - (lambda (TAG) - (let ((tag-started nil)) - (mapc - (lambda (DEF) - (if (and stub (not (string-match (concat "^" stub) TAG))) - nil ;; we have a stub and it didn't match: NOOP - (let ((file (car DEF)) - (line (cadr DEF))) - (insert - (format - (concat - " <tr> \n" - " <td>%s</td> \n" - " <td><a href=\"%s%s\">%s</a></td> \n" - " <td><a href=\"%s%s#%s.%d\">%d</a></td>\n" - " </tr> \n") - (if (string= TAG tag-started) " " - (format "<a name=\"%s\">%s</a>" TAG TAG)) - file (or hfy-link-extn hfy-extn) file - file (or hfy-link-extn hfy-extn) TAG line line)) - (setq tag-started TAG)))) - (gethash TAG cache-hash)))) tag-list) + (dolist (TAG tag-list) + (let ((tag-started nil)) + (dolist (DEF (gethash TAG cache-hash)) + (if (and stub (not (string-match (concat "^" stub) TAG))) + nil ;; we have a stub and it didn't match: NOOP + (let ((file (car DEF)) + (line (cadr DEF))) + (insert + (format + (concat + " <tr> \n" + " <td>%s</td> \n" + " <td><a href=\"%s%s\">%s</a></td> \n" + " <td><a href=\"%s%s#%s.%d\">%d</a></td>\n" + " </tr> \n") + (if (string= TAG tag-started) " " + (format "<a name=\"%s\">%s</a>" TAG TAG)) + file (or hfy-link-extn hfy-extn) file + file (or hfy-link-extn hfy-extn) TAG line line)) + (setq tag-started TAG)))))) (insert "</table>\n") (insert (funcall hfy-page-footer filename)) (and dstdir (cd dstdir)) @@ -2237,20 +2236,15 @@ (fwd-map (cadr (assoc srcdir hfy-tags-cache))) (rev-map (cadr (assoc srcdir hfy-tags-rmap ))) (taglist (cadr (assoc srcdir hfy-tags-sortl)))) - (mapc - (lambda (TAG) - (setq def-list (gethash TAG fwd-map) - old-list (gethash TAG rev-map) - new-list nil - exc-list nil) - (mapc - (lambda (P) - (setq exc-list (cons (list (car P) (cadr P)) exc-list))) def-list) - (mapc - (lambda (P) - (or (member (list (car P) (cadr P)) exc-list) - (setq new-list (cons P new-list)))) old-list) - (puthash TAG new-list rev-map)) taglist) )) + (dolist (TAG taglist) + (setq def-list (gethash TAG fwd-map) + old-list (gethash TAG rev-map) + exc-list (mapcar (lambda (P) (list (car P) (cadr P))) def-list) + new-list nil) + (dolist (P old-list) + (or (member (list (car P) (cadr P)) exc-list) + (push P new-list))) + (puthash TAG new-list rev-map)))) (defun htmlfontify-run-etags (srcdir) "Load the etags cache for SRCDIR. @@ -2264,11 +2258,11 @@ ;; (message "foo: %S\nbar: %S" foo bar)) (defun hfy-save-kill-buffers (buffer-list &optional dstdir) - (mapc (lambda (B) - (set-buffer B) - (and dstdir (file-directory-p dstdir) (cd dstdir)) - (save-buffer) - (kill-buffer B)) buffer-list) ) + (dolist (B buffer-list) + (set-buffer B) + (and dstdir (file-directory-p dstdir) (cd dstdir)) + (save-buffer) + (kill-buffer B))) (defun htmlfontify-copy-and-link-dir (srcdir dstdir &optional f-ext l-ext) "Trawl SRCDIR and write fontified-and-hyperlinked output in DSTDIR. @@ -2291,8 +2285,8 @@ (clrhash (cadr tr-cache)) (hfy-make-directory dstdir) (setq source-files (hfy-list-files srcdir)) - (mapc (lambda (file) - (hfy-copy-and-fontify-file srcdir dstdir file)) source-files) + (dolist (file source-files) + (hfy-copy-and-fontify-file srcdir dstdir file)) (hfy-subtract-maps srcdir) (hfy-save-kill-buffers (hfy-prepare-index srcdir dstdir) dstdir) (hfy-save-kill-buffers (hfy-prepare-tag-map srcdir dstdir) dstdir) )) @@ -2345,8 +2339,11 @@ (custom-save-delete 'hfy-init-progn) (setq start-pos (point)) (princ "(hfy-init-progn\n;;auto-generated, only one copy allowed\n") + ;; FIXME: This saving&restoring of global customization + ;; variables can interfere with other customization settings for + ;; those vars (in .emacs or in Customize). (mapc 'hfy-save-initvar - (list 'auto-mode-alist 'interpreter-mode-alist)) + '(auto-mode-alist interpreter-mode-alist)) (princ ")\n") (indent-region start-pos (point) nil)) (custom-save-all) ))