ox-ascii: Improve speed wrt table export
authorNicolas Goaziou <n.goaziou@gmail.com>
Sat, 18 May 2013 16:22:11 +0000 (18 18:22 +0200)
committerNicolas Goaziou <n.goaziou@gmail.com>
Sat, 18 May 2013 16:22:15 +0000 (18 18:22 +0200)
* lisp/ox-ascii.el (org-ascii--table-cell-width): Cache results of
  this internal function since it is called at each cell, though its
  value only change column wise.

lisp/ox-ascii.el

index bdc54b2..1884061 100644 (file)
@@ -1672,25 +1672,35 @@ column.
 
 When `org-ascii-table-widen-columns' is non-nil, width cookies
 are ignored."
-  (or (and (not org-ascii-table-widen-columns)
-          (org-export-table-cell-width table-cell info))
-      (let* ((max-width 0)
-            (table (org-export-get-parent-table table-cell))
-            (specialp (org-export-table-has-special-column-p table))
-            (col (cdr (org-export-table-cell-address table-cell info))))
-       (org-element-map table 'table-row
-         (lambda (row)
-           (setq max-width
-                 (max (length
-                       (org-export-data
-                        (org-element-contents
-                         (elt (if specialp (cdr (org-element-contents row))
-                                (org-element-contents row))
-                              col))
-                        info))
-                      max-width)))
-         info)
-       max-width)))
+  (let* ((row (org-export-get-parent table-cell))
+        (table (org-export-get-parent row))
+        (col (let ((cells (org-element-contents row)))
+               (- (length cells) (length (memq table-cell cells)))))
+        (cache
+         (or (plist-get info :ascii-table-cell-width-cache)
+             (plist-get (setq info
+                              (plist-put info :ascii-table-cell-width-cache
+                                         (make-hash-table :test 'equal)))
+                        :ascii-table-cell-width-cache)))
+        (key (cons table col)))
+    (or (gethash key cache)
+       (puthash
+        key
+        (or (and (not org-ascii-table-widen-columns)
+                 (org-export-table-cell-width table-cell info))
+            (let* ((max-width 0))
+              (org-element-map table 'table-row
+                (lambda (row)
+                  (setq max-width
+                        (max (length
+                              (org-export-data
+                               (org-element-contents
+                                (elt (org-element-contents row) col))
+                               info))
+                             max-width)))
+                info)
+              max-width))
+        cache))))
 
 (defun org-ascii-table-cell (table-cell contents info)
   "Transcode a TABLE-CELL object from Org to ASCII.