emacs-orgmode@gnu.org archives
 help / color / mirror / code / Atom feed
From: Jason Riedy <jason@acm.org>
To: emacs-orgmode@gnu.org
Subject: [PATCH 1/4] Refactor orgtbl-to-generic; explicitly separate heading from body.
Date: Wed, 16 Apr 2008 14:39:51 -0700	[thread overview]
Message-ID: <1208381994-7893-2-git-send-email-jason@acm.org> (raw)
In-Reply-To: <1208381994-7893-1-git-send-email-jason@acm.org>

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>
---
 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  <jason@acm.org>
+
+	* 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  <dominik@science.uva.nl>
 
 	* 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	other threads:[~2008-04-16 21:40 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-04-16 21:39 [PATCH 0/4] Generalize orgtbl formatting with functions Jason Riedy
2008-04-16 21:39 ` Jason Riedy [this message]
2008-04-16 21:39 ` [PATCH 2/4] Support last-line specializers Jason Riedy
2008-04-16 21:39 ` [PATCH 3/4] Allow functions for some orgtbl parameters Jason Riedy
2008-04-16 21:39 ` [PATCH 4/4] Add a :remove-nil-lines parameter to orgtbl-to-generic Jason Riedy

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=1208381994-7893-2-git-send-email-jason@acm.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).