From 90a20261f1fb0711d1410ff62077949401c4c956 Mon Sep 17 00:00:00 2001 From: Jambunathan K Date: Fri, 13 Jul 2012 03:23:57 +0530 Subject: [PATCH] org-e-html.el: Use `org-export-dictionary' Don't use `org-export-language-setup'. Lots of miscellaneous cleanups to enable clean compilation. --- contrib/lisp/org-e-html.el | 243 +++++++++++-------------------------- 1 file changed, 68 insertions(+), 175 deletions(-) diff --git a/contrib/lisp/org-e-html.el b/contrib/lisp/org-e-html.el index d2d88c604..0bac01596 100644 --- a/contrib/lisp/org-e-html.el +++ b/contrib/lisp/org-e-html.el @@ -1062,13 +1062,13 @@ in order to mimic default behaviour: (defcustom org-e-html-quotes '(("fr" - ("\\(\\s-\\|[[(]\\|^\\)\"" . "«~") - ("\\(\\S-\\)\"" . "~»") - ("\\(\\s-\\|(\\|^\\)'" . "'")) + ("\\(\\s-\\|[[(]\\|^\\)\"" . "« ") + ("\\(\\S-\\)\"" . " »") + ("\\(\\s-\\|(\\|^\\)'" . "’")) ("en" - ("\\(\\s-\\|[[(]\\|^\\)\"" . "``") - ("\\(\\S-\\)\"" . "''") - ("\\(\\s-\\|(\\|^\\)'" . "`"))) + ("\\(\\s-\\|[[(]\\|^\\)\"" . "“") + ("\\(\\S-\\)\"" . "”") + ("\\(\\s-\\|(\\|^\\)'" . "‘"))) "Alist for quotes to use when converting english double-quotes. The CAR of each item in this alist is the language code. @@ -1098,99 +1098,6 @@ string defines the replacement string for this quote." ;;; Internal Functions (HTML) -(defun org-e-html-cvt-org-as-html (opt-plist type path) - "Convert an org filename to an equivalent html filename. -If TYPE is not file, just return `nil'. -See variable `org-e-html-link-org-files-as-html'." - (save-match-data - (and - org-e-html-link-org-files-as-html - (string= type "file") - (string-match "\\.org$" path) - (progn - (list - "file" - (concat - (substring path 0 (match-beginning 0)) - "." (plist-get opt-plist :html-extension))))))) - -(defun org-e-html-format-org-link (opt-plist type-1 path fragment desc attr - descp) - "Make an HTML link. -OPT-PLIST is an options list. -TYPE is the device-type of the link (THIS://foo.html). -PATH is the path of the link (http://THIS#location). -FRAGMENT is the fragment part of the link, if any (foo.html#THIS). -DESC is the link description, if any. -ATTR is a string of other attributes of the \"a\" element." - (declare (special org-lparse-par-open)) - (save-match-data - (let* ((may-inline-p - (and (member type-1 '("http" "https" "file")) - (org-lparse-should-inline-p path descp) - (not fragment))) - (type (if (equal type-1 "id") "file" type-1)) - (filename path) - ;;First pass. Just sanity stuff. - (components-1 - (cond - ((string= type "file") - (list - type - ;;Substitute just if original path was absolute. - ;;(Otherwise path must remain relative) - (if (file-name-absolute-p path) - (concat "file://" (expand-file-name path)) - path))) - ((string= type "") - (list nil path)) - (t (list type path)))) - - ;;Second pass. Components converted so they can refer - ;;to a remote site. - (components-2 - (or - (and org-e-html-cvt-link-fn - (apply org-e-html-cvt-link-fn - opt-plist components-1)) - (apply #'org-e-html-cvt-org-as-html - opt-plist components-1) - components-1)) - (type (first components-2)) - (thefile (second components-2))) - - - ;;Third pass. Build final link except for leading type - ;;spec. - (cond - ((or - (not type) - (string= type "http") - (string= type "https") - (string= type "file") - (string= type "coderef")) - (if fragment - (setq thefile (concat thefile "#" fragment)))) - - (t)) - - ;;Final URL-build, for all types. - (setq thefile - (let - ((str (org-xml-format-href thefile))) - (if (and type (not (or (string= "file" type) - (string= "coderef" type)))) - (concat type ":" str) - str))) - - (if may-inline-p - (ignore) ;; (org-e-html-format-image thefile) - (org-lparse-format - 'LINK (org-xml-format-desc desc) thefile attr))))) - -;; (caption (and caption (org-xml-encode-org-text caption))) -;; alt = (file-name-nondirectory path) - (defun org-e-html-format-inline-image (src &optional caption label attr standalone-p) (let* ((id (if (not label) "" @@ -1356,25 +1263,16 @@ that uses these same face definitions." headline info 'org-e-html-format-toc-headline) (org-export-get-relative-level headline info))))) (when toc-entries - (let* ((lang-specific-heading - (nth 3 (or (assoc (plist-get info :language) - org-export-language-setup) - (assoc "en" org-export-language-setup))))) - (concat - "
\n" - (format "%s\n" - org-e-html-toplevel-hlevel - lang-specific-heading - org-e-html-toplevel-hlevel) - "
" - (org-e-html-toc-text toc-entries) - "
\n" - "
\n"))))) - -;; (defun org-e-html-format-line (line) -;; (case org-lparse-dyn-current-environment -;; ((quote fixedwidth) (concat (org-e-html-encode-plain-text line) "\n")) -;; (t (concat line "\n")))) + (concat + "
\n" + (format "%s\n" + org-e-html-toplevel-hlevel + (org-e-html--translate "Table of Contents" info) + org-e-html-toplevel-hlevel) + "
" + (org-e-html-toc-text toc-entries) + "
\n" + "
\n")))) (defun org-e-html-fix-class-name (kwd) ; audit callers of this function "Turn todo keyword into a valid class name. @@ -1419,9 +1317,7 @@ Replaces invalid characters with \"_\"." (org-trim (org-export-data raw info)))))))) (when fn-alist (org-e-html-format-footnotes-section - (nth 4 (or (assoc (plist-get info :language) - org-export-language-setup) - (assoc "en" org-export-language-setup))) + (org-e-html--translate "Footnotes" info) (format "\n%s\n
\n" (mapconcat 'org-e-html-format-footnote-definition fn-alist "\n")))))) @@ -1572,9 +1468,6 @@ This function shouldn't be used for floats. See (let* ((title (org-export-data (plist-get info :title) info)) (date (org-e-html-format-date info)) (author (org-export-data (plist-get info :author) info)) - (lang-words (or (assoc (plist-get info :language) - org-export-language-setup) - (assoc "en" org-export-language-setup))) (email (plist-get info :email)) (html-pre-real-contents (cond @@ -1588,7 +1481,7 @@ This function shouldn't be used for floats. See (?d . ,date) (?e . ,email)))) (t (format-spec - (or (cadr (assoc (nth 0 lang-words) + (or (cadr (assoc (plist-get info :language) org-e-html-preamble-format)) (cadr (assoc "en" org-e-html-preamble-format))) `((?t . ,title) (?a . ,author) @@ -1611,14 +1504,10 @@ This function shouldn't be used for floats. See (date (org-e-html-format-date info)) (author (let ((author (plist-get info :author))) (and author (org-export-data author info)))) - (email (plist-get info :email)) - (lang-words (or (assoc (plist-get info :language) - org-export-language-setup) - (assoc "en" org-export-language-setup))) (email (mapconcat (lambda(e) (format "%s" e e)) - (split-string email ",+ *") + (split-string (plist-get info :email) ",+ *") ", ")) (html-validation-link (or org-e-html-validation-link "")) (creator-info org-export-creator-string)) @@ -1632,10 +1521,10 @@ This function shouldn't be used for floats. See (concat (when (plist-get info :time-stamp-file) (format " -

%s: %s

" (nth 2 lang-words) date)) +

%s: %s

" (org-e-html--translate "Date" info) date)) (when (and (plist-get info :with-author) author) (format " -

%s : %s

" (nth 1 lang-words) author)) +

%s : %s

" (org-e-html--translate "Author" info) author)) (when (and (plist-get info :with-email) email) (format "

%s

" email)) @@ -1658,7 +1547,7 @@ This function shouldn't be used for floats. See ;; default postamble (t (format-spec - (or (cadr (assoc (nth 0 lang-words) + (or (cadr (assoc (plist-get info :language) org-e-html-postamble-format)) (cadr (assoc "en" org-e-html-postamble-format))) `((?a . ,author) (?e . ,email) @@ -1741,6 +1630,21 @@ original parsed data. INFO is a plist holding export options." " ")) +(defun org-e-html--translate (s info) + "Transcode string S in to HTML. +INFO is a plist used as a communication channel. + +Lookup utf-8 equivalent of S in `org-export-dictionary' and +replace all non-ascii characters with its numeric reference." + (let ((s (org-export-translate s :utf-8 info))) + ;; Protect HTML metacharacters. + (setq s (org-e-html-encode-plain-text s)) + ;; Replace non-ascii characters with their numeric equivalents. + (replace-regexp-in-string + "[[:nonascii:]]" + (lambda (m) (format "&#%d;" (encode-char (string-to-char m) 'ucs))) + s t t))) + ;;; Transcode Helpers @@ -1814,21 +1718,29 @@ original parsed data. INFO is a plist holding export options." ((not (functionp lang-mode)) ;; Simple transcoding. (org-e-html-encode-plain-text code)) - ;; Case 2: Default. Fotify code. + ;; Case 2: Default. Fontify code. (t ;; htmlize (setq code (with-temp-buffer (insert code) + ;; Switch to language-specific mode. (funcall lang-mode) + ;; Fontify buffer. (font-lock-fontify-buffer) - ;; markup each line separately - (org-remove-formatting-on-newlines-in-region - (point-min) (point-max)) + ;; Remove formatting on newline characters. + (save-excursion + (let ((beg (point-min)) + (end (point-max))) + (goto-char beg) + (while (progn (end-of-line) (< (point) end)) + (put-text-property (point) (1+ (point)) 'face nil) + (forward-char 1)))) (org-src-mode) (set-buffer-modified-p nil) + ;; Htmlize region. (org-export-e-htmlize-region-for-paste (point-min) (point-max)))) - ;; Strip any encolosing
 tags
+	  ;; Strip any encolosing 
 tags.
 	  (if (string-match "]*>\n*\\([^\000]*\\)" code)
 	      (match-string 1 code)
 	    code))))))))
