summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJambunathan K <kjambunathan@gmail.com>2012-09-04 14:15:14 +0530
committerJambunathan K <kjambunathan@gmail.com>2012-09-04 14:15:14 +0530
commitd7e75f30357fa60d297a5bd0baf0f65ad5dd8b55 (patch)
tree905b88fac3d6b45d0e40669ffab66e2cbb157126
parent97c1b93e045e90ebb6d8a9d15a064d8ae717260b (diff)
downloadorg-mode-d7e75f30357fa60d297a5bd0baf0f65ad5dd8b55.tar.gz
org-e-odt.el: Support for list-tables.
A list marked with non-nil `:list-table' attribute will be deemed as a list-table. A typical list-table will look like this: ,---- | #+attr_odt :list-table t | - Row 1 | - 1.1 | - 1.2 | - 1.3 | - Row 2 | - 2.1 | - 2.2 | - 2.3 `---- Also fix regression in indented table caused by recent `section' changes.
-rw-r--r--contrib/lisp/org-e-odt.el105
1 files changed, 91 insertions, 14 deletions
diff --git a/contrib/lisp/org-e-odt.el b/contrib/lisp/org-e-odt.el
index 9d25495..de5c190 100644
--- a/contrib/lisp/org-e-odt.el
+++ b/contrib/lisp/org-e-odt.el
@@ -1872,15 +1872,9 @@ holding contextual information."
(if (and parent
(org-export-low-level-p parent info))
"true" "false")))))
- (let* ((headline-has-table-p
- (let* ((headline-contents (org-element-contents headline))
- (element (and (eq 'section
- (org-element-type
- (car headline-contents)))
- (car headline-contents))))
- (loop for el in (org-element-contents element)
- thereis (eq (org-element-type el) 'table))))
- (closing-tag ))
+ (let ((headline-has-table-p
+ (let ((section (assq 'section (org-element-contents headline))))
+ (assq 'table (and section (org-element-contents section))))))
(format "\n<text:list-item>\n%s\n%s"
(concat
(format "\n<text:p text:style-name=\"%s\">%s</text:p>"
@@ -2566,7 +2560,6 @@ INFO is a plist holding contextual information. See
(mapconcat 'number-to-string
(org-e-odt-resolve-numbered-paragraph
container info) ".")))))))
-
(otherwise
;; (unless desc
;; (setq number (cond
@@ -3157,8 +3150,12 @@ channel."
(assert paragraph-style)
(format "\n<table:table-cell%s>\n%s\n</table:table-cell>"
cell-attributes
- (format "\n<text:p text:style-name=\"%s\">%s</text:p>"
- paragraph-style contents))
+ (let ((table-cell-contents (org-element-contents table-cell)))
+ (if (memq (org-element-type (car table-cell-contents))
+ org-element-all-elements)
+ contents
+ (format "\n<text:p text:style-name=\"%s\">%s</text:p>"
+ paragraph-style contents))))
(let (s)
(dotimes (i horiz-span s)
(setq s (concat s "\n<table:covered-table-cell/>"))))
@@ -3345,8 +3342,11 @@ pertaining to indentation here."
(if (funcall --element-preceded-by-table-p table info)
'("</text:list-header>" . "<text:list-header>")
'("</text:list-item>" . "<text:list-header>")))
- ((funcall --element-preceded-by-table-p
- parent-list info)
+ ((let ((section? (org-export-get-previous-element
+ parent-list info)))
+ (and section?
+ (eq (org-element-type section?) 'section)
+ (assq 'table (org-element-contents section?))))
'("</text:list-header>" . "<text:list-header>"))
(t
'("</text:list-item>" . "<text:list-item>")))))))))))
@@ -3551,6 +3551,83 @@ contextual information."
info))
tree)
+;;;; List tables
+
+;; Lists that are marked with attribute `:list-table' are called as
+;; list tables. They will be rendered as a table within the exported
+;; document.
+
+;; Consider an example. The following list table
+;;
+;; #+attr_odt :list-table t
+;; - Row 1
+;; - 1.1
+;; - 1.2
+;; - 1.3
+;; - Row 2
+;; - 2.1
+;; - 2.2
+;; - 2.3
+;;
+;; will be exported as though it were an Org table like the one show
+;; below.
+;;
+;; | Row 1 | 1.1 | 1.2 | 1.3 |
+;; | Row 2 | 2.1 | 2.2 | 2.3 |
+;;
+;; Note that org-tables are NOT multi-line and each line is mapped to
+;; a unique row in the exported document. So if an exported table
+;; needs to contain a single paragraph (with copious text) it needs to
+;; be typed up in a single line. Editing such long lines using the
+;; table editor will be a cumbersome task. Furthermore inclusion of
+;; multi-paragraph text in a table cell is well-nigh impossible.
+;;
+;; A LIST-TABLE circumvents above problems.
+;;
+;; Note that in the example above the list items could be paragraphs
+;; themselves and the list can be arbitrarily deep.
+;;
+;; Inspired by following thread:
+;; https://lists.gnu.org/archive/html/emacs-orgmode/2011-03/msg01101.html
+
+;; Translate lists to tables
+
+(add-to-list 'org-export-filter-parse-tree-functions
+ 'org-e-odt--translate-list-tables)
+
+(defun org-e-odt--translate-list-tables (tree backend info)
+ (when (eq backend 'e-odt)
+ (org-element-map
+ tree 'plain-list
+ (lambda (plain-list-1)
+ (when (org-export-read-attribute :attr_odt plain-list-1 :list-table)
+ (org-element-set-element
+ plain-list-1
+ (apply 'org-element-adopt-elements
+ (list 'table nil)
+ (org-element-map
+ plain-list-1
+ 'item
+ (lambda (level-1-item)
+ (apply 'org-element-adopt-elements
+ (list 'table-row (list :type 'standard))
+ (org-element-adopt-elements
+ (list 'table-cell nil)
+ (car (org-element-contents level-1-item)))
+ (let ((plain-list-2 (assq 'plain-list level-1-item)))
+ (org-element-map
+ plain-list-2
+ 'item
+ (lambda (item)
+ (apply 'org-element-adopt-elements
+ (list 'table-cell nil)
+ (org-element-contents item)))
+ info nil t))))
+ info nil 'item))))
+ nil)
+ info))
+ tree)
+
;;; Interactive functions