1
0
mirror of https://git.savannah.gnu.org/git/emacs/org-mode.git synced 2024-12-28 10:56:57 +00:00

org-e-html: Support for generating TOC

This commit is contained in:
Jambunathan K 2012-02-19 21:27:05 +05:30
parent 2239d74fd9
commit 8fc0dc2f58

View File

@ -987,10 +987,6 @@ that uses these same face definitions."
(defvar org-lparse-dyn-first-heading-pos)
(defun org-e-html-end-export ()
;; insert the table of contents
(when (and org-export-with-toc (not body-only) org-lparse-toc)
(org-e-html-insert-toc org-lparse-toc))
;; Convert whitespace place holders
(goto-char (point-min))
(let (beg end n)
@ -1014,117 +1010,75 @@ that uses these same face definitions."
(defun org-e-html-format-toc-entry (snumber todo headline tags href)
(setq headline (concat
(and org-export-with-section-numbers
(concat snumber " "))
;; section number
(and org-export-with-section-numbers (concat snumber " "))
;; headline
headline
(and tags
(concat
(org-lparse-format 'SPACES 3)
(org-lparse-format 'FONTIFY tags "tag")))))
(when todo
(setq headline (org-lparse-format 'FONTIFY headline "todo")))
(org-lparse-format 'LINK headline (concat "#" href)))
;; tags
(and tags (concat
(org-e-html-format-spaces 3)
(org-e-html-format-fontify tags "tag")))))
;; fontify headline based on TODO keyword
(when todo (setq headline (org-e-html-format-fontify headline "todo")))
(org-e-html-format-link headline (concat "#" href)))
(defun org-e-html-format-toc-item (toc-entry level org-last-level)
(when (> level org-last-level)
(let ((cnt (- level org-last-level)))
(while (>= (setq cnt (1- cnt)) 0)
(org-lparse-begin-list 'unordered)
(org-lparse-begin-list-item 'unordered))))
(when (< level org-last-level)
(let ((cnt (- org-last-level level)))
(while (>= (setq cnt (1- cnt)) 0)
(org-lparse-end-list-item-1)
(org-lparse-end-list 'unordered))))
(defun org-e-html-toc-entry-formatter
(level snumber todo todo-type priority
headline tags target extra-targets extra-class)
(org-e-html-format-toc-entry snumber todo headline tags target))
(org-lparse-end-list-item-1)
(org-lparse-begin-list-item 'unordered)
(insert toc-entry))
(defun org-e-html-make-string (n string)
(let (out) (dotimes (i n out) (setq out (concat string out)))))
(defun org-e-html-begin-toc (lang-specific-heading max-level)
(org-lparse-insert-tag "<div id=\"table-of-contents\">")
(insert
(org-lparse-format 'HEADING lang-specific-heading
(or (org-lparse-get 'TOPLEVEL-HLEVEL) 1)))
(org-lparse-insert-tag "<div id=\"text-table-of-contents\">")
(org-lparse-begin-list 'unordered)
(org-lparse-begin-list-item 'unordered))
(defun org-e-html-toc-text (toc-entries)
(let* ((prev-level (1- (nth 1 (car toc-entries))))
(start-level prev-level))
(concat
(mapconcat
(lambda (entry)
(let ((headline (nth 0 entry))
(level (nth 1 entry)))
(concat
(let* ((cnt (- level prev-level))
(times (if (> cnt 0) (1- cnt) (- cnt)))
rtn)
(setq prev-level level)
(concat
(org-e-html-make-string
times (cond ((> cnt 0) "<ul>\n<li>\n")
((< cnt 0) "</li>\n</ul>\n")))
(if (> cnt 0) "<ul>\n<li>\n" "</li>\n<li>\n")))
headline)))
toc-entries "")
(org-e-html-make-string
(- prev-level start-level) "</li>\n</ul>\n"))))
(defun org-e-html-end-toc ()
(while (> org-last-level (1- org-min-level))
(setq org-last-level (1- org-last-level))
(org-lparse-end-list-item-1)
(org-lparse-end-list 'unordered))
(org-lparse-insert-tag "</div>")
(org-lparse-insert-tag "</div>")
(defun org-e-html-toc (depth info)
(assert (wholenump depth))
(let* ((headlines (org-export-collect-headlines info depth))
(toc-entries
(loop for headline in headlines collect
(list (org-e-html-headline-text
headline info 'org-e-html-toc-entry-formatter)
(org-export-get-relative-level headline info)))))
(when toc-entries
(let* ((lang-specific-heading "Table of Contents")) ; FIXME
(concat
"<div id=\"table-of-contents\">\n"
(org-e-html-format-heading lang-specific-heading
(or org-e-html-toplevel-hlevel 1))
"<div id=\"text-table-of-contents\">"
(org-e-html-toc-text toc-entries)
"</div>\n"
"</div>\n")))))
;; cleanup empty list items in toc
(while (re-search-backward "<li>[ \r\n\t]*</li>\n?" (point-min) t)
(replace-match "")))
;;;###autoload
(defun org-export-as-html-and-open (arg)
"Export the outline as HTML and immediately open it with a browser.
If there is an active region, export only the region.
The prefix ARG specifies how many levels of the outline should become
headlines. The default is 3. Lower levels will become bulleted lists."
(interactive "P")
(error "FIXME"))
;;;###autoload
(defun org-export-as-html-batch ()
"Call the function `org-lparse-batch'.
This function can be used in batch processing as:
emacs --batch
--load=$HOME/lib/emacs/org.el
--eval \"(setq org-export-headline-levels 2)\"
--visit=MyFile --funcall org-export-as-html-batch"
(error "FIXME"))
;;;###autoload
(defun org-export-as-html-to-buffer (arg)
"Call `org-lparse-to-buffer` with output to a temporary buffer.
No file is created. The prefix ARG is passed through to `org-lparse-to-buffer'."
(interactive "P")
(error "FIXME"))
;;;###autoload
(defun org-replace-region-by-html (beg end)
"Assume the current region has org-mode syntax, and convert it to HTML.
This can be used in any buffer. For example, you could write an
itemized list in org-mode syntax in an HTML buffer and then use this
command to convert it."
(interactive "r")
(error "FIXME"))
;;;###autoload
(defun org-export-region-as-html (beg end &optional body-only buffer)
"Convert region from BEG to END in `org-mode' buffer to HTML.
If prefix arg BODY-ONLY is set, omit file header, footer, and table of
contents, and only produce the region of converted text, useful for
cut-and-paste operations.
If BUFFER is a buffer or a string, use/create that buffer as a target
of the converted HTML. If BUFFER is the symbol `string', return the
produced HTML as a string and leave not buffer behind. For example,
a Lisp program could call this function in the following way:
(setq html (org-export-region-as-html beg end t 'string))
When called interactively, the output buffer is selected, and shown
in a window. A non-interactive call will only return the buffer."
(interactive "r\nP")
(error "FIXME"))
;;; org-export-as-html
;;;###autoload
(defun org-export-as-html (arg &optional hidden ext-plist
to-buffer body-only pub-dir)
"Export the outline as a pretty HTML file.
Use `org-lparse' internally to perform the actual export. This
routine merely binds the TARGET-BACKEND and NATIVE-BACKEND args
of `org-lparse' to \"html\"."
(interactive "P")
(error "FIXME"))
;; FIXME: Legacy interactive functions
;; org-export-as-html-and-open
;; org-export-as-html-batch
;; org-export-as-html-to-buffer
;; org-replace-region-by-html
;; org-export-region-as-html
;; org-export-as-html
(defun org-e-html-begin-outline (level1 snumber title tags
target extra-targets extra-class)
@ -2194,18 +2148,23 @@ original parsed data. INFO is a plist holding export options."
(or link-home link-up))))
;; preamble
(org-e-html-preamble info)
;; content
;; begin content
(format "
<div id=\"%s\">" (or org-e-html-content-div
(nth 1 org-e-html-divs)))
;; document title
(format "
<h1 class=\"title\"> %s </h1>\n" (plist-get info :title))
;; table of contents
(let ((depth (plist-get info :with-toc)))
(when (wholenump depth) (org-e-html-toc depth info)))
;; document contents
contents
;; footnotes section
(org-e-html-footnote-section info)
;; bibliography
(org-e-html-bibliography)
;; end content
(unless body-only
"
</div>")
@ -2542,6 +2501,44 @@ CONTENTS is nil. INFO is a plist holding contextual information."
(list (if (member todo org-done-keywords) "done" "todo")
todo))))
(defvar org-e-html-headline-formatter
(lambda (level snumber todo todo-type priority
title tags target extra-targets extra-class)
(concat snumber " " title)))
(defun org-e-html-headline-text (headline info &optional formatter)
"Transcode an HEADLINE element from Org to HTML.
CONTENTS holds the contents of the headline. INFO is a plist
holding contextual information."
(let* ((numberedp (plist-get info :section-numbers))
(level (org-export-get-relative-level headline info))
(todo (and (plist-get info :with-todo-keywords)
(let ((todo (org-element-get-property
:todo-keyword headline)))
(and todo
(org-export-secondary-string todo 'e-html info)))))
(todo-type (and todo (org-element-get-property :todo-type headline)))
(priority (and (plist-get info :with-priority)
(org-element-get-property :priority headline)))
(text (org-export-secondary-string
(org-element-get-property :title headline) 'e-html info))
(tags (and (plist-get info :with-tags)
(org-element-get-property :tags headline)))
(headline-no (org-export-get-headline-number headline info))
(headline-label
(format "sec-%s" (mapconcat 'number-to-string headline-no "-")))
(headline-labels (list headline-label))
(headline-no (org-export-get-headline-number headline info))
(section-no (mapconcat 'number-to-string headline-no "."))
(primary-target (car (last headline-labels)))
(secondary-targets (butlast headline-labels))
(extra-class nil)
(formatter (or (and (functionp formatter) formatter)
org-e-html-headline-formatter)))
(funcall formatter level section-no todo todo-type priority
text tags primary-target secondary-targets extra-class)))
(defun org-e-html-headline (headline contents info)
"Transcode an HEADLINE element from Org to HTML.
CONTENTS holds the contents of the headline. INFO is a plist
@ -2801,10 +2798,7 @@ CONTENTS is nil. INFO is a plist holding contextual information."
(let ((depth (or (and (string-match "[0-9]+" value)
(string-to-number (match-string 0 value)))
(plist-get info :with-toc))))
(concat
(when (wholenump depth)
(format "\\setcounter{tocdepth}{%s}\n" depth))
"\\tableofcontents")))
(when (wholenump depth) (org-e-html-toc depth info))))
((string= "tables" value) "\\listoftables")
((string= "figures" value) "\\listoffigures")
((string= "listings" value)