Function: org-table-analyze
org-table-analyze is an autoloaded and byte-compiled function defined
in org-table.el.gz.
Signature
(org-table-analyze)
Documentation
Analyze table at point and store results.
This function sets up the following dynamically scoped variables:
org-table-column-name-regexp,
org-table-column-names,
org-table-current-begin-pos,
org-table-current-line-types,
org-table-current-ncol,
org-table-dlines,
org-table-hlines,
org-table-local-parameters,
org-table-named-field-locations.
Source Code
;; Defined in /usr/src/emacs/lisp/org/org-table.el.gz
;;;###autoload
(defun org-table-analyze ()
"Analyze table at point and store results.
This function sets up the following dynamically scoped variables:
`org-table-column-name-regexp',
`org-table-column-names',
`org-table-current-begin-pos',
`org-table-current-line-types',
`org-table-current-ncol',
`org-table-dlines',
`org-table-hlines',
`org-table-local-parameters',
`org-table-named-field-locations'."
(let ((beg (org-table-begin))
(end (org-table-end)))
(save-excursion
(goto-char beg)
;; Extract column names.
(setq org-table-column-names nil)
(when (save-excursion
(re-search-forward "^[ \t]*| *! *\\(|.*\\)" end t))
(let ((c 1))
(dolist (name (org-split-string (match-string 1) " *| *"))
(cl-incf c)
(when (string-match "\\`[a-zA-Z][_a-zA-Z0-9]*\\'" name)
(push (cons name (number-to-string c)) org-table-column-names)))))
(setq org-table-column-names (nreverse org-table-column-names))
(setq org-table-column-name-regexp
(format "\\$\\(%s\\)\\>"
(regexp-opt (mapcar #'car org-table-column-names) t)))
;; Extract local parameters.
(setq org-table-local-parameters nil)
(save-excursion
(while (re-search-forward "^[ \t]*| *\\$ *\\(|.*\\)" end t)
(dolist (field (org-split-string (match-string 1) " *| *"))
(when (string-match
"\\`\\([a-zA-Z][_a-zA-Z0-9]*\\|%\\) *= *\\(.*\\)" field)
(push (cons (match-string 1 field) (match-string 2 field))
org-table-local-parameters)))))
;; Update named fields locations. We minimize `count-lines'
;; processing by storing last known number of lines in LAST.
(setq org-table-named-field-locations nil)
(save-excursion
(let ((last (cons (point) 0)))
(while (re-search-forward "^[ \t]*| *\\([_^]\\) *\\(|.*\\)" end t)
(let ((c (match-string 1))
(fields (org-split-string (match-string 2) " *| *")))
(save-excursion
(forward-line (if (equal c "_") 1 -1))
(let ((fields1
(and (looking-at "^[ \t]*|[^|]*\\(|.*\\)")
(org-split-string (match-string 1) " *| *")))
(line (cl-incf (cdr last) (count-lines (car last) (point))))
(col 1))
(setcar last (point)) ; Update last known position.
(while (and fields fields1)
(let ((field (pop fields))
(v (pop fields1)))
(cl-incf col)
(when (and (stringp field)
(stringp v)
(string-match "\\`[a-zA-Z][_a-zA-Z0-9]*\\'"
field))
(push (cons field v) org-table-local-parameters)
(push (list field line col)
org-table-named-field-locations))))))))))
;; Re-use existing markers when possible.
(if (markerp org-table-current-begin-pos)
(move-marker org-table-current-begin-pos (point))
(setq org-table-current-begin-pos (point-marker)))
;; Analyze the line types.
(let ((l 0) hlines dlines types)
(while (looking-at "[ \t]*|\\(-\\)?")
(push (if (match-end 1) 'hline 'dline) types)
(if (match-end 1) (push l hlines) (push l dlines))
(forward-line)
(cl-incf l))
(push 'hline types) ; Add an imaginary extra hline to the end.
(setq org-table-current-line-types (apply #'vector (nreverse types)))
(setq org-table-dlines (apply #'vector (cons nil (nreverse dlines))))
(setq org-table-hlines (apply #'vector (cons nil (nreverse hlines)))))
;; Get the number of columns from the first data line in table.
(goto-char beg)
(forward-line (aref org-table-dlines 1))
(setq org-table-current-ncol
(length (org-split-string
(buffer-substring (line-beginning-position) (line-end-position))
"[ \t]*|[ \t]*"))))))