Browse Source

Preparing for typesetting of indented tables

Jambunathan K 12 years ago
parent
commit
160c7ee356
1 changed files with 80 additions and 209 deletions
  1. 80 209
      contrib/lisp/org-e-odt.el

+ 80 - 209
contrib/lisp/org-e-odt.el

@@ -91,22 +91,8 @@
 (defconst org-e-odt-options-alist
   '(
     ;; (:agenda-style nil nil org-agenda-export-html-style)
-    ;; (:convert-org-links nil nil org-e-odt-link-org-files-as-html)
-    ;; ;; FIXME Use (org-xml-encode-org-text-skip-links s) ??
     ;; ;; (:expand-quoted-html nil "@" org-e-odt-expand)
-    ;; (:inline-images nil nil org-e-odt-inline-images)
-    ;; ;; (:link-home nil nil org-e-odt-link-home) FIXME
-    ;; ;; (:link-up nil nil org-e-odt-link-up) FIXME
-    ;; (:style nil nil org-e-odt-style)
-    ;; (:style-extra nil nil org-e-odt-style-extra)
-    ;; (:style-include-default nil nil org-e-odt-style-include-default)
-    ;; (:style-include-scripts nil nil org-e-odt-style-include-scripts)
     ;; ;; (:timestamp nil nil org-e-odt-with-timestamp)
-    ;; (:html-extension nil nil org-e-odt-extension)
-    ;; (:html-postamble nil nil org-e-odt-postamble)
-    ;; (:html-preamble nil nil org-e-odt-preamble)
-    ;; (:html-table-tag nil nil org-e-odt-table-tag)
-    ;; (:xml-declaration nil nil org-e-odt-xml-declaration)
     (:odt-styles-file "ODT_STYLES_FILE" nil nil t)
     (:LaTeX-fragments nil "LaTeX" org-export-with-LaTeX-fragments))
   "Alist between ODT export properties and ways to set them.
@@ -246,17 +232,12 @@ structure of the values.")
 (defun org-e-odt-end-annotation ()
   "</office:annotation>")
 