@@ -2174,7 +2086,7 @@ holding contextual information."
 			preferred-id
 			(mapconcat
 			 (lambda (x)
-			   (let ((id (org-solidify-link-text
+			   (let ((id (org-export-solidify-link-text
 				      (if (org-uuidgen-p x) (concat "ID-" x)
 					x))))
 			     (org-e-html--anchor id)))
@@ -2601,7 +2513,7 @@ INFO is a plist holding contextual information.  See
 		    (or desc (org-export-data (org-element-property
 					       :title destination) info)))))
 	     (format "%s"
-		     (org-solidify-link-text href) attributes desc)))
+		     (org-export-solidify-link-text href) attributes desc)))
 	  ;; Fuzzy link points to a target.  Do as above.
 	  (t
 	   (let ((path (org-export-solidify-link-text path)) number)
@@ -2721,43 +2633,24 @@ contextual information."
 	(setq string (replace-match rpl t nil string))))
     string))
 
-(defun org-e-html-encode-plain-text (s)
+(defun org-e-html-encode-plain-text (text)
   "Convert plain text characters to HTML equivalent.
 Possible conversions are set in `org-export-html-protect-char-alist'."
-  (let ((cl org-e-html-protect-char-alist) c)
-    (while (setq c (pop cl))
-      (let ((start 0))
-	(while (string-match (car c) s start)
-	  (setq s (replace-match (cdr c) t t s)
-		start (1+ (match-beginning 0))))))
-    s))
+  (mapc
+   (lambda (pair)
+     (setq text (replace-regexp-in-string (car pair) (cdr pair) text t t)))
+   org-e-html-protect-char-alist)
+  text)
 
 (defun org-e-html-plain-text (text info)
   "Transcode a TEXT string from Org to HTML.
 TEXT is the string to transcode.  INFO is a plist holding
 contextual information."
+  ;; Protect following characters: <, >, &.
   (setq text (org-e-html-encode-plain-text text))
-  ;; Protect %, #, &, $, ~, ^, _,  { and }.
-  ;; (while (string-match "\\([^\\]\\|^\\)\\([%$#&{}~^_]\\)" text)
-  ;;   (setq text
-  ;; 	  (replace-match (format "\\%s" (match-string 2 text)) nil t text 2)))
-  ;; Protect \
-  ;; (setq text (replace-regexp-in-string
-  ;; 	      "\\(?:[^\\]\\|^\\)\\(\\\\\\)\\(?:[^%$#&{}~^_\\]\\|$\\)"
-  ;; 	      "$\\backslash$" text nil t 1))
-  ;; HTML into \HTML{} and TeX into \TeX{}.
-  ;; (let ((case-fold-search nil)
-  ;; 	(start 0))
-  ;;   (while (string-match "\\<\\(\\(?:La\\)?TeX\\)\\>" text start)
-  ;;     (setq text (replace-match
-  ;; 		  (format "\\%s{}" (match-string 1 text)) nil t text)
-  ;; 	    start (match-end 0))))
-  ;; Handle quotation marks
-  ;; (setq text (org-e-html--quotation-marks text info))
-  ;; Convert special strings.
-  ;; (when (plist-get info :with-special-strings)
-  ;;   (while (string-match (regexp-quote "...") text)
-  ;;     (setq text (replace-match "\\ldots{}" nil t text))))
+  ;; Handle quotation marks.
+  (setq text (org-e-html--quotation-marks text info))
+  ;; Handle special strings.
   (when (plist-get info :with-special-strings)
     (setq text (org-e-html-convert-special-strings text)))
   ;; Handle break preservation if required.
@@ -3079,7 +2972,7 @@ contextual information."
   		(and (string-match  "" table-tag)
   		     (match-string 1 table-tag))
   		(and label (format " id=\"%s\""
-  				   (org-solidify-link-text label)))))))
+  				   (org-export-solidify-link-text label)))))))
        ;; Remove last blank line.
        (setq contents (substring contents 0 -1))
        ;; FIXME: splice
@@ -3216,10 +3109,6 @@ Return output file's name."
 ;;;; org-table-number-regexp
 ;;;; org-e-html-table-caption-above
 
-;;;; org-whitespace
-;;;; "%s"
-;;;; Remove display properties
-
 ;;;; org-e-html-with-timestamp
 ;;;; org-e-html-html-helper-timestamp
 
@@ -3243,10 +3132,14 @@ Return output file's name."
 ;;;; org-e-html-footnote-separator
 
 ;;;; org-export-preferred-target-alist
-;;;; org-solidify-link-text
+;;;; org-export-solidify-link-text
 ;;;; class for anchors
 ;;;; org-export-with-section-numbers, body-only
 ;;;; org-export-mark-todo-in-toc
 
+;;;; org-e-html-format-org-link
+;;;; (caption (and caption (org-xml-encode-org-text caption)))
+;;;; alt = (file-name-nondirectory path)
+
 (provide 'org-e-html)
 ;;; org-e-html.el ends here