Emacs+Htmlize syntax-coloring Example
Following is syntax-colored code using emacs htmlize [see Elisp: Syntax Color Source Code in HTML].
;-*- coding: utf-8 -*- ;; emacs lisp. emacs 22. ;; started: 2008-01-03. ;; generate a report of wikipedia links. ;; this program traverse a given dir, visiting every HTML file, find links to Wikipedia in those files, collect them, and generate a nice html report of these links and the files they are from, then write it to a given file. ;; Xah Lee ;; ∑ http://xahlee.org/ ;;;; user level globle parameters (defconst dirpath (expand-file-name "../") "The dir to process.") (defconst root-path-char-count (length dirpath) "A integer that counts how many chars to take off of a given file's full path, to result as a relative path for the link url. For example, if file path is <code class=\"path-xyz\">/Users/xah/web/emacs/emacs.html」 , and root-path-char-count is 15, then its url in link would be “emacs/emacs.html”. This number is not necessarily the length of dirpath. It can be smaller for flexibility.") (defconst output-file (concat (expand-file-name "../") "wikipedia_links.html") "The file to save the generated report to. (existing file backedup as ~)") ;;;; loading package. global vars. (setq tmpBufName (concat " xahtemp" (int-to-string (random t)) )) (require 'find-lisp) ;; create hash table. ;; for each entry, the key is Wikipedia url, and value is a list of file paths. ;; like this: ("Wikipedia url" ("file1" "file2" …)) (setq wpdata-hash (make-hash-table :test 'equal :size 4000)) ;; a list version of the hash for sorting & report (setq wpdata-list '()) ;; header text for the generated HTML file (setq header-text "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\" \"http://www.w3.org/TR/html4/strict.dtd\"> <html> <head> <META HTTP-EQUIV=\"Content-Type\" CONTENT=\"text/html;charset=utf-8\"> <link rel=\"stylesheet\" type=\"text/css\" href=\"mybasic.css\"> <title>Links To Wikipedia from XahLee.org</title> <style type=\"text/css\"> li > a:link:active {text-decoration:none;} li > a:link:hover {text-decoration:none; background-color:yellow} li > a:visited:hover {text-decoration:none;background-color:yellow} li > a:visited {text-decoration:none;} li > a:link {text-decoration:none;} </style> </head> <body> <h1>Links To Wikipedia from XahLee.org</h1> ") (setq footer-text " <div class=\"dstp\">2008-01</div> <div class=\"cpr\">© 2008 by <a href=\"http://xahlee.org/PageTwo_dir/more.html\">Xah Lee</a>.</div> <div class=\"xsig\"></div> </body> </html> ") ;;;; subroutines (defun insert-date () "Insert current date." (interactive) (if (and (or delete-selection-mode cua-mode) mark-active) (delete-region (region-beginning) (region-end)) ) (insert (format-time-string "%Y-%m-%d")) ) (defun hash-to-list (hashtable) "Return a list that represent the hashtable." (let (mylist) (maphash (lambda (kk vv) (setq mylist (cons (list kk vv) mylist))) hashtable) mylist)) (defun add-wplink-to-hash (filePath) "Get links in filePath and add it to hash table." (let (url) (insert-file-contents filePath nil nil nil t) (goto-char (point-min)) (while (re-search-forward "href=\"\\(http://..\\.wikipedia\\.org/[^\"]+\\)\">\\([^<]+\\)</a>" nil t) (when (and (match-string 0) ; if url found (not (string-match "=" (match-string 1) )) ; not some history page ) (setq url (match-string 1)) ; set url to matched string ;; if exist in hash, prepend to existing entry, else just add (if (gethash url wpdata-hash) (puthash url (cons filePath (gethash url wpdata-hash)) wpdata-hash) (puthash url (list filePath) wpdata-hash)) )))) (defun prt-each (ele) "print each item. ele is of the form (url (filepath1 filepath2 …)). Print it like this: <li> <link to url> : <link to file1>, <link to file2>, ... </li>" (let (wplink files) (setq wplink (car ele)) (setq files (cadr ele)) (insert "<li>") (insert (wikipedia-url-to-link wplink)) (insert " —") (dolist (x files nil) (insert (concat " <a href=\"" (substring x root-path-char-count) "\">" (get-html-file-title x) "</a>,"))) (delete-backward-char 1) (insert ".") (insert "</li>\n") ) ) (defun wikipedia-url-to-link (url) "Return the url as HTML link string.\n Example: http://en.wikipedia.org/wiki/Emacs becomes <a href=\"http://en.wikipedia.org/wiki/Emacs\">Emacs</a>." (require 'gnus-util) (let ((linktext url)) (setq linktext (gnus-url-unhex-string linktext nil)) (setq linktext (concat (car (last (split-string linktext "/")))) ) (setq linktext (replace-regexp-in-string "&" "&" linktext)) (setq linktext (replace-regexp-in-string "_" " " linktext)) (concat "<a href=\"" url "\">" linktext "</a>" ) )) (defun get-html-file-title (fname) "Return FNAME <title> tag's text. Assumes that the file contains the string “<title>…</title>”." (let (x1 x2 linkText) (with-temp-buffer (goto-char (point-min)) (insert-file-contents fname nil nil nil t) (setq x1 (search-forward "<title>")) (search-forward "</title>") (setq x2 (search-backward "<")) (buffer-substring-no-properties x1 x2) ) )) ;;;; main ;; backup (when (file-exists-p output-file) (copy-file output-file (concat output-file "~") t) (delete-file output-file) ) ;; get links from files, put to hash (save-current-buffer (set-buffer (get-buffer-create tmpBufName)) (let (filePaths) ;; get files ending in “.html” but not starting with “xx”. (mapcar (lambda (x) (when (not (string-match "/xx" x)) (setq filePaths (cons x filePaths) ) )) (find-lisp-find-files dirpath "\\.html$")) (mapc 'add-wplink-to-hash filePaths) ) (setq wpdata-list (hash-to-list wpdata-hash)) (setq wpdata-list (sort wpdata-list (lambda (a b) (string< (downcase (car a)) (downcase (car b)))) ))) ;; print it out in a temp buffer and save to file (switch-to-buffer tmpBufName) (erase-buffer) (insert header-text) (insert "<p>This page contains all existing links from XahLee.org to Wikipedia, as of ") (insert-date) (insert ". There are a total of " (number-to-string (length wpdata-list)) " links.</p>\n\n") (insert "<ul>") (mapcar 'prt-each wpdata-list) (insert "</ul>") (insert footer-text) (write-file output-file) (clrhash wpdata-hash) (setq wpdata-list '())