emacs-orgmode
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Orgmode] [PATCH 1/4] Refactor orgtbl-to-generic; explicitly separate he


From: Jason Riedy
Subject: [Orgmode] [PATCH 1/4] Refactor orgtbl-to-generic; explicitly separate heading from body.
Date: Wed, 16 Apr 2008 14:39:51 -0700

Parameters are fluidly bound as early as possible.  Added one
helper function, orgtbl-format-section, and removed one,
org-get-param.  Also cleaned org-format-line.

Signed-off-by: Jason Riedy <address@hidden>
---
 ChangeLog         |   16 +++++++
 lisp/org-table.el |  124 ++++++++++++++++++++++++++++++++--------------------
 2 files changed, 92 insertions(+), 48 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 9ae71a9..4569d3a 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,19 @@
+2008-04-15  Jason Riedy  <address@hidden>
+
+       * lisp/org-table.el (*orgtbl-table*, *orgtbl-rtn*): Dynamically
+       bound variables to hold the input collection of lines and output
+       formatted text.
+       (*orgtbl-hline*, *orgtbl-sep*, *orgtbl-fmt*, *orgtbl-efmt*,
+       (*orgtbl-lfmt*, *orgtbl-lstart*, *orgtbl-lend*): Dynamically bound
+       format parameters.
+       (orgtbl-format-line): New function encapsulating formatting for a
+       single line.
+       (orgtbl-format-section): Similar for each section.  Rebinding the
+       dynamic vars customizes the formatting for each section.
+       (orgtbl-to-generic): Use orgtbl-format-line and
+       orgtbl-format-section.
+       (org-get-param): Now unused, so delete.
+
 2008-04-15  Carsten Dominik  <address@hidden>
 
        * lisp/org-agenda.el (org-agenda-columns-show-summaries)
diff --git a/lisp/org-table.el b/lisp/org-table.el
index 1e1bd85..3cc70c1 100644
--- a/lisp/org-table.el
+++ b/lisp/org-table.el
@@ -3602,15 +3602,51 @@ First element has index 0, or I0 if given."
     (insert txt)
     (goto-char pos)))
 
