Browse Source

org-e-odt: Use new source code handling API

Jambunathan K 13 years ago
parent
commit
4512930860
2 changed files with 93 additions and 110 deletions
  1. 6 6
      EXPERIMENTAL/org-e-html.el
  2. 87 104
      EXPERIMENTAL/org-e-odt.el

+ 6 - 6
EXPERIMENTAL/org-e-html.el

@@ -1807,9 +1807,6 @@ original parsed data.  INFO is a plist holding export options."
 
 
 (defun org-e-html-do-format-code
 (defun org-e-html-do-format-code
   (code &optional lang refs retain-labels num-start textarea-p)
   (code &optional lang refs retain-labels num-start textarea-p)
-  "Transcode a SRC-BLOCK element from Org to HTML.
-CONTENTS holds the contents of the item.  INFO is a plist holding
-contextual information."
   (when textarea-p
   (when textarea-p
     (setq num-start nil refs nil lang nil))
     (setq num-start nil refs nil lang nil))
   (let* ((code-lines (org-split-string code "\n"))
   (let* ((code-lines (org-split-string code "\n"))
@@ -1841,7 +1838,8 @@ contextual information."
 
 
 (defun org-e-html-format-code (element info)
 (defun org-e-html-format-code (element info)
   (let* ((lang (org-element-property :language element))
   (let* ((lang (org-element-property :language element))
-	 (switches (org-element-property :switches element))
+	 ;; (switches (org-element-property :switches element))
+	 (switches nil)			; FIXME
 	 (textarea-p (and switches (string-match "-t\\>" switches)))
 	 (textarea-p (and switches (string-match "-t\\>" switches)))
 	 ;; Extract code and references.
 	 ;; Extract code and references.
 	 (code-info (org-export-unravel-code element))
 	 (code-info (org-export-unravel-code element))
@@ -1939,7 +1937,8 @@ CONTENTS is nil.  INFO is a plist holding contextual information."
 	 (attr (mapconcat #'identity
 	 (attr (mapconcat #'identity
 			  (org-element-property :attr_html example-block)
 			  (org-element-property :attr_html example-block)
 			  " "))
 			  " "))
-	 (switches (org-element-property :switches example-block))
+	 ;; (switches (org-element-property :switches example-block))
+	 (switches nil)			; FIXME
 	 (textarea-p (and switches (string-match "-t\\>" switches)))
 	 (textarea-p (and switches (string-match "-t\\>" switches)))
 	 (code (org-e-html-format-code example-block info)))
 	 (code (org-e-html-format-code example-block info)))
     (cond
     (cond
@@ -2733,7 +2732,8 @@ contextual information."
 	 (attr (mapconcat #'identity
 	 (attr (mapconcat #'identity
 			  (org-element-property :attr_html src-block)
 			  (org-element-property :attr_html src-block)
 			  " "))
 			  " "))
-	 (switches (org-element-property :switches src-block))
+	 ;; (switches (org-element-property :switches src-block))
+	 (switches nil)			; FIXME
 	 (textarea-p (and switches (string-match "-t\\>" switches)))
 	 (textarea-p (and switches (string-match "-t\\>" switches)))
 	 (code (org-e-html-format-code src-block info)))
 	 (code (org-e-html-format-code src-block info)))
     (cond
     (cond

+ 87 - 104
EXPERIMENTAL/org-e-odt.el

@@ -623,38 +623,6 @@ styles congruent with the ODF-1.2 specification."
 				((string= s "\t") (org-e-odt-format-tabs))
 				((string= s "\t") (org-e-odt-format-tabs))
 				(t (org-e-odt-format-spaces (length s))))) line))
 				(t (org-e-odt-format-spaces (length s))))) line))
 
 
-
-(defun org-e-odt-format-source-line-with-line-number-and-label
-  (line fontifier par-style)
-  (let (;; (keep-label (not (numberp rpllbl)))
-	(ref (org-find-text-property-in-string 'org-coderef line))
-	(num (org-find-text-property-in-string 'org-loc line)))
-    (setq line (concat line (and ref (format "(%s)" ref))))
-    (setq line (funcall fontifier line))
-    (when ref
-      (setq line (org-e-odt-format-target line (concat "coderef-" ref))))
-    (setq line (org-e-odt-format-stylized-paragraph par-style line))
-    (if (not num) line
-      (org-e-odt-format-tags
-       '("<text:list-item>" . "</text:list-item>") line))))
-
-(defun org-e-odt-format-source-code-or-example-plain
-  (lines lang caption textareap cols rows num cont rpllbl fmt)
-  "Format source or example blocks much like fixedwidth blocks.
-Use this when `org-export-e-odt-fontify-srcblocks' option is turned
-off."
-  (let* ((lines (org-split-string lines "[\r\n]"))
-	 (line-count (length lines))
-	 (i 0))
-    (mapconcat
-     (lambda (line)
-       (incf i)
-       (org-e-odt-format-source-line-with-line-number-and-label
-	line 'org-e-odt-encode-plain-text
-	(if (= i line-count) "OrgFixedWidthBlockLastLine"
-	  "OrgFixedWidthBlock")))
-     lines "\n")))
-
 (defun org-e-odt-hfy-face-to-css (fn)
 (defun org-e-odt-hfy-face-to-css (fn)
   "Create custom style for face FN.
   "Create custom style for face FN.
 When FN is the default face, use it's foreground and background
 When FN is the default face, use it's foreground and background
@@ -702,76 +670,6 @@ Update styles.xml with styles that were collected as part of
 	(goto-char (match-beginning 0))
 	(goto-char (match-beginning 0))
 	(insert "\n<!-- Org Htmlfontify Styles -->\n" styles "\n")))))
 	(insert "\n<!-- Org Htmlfontify Styles -->\n" styles "\n")))))
 
 
-(defun org-e-odt-format-source-code-or-example-colored (lines lang caption)
-  "Format source or example blocks using `htmlfontify-string'.
-Use this routine when `org-export-e-odt-fontify-srcblocks' option
-is turned on."
-  (let* ((lang-m (and lang (or (cdr (assoc lang org-src-lang-modes)) lang)))
-	 (mode (and lang-m (intern (concat (if (symbolp lang-m)
-					       (symbol-name lang-m)
-					     lang-m) "-mode"))))
-	 (org-inhibit-startup t)
-	 (org-startup-folded nil)
-	 (lines (with-temp-buffer
-		  (insert lines)
-		  (if (functionp mode) (funcall mode) (fundamental-mode))
-		  (font-lock-fontify-buffer)
-		  (buffer-string)))
-	 (hfy-html-quote-regex "\\([<\"&> 	]\\)")
-	 (hfy-html-quote-map '(("\"" "&quot;")
-			       ("<" "&lt;")
-			       ("&" "&amp;")
-			       (">" "&gt;")
-			       (" " "<text:s/>")
-			       ("	" "<text:tab/>")))
-	 (hfy-face-to-css 'org-e-odt-hfy-face-to-css)
-	 (hfy-optimisations-1 (copy-seq hfy-optimisations))
-	 (hfy-optimisations (add-to-list 'hfy-optimisations-1
-					 'body-text-only))
-	 (hfy-begin-span-handler
-	  (lambda (style text-block text-id text-begins-block-p)
-	    (insert (format "<text:span text:style-name=\"%s\">" style))))
-	 (hfy-end-span-handler (lambda nil (insert "</text:span>"))))
-    (when (fboundp 'htmlfontify-string)
-      (let* ((lines (org-split-string lines "[\r\n]"))
-	     (line-count (length lines))
-	     (i 0))
-	(mapconcat
-	 (lambda (line)
-	   (incf i)
-	   (org-e-odt-format-source-line-with-line-number-and-label
-	    line 'htmlfontify-string
-	    (if (= i line-count) "OrgSrcBlockLastLine" "OrgSrcBlock")))
-	 lines "\n")))))
-
-(defun org-e-odt-format-source-code-or-example (lines lang
-						&optional caption ; FIXME
-						)
-  "Format source or example blocks for export.
-Use `org-e-odt-format-source-code-or-example-plain' or
-`org-e-odt-format-source-code-or-example-colored' depending on the
-value of `org-export-e-odt-fontify-srcblocks."
-  (setq ;; lines (org-export-number-lines
-   ;;        lines 0 0 num cont rpllbl fmt 'preprocess) FIXME
-   lines (funcall
-	  (or (and org-export-e-odt-fontify-srcblocks
-		   (or (featurep 'htmlfontify)
-		       ;; htmlfontify.el was introduced in Emacs 23.2
-		       ;; So load it with some caution
-		       (require 'htmlfontify nil t))
-		   (fboundp 'htmlfontify-string)
-		   'org-e-odt-format-source-code-or-example-colored)
-	      'org-e-odt-format-source-code-or-example-plain)
-	  lines lang caption))
-  (let ((num (org-find-text-property-in-string 'org-loc lines)))
-    (if (not num) lines
-      (let* ((cont (not (equal num 1)))
-	     (extra (format " text:continue-numbering=\"%s\""
-			    (if cont "true" "false"))))
-	(org-e-odt-format-tags
-	 '("<text:list text:style-name=\"OrgSrcBlockNumberedLine\"%s>"
-	   . "</text:list>") lines extra)))))
-
 (defun org-e-odt-remap-stylenames (style-name)
 (defun org-e-odt-remap-stylenames (style-name)
   (or
   (or
    (cdr (assoc style-name '(("timestamp-wrapper" . "OrgTimestampWrapper")
    (cdr (assoc style-name '(("timestamp-wrapper" . "OrgTimestampWrapper")
@@ -3324,6 +3222,92 @@ This function shouldn't be used for floats.  See
   output)
   output)
 
 
 
 
+
+;;; Transcode Helpers
+
+;;;; Src Code
+
+(defun org-e-odt-htmlfontify-string (line)
+  (let* ((hfy-html-quote-regex "\\([<\"&> 	]\\)")
+	 (hfy-html-quote-map '(("\"" "&quot;")
+			       ("<" "&lt;")
+			       ("&" "&amp;")
+			       (">" "&gt;")
+			       (" " "<text:s/>")
+			       ("	" "<text:tab/>")))
+	 (hfy-face-to-css 'org-e-odt-hfy-face-to-css)
+	 (hfy-optimisations-1 (copy-seq hfy-optimisations))
+	 (hfy-optimisations (add-to-list 'hfy-optimisations-1
+					 'body-text-only))
+	 (hfy-begin-span-handler
+	  (lambda (style text-block text-id text-begins-block-p)
+	    (insert (format "<text:span text:style-name=\"%s\">" style))))
+	 (hfy-end-span-handler (lambda nil (insert "</text:span>"))))
+    (htmlfontify-string line)))
+
+(defun org-e-odt-do-format-code
+  (code &optional lang refs retain-labels num-start)
+  (let* ((lang (or (assoc-default lang org-src-lang-modes) lang))
+	 (lang-mode (and lang (intern (format "%s-mode" lang))))
+	 (code-lines (org-split-string code "\n"))
+	 (code-length (length code-lines))
+	 (use-htmlfontify-p (and (functionp lang-mode)
+				 org-export-e-odt-fontify-srcblocks
+				 (require 'htmlfontify nil t)
+				 (fboundp 'htmlfontify-string)))
+	 (code (if (not use-htmlfontify-p) code
+		 (with-temp-buffer
+		   (insert code)
+		   (funcall lang-mode)
+		   (font-lock-fontify-buffer)
+		   (buffer-string))))
+	 (fontifier (if use-htmlfontify-p 'org-e-odt-htmlfontify-string
+		      'org-e-odt-encode-plain-text))
+	 (par-style (if use-htmlfontify-p "OrgSrcBlock"
+		      "OrgFixedWidthBlock"))
+	 (i 0))
+    (assert (= code-length (length (org-split-string code "\n"))))
+    (setq code
+	  (org-export-format-code
+	   code
+	   (lambda (loc line-num ref)
+	     (setq par-style
+		   (concat par-style (and (= (incf i) code-length) "LastLine")))
+
+	     (setq loc (concat loc (and ref retain-labels (format " (%s)" ref))))
+	     (setq loc (funcall fontifier loc))
+	     (when ref
+	       (setq loc (org-e-odt-format-target loc (concat "coderef-" ref))))
+	     (setq loc (org-e-odt-format-stylized-paragraph par-style loc))
+	     (if (not line-num) loc
+	       (org-e-odt-format-tags
+		'("<text:list-item>" . "</text:list-item>") loc)))
+	   num-start refs))
+    (cond
+     ((not num-start) code)
+     ((equal num-start 0)
+      (org-e-odt-format-tags
+       '("<text:list text:style-name=\"OrgSrcBlockNumberedLine\"%s>"
+	 . "</text:list>") code " text:continue-numbering=\"false\""))
+     (t (org-e-odt-format-tags
+	 '("<text:list text:style-name=\"OrgSrcBlockNumberedLine\"%s>"
+	   . "</text:list>") code " text:continue-numbering=\"true\"")))))
+
+(defun org-e-odt-format-code (element info)
+  (let* ((lang (org-element-property :language element))
+	 ;; Extract code and references.
+	 (code-info (org-export-unravel-code element))
+	 (code (car code-info))
+	 (refs (cdr code-info))
+	 ;; Does the src block contain labels?
+	 (retain-labels (org-element-property :retain-labels element))
+	 ;; Does it have line numbers?
+	 (num-start (case (org-element-property :number-lines element)
+		      (continued (org-export-get-loc element info))
+		      (new 0))))
+    (org-e-odt-do-format-code code lang refs retain-labels num-start)))
+
+
 
 
 ;;; Template
 ;;; Template
 
 
@@ -4192,7 +4176,6 @@ holding contextual information."
 CONTENTS holds the contents of the item.  INFO is a plist holding
 CONTENTS holds the contents of the item.  INFO is a plist holding
 contextual information."
 contextual information."
   (let* ((lang (org-element-property :language src-block))
   (let* ((lang (org-element-property :language src-block))
-	 (code (org-export-handle-code src-block info nil nil t))
 	 (caption (org-element-property :caption src-block))
 	 (caption (org-element-property :caption src-block))
 	 (label (org-element-property :name src-block)))
 	 (label (org-element-property :name src-block)))
     ;; FIXME: Handle caption
     ;; FIXME: Handle caption
@@ -4201,7 +4184,7 @@ contextual information."
     ;; (main (org-export-secondary-string (car caption) 'e-odt info))
     ;; (main (org-export-secondary-string (car caption) 'e-odt info))
     ;; (secondary (org-export-secondary-string (cdr caption) 'e-odt info))
     ;; (secondary (org-export-secondary-string (cdr caption) 'e-odt info))
     ;; (caption-str (org-e-odt--caption/label-string caption label info))
     ;; (caption-str (org-e-odt--caption/label-string caption label info))
-    (org-e-odt-format-source-code-or-example code lang)))
+    (org-e-odt-format-code src-block info)))
 
 
 
 
 ;;;; Statistics Cookie
 ;;;; Statistics Cookie