HTML export: Improved support for field alignment, including centering
* doc/org.texi: Document the <c> cookie. * lisp/org-exp.el (org-store-forced-table-alignment): (org-export-remove-special-table-lines): Allow the "c" cookie for table alignment. * lisp/org-html.el (org-export-table-header-tags): (org-export-table-data-tags): Add another %s format for the alignment. (org-export-html-table-align-individual-fields): New option. (org-format-org-table-html): Implement field-by-field alignment and support centering. (org-format-table-table-html): Make sure the new table tag formats don't break this function. * lisp/org-table.el (org-table-cookie-line-p): (org-table-align): Allow for the <c> cookie. * lisp/org.el (org-set-font-lock-defaults): Allow for the <c> cookie.
This commit is contained in:
parent
b0fae37687
commit
ca991d2ad4
|
@ -1922,9 +1922,10 @@ on a per-file basis with:
|
|||
@end example
|
||||
|
||||
If you would like to overrule the automatic alignment of number-rich columns
|
||||
to the right and of string-rich column to the left, you and use @samp{<r>} or
|
||||
@samp{<l>} in a similar fashion. You may also combine alignment and field
|
||||
width like this: @samp{<l10>}.
|
||||
to the right and of string-rich column to the left, you and use @samp{<r>},
|
||||
@samp{c}@footnote{Centering does not work inside Emacs, but it does have an
|
||||
effect when exporting to HTML.} or @samp{<l>} in a similar fashion. You may
|
||||
also combine alignment and field width like this: @samp{<l10>}.
|
||||
|
||||
Lines which only contain these formatting cookies will be removed
|
||||
automatically when exporting the document.
|
||||
|
|
|
@ -1776,19 +1776,19 @@ When it is nil, all comments will be removed."
|
|||
|
||||
(defun org-store-forced-table-alignment ()
|
||||
"Find table lines which force alignment, store the results in properties."
|
||||
(let (line)
|
||||
(let (line cnt aligns)
|
||||
(goto-char (point-min))
|
||||
(while (re-search-forward "|[ \t]*<[rl][0-9]*>[ \t]*|" nil t)
|
||||
(while (re-search-forward "|[ \t]*<[lrc][0-9]*>[ \t]*|" nil t)
|
||||
;; OK, this looks like a table line with an alignment cookie
|
||||
(org-if-unprotected
|
||||
(setq line (buffer-substring (point-at-bol) (point-at-eol)))
|
||||
(when (and (org-at-table-p)
|
||||
(org-table-cookie-line-p line))
|
||||
(setq cnt 0 aligns nil)
|
||||
(mapcar
|
||||
(mapc
|
||||
(lambda (x)
|
||||
(setq cnt (1+ cnt))
|
||||
(if (string-match "\\`<\\([lr]\\)" x)
|
||||
(if (string-match "\\`<\\([lrc]\\)" x)
|
||||
(push (cons cnt (downcase (match-string 1 x))) aligns)))
|
||||
(org-split-string line "[ \t]*|[ \t]*"))
|
||||
(add-text-properties (org-table-begin) (org-table-end)
|
||||
|
@ -1810,7 +1810,7 @@ Also, store forcedalignment information found in such lines."
|
|||
(lambda (f)
|
||||
(or (= (length f) 0)
|
||||
(string-match
|
||||
"\\`<\\([0-9]\\|[rl]\\|[rl][0-9]+\\)>\\'" f)))
|
||||
"\\`<\\([0-9]\\|[lrc]\\|[lrc][0-9]+\\)>\\'" f)))
|
||||
(org-split-string ;; FIXME, can't we do without splitting???
|
||||
(buffer-substring (point-at-bol) (point-at-eol))
|
||||
"[ \t]*|[ \t]*")))))
|
||||
|
|
|
@ -400,17 +400,22 @@ borders and spacing."
|
|||
:group 'org-export-html
|
||||
:type 'string)
|
||||
|
||||
(defcustom org-export-table-header-tags '("<th scope=\"%s\">" . "</th>")
|
||||
(defcustom org-export-table-header-tags '("<th scope=\"%s\"%s>" . "</th>")
|
||||
"The opening tag for table header fields.
|
||||
This is customizable so that alignment options can be specified.
|
||||
%s will be filled with the scope of the field, either row or col.
|
||||
See also the variable `org-export-html-table-use-header-tags-for-first-column'."
|
||||
The first %s will be filled with the scope of the field, either row or col.
|
||||
The second %s will be replaced by a style entry to align the field.
|
||||
See also the variable `org-export-html-table-use-header-tags-for-first-column'.
|
||||
See also the variable `org-export-html-table-align-individual-fields'."
|
||||
:group 'org-export-tables
|
||||
:type '(cons (string :tag "Opening tag") (string :tag "Closing tag")))
|
||||
|
||||
(defcustom org-export-table-data-tags '("<td>" . "</td>")
|
||||
(defcustom org-export-table-data-tags '("<td%s>" . "</td>")
|
||||
"The opening tag for table data fields.
|
||||
This is customizable so that alignment options can be specified."
|
||||
This is customizable so that alignment options can be specified.
|
||||
The first %s will be filled with the scope of the field, either row or col.
|
||||
The second %s will be replaced by a style entry to align the field.
|
||||
See also the variable `org-export-html-table-align-individual-fields'."
|
||||
:group 'org-export-tables
|
||||
:type '(cons (string :tag "Opening tag") (string :tag "Closing tag")))
|
||||
|
||||
|
@ -441,7 +446,13 @@ will give even lines the class \"tr-even\" and odd lines the class \"tr-odd\"."
|
|||
(string :tag "Specify")
|
||||
(sexp))))
|
||||
|
||||
|
||||
(defcustom org-export-html-table-align-individual-fields t
|
||||
"Non-nil means attach style attributes for alignment to each table field.
|
||||
When nil, alignment will only be specified in the column tags, but this
|
||||
is ignored by some browsers (like Firefox, Safari). Opera does it right
|
||||
though."
|
||||
:group 'org-export-tables
|
||||
:type 'boolean)
|
||||
|
||||
(defcustom org-export-html-table-use-header-tags-for-first-column nil
|
||||
"Non-nil means format column one in tables with header tags.
|
||||
|
@ -1869,9 +1880,9 @@ lang=\"%s\" xml:lang=\"%s\">
|
|||
(delq nil (mapcar
|
||||
(lambda (x) (string-match "^[ \t]*|-" x))
|
||||
(cdr lines)))))
|
||||
|
||||
(nline 0) fnum nfields i (cnt 0)
|
||||
tbopen line fields html gr colgropen rowstart rowend)
|
||||
tbopen line fields html gr colgropen rowstart rowend
|
||||
ali align aligns n)
|
||||
(setq caption (and caption (org-html-do-expand caption)))
|
||||
(when (and forced-aligns org-table-clean-did-remove-column)
|
||||
(setq forced-aligns
|
||||
|
@ -1899,23 +1910,26 @@ lang=\"%s\" xml:lang=\"%s\">
|
|||
(push (concat rowstart
|
||||
(mapconcat
|
||||
(lambda (x)
|
||||
(setq i (1+ i))
|
||||
(setq i (1+ i) ali (format "@@align%03d@@" i))
|
||||
(if (and (< i nfields) ; make sure no rogue line causes an error here
|
||||
(string-match org-table-number-regexp x))
|
||||
(incf (aref fnum i)))
|
||||
(cond
|
||||
(head
|
||||
(concat
|
||||
(format (car org-export-table-header-tags) "col")
|
||||
(format (car org-export-table-header-tags)
|
||||
"col" ali)
|
||||
x
|
||||
(cdr org-export-table-header-tags)))
|
||||
((and (= i 0) org-export-html-table-use-header-tags-for-first-column)
|
||||
(concat
|
||||
(format (car org-export-table-header-tags) "row")
|
||||
(format (car org-export-table-header-tags)
|
||||
"row" ali)
|
||||
x
|
||||
(cdr org-export-table-header-tags)))
|
||||
(t
|
||||
(concat (car org-export-table-data-tags) x
|
||||
(concat (format (car org-export-table-data-tags) ali)
|
||||
x
|
||||
(cdr org-export-table-data-tags)))))
|
||||
fields "")
|
||||
rowend)
|
||||
|
@ -1932,23 +1946,32 @@ lang=\"%s\" xml:lang=\"%s\">
|
|||
(push (mapconcat
|
||||
(lambda (x)
|
||||
(setq gr (pop org-table-colgroup-info)
|
||||
i (1+ i))
|
||||
i (1+ i)
|
||||
align (if (assoc i forced-aligns)
|
||||
(cdr (assoc (cdr (assoc i forced-aligns))
|
||||
'(("l" . "left") ("r" . "right")
|
||||
("c" . "center"))))
|
||||
(if (> (/ (float x) nline)
|
||||
org-table-number-fraction)
|
||||
"right" "left")))
|
||||
(push align aligns)
|
||||
(format "%s<col align=\"%s\" />%s"
|
||||
(if (memq gr '(:start :startend))
|
||||
(prog1
|
||||
(if colgropen "</colgroup>\n<colgroup>" "<colgroup>")
|
||||
(if colgropen
|
||||
"</colgroup>\n<colgroup>"
|
||||
"<colgroup>")
|
||||
(setq colgropen t))
|
||||
"")
|
||||
(if (assoc i forced-aligns)
|
||||
(cdr (assoc (cdr (assoc i forced-aligns)) '(("l" . "left") ("r" . "right"))))
|
||||
(if (> (/ (float x) nline) org-table-number-fraction)
|
||||
"right" "left"))
|
||||
align
|
||||
(if (memq gr '(:end :startend))
|
||||
(progn (setq colgropen nil) "</colgroup>")
|
||||
"")))
|
||||
fnum "")
|
||||
html)
|
||||
(if colgropen (setq html (cons (car html) (cons "</colgroup>" (cdr html)))))
|
||||
(setq aligns (nreverse aligns))
|
||||
(if colgropen (setq html (cons (car html)
|
||||
(cons "</colgroup>" (cdr html)))))
|
||||
;; Since the output of HTML table formatter can also be used in
|
||||
;; DocBook document, we want to always include the caption to make
|
||||
;; DocBook XML file valid.
|
||||
|
@ -1956,6 +1979,18 @@ lang=\"%s\" xml:lang=\"%s\">
|
|||
(when label (push (format "<a name=\"%s\" id=\"%s\"></a>" label label)
|
||||
html))
|
||||
(push html-table-tag html))
|
||||
(setq html (mapcar
|
||||
(lambda (x)
|
||||
(replace-regexp-in-string
|
||||
"@@align\\([0-9]+\\)@@"
|
||||
(lambda (txt)
|
||||
(if (not org-export-html-table-align-individual-fields)
|
||||
""
|
||||
(setq n (string-to-number (match-string 1 txt)))
|
||||
(format " style=\"text-align:%s\""
|
||||
(or (nth n aligns) "left"))))
|
||||
x))
|
||||
html))
|
||||
(concat (mapconcat 'identity html "\n") "\n")))
|
||||
|
||||
(defun org-export-splice-attributes (tag attributes)
|
||||
|
@ -2000,10 +2035,10 @@ But it has the disadvantage, that no cell- or row-spanning is allowed."
|
|||
(if (equal x "") (setq x empty))
|
||||
(if head
|
||||
(concat
|
||||
(format (car org-export-table-header-tags) "col")
|
||||
(format (car org-export-table-header-tags) "col" "")
|
||||
x
|
||||
(cdr org-export-table-header-tags))
|
||||
(concat (car org-export-table-data-tags) x
|
||||
(concat (format (car org-export-table-data-tags) "") x
|
||||
(cdr org-export-table-data-tags))))
|
||||
field-buffer "\n")
|
||||
"</tr>\n"))
|
||||
|
|
|
@ -1277,7 +1277,7 @@ OPT-PLIST is the options plist for current buffer."
|
|||
(plist-get opt-plist :latex-header-extra)))
|
||||
;; append another special variable
|
||||
(org-export-apply-macros-in-string org-export-latex-append-header)
|
||||
;; define align if not yet defined
|
||||
;; define alert if not yet defined
|
||||
"\n\\providecommand{\\alert}[1]{\\textbf{#1}}"
|
||||
;; insert the title
|
||||
(format
|
||||
|
|
|
@ -342,19 +342,18 @@ available parameters."
|
|||
|
||||
(defun org-table-cookie-line-p (line)
|
||||
"Is this a table line with only alignment/width cookies?"
|
||||
|
||||
(save-match-data
|
||||
(and (string-match "[<>]\\|&[lg]t;" line)
|
||||
(or (string-match
|
||||
"\\`[ \t]*|[ \t]*/[ \t]*\\(|[ \t<>0-9|lgt&;]+\\)\\'" line)
|
||||
(string-match "\\(\\`[ \t<>lr0-9|gt&;]+\\'\\)" line))
|
||||
"\\`[ \t]*|[ \t]*/[ \t]*\\(|[ \t<>0-9|lrcgt&;]+\\)\\'" line)
|
||||
(string-match "\\(\\`[ \t<>lrc0-9|gt&;]+\\'\\)" line))
|
||||
(not (delq nil (mapcar
|
||||
(lambda (s)
|
||||
(not (or (equal s "")
|
||||
(string-match
|
||||
"\\`<\\([lr]?[0-9]+\\|[lr]\\)>\\'" s)
|
||||
"\\`<\\([lrc]?[0-9]+\\|[lrc]\\)>\\'" s)
|
||||
(string-match
|
||||
"\\`<\\([lr]?[0-9]+\\|[lr]\\)>\\'"
|
||||
"\\`<\\([lrc]?[0-9]+\\|[lrc]\\)>\\'"
|
||||
s))))
|
||||
(org-split-string (match-string 1 line)
|
||||
"[ \t]*|[ \t]*")))))))
|
||||
|
@ -662,9 +661,9 @@ When nil, simply write \"#ERROR\" in corrupted fields.")
|
|||
(goto-char beg)
|
||||
(setq narrow (and org-table-do-narrow
|
||||
org-format-transports-properties-p
|
||||
(re-search-forward "<[rl]?[0-9]+>" end t)))
|
||||
(re-search-forward "<[lrc]?[0-9]+>" end t)))
|
||||
(goto-char beg)
|
||||
(setq falign (re-search-forward "<[rl][0-9]*>" end t))
|
||||
(setq falign (re-search-forward "<[lrc][0-9]*>" end t))
|
||||
(goto-char beg)
|
||||
;; Get the rows
|
||||
(setq lines (org-split-string
|
||||
|
@ -705,7 +704,7 @@ When nil, simply write \"#ERROR\" in corrupted fields.")
|
|||
(setq c column fmax nil falign1 nil)
|
||||
(while c
|
||||
(setq e (pop c))
|
||||
(when (and (stringp e) (string-match "^<\\([rl]\\)?\\([0-9]+\\)?>$" e))
|
||||
(when (and (stringp e) (string-match "^<\\([lrc]\\)?\\([0-9]+\\)?>$" e))
|
||||
(if (match-end 1) (setq falign1 (match-string 1 e)))
|
||||
(if (and org-table-do-narrow (match-end 2))
|
||||
(setq fmax (string-to-number (match-string 2 e)) c nil))))
|
||||
|
|
|
@ -5457,7 +5457,7 @@ needs to be inserted at a specific position in the font-lock sequence.")
|
|||
'("^[ \t]*|\\(?:.*?|\\)? *\\(:?=[^|\n]*\\)" (1 'org-formula t))
|
||||
'("^[ \t]*| *\\([#*]\\) *|" (1 'org-formula t))
|
||||
'("^[ \t]*|\\( *\\([$!_^/]\\) *|.*\\)|" (1 'org-formula t))
|
||||
'("| *\\(<[lr]?[0-9]*>\\)" (1 'org-formula t))
|
||||
'("| *\\(<[lrc]?[0-9]*>\\)" (1 'org-formula t))
|
||||
;; Drawers
|
||||
(list org-drawer-regexp '(0 'org-special-keyword t))
|
||||
(list "^[ \t]*:END:" '(0 'org-special-keyword t))
|
||||
|
|
Loading…
Reference in New Issue