-(defun org-get-param (params header i sym &optional hsym)
-  "Get parameter value for symbol SYM.
-If this is a header line, actually get the value for the symbol with an
-additional \"h\" inserted after the colon.
-If the value is a protperty list, get the element for the current column.
-Assumes variables VAL, PARAMS, HEAD and I to be scoped into the function."
-  (let ((val (plist-get params sym)))
-    (and hsym header (setq val (or (plist-get params hsym) val)))
-    (if (consp val) (plist-get val i) val)))
+;; Dynamically bound input and output for table formatting.
+(defvar *orgtbl-table* nil
+  "Carries the current table through formatting routines.")
+(defvar *orgtbl-rtn* nil
+  "Formatting routines push the output lines here.")
+;; Formatting parameters for the current table section.
+(defvar *orgtbl-hline* nil "Text used for horizontal lines")
+(defvar *orgtbl-sep* nil "Text used as a column separator")
+(defvar *orgtbl-fmt* nil "Format for each entry")
+(defvar *orgtbl-efmt* nil "Format for numbers")
+(defvar *orgtbl-lfmt* nil "Format for an entire line, overrides fmt")
+(defvar *orgtbl-lstart* nil "Text starting a row")
+(defvar *orgtbl-lend* nil "Text ending a row")
+
+(defun orgtbl-format-line (line)
+  "Format LINE as a table row."
+  (if (eq line 'hline) (if *orgtbl-hline* (push *orgtbl-hline* *orgtbl-rtn*))
+    (let* ((i 0)
+          (line
+           (mapcar
+            (lambda (f)
+              (setq i (1+ i))
+              (let* ((*orgtbl-fmt* (if (consp *orgtbl-fmt*)
+                                    (plist-get *orgtbl-fmt* i)
+                                    *orgtbl-fmt*))
+                     (*orgtbl-efmt* (if (consp *orgtbl-efmt*)
+                                     (plist-get *orgtbl-efmt* i)
+                                     *orgtbl-efmt*))
+                     (f (if (and *orgtbl-efmt*
+                                 (string-match orgtbl-exp-regexp f))
+                            (format *orgtbl-efmt* (match-string 1 f)
+                                    (match-string 2 f))
+                          f)))
+                (if *orgtbl-fmt* (format *orgtbl-fmt* f) f)))
+            line)))
+      (push (if *orgtbl-lfmt* (apply 'format *orgtbl-lfmt* line)
+             (concat *orgtbl-lstart* (mapconcat 'identity line *orgtbl-sep*)
+                     *orgtbl-lend*))
+           *orgtbl-rtn*))))
+
+(defun orgtbl-format-section (section-stopper)
+  "Format lines until the first occurrence of SECTION-STOPPER."
+  (progn
+    (while (not (eq (car *orgtbl-table*) section-stopper))
+      (orgtbl-format-line (pop *orgtbl-table*)))))
 
 (defun orgtbl-to-generic (table params)
   "Convert the orgtbl-mode TABLE to some other format.
@@ -3658,51 +3694,43 @@ Valid parameters are
 In addition to this, the parameters :skip and :skipcols are always handled
 directly by `orgtbl-send-table'.  See manual."
   (interactive)
-  (let* ((p params)
-        (splicep (plist-get p :splice))
-        (hline (plist-get p :hline))
-        rtn line i fm efm lfmt h)
-
-    ;; Do we have a header?
-    (if (and (not splicep) (listp (car table)) (memq 'hline table))
-       (setq h t))
+  (let* ((splicep (plist-get params :splice))
+        (hline (plist-get params :hline))
+        (*orgtbl-table* table)
+        (*orgtbl-sep* (plist-get params :sep))
+        (*orgtbl-efmt* (plist-get params :efmt))
+        (*orgtbl-lstart* (plist-get params :lstart))
+        (*orgtbl-lend* (plist-get params :lend))
+        (*orgtbl-lfmt* (plist-get params :lfmt))
+        (*orgtbl-fmt* (plist-get params :fmt))
+        *orgtbl-rtn*)
 
     ;; Put header
     (unless splicep
-      (push (or (plist-get p :tstart) "ERROR: no :tstart") rtn))
-
-    ;; Now loop over all lines
-    (while (setq line (pop table))
-      (if (eq line 'hline)
-         ;; A horizontal separator line
-         (progn (if hline (push hline rtn))
-                (setq h nil))               ; no longer in header
-       ;; A normal line.  Convert the fields, push line onto the result list
-       (setq i 0)
-       (setq line
-             (mapcar
-              (lambda (f)
-                (setq i (1+ i)
-                      fm (org-get-param p h i :fmt :hfmt)
-                      efm (org-get-param p h i :efmt))
-                (if (and efm (string-match orgtbl-exp-regexp f))
-                    (setq f (format
-                             efm (match-string 1 f) (match-string 2 f))))
-                (if fm (setq f (format fm f)))
-                f)
-              line))
-       (if (setq lfmt (org-get-param p h i :lfmt :hlfmt))
-           (push (apply 'format lfmt line) rtn)
-         (push (concat
-                (org-get-param p h i :lstart :hlstart)
-                (mapconcat 'identity line (org-get-param p h i :sep :hsep))
-                (org-get-param p h i :lend :hlend))
-               rtn))))
+      (push (or (plist-get params :tstart) "ERROR: no :tstart") *orgtbl-rtn*))
+
+    ;; Do we have a heading section?  If so, format it and handle the
+    ;; trailing hline.
+    (if (and (not splicep) (listp (car *orgtbl-table*))
+            (memq 'hline *orgtbl-table*))
+       (progn
+         (let* ((*orgtbl-lstart* (or (plist-get params :hlstart)
+                                     *orgtbl-lstart*))
+                (*orgtbl-lend* (or (plist-get params :hlend) *orgtbl-lend*))
+                (*orgtbl-lfmt* (or (plist-get params :hlfmt) *orgtbl-lfmt*))
+                (*orgtbl-sep* (or (plist-get params :hlsep) *orgtbl-sep*))
+                (*orgtbl-fmt* (or (plist-get params :hfmt) *orgtbl-fmt*)))
+           (orgtbl-format-section 'hline))
+         (if hline (push hline *orgtbl-rtn*))
+         (pop *orgtbl-table*)))
+
+    ;; Now format the main section.
+    (orgtbl-format-section nil)
 
     (unless splicep
-      (push (or (plist-get p :tend) "ERROR: no :tend") rtn))
+      (push (or (plist-get params :tend) "ERROR: no :tend") *orgtbl-rtn*))
 
-    (mapconcat 'identity (nreverse rtn) "\n")))
+    (mapconcat 'identity (nreverse *orgtbl-rtn*) "\n")))
 
 (defun orgtbl-to-latex (table params)
   "Convert the orgtbl-mode TABLE to LaTeX.
-- 
1.5.5.rc1.121.g1594





reply via email to

[Prev in Thread] Current Thread [Next in Thread]