-(defun org-e-odt-begin-plain-list (ltype)
+(defun org-e-odt-begin-plain-list (ltype &optional continue-numbering)
   (let* ((style-name (org-e-odt-get-style-name-for-entity 'list ltype))
 	 (extra (concat
-		 ;; (if (or org-lparse-list-table-p
-		 ;; 	 (and (= 1 (length org-lparse-list-stack))
-		 ;; 	      (null org-e-odt-list-stack-stashed)))
-		 ;;     " text:continue-numbering=\"false\""
-		 ;;   " text:continue-numbering=\"true\"")
-
-		 " text:continue-numbering=\"true\""
-
+		 (if continue-numbering
+		     " text:continue-numbering=\"true\""
+		   " text:continue-numbering=\"false\"")
 		 (when style-name
 		   (format " text:style-name=\"%s\""  style-name)))))
     (case ltype
@@ -275,23 +256,15 @@ structure of the values.")
     (ordered
      (assert (not headline) t)
      (let* ((counter arg) (extra ""))
-       (concat "<text:list-item>" ;; (org-e-odt-begin-paragraph)
-	       )
-       ;; (if (= (length org-lparse-list-stack)
-       ;;        (length org-e-odt-list-stack-stashed))
-       ;;     "<text:list-header>" "<text:list-item>")
-       ))
+       ;; "<text:list-header>"
+       "<text:list-item>"))
     (unordered
      (let* ((id arg) (extra ""))
        (concat
+	;; "<text:list-header>"
 	"<text:list-item>"
-	;; (org-e-odt-begin-paragraph)
 	(if headline (org-e-odt-format-target headline id)
-	  (org-e-odt-format-bookmark "" id)))
-       ;; (if (= (length org-lparse-list-stack)
-       ;;        (length org-e-odt-list-stack-stashed))
-       ;;     "<text:list-header>" "<text:list-item>")
-       ))
+	  (org-e-odt-format-bookmark "" id)))))
     (descriptive
      (assert (not headline) t)
      (let ((term (or arg "(no term)")))
@@ -307,15 +280,8 @@ structure of the values.")
 (defun org-e-odt-end-list-item (ltype)
   (case ltype
     ((ordered unordered)
-     ;; (org-lparse-insert-tag
-     ;; (if (= (length org-lparse-list-stack)
-     ;; 	     (length org-e-odt-list-stack-stashed))
-     ;; 	  (prog1 "</text:list-header>"
-     ;; 	    (setq org-e-odt-list-stack-stashed nil))
-     ;; 	"</text:list-item>")
-     "</text:list-item>"
-     ;; )
-     )
+     ;; "</text:list-header>"
+     "</text:list-item>")
     (descriptive
      (concat
       (org-e-odt-end-list-item 'unordered)
@@ -1050,7 +1016,6 @@ ATTR is a string of other attributes of the a element."
 	  org-e-odt-embedded-images-count 0
 	  org-e-odt-embedded-formulas-count 0
 	  org-e-odt-section-count 0
-	  org-e-odt-list-stack-stashed nil
 	  org-e-odt-automatic-styles nil
 	  org-e-odt-object-counters nil)
 
@@ -1060,7 +1025,7 @@ ATTR is a string of other attributes of the a element."
     (setq hfy-user-sheet-assoc nil)
 
     ;; init conten.xml
-    (require 'nxml-mode)
+    (require 'nxml-mode)		; FIXME
     (with-current-buffer
 	(let ((nxml-auto-insert-xml-declaration-flag nil))
 	  (find-file-noselect content-file t))
@@ -1558,8 +1523,6 @@ standard Emacs.")
   "
 <manifest:file-entry manifest:media-type=\"%s\" manifest:full-path=\"%s\"%s/>")
 
-
-
 (defvar org-lparse-dyn-first-heading-pos) ; let bound during org-do-lparse
 
 (defvar org-e-odt-suppress-xref nil)
@@ -1609,24 +1572,9 @@ standard Emacs.")
   "Default styles for various entities.")
 
 (defvar org-e-odt-org-styles-alist org-e-odt-default-org-styles-alist)
-
-;;;_. callbacks
-;;;_. control callbacks
-;;;_ , document body
-
 (defvar org-lparse-opt-plist)		    ; bound during org-do-lparse
-(defvar org-lparse-list-stack) ; dynamically bound in org-do-lparse
-(defvar org-e-odt-list-stack-stashed)
 (defvar org-lparse-table-ncols)
 
-(defvar org-e-odt-table-style nil
-  "Table style specified by \"#+ATTR_ODT: <style-name>\" line.
-This is set during `org-e-odt-begin-table'.")
-
-(defvar org-e-odt-table-style-spec nil
-  "Entry for `org-e-odt-table-style' in `org-e-odt-table-styles'.")
-
-
 (defvar org-e-odt-table-style-format
   "
 <style:style style:name=\"%s\" style:family=\"table\">
@@ -1657,10 +1605,8 @@ Use `org-e-odt-add-automatic-style' to add update this variable.'")
 Use this to generate automatic names and style-names. See
 `org-e-odt-add-automatic-style'.")
 
-(defvar org-e-odt-table-indentedp nil)
 (defvar org-lparse-link-description-is-image nil)
 
-
 (defvar org-src-block-paragraph-format
   "<style:style style:name=\"OrgSrcBlock\" style:family=\"paragraph\" style:parent-style-name=\"Preformatted_20_Text\">
    <style:paragraph-properties fo:background-color=\"%s\" fo:padding=\"0.049cm\" fo:border=\"0.51pt solid #000000\" style:shadow=\"none\">
@@ -1698,7 +1644,6 @@ according to the default face identified by the `htmlfontify'.")
      ("OrgFormulaCaptionFrame" nil "as-char"))))
 
 (defvar org-e-odt-embedded-images-count 0)
-
 (defvar org-e-odt-image-size-probe-method
   (append (and (executable-find "identify") '(imagemagick)) ; See Bug#10675
 	  '(emacs fixed))
@@ -2022,7 +1967,7 @@ This is a list where each element is of the
 form (TABLE-STYLE-NAME TABLE-TEMPLATE-NAME TABLE-CELL-OPTIONS).
 
 TABLE-STYLE-NAME is the style associated with the table through
-`org-e-odt-table-style'.
+\"#+ATTR_ODT: :style TABLE-STYLE-NAME\" line.
 
 TABLE-TEMPLATE-NAME is a set of - upto 9 - automatic
 TABLE-CELL-STYLE-NAMEs and PARAGRAPH-STYLE-NAMEs (as defined
@@ -2506,40 +2451,10 @@ string defines the replacement string for this quote."
 
 ;;; Internal Functions (HTML)
 
-;; (defun org-e-odt-format-inline-image (path &optional caption label attr)
-;;   ;; FIXME: alt text missing here?
-;;   (let ((inline-image (format "<img src=\"%s\" alt=\"%s\"/>"
-;; 			      path (file-name-nondirectory path))))
-;;     (if (not label) inline-image
-;;       (org-e-odt-format-section inline-image "figure" label))))
-
 ;;;; Bibliography
 
-(defun org-e-odt-bibliography ()
-  "Find bibliography, cut it out and return it."
-  (catch 'exit
-    (let (beg end (cnt 1) bib)
-      (save-excursion
-	(goto-char (point-min))
-	(when (re-search-forward
-	       "^[ \t]*<div \\(id\\|class\\)=\"bibliography\"" nil t)
-	  (setq beg (match-beginning 0))
-	  (while (re-search-forward "</?div\\>" nil t)
-	    (setq cnt (+ cnt (if (string= (match-string 0) "<div") +1 -1)))
-	    (when (= cnt 0)
-	      (and (looking-at ">") (forward-char 1))
-	      (setq bib (buffer-substring beg (point)))
-	      (delete-region beg (point))
-	    (throw 'exit bib))))
-	nil))))
-
 ;;;; Table
 
-(defun org-e-odt-toc-entry-formatter
-  (level snumber todo todo-type priority
-	 headline tags target extra-targets extra-class)
-  (org-e-odt-format-toc-entry snumber todo headline tags target))
-
 (defun org-e-odt-make-string (n string)
   (let (out) (dotimes (i n out) (setq out (concat string out)))))
 
@@ -2587,12 +2502,6 @@ string defines the replacement string for this quote."
 	 (org-e-odt-toc-text toc-entries)
 	 (org-e-odt-end-toc))))))
 
-(defun org-e-odt-suffix-from-snumber (snumber)
-  (let* ((snu (replace-regexp-in-string "\\." "-" snumber))
-	 (href (cdr (assoc (concat "sec-" snu)
-			   org-export-preferred-target-alist))))
-    (org-solidify-link-text (or href snu))))
-
 ;; (defun org-e-odt-format-line (line)
 ;;   (case org-lparse-dyn-current-environment
 ;;     ((quote fixedwidth) (concat (org-e-odt-encode-plain-text line) "\n"))
@@ -2628,30 +2537,6 @@ Replaces invalid characters with \"_\"."
       tags
       (org-e-odt-format-spaces 1)) "tag")))
 
-(defun org-e-odt-format-section-number (&optional snumber level)
-  ;; FIXME
-  (and nil org-export-with-section-numbers
-       ;; (not org-lparse-body-only)
-       snumber level
-       (org-e-odt-format-fontify snumber (format "section-number-%d" level))))
-
-;; (defun org-e-odt-format-headline (title extra-targets tags
-;; 				       &optional snumber level)
-;;   (concat
-;;    (org-e-odt-format-extra-targets extra-targets)
-;;    (concat (org-e-odt-format-section-number snumber level) " ")
-;;    title
-;;    (and tags (concat (org-e-odt-format-spaces 3)
-;; 		     (org-e-odt-format-org-tags tags)))))
-
-;; (defun org-e-odt-format-date (info)
-;;   (let ((date (plist-get info :date)))
-;;     (cond
-;;      ((and date (string-match "%" date))
-;;       (format-time-string date))
-;;      (date date)
-;;      (t (format-time-string "%Y-%m-%d %T %Z")))))
-
 
 
 ;;; Internal Functions (Ngz)
@@ -3568,11 +3453,11 @@ INFO is a plist holding contextual information.  See
       (let* ((fmt (org-export-get-coderef-format path desc))
 	     (res (org-export-resolve-coderef path info))
 	     (org-e-odt-suppress-xref nil)
-	     (href (org-xml-format-href (concat "#coderef-" path))))
+	     (href (concat "#coderef-" path)))
 	(format fmt (org-e-odt-format-link res href))))
      ;; Link type is handled by a special function.
      ((functionp (setq protocol (nth 2 (assoc type org-link-protocols))))
-      (funcall protocol (org-link-unescape path) desc 'html))
+      (funcall protocol (org-link-unescape path) desc 'odt))
      ;; External link with a description part.
      ((and path desc) (org-e-odt-format-link desc path))
      ;; External link without a description part.
@@ -3637,22 +3522,8 @@ contextual information."
   "Transcode a TEXT string from Org to ODT.
 TEXT is the string to transcode.  INFO is a plist holding
 contextual information."
+  ;; Protect &, < and >.
   (setq text (org-e-odt-encode-plain-text text t))
-  ;; 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-odt--quotation-marks text info))
   ;; Convert special strings.
@@ -3992,13 +3863,22 @@ communication channel."
     (if (not special-column-p) (org-element-contents table-row)
       (cdr (org-element-contents table-row)))))
 
-(defun org-e-odt-table (table contents info)
+(defun org-e-odt--table (table contents info)
   "Transcode a TABLE element from Org to ODT.
 CONTENTS is the contents of the table.  INFO is a plist holding
 contextual information."
   (case (org-element-property :type table)
-    (table.el nil)
-    (t
+    ;; Case 1: table.el doesn't support export to OD format.  Strip
+    ;; such tables from export.
+    (table.el
+     (prog1 nil
+       (message
+	(concat
+	 "(org-e-odt): Found table.el-type table in the source Org file."
+	 "  table.el doesn't support export to ODT format."
+	 "  Stripping the table from export."))))
+    ;; Case 2: Native Org tables.
+    (otherwise
      (let* ((captions (org-e-odt-format-label table info 'definition))
 	    (caption (car captions)) (short-caption (cdr captions))
 	    (attributes (org-e-odt-element-attributes table info))
@@ -4029,13 +3909,62 @@ contextual information."
 	   (or short-caption (car automatic-name))
 	   (or custom-table-style (cdr automatic-name) "OrgTable")))
 	;; column specification.
-      	(funcall table-column-specs table info)
+	(funcall table-column-specs table info)
 	;; actual contents.
 	"\n" contents
 	;; end table.
 	"</table:table>")))))
 
 
+(defun org-e-odt-table (table contents info)
+  "Transcode a TABLE element from Org to ODT.
+CONTENTS is the contents of the table.  INFO is a plist holding
+contextual information."
+  (let* ((transcoded-table (org-e-odt--table table contents info))
+	 (genealogy (org-export-get-genealogy table info))
+	 (list-genealogy (and (equal (org-element-type (car genealogy)) 'item)
+			      (loop for element in genealogy
+				    when (member (org-element-type element)
+						 '(item plain-list))
+				    collect element))))
+    (when (and transcoded-table list-genealogy)
+      (let ((parent-list (nth 1 list-genealogy)))
+	(assert (equal (org-element-type parent-list) 'plain-list))
+	(assert
+	 (not (equal (org-element-property :type parent-list) 'descriptive))
+	 nil "ODT export doesn't support tables within description list."))
+
+      ;; Within the Org file, the table is appearing within a
+      ;; list item.  OpenDocument doesn't allow table to appear
+      ;; within list items.  Temporarily terminate the list, put
+      ;; the table in an indented section and then re-continue
+      ;; the list.
+
+      ;; Put the Table in an indented section.
+      (setq transcoded-table
+	    (let ((level (/ (length list-genealogy)  2)))
+	      (concat (org-e-odt-begin-section
+		       (format "OrgIndentedSection-Level-%d" level))
+		      transcoded-table (org-e-odt-end-section))))
+
+      (loop for element in list-genealogy
+	    when (equal (org-element-type element) 'plain-list)
+	    do (setq transcoded-table
+		     (concat
+		      ;; Discontinue this list.
+		      "\n</text:list-item>"
+		      "\n</text:list>"
+		      ;; Embed the table.
+		      transcoded-table
+		      ;; Continute the this list.
+		      (org-e-odt-begin-plain-list
+		       (org-element-property :type element)
+		       'continue-numbering)
+		      (if (cdr element) "\n<text:list-item>"
+			"\n<text:list-header>")))))
+    transcoded-table))
+
+
 ;;;; Target
 
 (defun org-e-odt-target (target contents info)
@@ -4132,12 +4061,7 @@ directory.
 
 Return output file's name."
   (interactive)
-  (setq debug-on-error t)
-
-  ;; (let* ((outfile (org-export-output-file-name ".html" subtreep pub-dir))
-  ;; 	 (outfile "content.xml"))
-  ;;   (org-export-to-file
-  ;;    'e-odt outfile subtreep visible-only body-only ext-plist))
+  (setq debug-on-error t)		; FIXME
 
   (let* ((outbuf (org-e-odt-init-outfile))
 	 (target (org-export-output-file-name ".odt" subtreep pub-dir))
@@ -4164,7 +4088,6 @@ Return output file's name."
 	  target))))
 
 
-
 
 
 (defun org-e-odt-reachable-p (in-fmt out-fmt)
@@ -4282,66 +4205,14 @@ using `org-open-file'."
 
 ;;; FIXMES, TODOS, FOR REVIEW etc
 
-;; coding system
-
-;; (defun org-e-odt-discontinue-list ()
-;;   (let ((stashed-stack org-lparse-list-stack))
-;;     (loop for list-type in stashed-stack
-;; 	  do (org-lparse-end-list-item-1 list-type)
-;; 	  (org-lparse-end-list list-type))
-;;     (setq org-e-odt-list-stack-stashed stashed-stack)))
-
-;; (defun org-e-odt-continue-list ()
-;;   (setq org-e-odt-list-stack-stashed (nreverse org-e-odt-list-stack-stashed))
-;;   (loop for list-type in org-e-odt-list-stack-stashed
-;; 	do (org-lparse-begin-list list-type)
-;; 	(org-lparse-begin-list-item list-type)))
-
-;; FIXME: Begin indented table
-;; (setq org-e-odt-table-indentedp (not (null org-lparse-list-stack)))
-;; (setq org-e-odt-table-indentedp nil) ; FIXME
-;; (when org-e-odt-table-indentedp
-;;   ;; Within the Org file, the table is appearing within a list item.
-;;   ;; OpenDocument doesn't allow table to appear within list items.
-;;   ;; Temporarily terminate the list, emit the table and then
-;;   ;; re-continue the list.
-;;   (org-e-odt-discontinue-list)
-;;   ;; Put the Table in an indented section.
-;;   (let ((level (length org-e-odt-list-stack-stashed)))
-;; 	(org-e-odt-begin-section (format "OrgIndentedSection-Level-%d" level))))
-
-;; FIXME: End indented table
-;; (when org-e-odt-table-indentedp
-;;   (org-e-odt-end-section)
-;;   (org-e-odt-continue-list))
-
-
-;;;; org-format-table-html
-;;;; org-format-org-table-html
-;;;; org-format-table-table-html
-;;;; org-table-number-fraction
-;;;; org-table-number-regexp
+;;;; org-solidify-link-text
+;;;; coding system
 ;;;; org-e-odt-table-caption-above
 
-;;;; org-whitespace
-;;;; "<span style=\"visibility:hidden;\">%s</span>"
-;;;; Remove display properties
-
 ;;;; org-e-odt-with-timestamp
 ;;;; org-e-odt-html-helper-timestamp
 
-;;;; org-export-as-html-and-open
-;;;; org-export-as-html-batch
-;;;; org-export-as-html-to-buffer
-;;;; org-replace-region-by-html
-;;;; org-export-region-as-html
-;;;; org-export-as-html
-
 ;;;; (org-export-directory :html opt-plist)
-;;;; (plist-get opt-plist :html-extension)
-;;;; org-e-odt-toplevel-hlevel
-;;;; org-e-odt-inline-image-extensions
-;;;; org-e-odt-table-use-header-tags-for-first-column
 ;;;; org-e-odt-todo-kwd-class-prefix
 ;;;; org-e-odt-tag-class-prefix
 ;;;; org-e-odt-footnote-separator