1
0
mirror of https://git.savannah.gnu.org/git/emacs/org-mode.git synced 2024-12-28 10:56:57 +00:00

Preparing for typesetting of indented tables

This commit is contained in:
Jambunathan K 2012-06-03 17:25:37 +05:30
parent e32a4777df
commit 160c7ee356

View File

@ -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