Add support for indented tables in ODT export
[org-mode.git] / lisp / org-lparse.el
index 8c98ea7..4d88ba0 100644 (file)
@@ -603,11 +603,7 @@ version."
         (org-lparse-par-open-stashed 0)
 
         ;; list related vars
-        (org-lparse-list-level 0)      ; list level starts at 1. A
-                                       ; value of 0 implies we are
-                                       ; outside of any list
-        (org-lparse-list-item-count 0)
-        org-lparse-list-stack
+        (org-lparse-list-stack '())
 
         ;; list-table related vars
         org-lparse-list-table-p
@@ -1086,10 +1082,11 @@ version."
                    table-buffer (nreverse table-buffer)
                    table-orig-buffer (nreverse table-orig-buffer))
              (org-lparse-end-paragraph)
+             (when org-lparse-list-table-p
+               (error "Regular tables are not allowed in a list-table block"))
              (org-lparse-insert 'TABLE table-buffer table-orig-buffer)))
 
           ;; Normal lines
-
           (t
            ;; This line either is list item or end a list.
            (when (get-text-property 0 'list-item line)
@@ -2109,8 +2106,6 @@ When TITLE is nil, just close all open levels."
                      ("d" . description)))))
 
 ;; following vars are bound during `org-do-lparse'
-(defvar org-lparse-list-level)
-(defvar org-lparse-list-item-count)
 (defvar org-lparse-list-stack)
 (defvar org-lparse-list-table:table-row)
 (defvar org-lparse-list-table:lines)
@@ -2152,73 +2147,69 @@ When TITLE is nil, just close all open levels."
 ;; https://lists.gnu.org/archive/html/emacs-orgmode/2011-03/msg01101.html
 
 (defun org-lparse-begin-list (ltype)
-  (incf org-lparse-list-level)
-  (push org-lparse-list-item-count org-lparse-list-stack)
-  (setq org-lparse-list-item-count 0)
-  (cond
-   ((not org-lparse-list-table-p)
-    (org-lparse-begin 'LIST ltype))
-   ;; process LIST-TABLE
-   ((= 1 org-lparse-list-level)
-    ;; begin LIST-TABLE
-    (setq org-lparse-list-table:lines nil)
-    (setq org-lparse-list-table:table-row nil))
-   ((= 2 org-lparse-list-level)
-    (ignore))
-   (t
-    (org-lparse-begin 'LIST ltype))))
+  (push ltype org-lparse-list-stack)
+  (let ((list-level (length org-lparse-list-stack)))
+    (cond
+     ((not org-lparse-list-table-p)
+      (org-lparse-begin 'LIST ltype))
+     ;; process LIST-TABLE
+     ((= 1 list-level)
+      ;; begin LIST-TABLE
+      (setq org-lparse-list-table:lines nil)
+      (setq org-lparse-list-table:table-row nil))
+     ((= 2 list-level)
+      (ignore))
+     (t
+      (org-lparse-begin 'LIST ltype)))))
 
 (defun org-lparse-end-list (ltype)
-  (setq org-lparse-list-item-count (pop org-lparse-list-stack))
-  (decf org-lparse-list-level)
-  (cond
-   ((not org-lparse-list-table-p)
-    (org-lparse-end 'LIST ltype))
-   ;; process LIST-TABLE
-   ((= 0 org-lparse-list-level)
-    ;; end LIST-TABLE
-    (insert (org-lparse-format-list-table
-            (nreverse org-lparse-list-table:lines))))
-   ((= 1 org-lparse-list-level)
-    (ignore))
-   (t
-    (org-lparse-end 'LIST ltype))))
+  (pop org-lparse-list-stack)
+  (let ((list-level (length org-lparse-list-stack)))
+    (cond
+     ((not org-lparse-list-table-p)
+      (org-lparse-end 'LIST ltype))
+     ;; process LIST-TABLE
+     ((= 0 list-level)
+      ;; end LIST-TABLE
+      (insert (org-lparse-format-list-table
+              (nreverse org-lparse-list-table:lines))))
+     ((= 1 list-level)
+      (ignore))
+     (t
+      (org-lparse-end 'LIST ltype)))))
 
 (defun org-lparse-begin-list-item (ltype &optional arg headline)
-  (incf org-lparse-list-item-count)
-  (cond
-   ((not org-lparse-list-table-p)
-    (org-lparse-begin 'LIST-ITEM ltype arg headline))
-   ;; process LIST-TABLE
-   ((and (= 1 org-lparse-list-level)
-        (= 1 org-lparse-list-item-count))
-    ;; begin TABLE-ROW for LIST-TABLE
-    (setq org-lparse-list-table:table-row nil)
-    (org-lparse-begin-list-table:table-cell))
-   ((and (= 2 org-lparse-list-level)
-        (= 1 org-lparse-list-item-count))
-    ;; begin TABLE-CELL for LIST-TABLE
-    (org-lparse-begin-list-table:table-cell))
-   (t
-    (org-lparse-begin 'LIST-ITEM ltype arg headline))))
+  (let ((list-level (length org-lparse-list-stack)))
+    (cond
+     ((not org-lparse-list-table-p)
+      (org-lparse-begin 'LIST-ITEM ltype arg headline))
+     ;; process LIST-TABLE
+     ((= 1 list-level)
+      ;; begin TABLE-ROW for LIST-TABLE
+      (setq org-lparse-list-table:table-row nil)
+      (org-lparse-begin-list-table:table-cell))
+     ((= 2 list-level)
+      ;; begin TABLE-CELL for LIST-TABLE
+      (org-lparse-begin-list-table:table-cell))
+     (t
+      (org-lparse-begin 'LIST-ITEM ltype arg headline)))))
 
 (defun org-lparse-end-list-item (ltype)
-  (decf org-lparse-list-item-count)
-  (cond
-   ((not org-lparse-list-table-p)
-    (org-lparse-end 'LIST-ITEM ltype))
-   ;; process LIST-TABLE
-   ((and (= 1 org-lparse-list-level)
-        (= 0 org-lparse-list-item-count))
-    ;; end TABLE-ROW for LIST-TABLE
-    (org-lparse-end-list-table:table-cell)
-    (push (nreverse org-lparse-list-table:table-row)
-         org-lparse-list-table:lines))
-   ((= 2 org-lparse-list-level)
-    ;; end TABLE-CELL for LIST-TABLE
-    (org-lparse-end-list-table:table-cell))
-   (t
-    (org-lparse-end 'LIST-ITEM ltype))))
+  (let ((list-level (length org-lparse-list-stack)))
+    (cond
+     ((not org-lparse-list-table-p)
+      (org-lparse-end 'LIST-ITEM ltype))
+     ;; process LIST-TABLE
+     ((= 1 list-level)
+      ;; end TABLE-ROW for LIST-TABLE
+      (org-lparse-end-list-table:table-cell)
+      (push (nreverse org-lparse-list-table:table-row)
+           org-lparse-list-table:lines))
+     ((= 2 list-level)
+      ;; end TABLE-CELL for LIST-TABLE
+      (org-lparse-end-list-table:table-cell))
+     (t
+      (org-lparse-end 'LIST-ITEM ltype)))))
 
 (defvar org-lparse-list-table:table-cell-open)
 (defun org-lparse-begin-list-table:table-cell ()