emacs-orgmode@gnu.org archives
 help / color / mirror / code / Atom feed
From: Jason Riedy <jason@acm.org>
To: emacs-orgmode@gnu.org
Subject: [PATCH] Refactor orgtbl-to-generic; explicitly separate heading from body.
Date: Sun, 02 Mar 2008 16:35:55 -0800	[thread overview]
Message-ID: <87mypgiqz8.fsf@sparse.yi.org> (raw)

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 <jason@acm.org>
---
 org.el |  100 +++++++++++++++++++++++++++++++++------------------------------
 1 files changed, 52 insertions(+), 48 deletions(-)

diff --git a/org.el b/org.el
index 4e27ecc..64121c9 100644
--- a/org.el
+++ b/org.el
@@ -11770,15 +11770,31 @@ 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)))
+(defun orgtbl-format-line (line)
+  "Format LINE as a table row."
+  (if (eq line 'hline) (if hline (push hline rtn))
+    (let* ((i 0)
+	   (line
+	    (mapcar
+	     (lambda (f)
+	       (setq i (1+ i))
+	       (let* ((fmt (if (consp fmt) (plist-get fmt i) fmt))
+		      (efmt (if (consp efmt) (plist-get efmt i) efmt))
+		      (f (if (and efmt (string-match orgtbl-exp-regexp f))
+			     (format efmt (match-string 1 f)
+					  (match-string 2 f))
+			   f)))
+		 (if fmt (format fmt f) f)))
+	     line)))
+      (push (if lfmt (apply 'format lfmt line)
+	      (concat lstart (mapconcat 'identity line sep) lend))
+	    rtn))))
+
+(defun orgtbl-format-section (section-stopper)
+  "Format lines until the first occurrence of SECTION-STOPPER."
+  (progn
+    (while (not (eq (car table) section-stopper))
+      (orgtbl-format-line (pop table)))))
 
 (defun orgtbl-to-generic (table params)
   "Convert the orgtbl-mode TABLE to some other format.
@@ -11812,7 +11828,7 @@ Valid parameters are
             This may also be a property list with column numbers and
             formats. For example :fmt (2 \"$%s$\" 4 \"%s%%\")
 
-:hlstart :hlend :hlsep :hlfmt :hfmt
+:hlstart :hlend :hsep :hlfmt :hfmt
             Same as above, specific for the header lines in the table.
             All lines before the first hline are treated as header.
             If any of these is not present, the data line value is used.
@@ -11826,49 +11842,37 @@ 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))
+	 (sep (plist-get params :sep))
+	 (efmt (plist-get params :efmt))
+	 (lstart (plist-get params :lstart))
+	 (lend (plist-get params :lend))
+	 (lfmt (plist-get params :lfmt))
+	 (fmt (plist-get params :fmt))
+	 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") rtn))
+
+    ;; Do we have a heading section?  If so, format it and handle the
+    ;; trailing hline.
+    (if (and (not splicep) (listp (car table)) (memq 'hline table))
+	(progn
+	  (let* ((lstart (or (plist-get params :hlstart) lstart))
+		 (lend (or (plist-get params :hlend) lend))
+		 (lfmt (or (plist-get params :hlfmt) lfmt))
+		 (fmt (or (plist-get params :hfmt) fmt)))
+	    (orgtbl-format-section 'hline))
+	  (if hline (push hline rtn))
+	  (pop 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") rtn))
 
     (mapconcat 'identity (nreverse rtn) "\n")))
 
-- 
1.5.4.3

                 reply	other threads:[~2008-03-03  0:36 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://www.orgmode.org/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=87mypgiqz8.fsf@sparse.yi.org \
    --to=jason@acm.org \
    --cc=emacs-orgmode@gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs/org-mode.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).