From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mp1.migadu.com ([2001:41d0:403:4876::]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) by ms13.migadu.com with LMTPS id eGddNnsDsWYSIQAA62LTzQ:P1 (envelope-from ) for ; Mon, 05 Aug 2024 16:53:16 +0000 Received: from aspmx1.migadu.com ([2001:41d0:403:4876::]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) by mp1.migadu.com with LMTPS id eGddNnsDsWYSIQAA62LTzQ (envelope-from ) for ; Mon, 05 Aug 2024 18:53:15 +0200 X-Envelope-To: larch@yhetil.org Authentication-Results: aspmx1.migadu.com; dkim=none; spf=pass (aspmx1.migadu.com: domain of "emacs-orgmode-bounces+larch=yhetil.org@gnu.org" designates 209.51.188.17 as permitted sender) smtp.mailfrom="emacs-orgmode-bounces+larch=yhetil.org@gnu.org"; dmarc=fail reason="SPF not aligned (relaxed), No valid DKIM" header.from=hfmdk-frankfurt.de (policy=none) ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=yhetil.org; s=key1; t=1722876795; h=from:from:sender:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:mime-version:mime-version: content-type:content-type:in-reply-to:in-reply-to: references:references:list-id:list-help:list-unsubscribe: list-subscribe:list-post; bh=xApbeSlr6bxQhW3uSFDRYWBgB9bHuHrri13HUpG6aFM=; b=qnHVhp2kdEQTCnjVpcyEnkICSg/VBAxKgm+MpP6BJ0Uec7tSD+bTwyj1/TJmAk8Xdg77S5 UncumW7F+Ip3r6DrwQ1Q0C/ZEnpZckas+AySrXGonWcEWRBBvqAqnuTMK2OvICQ3MWHrzc +l5yV6/Cj08WWEubsXp/VnrczyDMrwhbA5a1Qa8NRVFWNrUXUFN9uY9pxeTjwAHkBiOKDD Peex7Y7bc/3D+ONIWuvY03QElXzHu35uiMmxOBhVFP7AYvqaWQ63HfgLOnGLZ3qx/N2vWa WrGcJbNbNjRvSupnnoCC1w0QYiNL4UU6YppZpr3UJ9wYId268VAJDoSnDvA/Ig== ARC-Authentication-Results: i=1; aspmx1.migadu.com; dkim=none; spf=pass (aspmx1.migadu.com: domain of "emacs-orgmode-bounces+larch=yhetil.org@gnu.org" designates 209.51.188.17 as permitted sender) smtp.mailfrom="emacs-orgmode-bounces+larch=yhetil.org@gnu.org"; dmarc=fail reason="SPF not aligned (relaxed), No valid DKIM" header.from=hfmdk-frankfurt.de (policy=none) ARC-Seal: i=1; s=key1; d=yhetil.org; t=1722876795; a=rsa-sha256; cv=none; b=S6JqlTFxD6itpga881hovR3LqgzpeJuddOP4BrzKRu7vUACJg3J3HAiGhuJzSfMZepk6kN 27sxWyELlZ0IoL0Vsgzr7y9H1XzSpphCFTIOeti2hP7pET5Nwvt8UJjdi6FDnuHSpp7kzu cZeZgzg91Lgh7RbeuggBbwgIUiCoZN3M67aJ6J7j6O7jMyizU4AK/61s21ay+n5s5m2YMG DvzSQTFt4A0DCqsWDJNvgaUY1onDuUxc55prxiNhbr1EuWsx1nhjSMqNyLaUWEGk1qX0hS issdpyPnjvFdj2VGPpux94NN3XWYe/VntkDwDKuXZELJfSWIO5Uh1InVfhCVbQ== Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by aspmx1.migadu.com (Postfix) with ESMTPS id 434A799ED for ; Mon, 5 Aug 2024 18:53:15 +0200 (CEST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1sb0wW-00056g-1Y; Mon, 05 Aug 2024 12:52:20 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1sb0wT-00056I-Nn for emacs-orgmode@gnu.org; Mon, 05 Aug 2024 12:52:17 -0400 Received: from www.selma.hfmdk-frankfurt.de ([46.4.92.145] helo=mail.selma.hfmdk-frankfurt.de) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1sb0wL-0004r0-4m for emacs-orgmode@gnu.org; Mon, 05 Aug 2024 12:52:17 -0400 Received: by mail.selma.hfmdk-frankfurt.de (Postfix, from userid 113) id 5CB3CF622FE; Mon, 5 Aug 2024 18:52:05 +0200 (CEST) Received: from selma.hfmdk-frankfurt.de (ip-037-201-128-004.um10.pools.vodafone-ip.de [37.201.128.4]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-256) server-digest SHA256) (Client did not present a certificate) by mail.selma.hfmdk-frankfurt.de (Postfix) with ESMTPSA id 1DA98F61A6A for ; Mon, 5 Aug 2024 18:52:03 +0200 (CEST) Received: by selma.hfmdk-frankfurt.de (Postfix, from userid 1000) id A16D23960545; Mon, 05 Aug 2024 18:52:02 +0200 (CEST) Date: Mon, 5 Aug 2024 18:52:02 +0200 From: Orm Finnendahl To: emacs-orgmode@gnu.org Subject: Re: multipage html output Message-ID: Mail-Followup-To: emacs-orgmode@gnu.org References: <87bk2o2o2m.fsf@localhost> <87sew011c6.fsf@localhost> <87frrzdrbz.fsf@localhost> <87plr14wka.fsf@localhost> <87bk2i8w07.fsf@localhost> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="/jKJUrk4TV58OzGX" Content-Disposition: inline In-Reply-To: <87bk2i8w07.fsf@localhost> X-Disclaimer: Why are you listening to me? X-Operating-System: GNU/Linux Organization: Hochschule =?utf-8?B?ZsO8?= =?utf-8?Q?r?= Musik und Darstellende Kunst Frankfurt, Frankfurt, Germany Received-SPF: pass client-ip=46.4.92.145; envelope-from=orm.finnendahl@selma.hfmdk-frankfurt.de; helo=mail.selma.hfmdk-frankfurt.de X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: emacs-orgmode@gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: "General discussions about Org-mode." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-orgmode-bounces+larch=yhetil.org@gnu.org Sender: emacs-orgmode-bounces+larch=yhetil.org@gnu.org X-Migadu-Country: US X-Migadu-Flow: FLOW_IN X-Spam-Score: 0.66 X-Migadu-Queue-Id: 434A799ED X-Migadu-Scanner: mx10.migadu.com X-Migadu-Spam-Score: 0.66 X-TUID: 8NbTYtZ/fSgT --/jKJUrk4TV58OzGX Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Hi, attached are the patches for the multipage html export proposal. The tgz file contains all commits after branching from the main branch to the org-html-multipage branch (see: https://github.com/ormf/org-mode/tree/org-html-multipage) There are also diffs for the only changed files, ox.el, ox-html.el and org-manual.org between 2a4fdffac163e91f6ed2055ec34cbcadf8b95dec of the main branch and my last commit to my org-html-multipage branch. Let me know if there are problems or you need anything. I tried to be conformant to Org in general and hope I succeeded. Let me know what you think. -- Orm Am Samstag, den 27. Juli 2024 um 19:39:36 Uhr (+0000) schrieb Ihor Radchenko: > Orm Finnendahl writes: > > > html multipage output is fully working now in the org-export > > compliant way sketched by Ihor. > > Great! > > > There is a small issue with org-export-as from ox.el: On my machine > > applying the :filter-final-output functions to the final output > > strings delete their :output-file Text Property. Below is a commented > > somewhat ugly fix just to show what was necessary to make it > > work. Maybe you have a better idea about how to change it. > > `org-html-final-function' strips the text properties. You can modify > it. Or, better, you can add an additional filter to ox-html that will > apply the necessary text properties (to make sure that user filters that > do no care about text properties never interfere). > > -- > Ihor Radchenko // yantar92, > Org mode contributor, > Learn more about Org mode at . > Support Org development at , > or support my work at > --/jKJUrk4TV58OzGX Content-Type: application/gzip Content-Disposition: attachment; filename="ox-html-multipage-patches.tgz" Content-Transfer-Encoding: base64 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 Dy6vmosAYAQA --/jKJUrk4TV58OzGX Content-Type: text/plain; charset=utf-8 Content-Disposition: attachment; filename="ox.el.patch" Content-Transfer-Encoding: quoted-printable *** org-mode/lisp/ox.el 2024-08-05 17:15:57.631928954 +0200 --- org-mode-multipage/lisp/ox.el 2024-08-03 12:57:24.346459632 +0200 *************** *** 215,220 **** --- 215,221 ---- (:filter-latex-fragment . org-export-filter-latex-fragment-functions) (:filter-line-break . org-export-filter-line-break-functions) (:filter-link . org-export-filter-link-functions) + (:multipage-split . org-export-multipage-split-functions) (:filter-node-property . org-export-filter-node-property-functions) (:filter-options . org-export-filter-options-functions) (:filter-paragraph . org-export-filter-paragraph-functions) *************** *** 1883,1891 **** INFO is a plist containing export directives." (let ((type (org-element-type blob))) ;; Return contents only for complete parse trees. ! (if (eq type 'org-data) (lambda (_datum contents _info) contents) ! (let ((transcoder (cdr (assq type (plist-get info :translate-alist)= )))) ! (and (functionp transcoder) transcoder))))) =20 (defun org-export--keep-spaces (data info) "Non-nil, when post-blank spaces after removing DATA should be preserve= d. --- 1884,1894 ---- INFO is a plist containing export directives." (let ((type (org-element-type blob))) ;; Return contents only for complete parse trees. ! (let ((transcoder (cdr (assq type (plist-get info :translate-alist)))= )) ! (cond ! ((functionp transcoder) transcoder) ! ;; Use default org-data transcoder unless specified. ! ((eq type 'org-data) #'org-export-transcode-org-data))))) =20 (defun org-export--keep-spaces (data info) "Non-nil, when post-blank spaces after removing DATA should be preserve= d. *************** *** 1928,1934 **** =20 The `:filter-parse-tree' filters are not applied. =20 ! Return a string." (or (gethash data (plist-get info :exported-data)) ;; Handle broken links according to ;; `org-export-with-broken-links'. --- 1931,1937 ---- =20 The `:filter-parse-tree' filters are not applied. =20 ! Return a string or a list of strings." (or (gethash data (plist-get info :exported-data)) ;; Handle broken links according to ;; `org-export-with-broken-links'. *************** *** 2194,2199 **** --- 2197,2205 ---- as a plist. It must return a string that will be used as the final export output.") =20 + (defvar org-export-multipage-split-functions nil + "List of functions applied when multipage output has to be split.") +=20 =20 ;;;; Elements Filters =20 *************** *** 2537,2542 **** --- 2543,2549 ---- (let (plist) ;; Install user-defined filters with `org-export-filters-alist' ;; and filters already in INFO (through ext-plist mechanism). + (setq tmp-info info) (dolist (p org-export-filters-alist) (let* ((prop (car p)) (info-value (plist-get info prop)) *************** *** 2548,2553 **** --- 2555,2561 ---- (append (if (listp info-value) info-value (list info-value)) default-value))))) + (setq global-prop org-export-filters-alist) ;; Prepend backend specific filters to that list. (dolist (p (org-export-get-all-filters (plist-get info :back-end))) ;; Single values get consed, lists are appended. *************** *** 2967,2973 **** with external parameters overriding Org default settings, but still inferior to file-local settings. =20 ! Return code as a string." (when (symbolp backend) (setq backend (org-export-get-backend backend))) (org-export-barf-if-invalid-backend backend) (org-fold-core-ignore-modifications --- 2975,2983 ---- with external parameters overriding Org default settings, but still inferior to file-local settings. =20 ! Return code as a string or a list of strings. ! The returned strings will have their `org-export-info' property set to ! export information channel." (when (symbolp backend) (setq backend (org-export-get-backend backend))) (org-export-barf-if-invalid-backend backend) (org-fold-core-ignore-modifications *************** *** 3004,3034 **** backend info subtreep visible-only ext-plist)) ;; Eventually transcode TREE. Wrap the resulting string into ;; a template. ! (let* ((body (org-element-normalize-string ! (or (org-export-data (plist-get info :parse-tree) info) ! ""))) ! (inner-template (cdr (assq 'inner-template ! (plist-get info :translate-alist)))) ! (full-body (org-export-filter-apply-functions ! (plist-get info :filter-body) ! (if (not (functionp inner-template)) body ! (funcall inner-template body info)) ! info)) ! (template (cdr (assq 'template ! (plist-get info :translate-alist)))) ! (output ! (if (or (not (functionp template)) body-only) full-body ! (funcall template full-body info)))) ;; Call citation export finalizer. (when (plist-get info :with-cite-processors) ! (setq output (org-cite-finalize-export output info))) ! ;; Remove all text properties since they cannot be ! ;; retrieved from an external process. Finally call ! ;; final-output filter and return result. ! (org-no-properties ! (org-export-filter-apply-functions ! (plist-get info :filter-final-output) ! output info))))))))) =20 (defun org-export--annotate-info (backend info &optional subtreep visible= -only ext-plist) "Annotate the INFO plist according to the BACKEND. --- 3014,3059 ---- backend info subtreep visible-only ext-plist)) ;; Eventually transcode TREE. Wrap the resulting string into ;; a template. ! (let ((output ! (or (org-export-data (plist-get info :parse-tree) info) ! ""))) ! (setq output (ensure-list output)) ;; Call citation export finalizer. (when (plist-get info :with-cite-processors) ! (setq output ! (mapcar ! (lambda (o) (org-cite-finalize-export o info)) ! output))) ! (let ((filters (plist-get info :filter-final-output))) ! ;; Call final-output filter and return result. ! (setq output ! (mapcar ! (lambda (o) (org-export-filter-apply-functions filt= ers o info)) ! output))) ! ;; Apply org-export-info property. ! (setq output ! (mapcar ! (lambda (o) (org-add-props o nil ! :output-file (get-text-property 0 :output-fi= le o) ! 'org-export-info info)) ! output)) ! (if (length=3D output 1) (car output) output)))))))) !=20 ! (defun org-export-transcode-org-data (_ body info) ! "Transcode `org-data' node with BODY. Return transcoded string. ! INFO is the communication channel plist." ! (let* ((inner-template (cdr (assq 'inner-template ! (plist-get info :translate-alist)))) ! (full-body (org-export-filter-apply-functions ! (plist-get info :filter-body) ! (if (not (functionp inner-template)) body ! (funcall inner-template body info)) ! info)) ! (template (cdr (assq 'template ! (plist-get info :translate-alist)))) ! (body-only (memq 'body-only (plist-get info :export-options)))) ! (if (or (not (functionp template)) body-only) full-body ! (funcall template full-body info)))) =20 (defun org-export--annotate-info (backend info &optional subtreep visible= -only ext-plist) "Annotate the INFO plist according to the BACKEND. *************** *** 3107,3120 **** (_ nil))) ;; Install user's and developer's filters. (setq info (org-export-install-filters info)) ;; Call options filters and update export options. We do not ;; use `org-export-filter-apply-functions' here since the ;; arity of such filters is different. (let ((backend-name (org-export-backend-name backend))) (dolist (filter (plist-get info :filter-options)) ! (let ((result (funcall filter info backend-name))) ! (when result (setq info result))))) ;; Parse buffer. (setq tree (org-element-parse-buffer nil visible-only 'defer)) ;; Prune tree from non-exported elements and transform ;; uninterpreted elements or objects in both parse tree and --- 3132,3147 ---- (_ nil))) ;; Install user's and developer's filters. (setq info (org-export-install-filters info)) +=20 ;; Call options filters and update export options. We do not ;; use `org-export-filter-apply-functions' here since the ;; arity of such filters is different. (let ((backend-name (org-export-backend-name backend))) (dolist (filter (plist-get info :filter-options)) ! (let ((result (funcall filter info backend-name))) ! (when result (setq info result))))) ;; Parse buffer. +=20 (setq tree (org-element-parse-buffer nil visible-only 'defer)) ;; Prune tree from non-exported elements and transform ;; uninterpreted elements or objects in both parse tree and *************** *** 3131,3136 **** --- 3158,3166 ---- ;; to communication channel. This is responsible for setting ;; :parse-tree to TREE. (setq info (org-export--collect-tree-properties tree info)) + (when (plist-get info :multipage) + (setq tree (org-export-filter-apply-functions + (plist-get info :multipage-split) tree info))) ;; Process citations and bibliography. Replace each citation ;; and "print_bibliography" keyword in the parse tree with ;; the output of the selected citation export processor. *************** *** 6140,6145 **** --- 6170,6195 ---- ("uk" :html "Автор" :utf-8 "=D0=90=D0= =B2=D1=82=D0=BE=D1=80") ("zh-CN" :html "作者" :utf-8 "=E4=BD=9C=E8=80=85") ("zh-TW" :html "作者" :utf-8 "=E4=BD=9C=E8=80=85")) + ("Chapter %s" + ("ar" :default "=D8=A7=D9=84=D9=81=D8=B5=D9=84 %s") + ("cs" :default "kapitola %s") + ("da" :default "kapitel %s") + ("de" :default "Kapitel %s") + ("es" :ascii "capitulo %s" :html "capítulo %s" :default "cap= =C3=ADtulo %s") + ("et" :html "peatükk %s" :utf-8 "peat=C3=BCkk %s") + ("fa" :default "=D9=81=D8=B5=D9=84 %s") + ("fr" :default "chapitre %s") + ("it" :default "capitolo %s") + ("ja" :default "=E7=AB=A0 %s") + ("nl" :default "hoofdstuk %s" + :html "hoofdstuk %s" :latex "hoofdstuk~%s") + ("pt_BR" :ascii "capitulo %s" :html "capítulo %s" :default "c= ap=C3=ADtulo %s") + ("ro" :default "capitol %s") + ("ru" :html "глава %s" + :utf-8 "=D0=B3=D0=BB=D0=B0=D0=B2=D0=B0 %s") + ("sl" :default "odsek %s") + ("tr" :html "bölüm" :default "b=C3=B6l=C3=BCm %s") + ("zh-CN" :html "章节" :utf-8 "=E7=AB=A0=E8=8A=82 %s")) ("Continued from previous page" ("ar" :default "=D8=AA=D8=AA=D9=85=D8=A9 =D8=A7=D9=84=D8=B5=D9=81=D8= =AD=D8=A9 =D8=A7=D9=84=D8=B3=D8=A7=D8=A8=D9=82=D8=A9") ("cs" :default "Pokra=C4=8Dov=C3=A1n=C3=AD z p=C5=99edchoz=C3=AD str= any") *************** *** 6269,6274 **** --- 6319,6326 ---- ("sv" :default "Illustration") ("tr" :default "=C5=9Eekil") ("zh-CN" :html "图" :utf-8 "=E5=9B=BE")) + ("Fig. %s" + ("de" :default "Abb. %s")) ("Figure %d:" ("ar" :default "=D8=B4=D9=83=D9=84 %d:") ("cs" :default "Obr=C3=A1zek %d:") *************** *** 6436,6441 **** --- 6488,6515 ---- ("sl" :default "Reference") ("sv" :default "Referenser") ("tr" :default "Referanslar")) + ("Section %s" + ("ar" :default "=D8=A7=D9=86=D8=B8=D8=B1 =D9=82=D8=B3=D9=85 %s") + ("cs" :default "sekce %s") + ("da" :default "afsnit %s") + ("de" :default "Abschnitt %s") + ("es" :ascii "seccion %s" :html "sección %s" :default "secci= =C3=B3n %s") + ("et" :html "peatükki %s" :utf-8 "peat=C3=BCkki %s") + ;; ("fa" :default "=D9=86=D9=85=D8=A7=DB=8C=D8=B4 =D8=A8=D8= =AE=D8=B4 %s") + ("fr" :default "section %s") + ("it" :default "sezione %s") + ;; ("ja" :default "=E3=82=BB=E3=82=AF=E3=82=B7=E3=83=A7=E3= =83=B3 %s =E3=82=92=E5=8F=82=E7=85=A7") + ("nl" :default "sectie %s" + :html "sectie %s" :latex "sectie~%s") + ("pt_BR" :html "seção %s" :default "se=C3=A7=C3=A3o %s" + :ascii "secao %s") + ("ro" :default "sec=C8=9Biunea %s") + ("ru" :html "&раздел %s" + :utf-8 "=D1=80=D0=B0=D0=B7=D0=B4=D0=B5=D0=BB %s") + ("sl" :default "poglavje %d") + ("tr" :default "b=C3=B6l=C3=BCm %s") + ;; ("zh-CN" :html "参见第%s节" :utf= -8 "=E5=8F=82=E8=A7=81=E7=AC=AC%s=E8=8A=82") + ) ("See figure %s" ("cs" :default "Viz obr=C3=A1zek %s") ("et" :default "Vaata joonist %s") *************** *** 6813,6818 **** --- 6887,6918 ---- (switch-to-buffer-other-window buffer)) buffer))) =20 + (defun org-export--write-output (output encoding) + "Write OUTPUT to file with ENCODING. + OUTPUT may be a string or a list of strings. + The target file is retrieved from :output-file OUTPUT property or + :output-file property in plist stored in `org-export-info' property of + each string. +=20 + Return the file name or a list of file names." + (if (listp output) (mapcar #'org-export--write-output output) + (setq tmp-debug output) + (let ((file (or + (get-text-property 0 :output-file output) + (plist-get + (get-text-property 0 'org-export-info output) + :output-file)))) + (with-temp-buffer + (insert output) + ;; Ensure final newline. This is what was done + ;; historically, when we used `write-file'. + ;; Note that adding a newline is only safe for + ;; non-binary data. + (unless (bolp) (insert "\n")) + (let ((coding-system-for-write encoding)) + (write-region nil nil file)) + file)))) +=20 ;;;###autoload (defun org-export-to-file (backend file &optional async subtreep visible-only body-only ext-pli= st *************** *** 6861,6893 **** `(let ((output (org-export-as ',backend ,subtreep ,visible-only ,body-only ! ',ext-plist))) ! (with-temp-buffer ! (insert output) ! ;; Ensure final newline. This is what was done ! ;; historically, when we used `write-file'. ! ;; Note that adding a newline is only safe for ! ;; non-binary data. ! (unless (bolp) (insert "\n")) ! (let ((coding-system-for-write ',encoding)) ! (write-region nil nil ,file))) ! (or (ignore-errors (funcall ',post-process ,file)) ,file))) (let ((output (org-export-as ! backend subtreep visible-only body-only ext-plist)= )) ! (with-temp-buffer ! (insert output) ! ;; Ensure final newline. This is what was done ! ;; historically, when we used `write-file'. ! ;; Note that adding a newline is only safe for ! ;; non-binary data. ! (unless (bolp) (insert "\n")) ! (let ((coding-system-for-write encoding)) ! (write-region nil nil file))) (when (and (org-export--copy-to-kill-ring-p) (org-string-nw-p o= utput)) (org-kill-new output)) ;; Get proper return value. ! (or (and (functionp post-process) (funcall post-process file)) ! file)))))) =20 (defun org-export-output-file-name (extension &optional subtreep pub-dir) "Return output file's name according to buffer specifications. --- 6961,6983 ---- `(let ((output (org-export-as ',backend ,subtreep ,visible-only ,body-only ! ',ext-plist)) ! file) ! (setq file (org-export--write-output output ',encoding)) ! (let ((post (lambda (f) (or (ignore-errors (funcall ',post= -process f)) f)))) ! (if (listp file) (mapcar post file) (funcall post file))= ))) (let ((output (org-export-as ! backend subtreep visible-only body-only ext-plist)) ! file) ! (setq file (org-export--write-output output encoding)) (when (and (org-export--copy-to-kill-ring-p) (org-string-nw-p o= utput)) (org-kill-new output)) ;; Get proper return value. ! (let ((post (lambda (f) ! (or (and (functionp post-process) ! (funcall post-process f)) ! f)))) ! (if (listp file) (mapcar post file) (funcall post file)))))))) =20 (defun org-export-output-file-name (extension &optional subtreep pub-dir) "Return output file's name according to buffer specifications. --/jKJUrk4TV58OzGX Content-Type: text/plain; charset=utf-8 Content-Disposition: attachment; filename="ox-html.el.patch" *** org-mode/lisp/ox-html.el 2024-08-05 17:15:57.628595589 +0200 --- org-mode-multipage/lisp/ox-html.el 2024-08-05 17:11:54.979585435 +0200 *************** *** 4,9 **** --- 4,11 ---- ;; Author: Carsten Dominik ;; Jambunathan K + ;; multipage export by Orm Finnendahl + ;; ;; Maintainer: TEC ;; Keywords: outlines, hypermedia, calendar, text *************** *** 82,88 **** --- 84,94 ---- (latex-fragment . org-html-latex-fragment) (line-break . org-html-line-break) (link . org-html-link) + (multipage-inner-template . org-html-multipage-inner-template) + (multipage-template . org-html-multipage-template) (node-property . org-html-node-property) + (org-data . org-html-transcode-org-data) + ;;; (org-page . org-html-transcode-org-page) (paragraph . org-html-paragraph) (plain-list . org-html-plain-list) (plain-text . org-html-plain-text) *************** *** 108,118 **** --- 114,126 ---- (verse-block . org-html-verse-block)) :filters-alist '((:filter-options . org-html-infojs-install-script) (:filter-parse-tree . org-html-image-link-filter) + (:multipage-split . org-html-multipage-split) (:filter-final-output . org-html-final-function)) :menu-entry '(?h "Export to HTML" ((?H "As HTML buffer" org-html-export-as-html) (?h "As HTML file" org-html-export-to-html) + (?m "As HTML Multipage files" org-html-export-to-multipage) (?o "As HTML file and open" (lambda (a s v b) (if a (org-html-export-to-html t s v b) *************** *** 134,141 **** (:html-head "HTML_HEAD" nil org-html-head newline) (:html-head-extra "HTML_HEAD_EXTRA" nil org-html-head-extra newline) (:subtitle "SUBTITLE" nil nil parse) ! (:html-head-include-default-style ! nil "html-style" org-html-head-include-default-style) (:html-head-include-scripts nil "html-scripts" org-html-head-include-scripts) (:html-allow-name-attribute-in-anchors nil nil org-html-allow-name-attribute-in-anchors) --- 142,148 ---- (:html-head "HTML_HEAD" nil org-html-head newline) (:html-head-extra "HTML_HEAD_EXTRA" nil org-html-head-extra newline) (:subtitle "SUBTITLE" nil nil parse) ! (:html-head-include-default-style nil "html-style" org-html-head-include-default-style) (:html-head-include-scripts nil "html-scripts" org-html-head-include-scripts) (:html-allow-name-attribute-in-anchors nil nil org-html-allow-name-attribute-in-anchors) *************** *** 158,163 **** --- 165,190 ---- (:html-mathjax-options nil nil org-html-mathjax-options) (:html-mathjax-template nil nil org-html-mathjax-template) (:html-metadata-timestamp-format nil nil org-html-metadata-timestamp-format) + (:html-multipage-clear-export-directory nil "html-multipage-clear-export-directory" + org-html-multipage-clear-export-directory) + (:html-multipage-export-directory + nil "html-multipage-export-directory" org-html-multipage-export-directory) + (:html-multipage-head-include-default-style + nil "html-multipage-include-default-style" org-html-multipage-head-include-default-style) + (:html-multipage-join-empty-bodies + nil "html-multipage-join-empty-bodies" org-html-multipage-join-empty-bodies) + (:html-multipage-nav-format nil nil org-html-multipage-nav-format) + (:html-multipage-numbered-filenames nil "html-multipage-numbered-filenames" + org-html-multipage-numbered-filenames) + (:html-multipage-open nil "html-multipage-open" org-html-multipage-open) + (:html-multipage-postamble-position + nil "html-multipage-postamble-position" org-html-multipage-postamble-position) + (:html-multipage-preamble-position + nil "html-multipage-preamble-position" org-html-multipage-preamble-position) + (:html-multipage-split-hooks nil nil org-html-multipage-split-hooks) + (:html-multipage-split-level nil "html-multipage-split-level" org-html-multipage-split-level) + (:html-multipage-toc-to-top nil "html-multipage-toc-to-top" org-html-multipage-toc-to-top) + (:html-numbered-link-format nil nil org-html-numbered-link-format) (:html-postamble-format nil nil org-html-postamble-format) (:html-preamble-format nil nil org-html-preamble-format) (:html-prefer-user-labels nil nil org-html-prefer-user-labels) *************** *** 171,179 **** nil nil org-html-table-use-header-tags-for-first-column) (:html-tag-class-prefix nil nil org-html-tag-class-prefix) (:html-text-markup-alist nil nil org-html-text-markup-alist) (:html-todo-kwd-class-prefix nil nil org-html-todo-kwd-class-prefix) (:html-toplevel-hlevel nil nil org-html-toplevel-hlevel) ! (:html-use-infojs nil nil org-html-use-infojs) (:html-validation-link nil nil org-html-validation-link) (:html-viewport nil nil org-html-viewport) (:html-inline-images nil nil org-html-inline-images) --- 198,207 ---- nil nil org-html-table-use-header-tags-for-first-column) (:html-tag-class-prefix nil nil org-html-tag-class-prefix) (:html-text-markup-alist nil nil org-html-text-markup-alist) + (:html-toc-title nil "html-toc-title" org-html-toc-title) (:html-todo-kwd-class-prefix nil nil org-html-todo-kwd-class-prefix) (:html-toplevel-hlevel nil nil org-html-toplevel-hlevel) ! (:html-use-infojs nil nil org-export-html-use-infojs) (:html-validation-link nil nil org-html-validation-link) (:html-viewport nil nil org-html-viewport) (:html-inline-images nil nil org-html-inline-images) *************** *** 186,191 **** --- 214,221 ---- (:html-klipse-css nil nil org-html-klipse-css) (:html-klipse-js nil nil org-html-klipse-js) (:html-klipse-selection-script nil nil org-html-klipse-selection-script) + ;;; (:multipage-split nil nil org-html-multipage-split) + ;;; (:multipage nil nil org-html-multipage) (:infojs-opt "INFOJS_OPT" nil nil) ;; Redefine regular options. (:creator "CREATOR" nil org-html-creator-string) *************** *** 462,467 **** --- 492,720 ---- :package-version '(Org . "9.5") :type 'string) + (defcustom org-html-multipage-style-default + "" + "The default style specification for exported HTML files. + You can use `org-html-head' and `org-html-head-extra' to add to + this style. If you don't want to include this default style, + customize `org-html-head-include-default-style'." + :group 'org-export-html + :package-version '(Org . "9.8") + :type 'string) ;;; User Configuration Variables *************** *** 486,492 **** (home LINK_HOME :html-link-home)) "JavaScript options, long form for script, default values.") ! (defcustom org-html-use-infojs 'when-configured "Non-nil when Sebastian Rose's Java Script org-info.js should be active. This option can be nil or t to never or always use the script. It can also be the symbol `when-configured', meaning that the --- 739,745 ---- (home LINK_HOME :html-link-home)) "JavaScript options, long form for script, default values.") ! (defcustom org-export-html-use-infojs 'when-configured "Non-nil when Sebastian Rose's Java Script org-info.js should be active. This option can be nil or t to never or always use the script. It can also be the symbol `when-configured', meaning that the *************** *** 501,506 **** --- 754,766 ---- (const :tag "When configured in buffer" when-configured) (const :tag "Always" t))) + ;; (defcustom org-html-multipage nil + ;; "Boolean indicating multipage export." + ;; :group 'org-export-html + ;; :version "29.4" + ;; :package-version '(Org . "9.8") + ;; :type 'boolean) + (defcustom org-html-infojs-options (mapcar (lambda (x) (cons (car x) (nth 2 x))) org-html-infojs-opts-table) "Options settings for the INFOJS JavaScript. *************** *** 849,854 **** --- 1109,1129 ---- :group 'org-export-html :type 'boolean) + (defcustom org-html-numbered-link-format + '("Chapter %s" + "Section %s" + "Fig. %s") + "Format for the labels of numbered links. + + The first string is used for links to Chapters, the second for + links to Sections and the third for links to Figures. %s will be + replaced by the number of the reference. The strings get + translated using org-html--translate." + :group 'org-export-html + :version "29.4" + :package-version '(Org . "9.8") + :type 'list) + ;;;; Links :: Inline images (defcustom org-html-inline-images t *************** *** 1384,1389 **** --- 1659,1673 ---- (list (string :tag "Language") (string :tag "Format string")))) + (defcustom org-html-toc-title "Table of Contents" + "The string tp be used for the title of the table of contents. It + will be passed to org-html-translate." + :group 'org-export-html + :package-version '(Org . "9.8") + :version "29.4" + :type 'string + :safe #'stringp) + (defcustom org-html-validation-link "Validate" "Link to HTML validation service." *************** *** 1522,1529 **** --- 1806,1954 ---- :version "24.4" :package-version '(Org . "8.0") :type 'boolean) + + (defcustom org-html-multipage-clear-export-directory t + "Boolean. If non-nil remove all .html files from the export + directory before exporting." + :group 'org-export-html + :version "29.4" + :package-version '(Org . "9.8") + :type 'boolean) + + (defcustom org-html-multipage-export-directory "html" + "The default directory for exported HTML files." + :group 'org-export-html + :version "29.4" + :package-version '(Org . "9.8") + :type 'string) + + (defcustom org-html-multipage-head-include-default-style t + "Non-nil means include the default style in exported HTML files. + The actual style is defined in `org-html-style-default' and + should not be modified. Use `org-html-head' to use your own + style information." + :group 'org-export-html + :version "29.4" + :package-version '(Org . "9.8") + :type 'boolean) + + (defcustom org-html-multipage-join-empty-bodies t + "Recursively join subheadlines, if a headline doesn't contain any + text before its Subheadline. + + Example: + + * Headline 1 + ** Subheadline 1.1 + *** Subsubheadline 1.1.1 + Text of Subsubheadline 1.1.1 + + will be put on the same HTML page if this option is set, + otherwise Headline 1 And Subheadline 1.1 will be put on a + separate HTML page with empty content. + " + :group 'org-export-html + :version "29.4" + :package-version '(Org . "9.8") + :type 'boolean) + + (defcustom org-html-multipage-nav-format + '("
%s
" + "Next: %s , " + "Previous: %s , " + "Up: %s , " + "Home: %s ") + "Snippets used to insert the NEXT, PREV, HOME and UP links in + multipage output. The list contains format strings for the HTML + div and the navigation elements. The %s in the HTML div will + receive a concatenated string of the navigation elements. The + first %s in the navigation elements will receive the link, + the second the title" + :group 'org-export-html + :version "29.4" + :package-version '(Org . "9.8") + :type 'list) + + (defcustom org-html-multipage-numbered-filenames t + "Boolean indicating whether filenames in multipage export should + get their headline-numbering prepended. Note: This option is + independent of the num: option and the backend guarantees that + filenames are unique in any case." + :group 'org-export-html + :version "29.4" + :package-version '(Org . "9.8") + :type 'boolean) + + (defcustom org-html-multipage-open 'nil + "If and where to open the top page of the multipage html after + export." + :group 'org-export-html + :version "29.4" + :package-version '(Org . "9.8") + :type '(choice (const browser) (const buffer) (const nil))) + + (defcustom org-html-multipage-postamble-position 'bottom + "The position of the postamble in the html output. + + bottom - at the bottom of the page, directly before + + text-content - at the bottom of the text-content. + " + :group 'org-export-html + :version "29.4" + :package-version '(Org . "9.8") + :type '(choice (const bottom) (const text-content))) + + (defcustom org-html-multipage-preamble-position 'top + "If and where to open the top page of the multipage html after + export. + + top - at the top of the page, directly after + + text-content - at the top of the text-content. + + " + :group 'org-export-html + :version "29.4" + :package-version '(Org . "9.8") + :type '(choice (const top) (const text-content))) + + (defcustom org-html-multipage-split-hooks nil + "list of additional custom functions to be called during the + export after multipage splitting has taken place and before + transcoding with info as input. + " + :group 'org-export-html + :version "29.4" + :package-version '(Org . "9.8") + :type 'list) + + (defcustom org-html-multipage-split-level 'toc + "How to split the ORG file into multiple HTML pages. + + toc - split each entry of the toc into a separate page. + + number - a number indicating the maximum headline-level for + splitting. + " + :group 'org-export-html + :version "29.4" + :package-version '(Org . "9.8") + :type '(choice (const toc) (number :tag "Headline Level" 3))) + + (defcustom org-html-multipage-toc-to-top t + "If t links in the TOC will always point to the top of the page, + otherwise it will link directly to the referenced headline + element." + :group 'org-export-html + :version "29.4" + :package-version '(Org . "9.8") + :type 'boolean) + ;;;###autoload (put 'org-html-head-include-default-style 'safe-local-variable 'booleanp) + (put 'org-html-multipage-head-include-default-style 'safe-local-variable 'booleanp) + (put 'org-html-multipage-join-empty-bodies 'safe-local-variable 'booleanp) (defcustom org-html-head "" "Org-wide head definitions for exported HTML files. *************** *** 1873,1890 **** (defun org-html-footnote-section (info) "Format the footnote section. INFO is a plist used as a communication channel." ! (pcase (org-export-collect-footnote-definitions info) (`nil nil) (definitions - (format - (plist-get info :html-footnotes-section) - (org-html--translate "Footnotes" info) (format ! "\n%s\n" ! (mapconcat ! (lambda (definition) ! (pcase definition ! (`(,n ,label ,def) ;; Do not assign number labels as they appear in Org mode ;; - the footnotes are re-numbered by ;; `org-export-get-footnote-number'. If the label is not --- 2298,2315 ---- (defun org-html-footnote-section (info) "Format the footnote section. INFO is a plist used as a communication channel." ! (pcase (org-export-collect-footnote-definitions info (plist-get info :tl-headline)) (`nil nil) (definitions (format ! (plist-get info :html-footnotes-section) ! (org-html--translate "Footnotes" info) ! (format ! "\n%s\n" ! (mapconcat ! (lambda (definition) ! (pcase definition ! (`(,n ,label ,def) ;; Do not assign number labels as they appear in Org mode ;; - the footnotes are re-numbered by ;; `org-export-get-footnote-number'. If the label is not *************** *** 1911,1918 **** (if (not inline?) contents (format "

%s

" contents)))))))) ! definitions ! "\n")))))) ;;; Template --- 2336,2343 ---- (if (not inline?) contents (format "

%s

" contents)))))))) ! definitions ! "\n")))))) ;;; Template *************** *** 2018,2025 **** INFO is a plist used as a communication channel." (org-element-normalize-string (concat ! (when (plist-get info :html-head-include-default-style) ! (org-element-normalize-string org-html-style-default)) (org-html-normalize-string-or-function (plist-get info :html-head) info) (org-html-normalize-string-or-function (plist-get info :html-head-extra) info) --- 2443,2453 ---- INFO is a plist used as a communication channel." (org-element-normalize-string (concat ! (if (plist-get info :multipage) ! (when (plist-get info :html-multipage-head-include-default-style) ! (org-element-normalize-string org-html-multipage-style-default)) ! (when (plist-get info :html-head-include-default-style) ! (org-element-normalize-string org-html-style-default))) (org-html-normalize-string-or-function (plist-get info :html-head) info) (org-html-normalize-string-or-function (plist-get info :html-head-extra) info) *************** *** 2206,2212 **** holding export options." (concat ;; Table of contents. ! (let ((depth (plist-get info :with-toc))) (when depth (org-html-toc depth info))) ;; Document contents. contents --- 2634,2644 ---- holding export options." (concat ;; Table of contents. ! (let* ((with-toc (plist-get info :with-toc)) ! (depth (if with-toc ! (if (numberp with-toc) ! with-toc ! (plist-get info :headline-levels))))) (when depth (org-html-toc depth info))) ;; Document contents. contents *************** *** 2477,2484 **** of contents as a string, or nil if it is empty." (let ((toc-entries (mapcar (lambda (headline) ! (cons (org-html--format-toc-headline headline info) ! (org-export-get-relative-level headline info))) (org-export-collect-headlines info depth scope)))) (when toc-entries (let* ((toc-id-counter (plist-get info :org-html--toc-counter)) --- 2909,2918 ---- of contents as a string, or nil if it is empty." (let ((toc-entries (mapcar (lambda (headline) ! (cl-list* ! (org-html--format-toc-headline headline info) ! nil ;;; no hidden attribute ! (org-export-get-relative-level headline info))) (org-export-collect-headlines info depth scope)))) (when toc-entries (let* ((toc-id-counter (plist-get info :org-html--toc-counter)) *************** *** 2497,2503 **** (let ((top-level (plist-get info :html-toplevel-hlevel))) (format "%s\n" top-level ! (org-html--translate "Table of Contents" info) top-level)) toc (format "\n" outer-tag)))))))) --- 2931,2940 ---- (let ((top-level (plist-get info :html-toplevel-hlevel))) (format "%s\n" top-level ! (org-html--translate ! (or (plist-get info :html-toc-title) ! org-html-toc-title) ! info) top-level)) toc (format "\n" outer-tag)))))))) *************** *** 2505,2527 **** (defun org-html--toc-text (toc-entries) "Return innards of a table of contents, as a string. TOC-ENTRIES is an alist where key is an entry title, as a string, ! and value is its relative level, as an integer." ! (let* ((prev-level (1- (cdar toc-entries))) (start-level prev-level)) (concat (mapconcat (lambda (entry) (let ((headline (car entry)) ! (level (cdr entry))) (concat ! (let* ((cnt (- level prev-level)) ! (times (if (> cnt 0) (1- cnt) (- cnt)))) ! (setq prev-level level) ! (concat ! (org-html--make-string ! times (cond ((> cnt 0) "\n
    \n
  • ") ! ((< cnt 0) "
  • \n
\n"))) ! (if (> cnt 0) "\n
    \n
  • " "
  • \n
  • "))) headline))) toc-entries "") (org-html--make-string (- prev-level start-level) "
  • \n
\n")))) --- 2942,2974 ---- (defun org-html--toc-text (toc-entries) "Return innards of a table of contents, as a string. TOC-ENTRIES is an alist where key is an entry title, as a string, ! second element a flag whether the entry gets a ! class=\"toc-hidden\" attribute and the third element is its ! relative level, as an integer." ! (let* ((prev-level (1- (cddar toc-entries))) (start-level prev-level)) (concat (mapconcat (lambda (entry) (let ((headline (car entry)) ! (hidden (cadr entry)) ! (level (cddr entry))) (concat ! (format ! (let* ((cnt (- level prev-level)) ! (times (if (> cnt 0) (1- cnt) (- cnt)))) ! (setq prev-level level) ! (concat ! (org-html--make-string ! times (cond ((> cnt 0) (format "\n
    \n
  • " level)) ! ((< cnt 0) "
  • \n
\n"))) ! (if (> cnt 0) ! (concat "\n\n") ! "\n"))) ! (if hidden (format " class=\"toc-hidden toc-level-%d\"" level) ! (format " class=\"toc-level-%d\"" level))) headline))) toc-entries "") (org-html--make-string (- prev-level start-level) "\n\n")))) *************** *** 2572,2578 **** (org-html--translate "Listing %d:" info)))) (mapconcat (lambda (entry) ! (let ((label (org-html--reference entry info t)) (title (org-trim (org-export-data (or (org-export-get-caption entry t) --- 3019,3025 ---- (org-html--translate "Listing %d:" info)))) (mapconcat (lambda (entry) ! (let ((label (org-html--full-reference entry info t)) (title (org-trim (org-export-data (or (org-export-get-caption entry t) *************** *** 2610,2616 **** (org-html--translate "Table %d:" info)))) (mapconcat (lambda (entry) ! (let ((label (org-html--reference entry info t)) (title (org-trim (org-export-data (or (org-export-get-caption entry t) --- 3057,3063 ---- (org-html--translate "Table %d:" info)))) (mapconcat (lambda (entry) ! (let ((label (org-html--full-reference entry info t)) (title (org-trim (org-export-data (or (org-export-get-caption entry t) *************** *** 2759,2765 **** (let ((prev (org-export-get-previous-element footnote-reference info))) (when (org-element-type-p prev 'footnote-reference) (plist-get info :html-footnote-separator))) ! (let* ((n (org-export-get-footnote-number footnote-reference info)) (label (org-element-property :label footnote-reference)) ;; Do not assign number labels as they appear in Org mode - ;; the footnotes are re-numbered by --- 3206,3215 ---- (let ((prev (org-export-get-previous-element footnote-reference info))) (when (org-element-type-p prev 'footnote-reference) (plist-get info :html-footnote-separator))) ! (let* ((n (org-export-get-footnote-number ! footnote-reference info ! (if (plist-get info :multipage) ! (org-html-get-multipage-tl-headline footnote-reference info)))) (label (org-element-property :label footnote-reference)) ;; Do not assign number labels as they appear in Org mode - ;; the footnotes are re-numbered by *************** *** 2795,2801 **** CONTENTS holds the contents of the headline. INFO is a plist holding contextual information." (unless (org-element-property :footnote-section-p headline) ! (let* ((numberedp (org-export-numbered-headline-p headline info)) (numbers (org-export-get-headline-number headline info)) (level (+ (org-export-get-relative-level headline info) (1- (plist-get info :html-toplevel-hlevel)))) --- 3245,3253 ---- CONTENTS holds the contents of the headline. INFO is a plist holding contextual information." (unless (org-element-property :footnote-section-p headline) ! (let* ((numberedp (if (plist-get info :multipage) ! (plist-get info :section-numbers) ! (org-export-numbered-headline-p headline info))) (numbers (org-export-get-headline-number headline info)) (level (+ (org-export-get-relative-level headline info) (1- (plist-get info :html-toplevel-hlevel)))) *************** *** 3023,3028 **** --- 3475,3481 ---- ((string= key "HTML") value) ((string= key "TOC") (let ((case-fold-search t)) + (setq global-key keyword) (cond ((string-match "\\" value) (let ((depth (and (string-match "\\<[0-9]+\\>" value) *************** *** 3033,3039 **** (org-export-resolve-link (org-strip-quotes (match-string 1 value)) info)) ((string-match-p "\\" value) keyword)))) ;local ! (org-html-toc depth info scope))) ((string= "listings" value) (org-html-list-of-listings info)) ((string= "tables" value) (org-html-list-of-tables info)))))))) --- 3486,3496 ---- (org-export-resolve-link (org-strip-quotes (match-string 1 value)) info)) ((string-match-p "\\" value) keyword)))) ;local ! (if (plist-get info :multipage) ! (progn ! (setq global-key keyword) ! (org-html-multipage-toc depth (cl-list* :full-toc t info) scope)) ! (org-html-toc depth info scope)))) ((string= "listings" value) (org-html-list-of-listings info)) ((string= "tables" value) (org-html-list-of-tables info)))))))) *************** *** 3187,3193 **** (defun org-html-image-link-filter (data _backend info) "Process image links that are inside descriptions. ! DATA is the parse tree. INFO is and info plist. See `org-export-insert-image-links' for more details." (org-export-insert-image-links data info org-html-inline-image-rules)) --- 3644,3650 ---- (defun org-html-image-link-filter (data _backend info) "Process image links that are inside descriptions. ! DATA is the parse tree. INFO is an info plist. See `org-export-insert-image-links' for more details." (org-export-insert-image-links data info org-html-inline-image-rules)) *************** *** 3367,3389 **** (org-element-property :raw-link link) info)))) ;; Link points to a headline. (`headline ! (let ((href (org-html--reference destination info)) ;; What description to use? (desc ;; Case 1: Headline is numbered and LINK has no ;; description. Display section number. (if (and (org-export-numbered-headline-p destination info) (not desc)) ! (mapconcat #'number-to-string ! (org-export-get-headline-number ! destination info) ".") ;; Case 2: Either the headline is un-numbered or ;; LINK has a custom description. Display LINK's ;; description or headline's title. (or desc (org-export-data (org-element-property :title destination) info))))) ! (format "%s" href attributes desc))) ;; Fuzzy link points to a target or an element. (_ (if (and destination --- 3824,3860 ---- (org-element-property :raw-link link) info)))) ;; Link points to a headline. (`headline ! (let ((href ! (org-html--full-reference ! (if (plist-get info :multipage) ! (alist-get destination ! (plist-get info :stripped-hl-to-parse-tree-hl)) ! destination) ! info)) ;; What description to use? (desc ;; Case 1: Headline is numbered and LINK has no ;; description. Display section number. (if (and (org-export-numbered-headline-p destination info) (not desc)) ! (let ((headline-number (org-export-get-headline-number ! destination info))) ! (if (> (length headline-number) 1) ! (format ! (org-html--translate (nth 1 org-html-numbered-link-format) info) ! (mapconcat #'number-to-string ! headline-number ".")) ! (format ! (org-html--translate (nth 0 org-html-numbered-link-format) info) ! (mapconcat #'number-to-string ! headline-number ".")))) ;; Case 2: Either the headline is un-numbered or ;; LINK has a custom description. Display LINK's ;; description or headline's title. (or desc (org-export-data (org-element-property :title destination) info))))) ! (format "%s" href attributes desc))) ;; Fuzzy link points to a target or an element. (_ (if (and destination *************** *** 3394,3422 **** ;; environment. Use "ref" or "eqref" macro, depending on user ;; preference to refer to those in the document. (format (plist-get info :html-equation-reference-format) ! (org-html--reference destination info)) ! (let* ((ref (org-html--reference destination info)) (org-html-standalone-image-predicate #'org-html--has-caption-p) (counter-predicate (if (org-element-type-p destination 'latex-environment) #'org-html--math-environment-p #'org-html--has-caption-p)) ! (number (cond (desc nil) ((org-html-standalone-image-p destination info) ! (org-export-get-ordinal ! (org-element-map destination 'link #'identity info t) ! info '(link) 'org-html-standalone-image-p)) (t (org-export-get-ordinal destination info nil counter-predicate)))) (desc (cond (desc) ! ((not number) "No description for this link") ! ((numberp number) (number-to-string number)) (t (mapconcat #'number-to-string number "."))))) ! (format "%s" ref attributes desc))))))) ;; Coderef: replace link with the reference name or the ;; equivalent line number. ((string= type "coderef") --- 3865,3895 ---- ;; environment. Use "ref" or "eqref" macro, depending on user ;; preference to refer to those in the document. (format (plist-get info :html-equation-reference-format) ! (org-html--full-reference destination info)) ! (let* ((ref (org-html--full-reference destination info)) (org-html-standalone-image-predicate #'org-html--has-caption-p) (counter-predicate (if (org-element-type-p destination 'latex-environment) #'org-html--math-environment-p #'org-html--has-caption-p)) ! (numbered-ref (cond (desc nil) ((org-html-standalone-image-p destination info) ! (format (org-html--translate (nth 2 org-html-numbered-link-format) info) ! (org-export-get-ordinal ! (org-element-map destination 'link #'identity info t) ! info '(link) 'org-html-standalone-image-p))) (t (org-export-get-ordinal destination info nil counter-predicate)))) (desc (cond (desc) ! ((not numbered-ref) "No description for this link") ! ((numberp numbered-ref) (number-to-string number)) ! ((stringp numbered-ref) numbered-ref) (t (mapconcat #'number-to-string number "."))))) ! (format "%s" ref attributes desc))))))) ;; Coderef: replace link with the reference name or the ;; equivalent line number. ((string= type "coderef") *************** *** 3924,3930 **** "Transcode a TARGET object from Org to HTML. CONTENTS is nil. INFO is a plist holding contextual information." ! (let ((ref (org-html--reference target info))) (org-html--anchor ref nil nil info))) ;;;; Timestamp --- 4397,4403 ---- "Transcode a TARGET object from Org to HTML. CONTENTS is nil. INFO is a plist holding contextual information." ! (let ((ref (org-html--full-reference target info))) (org-html--anchor ref nil nil info))) ;;;; Timestamp *************** *** 3984,3990 **** (delay-mode-hooks (set-auto-mode t)) (when (plist-get info :html-indent) (indent-region (point-min) (point-max))) ! (buffer-substring-no-properties (point-min) (point-max)))) ;;; End-user functions --- 4457,4470 ---- (delay-mode-hooks (set-auto-mode t)) (when (plist-get info :html-indent) (indent-region (point-min) (point-max))) ! (if (plist-get info :multipage) ! (let ((output-file (get-text-property ! 0 :output-file ! (buffer-substring (point-min) (point-max))))) ! (put-text-property ! 0 1 :output-file output-file ! (buffer-substring-no-properties (point-min) (point-max)))) ! (buffer-substring-no-properties (point-min) (point-max))))) ;;; End-user functions *************** *** 4092,4097 **** --- 4572,5482 ---- "html")) plist pub-dir)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;;; + ;;; Code specific to the multipage backend + ;;; + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + (defun org-html-reverse-assoc-list (assoc-list) + (mapcar (lambda (entry) (cons (cdr entry) (car entry))) assoc-list)) + + (defun org-html-element-title (element) + (org-element-property :raw-value element)) + + (defun org-html-increment-string-idx (string) + (if (string-match "\\([0-9]+\\)$" string) + (replace-match (format "%s" (1+ (read (match-string 0 string)))) nil nil string) + (format "%s-1" string))) + + (defun org-html-unique-filename (string filenames) + "return a unique filename by appending - to the string with + starting from 1 and incrementing until the string is + unique in filenames." + (if (member string filenames) + (org-html-unique-filename + (org-html-increment-string-idx string) filenames) + string)) + + (defun org-html-replace-chars-with-dash (chars string) + (cl-reduce (lambda (accum x) (replace-regexp-in-string (format "%s+" x) "-" accum)) + chars + :initial-value string)) + + (defun org-html-remove-chars (chars string) + (cl-reduce (lambda (accum x) (replace-regexp-in-string (format "%s+" x) "" accum)) + chars + :initial-value string)) + + (defun org-html-string-to-filename (string) + (replace-regexp-in-string + "-+" "-" + (org-html-remove-chars + '("(" ")" "*" "," ";" "{" "}" "'" "\\" "?") + (org-html-replace-chars-with-dash + '(" " "_" ":" "/") + (replace-regexp-in-string + "\\\\ast{}" "*" + (downcase (string-trim string))))))) + + (defun org-html-string-prepend-section-numbering (string levels maxlevel) + "Prepend the chapter outline numbers given in levels to + string. Truncate levels to maxlevel or pad with zeroes if + required." + (cl-loop + for i from (1- maxlevel) downto 0 + with result = string + do (setq result (format "%02d_%s" (or (nth i levels) 0) result)) + finally (return result))) + + (defun org-html--get-multipage-page-url (element info) + "Return the url of the page containing ELEMENT." + (alist-get + (org-html-get-multipage-tl-headline element info) + (plist-get info :tl-url-lookup))) + + (defun org-html--full-reference (destination info &optional page-only) + "Return an appropriate reference for DESTINATION. Like + org-html--reference, but generating an extended cross-page + reference for multipage. + + DESTINATION is an element or a `target' type object. INFO is the + current export state, as a plist. + + When PAGE-ONLY is non-nil just return the page reference." + (if (plist-get info :multipage) + (concat (org-html--get-multipage-page-url destination info) + (if page-only "" + (format "#%s" (org-export-get-reference destination info)))) + (format "#%s" (org-export-get-reference destination info)))) + + (defun org-html-multipage-toc (depth info &optional scope) + "Build a table of contents for a page in multipage + export. `:tl-headline-number' and `:tl-headline' refer to the + current page and have to be supplied in INFO. + + DEPTH is an integer specifying the depth of the table. INFO is a + plist used as a communication channel. Optional argument SCOPE + is an element defining the scope of the table. Return the table + of contents as a string, or nil if it is empty." + (let* ((tl-headline-number (plist-get info :tl-headline-number)) + (tl-headline (unless (plist-get info :full-toc) (plist-get info :tl-headline))) + (curr-number-ref tl-headline-number) + (toc-entries + (cl-loop + for (entry . props) in (plist-get info :multipage-toc-lookup) + if (<= (length (plist-get props :toc-hl-number)) depth) + collect (let* ((tl-hl (plist-get props :tl-hl)) + (page-headline-number (plist-get props :page-hl-number))) + (if (eq tl-hl tl-headline) + (setf curr-number-ref page-headline-number)) + (cl-list* + (org-html--format-mp-toc-headline + (plist-get props :href) + (plist-get props :toc-body) + (equal (plist-get props :tl-hl) tl-headline) + (plist-get info :full-toc)) + (unless (plist-get info :full-toc) + (org-html--hidden-in-toc? page-headline-number + curr-number-ref)) + (plist-get props :relative-level)))))) + (when toc-entries + (let ((toc (concat "
" + (org-html--toc-text toc-entries) + "
\n"))) + (if scope toc + (let ((outer-tag (if (org-html--html5-fancy-p info) + "nav" + "div"))) + (concat (format "<%s id=\"table-of-contents\" role=\"doc-toc\">\n" outer-tag) + (let ((top-level (plist-get info :html-toplevel-hlevel))) + (format "%s\n" + top-level + (org-html--translate + (or (plist-get info :html-toc-title) + org-html-toc-title) + info) + top-level)) + toc + (format "\n" outer-tag)))))))) + + (defun org-html--get-toc-body (headline info) + "Return the body of the toc entry of HEADLINE. INFO is a plist + used as a communication channel." + (let* ((headline-number (org-html-get-multipage-headline-number headline info)) + (todo (and (plist-get info :with-todo-keywords) + (let ((todo (org-element-property :todo-keyword headline))) + (and todo (org-export-data todo info))))) + (todo-type (and todo (org-element-property :todo-type headline))) + (priority (and (plist-get info :with-priority) + (org-element-property :priority headline))) + (text (org-export-data-with-backend + (org-export-get-alt-title headline info) + (org-export-toc-entry-backend 'html) + info)) + (tags (and (eq (plist-get info :with-tags) t) + (org-export-get-tags headline info)))) + ;; Body. + (concat + (and (not (org-export-low-level-p headline info)) + (plist-get info :section-numbers) + (concat + (mapconcat #'number-to-string headline-number ".") + "  ")) + (apply (plist-get info :html-format-headline-function) + todo todo-type priority text tags :section-number nil)))) + + (defun org-html--format-mp-toc-headline (href body active full-toc) + "Return a table of contents entry for multipage output." + (format "%s" + ;; Target + (format "href=\"%s\"%s" + href + (concat + "class=\"" + (if full-toc "inline-toc-entry" + "toc-entry") + (if active + " toc-active" "") + "\"")) + + ;; Body. + body)) + + (defun org-html-multipage-ensure-export-dir (dir) + "get the full pathname of dir and ensure it exists." + (when (symbolp dir) (setq dir (format "%s" dir))) + (unless (= (aref dir 0) 47) + (setq dir (concat (file-name-directory (buffer-file-name)) dir))) + (unless (file-directory-p dir) + (make-directory dir :parents)) + dir) + + (defun org-html-multipage-split-tree (info) + (let ((split-ref (plist-get info :html-multipage-split-level)) + (headline-numbering (plist-get info :headline-numbering))) + (cond + ((eq split-ref 'toc) + (let ((maxdepth (if (numberp (plist-get info :with-toc)) + (plist-get info :with-toc) + (plist-get info :headline-levels)))) + (plist-put info :export-depth maxdepth) + (org-html-page-headlines + (cl-remove-if (lambda (hl-num) (> (length hl-num) maxdepth)) + headline-numbering :key 'cdr) + info))) + ((numberp split-ref) + (plist-put info :export-depth split-ref) + (org-html-page-headlines + (cl-remove-if (lambda (hl-num) (> (length hl-num) split-ref)) + headline-numbering :key 'cdr) + info))))) + + (defun org-html-transcode-multipage (info &optional body-only) + "Central routine transcoding to multipage output called by + `org-html-transcode-org-data' called from `org-export-as'. + + The pages to be exported are in the :multipage-org-pages property + of info as a list of org-page pseudo elements. This function + transcodes the org-pages and returns a list of the transcoded + output strings with their filename as :output-file Text Property + to be further processed by the function calling `org-export-as'. + + INFO is the communication channel. + " + (let ((async (plist-get info :async)) + (post-process (plist-get info :post-process))) + (declare (indent 2)) + (setq global-output + (cl-loop + for org-page in (plist-get info :multipage-org-pages) + collect (let ((file (org-element-property :output-file org-page))) + (message "transcoding: %s" file) + (let ((output (org-html-transcode-org-page org-page info))) + (put-text-property 0 1 :output-file file output) + output)))))) + + (defun org-html-multipage-split (data _backend info) + "Filter routine to collect all properties relevant to multipage + output. It is called in the context of calling all + :filter-parse-tree alist functions in `org-export-annotate-info' + after the parse-tree is completed and its properties + collected. The function takes care of splitting the parse-tree + into the subtrees for each page, creating org-page pseudo + elements, adding them in a list in the :multipage-org-pages + property of info. In addition lookup alists for the stripped + pages, for the page-urls, the navigation elements, the toc, + etc. are added to info, which are needed by the html transcoders. + + DATA is the completed parse-tree of the document. + + INFO is the communication channel. + " + (if (plist-get info :multipage) + (let ((dir (plist-get info :verified-export-directory)) + (async (plist-get info :async)) + (post-process (plist-get info :post-process))) + (declare (indent 2)) + (plist-put info :headline-numbering + (org-export--collect-headline-numbering + (plist-get info :parse-tree) + (cl-list* :section-numbers t info))) + (if (not (file-writable-p dir)) (error "Output dir not writable") + (let* ((encoding (or org-export-coding-system buffer-file-coding-system)) + (headline-numbering (plist-get info :headline-numbering)) + ;; each entry in exported-headline-numbering will become a + ;; single page in multipage output. + (exported-headline-numbering + (let ((tmp (org-html-multipage-split-tree info))) + (plist-put info :exported-headline-numbering tmp) + tmp)) + (max-toc-depth (if (numberp (plist-get info :with-toc)) + (plist-get info :with-toc) + (plist-get info :headline-levels))) + ;; section-trees is a list of all sections which get + ;; exported to a single page + (section-trees + (cl-loop + for section-entry in exported-headline-numbering + for keep-first-subhls = (plist-get info :keep-first-subhls) then (cdr keep-first-subhls) + collect + (let* ((section-number (cdr section-entry))) + (if (< (length section-number) max-toc-depth) + (org-html-element-remove-subheadlines + (car section-entry) + (car keep-first-subhls) + max-toc-depth) + (org-html-element-copy-element (car section-entry)))))) + ;; stripped-section-headline-numbering is the equivalent of + ;; headline-numbering but replacing the car of its elements + ;; with the stripped version of the headlines. + (stripped-section-headline-numbering + (cl-mapcar 'cons + (cl-loop for section in section-trees + ;; collect all subheadlines to match + ;; headline-numbering: + append (org-element-map section 'headline + 'identity)) + (mapcar 'cdr headline-numbering))) + ;; lookup from all toc headline-numbers to the tl-headline. + ) + ;; add stripped-section-headline-numbering to + ;; :headline-numbering, to make their headline-numbering + ;; accessible when generating the body of the individual + ;; pages. + (plist-put info :headline-numbering + (append + headline-numbering + stripped-section-headline-numbering)) + (plist-put info :section-trees section-trees) + (plist-put info :stripped-section-headline-numbering + stripped-section-headline-numbering) + ;; tl-url-lookup associates the stripped section headlines + ;; with the names of the joined pages to export. + (plist-put info :tl-url-lookup (org-html--generate-tl-url-lookup info)) + ;; lookup for the navigation elements of each page. + (plist-put info :section-nav-lookup + (org-html--make-section-nav-lookup info)) + (let ((section-filenames + (mapcar + (lambda (hl) (alist-get hl (plist-get info :tl-url-lookup))) + section-trees))) + (plist-put info :section-filenames section-filenames) + ;; bidirectional lookup tables to map between the + ;; stripped-section headlines and their global + ;; parse-tree equvialent. + (plist-put + info :stripped-hl-to-parse-tree-hl + (append + (cl-mapcar 'cons + (mapcar 'car stripped-section-headline-numbering) + (mapcar 'car headline-numbering)) + (cl-mapcar 'cons + (mapcar 'car headline-numbering) + (mapcar 'car stripped-section-headline-numbering)))) + ;; collect the toc information to avoid repeated + ;; recalculation in the toc transcoder for the + ;; individual pages. + (plist-put info :multipage-toc-lookup + (org-html--make-multipage-toc-lookup info)) + ;; The url for the "top" link on each page. + (plist-put info :html-top-url + (alist-get + (car (plist-get info :section-trees)) + (plist-get info :tl-url-lookup))) + ;; The title for the "top" link on each page. + (plist-put info :html-top-title + (org-html-element-title + (car (plist-get info :section-trees)))) + ;; collect all org-pages to be exported. + (plist-put info :multipage-org-pages + (cl-loop + for file in section-filenames + for tl-headline in section-trees + collect + (list 'org-page + (list :output-file (format "%s/%s" dir file) + :tl-headline tl-headline + :tl-headline-number + (alist-get + tl-headline + stripped-section-headline-numbering)) + nil)))))))) + data) + + (defun org-html--generate-tl-url-lookup (info) + "Return an assoc list for all headlines appearing in the toc + and the url names of the page they're on." + (let ((extension (plist-get info :html-extension)) + (stripped-section-headline-numbering + (plist-get info :stripped-section-headline-numbering)) + filenames) + (mapcar + (lambda (entry) + (let* ((tl-elem (org-html-element-get-top-level entry)) + (title (org-html-element-title tl-elem))) + (cons + entry + (format "%s.%s" + (car (push + (org-html-unique-filename + (if (plist-get info :html-multipage-numbered-filenames) + (org-html-string-prepend-section-numbering + (org-html-string-to-filename title) + (cdr (assoc + tl-elem + stripped-section-headline-numbering)) + org-export-headline-levels) + (org-html-string-to-filename title)) + filenames) + filenames)) + extension)))) + (plist-get info :section-trees)))) + + (defun org-html--make-section-nav-lookup (info) + "Return an assoc-list for the headlines of all + exported pages with a plist containing titles and urls for the + section and its navigation." + (let* ((stripped-section-headline-numbering (plist-get info :stripped-section-headline-numbering)) + ;;; first collect navigation-info once for each page only + (nav (mapcar (lambda (hl) + (let* ((hl-number (alist-get hl stripped-section-headline-numbering)) + (up (car (rassoc (butlast hl-number) stripped-section-headline-numbering)))) + (list hl + (org-html-element-title hl) + (org-html--full-reference hl info t) + (org-html-element-title up) + (and up (org-html--full-reference up info t))))) + (plist-get info :section-trees)))) + ;;; collect the info for prev, curr, next and up navigation for + ;;; each page by cdr-ing over nav. + (cl-labels ((inner (prev-entry curr-entry) + (let ((prev (car prev-entry)) + (curr (car curr-entry)) + (next (cadr curr-entry))) + (if curr + (cons (list (car curr) + :prev-title (nth 1 prev) + :curr-title (nth 1 curr) + :next-title (nth 1 next) + :up-title (nth 3 curr) + :prev-url (nth 2 prev) + :curr-url (nth 2 curr) + :next-url (nth 2 next) + :up-url (nth 4 curr)) + (inner (cdr prev-entry) (cdr curr-entry))))))) + (inner (cons nil nav) nav)))) + + (defun org-html--make-multipage-toc-lookup (info) + "Return an assoc-list containing info for the headlines of all toc entries." + (mapcar + (lambda (hl) + (let* ((tl-hl (org-html-element-get-top-level hl))) + (list hl + :href (org-html--full-reference hl info (plist-get info :html-multipage-toc-to-top)) + :tl-hl tl-hl + :relative-level (org-export-get-relative-level hl info) + :toc-body (org-html--get-toc-body hl info) + :toc-hl-number (alist-get hl (plist-get info :headline-numbering)) + :page-hl-number (org-html-get-multipage-headline-number hl info)))) + (org-html-collect-local-headlines info nil))) + + (defun org-html-get-multipage-tl-headline (element info) + "return the headline of the page containing + element. This requires that :headline-numbering has already been + added to info (done in org-export--collect-tree-properties)." + (let* ((elem element) + (parent (org-element-property :parent elem))) + (while parent + (setf elem parent) + (setf parent (org-element-property :parent elem))) + elem)) + + (defun org-html-get-multipage-headline-numbering (element info) + "return the headline of the section containing + element. This requires that :headline-numbering has already been + added to info (done in org-export--collect-tree-properties)." + (let* ((elem element) + (parent (org-element-property :parent elem)) + (hl-numbering (assoc elem (plist-get info :stripped-section-headline-numbering)))) + (while (not hl-numbering) + (setf elem parent) + (setf parent (org-element-property :parent elem)) + (setf hl-numbering (assoc elem (plist-get info :stripped-section-headline-numbering)))) + hl-numbering)) + + (defun org-html-get-multipage-headline-number (element info) + "return the headline-number of the section containing + element. This requires that :headline-numbering has already been + added to info (done in org-export--collect-tree-properties)." + (cdr (org-html-get-multipage-headline-numbering element info))) + + (defun org-html-element-get-top-level (element) + "Return the top-level element of ELEMENT by traversing the parse + tree upwards until the parent of element is nil." + (let ((elem element) + (parent (org-element-property :parent element))) + (while parent + (setq elem parent) + (setq parent (org-element-property :parent elem))) + elem)) + + (defun org-html-element-copy-element (org-node &optional keep-parent) + "copy ORG-NODE to a new org-node with elements not copied, + but referenced." + (let* (headline + (props (copy-sequence (nth 1 org-node))) + (new (list (car org-node) props))) + (unless keep-parent (setf (org-element-property :parent new) nil)) + (apply 'org-element-adopt-elements new (org-element-contents org-node)))) + + (defun org-html-element-remove-subheadlines (org-node &optional + keep-first-subheadlines max-toc-depth keep-parent) + "remove all elements starting with and including the first headline + in the children of ORG-NODE if JOIN_EMPTY_BODIES is nil. Returns a + new ast with all elements starting at START-CHILD-IDX copied into + it with the :parent property optionally removed in the top node." + (let* ((num-subheadlines 0) + contents-end + headline + (props (copy-sequence (nth 1 org-node))) + (new (list (car org-node) props)) + (new-children (cl-loop + for x in (org-element-contents org-node) + with exit = nil + do (if (and + (consp x) + (eq (org-element-type x) 'headline)) + (if (and (car keep-first-subheadlines) (zerop num-subheadlines)) + (progn + (setf num-subheadlines (1+ num-subheadlines)) + (if (< (org-element-property :level x) max-toc-depth) + (setq x (org-html-element-remove-subheadlines + x (cdr keep-first-subheadlines) max-toc-depth)))) + (progn + (setq contents-end (org-element-property :begin x)) + (setq exit t)))) + until exit + collect x))) + (unless keep-parent (setf (org-element-property :parent new) nil)) + (apply 'org-element-adopt-elements new new-children))) + + (defun org-html-find-headline (headline-number headline-numbering) + "return the headline in headline numbering for a given + headline-number." + (cond + ((null headline-numbering) nil) + ((equal headline-number (cdar headline-numbering)) + (caar headline-numbering)) + (t (org-html-find-headline headline-number (cdr headline-numbering))))) + + (defun org-html-element-body-text (element info) + "check if transcoding of the contents of element until the next + subheadline returns an empty string." + (let ((strings + (cl-loop + for elem in (org-element-contents element) + while (not (eq 'headline (org-element-type elem))) + collect (org-export-data elem info)))) + (string-trim + (apply 'concat + (with-temp-buffer + (mapcar 'insert strings) + (dom-strings (libxml-parse-html-region (point-min) (point-max)))))))) + + (defun org-html-element-body-text? (element info) + "check if transcoded element produces any text." + (not (eq "" (org-html-element-body-text element info)))) + + (defun org-html-page-headlines (headlines info) + "collect the headlines of all pages to export. In case of + html-multipage-join-empty-bodies don't collect the headlines to + be joined and keep track by collecting them for each page + headline in :keep-first-subhls. + `org-html-element-remove-subheadlines'" + (if (plist-get info :html-multipage-join-empty-bodies) + (cl-loop for (prev curr-headline) on (cons nil headlines) + with collect-hl = nil + with tmp = nil + with keep-shl = nil + while curr-headline + do (progn + (setf + collect-hl + (or ;; collect curr-headline either + (not prev) ;; when it is the first headline + (<= (length (cdr curr-headline)) + (length (cdr prev))) ;; when it is not a subheadline of prev. + ;; or when the previous headline contains body text + (org-html-element-body-text? (car prev) info))) + (if collect-hl + (progn (push (reverse tmp) keep-shl) + (setf tmp nil)) + (push t tmp))) + if collect-hl collect curr-headline + finally (progn (push tmp keep-shl) + (plist-put info :keep-first-subhls (cdr (reverse keep-shl))))) + headlines)) + + (defun org-html-transcode-org-page (page info) + "transcode the headline tree in the contents of the org-page + pseudo element PAGE into a string according to the backend and + return the string. + + INFO is used as communication channel." + (let* ((body-only (org-element-property :body-only page)) + (headline (org-element-property :tl-headline page)) + (info (cl-list* + :tl-headline headline + :tl-headline-number (org-element-property :tl-headline-number page) + info)) + (body (org-element-normalize-string + (or (org-export-data headline info) + ""))) + (inner-template (if (plist-get info :multipage) + (alist-get 'multipage-inner-template + (plist-get info :translate-alist)) + (alist-get 'inner-template + (plist-get info :translate-alist)))) + (full-body (org-export-filter-apply-functions + (plist-get info :filter-body) + (if (not (functionp inner-template)) body + (funcall inner-template body info)) + info)) + (template (if (plist-get info :multipage) + (cdr (assq 'multipage-template + (plist-get info :translate-alist))) + (cdr (assq 'template + (plist-get info :translate-alist))))) + (output + (if (or (not (functionp template)) body-only) full-body + (funcall template full-body info)))) + ;; Call citation export finalizer. + (setq output (org-cite-finalize-export output info)) + ;; Remove all text properties since they cannot be + ;; retrieved from an external process. Finally call + ;; final-output filter and return result. + (org-no-properties + (org-export-filter-apply-functions + (plist-get info :filter-final-output) + output info)))) + + (defun org-html-export-to-multipage + (&optional async subtreep visible-only body-only ext-plist post-process) + "Export current buffer to multipage HTML files. + + If narrowing is active in the current buffer, only export its + narrowed part. + + If a region is active, export that region. + + A non-nil optional argument ASYNC means the process should happen + asynchronously. The resulting files should be accessible through + the `org-export-stack' interface. + + When optional argument SUBTREEP is non-nil, export the sub-tree + at point, extracting information from the headline properties + first. + + When optional argument VISIBLE-ONLY is non-nil, don't export + contents of hidden elements. + + When optional argument BODY-ONLY is non-nil, only write code + between \"\" and \"\" tags. + + EXT-PLIST, when provided, is a property list with external + parameters overriding Org default settings, but still inferior to + file-local settings. + + Return output directory's name." + (interactive) + (let* ((extension (concat + (when (> (length org-html-extension) 0) ".") + (or (plist-get ext-plist :html-extension) + org-html-extension + "html"))) + (backend 'html) + (encoding (or org-export-coding-system buffer-file-coding-system)) + (org-export-coding-system org-html-coding-system) + (environment (org-export-get-environment 'html nil nil)) + (dir (org-html-multipage-ensure-export-dir + (plist-get environment :html-multipage-export-directory)))) + (if (not (file-writable-p dir)) (error "Output dir not writable") + (progn + (message "collecting multipage output...") + (let ((output + (org-export-as backend subtreep visible-only body-only + (cl-list* + :async async + :multipage t + :verified-export-directory dir + ext-plist)))) + (when (plist-get environment :html-multipage-clear-export-directory) + (message "clearing export-directory.") + (dolist + (file (directory-files dir nil ".html$")) + (delete-file (format "%s/%s" dir file)))) + (dolist (out output) + (if async + (org-export-async-start + (lambda (file) + (org-export-add-to-stack (expand-file-name file) backend)) + `(let ((file (get-text-property 0 :ouput-file out))) + (setq file (org-export--write-output output ',encoding)) + (let ((post (lambda (f) (or (ignore-errors (funcall ',post-process f)) f)))) + (if (listp file) (mapcar post file) (funcall post file))))) + (let (file) + (setq file (org-export--write-output out encoding)) + (when (and (org-export--copy-to-kill-ring-p) (org-string-nw-p output)) + (org-kill-new output)) + ;; Get proper return value. + (let ((post (lambda (f) + (or (and (functionp post-process) + (funcall post-process f)) + f)))) + (if (listp file) (mapcar post file) (funcall post file)))))) + (if (member system-type '(darwin gnu/linux gnu)) + (shell-command (format "ln -s %s %s/index.html" (get-text-property 0 :output-file (car output)) dir))) + (message "done!\n") + (cl-case (plist-get environment :html-multipage-open) + ('browser (org-open-file (format "%s" (get-text-property 0 :output-file (car output))))) + ('buffer (find-file (format "%s" (get-text-property 0 :output-file (car output))))))))))) + + (defun org-html--hidden-in-toc? (headline-number tl-headline-number) + "Check if the entry of HEADLINE-NUMBER should be hidden in the + toc of the page containing TL-HEADLINE-NUMBER." + (and + (> (length headline-number) 1) + (let ((l1 (length headline-number)) + (l2 (length tl-headline-number))) + (cond + ((= l1 l2) (not (equal (butlast headline-number) + (butlast tl-headline-number)))) + ((> l1 l2) (not (equal tl-headline-number + (butlast headline-number)))) + (t (not (equal (butlast headline-number) + (butlast (butlast tl-headline-number))))))))) + + (defun org-html-collect-local-headlines (info scope) + "Collect all headlines of headline-numbering from their local + tl-headlines counterparts." + (let ((stripped-section-headline-numbering (plist-get info :stripped-section-headline-numbering)) + (headline-numbering (plist-get info :headline-numbering))) + (mapcar + (lambda (global-headline) + (car + (rassoc (cdr (assoc global-headline headline-numbering)) + stripped-section-headline-numbering))) + (org-export-collect-headlines + info + (if (numberp (plist-get info :with-toc)) + (plist-get info :with-toc) + (plist-get info :headline-levels)) + scope)))) + + (defun org-html-nav-left (nav-lookup) + "Return nav string for multipage Navigation in page-main-body. + + INFO is a plist used as a communication channel. + " + (let* ((prev-url (plist-get nav-lookup :prev-url)) + (prev-title (plist-get nav-lookup :prev-title))) + (if prev-url + (format "" + prev-url) + (format "" + "")))) + + (defun org-html-nav-right (nav-lookup) + "Return nav string for multipage Navigation in page-main-body. + + INFO is a plist used as a communication channel. + " + (let* ((next-url (plist-get nav-lookup :next-url)) + (next-title (plist-get nav-lookup :next-title))) + (if next-url + (format "" + next-url) + (format "" + "")))) + + (defun org-html-multipage-nav (info) + "Return the string for the multipage navigation anchors. + + INFO is a plist used as a communication channel. + " + (let ((section-nav-lookup + (alist-get + (plist-get info :tl-headline) + (plist-get info :section-nav-lookup))) + (nav-format (plist-get info :html-multipage-nav-format))) + (format (car nav-format) + (concat + (when (plist-get section-nav-lookup :next-url) + (format (cadr nav-format) + (plist-get section-nav-lookup :next-url) + (plist-get section-nav-lookup :next-title))) + (when (plist-get section-nav-lookup :prev-url) + (format (caddr nav-format) + (plist-get section-nav-lookup :prev-url) + (plist-get section-nav-lookup :prev-title))) + (when (plist-get section-nav-lookup :up-url) + (format (cadddr nav-format) + (plist-get section-nav-lookup :up-url) + (plist-get section-nav-lookup :up-title))) + (when (plist-get info :html-top-url) + (format (nth 4 nav-format) + (plist-get info :html-top-url) + (plist-get info :html-top-title))))))) + + (defun org-html-multipage-template (contents info) + "Return complete document string after HTML conversion. + CONTENTS is the transcoded contents string. INFO is a plist + holding export options." + (concat + (when (and (not (org-html-html5-p info)) (org-html-xhtml-p info)) + (let* ((xml-declaration (plist-get info :html-xml-declaration)) + (decl (or (and (stringp xml-declaration) xml-declaration) + (cdr (assoc (plist-get info :html-extension) + xml-declaration)) + (cdr (assoc "html" xml-declaration)) + ""))) + (when (not (or (not decl) (string= "" decl))) + (format "%s\n" + (format decl + (or (and org-html-coding-system + ;; FIXME: Use Emacs 22 style here, see `coding-system-get'. + (coding-system-get org-html-coding-system 'mime-charset)) + "iso-8859-1")))))) + (org-html-doctype info) + "\n" + (concat "\n") + "\n" + (org-html--build-meta-info info) + (org-html--build-head info) + (org-html--build-mathjax-config info) + "\n" + "\n" + (when (eq org-html-multipage-preamble-position 'top) + (org-html--build-pre/postamble 'preamble info)) + (org-html-multipage-nav info) + ;; Preamble. + (unless (eq org-html-multipage-preamble-position 'top) + (org-html--build-pre/postamble 'preamble info)) + ;; Document contents. + (let ((div (assq 'content (plist-get info :html-divs)))) + (format "<%s id=\"%s\" class=\"%s\">\n" + (nth 1 div) + (nth 2 div) + (plist-get info :html-content-class))) + ;; Table of contents. + (let ((depth (if (numberp (plist-get info :with-toc)) + (plist-get info :with-toc) + (plist-get info :headline-levels)))) + (when depth (org-html-multipage-toc depth info))) + ;; Document title. + (when (plist-get info :with-title) + (let ((title (and (plist-get info :with-title) + (plist-get info :title))) + (subtitle (plist-get info :subtitle)) + (html5-fancy (org-html--html5-fancy-p info))) + (when title + (format + (if html5-fancy + "
\n

%s

\n%s
" + "

%s%s

\n") + (org-export-data title info) + (if subtitle + (format + (if html5-fancy + "

%s

\n" + (concat "\n" (org-html-close-tag "br" nil info) "\n" + "%s\n")) + (org-export-data subtitle info)) + ""))))) + contents + (format "\n" (nth 1 (assq 'content (plist-get info :html-divs)))) + ;; Possibly use the Klipse library live code blocks. + (when (plist-get info :html-klipsify-src) + (concat "")) + (when (eq org-html-multipage-postamble-position 'bottom) + (org-html--build-pre/postamble 'postamble info)) + ;; Closing document. + "\n")) + + (defun org-html-multipage-inner-template (contents info) + "Return body of document string after HTML conversion. + CONTENTS is the transcoded contents string. INFO is a plist + holding export options. + + DATA contains the subtree of the parse tree of the section to be + exported for multipage export. + " + ;; Navigation + (let* ((data (plist-get info :tl-headline)) + (section-nav-lookup + (alist-get + data + (plist-get info :section-nav-lookup)))) + (format "
%s\n
%s
%s
" + (org-html-nav-left section-nav-lookup) + (concat + ;; Document contents. + contents + ;; Footnotes section. + (or (org-html-footnote-section info) "") + ;; Postamble. + (unless (eq org-html-multipage-postamble-position 'bottom) + (org-html--build-pre/postamble 'postamble info))) + (org-html-nav-right section-nav-lookup)))) + + (defun org-html-transcode-org-data (data content info) + "Transcode the top org-data node of the org file to export. + + It is called by `org-export-as' after all necessary information + has been added to info and the final parse-tree has been + generated. Multipage information has already been collected by + calling `org-html-multipage-filter' in `org-export-annotate-info' + using the :multipage-split property. + + INFO is a plist used as a communication channel." + (message "transcoding data!") + (if (plist-get info :multipage) + ;;; for multipage output we don't need data and content as all + ;;; information is already collected in info. + (org-html-transcode-multipage info) + (org-export-transcode-org-data data content info))) (provide 'ox-html) *************** *** 4100,4102 **** --- 5485,5489 ---- ;; End: ;;; ox-html.el ends here + + --/jKJUrk4TV58OzGX Content-Type: text/plain; charset=utf-8 Content-Disposition: attachment; filename="org-manual.org.patch" *** org-mode/doc/org-manual.org 2024-08-05 17:15:57.585261838 +0200 --- org-mode-multipage/doc/org-manual.org 2024-08-05 15:40:24.679134249 +0200 *************** *** 772,781 **** where you can use the following keys to find your destination: #+attr_texinfo: :columns 0.3 0.7 ! | {{{kbd(TAB)}}} | Cycle visibility. | | {{{kbd(DOWN)}}} / {{{kbd(UP)}}} | Next/previous visible headline. | ! | {{{kbd(RET)}}} | Select this location. | ! | {{{kbd(/)}}} | Do a Sparse-tree search | #+texinfo: @noindent The following keys work if you turn off ~org-goto-auto-isearch~ --- 772,781 ---- where you can use the following keys to find your destination: #+attr_texinfo: :columns 0.3 0.7 ! | {{{kbd(TAB)}}} | Cycle visibility. | | {{{kbd(DOWN)}}} / {{{kbd(UP)}}} | Next/previous visible headline. | ! | {{{kbd(RET)}}} | Select this location. | ! | {{{kbd(/)}}} | Do a Sparse-tree search | #+texinfo: @noindent The following keys work if you turn off ~org-goto-auto-isearch~ *************** *** 783,791 **** #+attr_texinfo: :columns 0.3 0.7 | {{{kbd(n)}}} / {{{kbd(p)}}} | Next/previous visible headline. | | {{{kbd(f)}}} / {{{kbd(b)}}} | Next/previous headline same level. | ! | {{{kbd(u)}}} | One level up. | | {{{kbd(0)}}} ... {{{kbd(9)}}} | Digit argument. | ! | {{{kbd(q)}}} | Quit. | #+vindex: org-goto-interface #+texinfo: @noindent --- 783,791 ---- #+attr_texinfo: :columns 0.3 0.7 | {{{kbd(n)}}} / {{{kbd(p)}}} | Next/previous visible headline. | | {{{kbd(f)}}} / {{{kbd(b)}}} | Next/previous headline same level. | ! | {{{kbd(u)}}} | One level up. | | {{{kbd(0)}}} ... {{{kbd(9)}}} | Digit argument. | ! | {{{kbd(q)}}} | Quit. | #+vindex: org-goto-interface #+texinfo: @noindent *************** *** 2044,2050 **** #+attr_texinfo: :columns 0.2 0.8 | =$1..$3= | first three fields in the current row | ! | =$P..$Q= | range, using column names (see [[*Advanced features]]) | | =$<<<..$>>= | start in third column, continue to the last but one | | =@2$1..@4$3= | nine fields between these two fields (same as =A2..C4=) | | =@-1$-2..@-1= | 3 fields in the row above, starting from 2 columns on the left | --- 2044,2050 ---- #+attr_texinfo: :columns 0.2 0.8 | =$1..$3= | first three fields in the current row | ! | =$P..$Q= | range, using column names (see [[*Advanced features]]) | | =$<<<..$>>= | start in third column, continue to the last but one | | =@2$1..@4$3= | nine fields between these two fields (same as =A2..C4=) | | =@-1$-2..@-1= | 3 fields in the row above, starting from 2 columns on the left | *************** *** 2248,2255 **** | =$1+$2;%.2f= | Same, format result to two decimals | | =exp($2)+exp($1)= | Math functions can be used | | =$0;%.1f= | Reformat current cell to 1 decimal | ! | =($3-32)*5/9= | Degrees F \to C conversion | ! | =$c/$1/$cm= | Hz \to cm conversion, using =constants.el= | | =tan($1);Dp3s1= | Compute in degrees, precision 3, display SCI 1 | | =sin($1);Dp3%.1e= | Same, but use ~printf~ specifier for display | | =vmean($2..$7)= | Compute column range mean, using vector function | --- 2248,2255 ---- | =$1+$2;%.2f= | Same, format result to two decimals | | =exp($2)+exp($1)= | Math functions can be used | | =$0;%.1f= | Reformat current cell to 1 decimal | ! | =($3-32)*5/9= | Degrees F \to C conversion | ! | =$c/$1/$cm= | Hz \to cm conversion, using =constants.el= | | =tan($1);Dp3s1= | Compute in degrees, precision 3, display SCI 1 | | =sin($1);Dp3%.1e= | Same, but use ~printf~ specifier for display | | =vmean($2..$7)= | Compute column range mean, using vector function | *************** *** 11995,12001 **** #+attr_texinfo: :columns 0.1 0.9 | {{{kbd(s)}}} | Sort the footnote definitions by reference sequence. | | {{{kbd(r)}}} | Renumber the simple =fn:N= footnotes. | ! | {{{kbd(S)}}} | Short for first {{{kbd(r)}}}, then {{{kbd(s)}}} action. | | {{{kbd(n)}}} | Rename all footnotes into a =fn:1= ... =fn:n= sequence. | | {{{kbd(d)}}} | Delete the footnote at point, including definition and references. | --- 11995,12001 ---- #+attr_texinfo: :columns 0.1 0.9 | {{{kbd(s)}}} | Sort the footnote definitions by reference sequence. | | {{{kbd(r)}}} | Renumber the simple =fn:N= footnotes. | ! | {{{kbd(S)}}} | Short for first {{{kbd(r)}}}, then {{{kbd(s)}}} action. | | {{{kbd(n)}}} | Rename all footnotes into a =fn:1= ... =fn:n= sequence. | | {{{kbd(d)}}} | Delete the footnote at point, including definition and references. | *************** *** 13283,13288 **** --- 13283,13299 ---- Exports to a temporary buffer. Does not create a file. + - {{{kbd(C-c C-e h m)}}} (~org-html-export-to-multipage~) :: + #+kindex: C-c C-e h m + #+findex: org-html-export-to-multipage + + Export as multiple HTML files with a =.html= extension. The + exported files are written into a directory specified with the + customization variable =org-html-multipage-export-dir=. If + =org-html-clear-export-directory= is non-nil, all files with a + =.html= extension will be removed before writing the files. Files + with duplicate names will be overwritten without warning. + *** HTML specific export settings :PROPERTIES: :DESCRIPTION: Settings for HTML export. *************** *** 13823,13831 **** #+vindex: org-html-head-extra #+cindex: @samp{HTML_INCLUDE_STYLE}, keyword The HTML export backend includes a compact default style in each ! exported HTML file. To override the default style with another style, ! use these keywords in the Org file. They will replace the global ! defaults the HTML exporter uses. #+cindex: @samp{HTML_HEAD}, keyword #+cindex: @samp{HTML_HEAD_EXTRA}, keyword --- 13834,13844 ---- #+vindex: org-html-head-extra #+cindex: @samp{HTML_INCLUDE_STYLE}, keyword The HTML export backend includes a compact default style in each ! exported HTML file[fn:: The constant is called ! ~org-html-style-default~ for single page output and ! ~org-html-multipage-style-default~ for multipage output]. To override ! the default style with another style, use these keywords in the Org ! file. They will replace the global defaults the HTML exporter uses. #+cindex: @samp{HTML_HEAD}, keyword #+cindex: @samp{HTML_HEAD_EXTRA}, keyword *************** *** 13855,13861 **** a =CUSTOM_ID= property. You can also assign a specific class to a headline with the =HTML_HEADLINE_CLASS= property. ! Never change the ~org-html-style-default~ constant. Instead, use other simpler ways of customizing as described above. *** JavaScript supported display of web pages --- 13868,13875 ---- a =CUSTOM_ID= property. You can also assign a specific class to a headline with the =HTML_HEADLINE_CLASS= property. ! Never change the ~org-html-style-default~ and ! ~org-html-multipage-style-default~ constants. Instead, use other simpler ways of customizing as described above. *** JavaScript supported display of web pages *************** *** 13944,13949 **** --- 13958,14124 ---- variable ~org-infojs-options~. If you always want to apply the script to your pages, configure the variable ~org-export-html-use-infojs~. + *** Multipage HTML specific export options + The options and custom variables for HTML export also apply to + multipage export. In addition the variables below are applying to + multipage export. They can be set using the listed variable name + or using an in buffer option using the name without the =org-= at + the beginning as in the following example: + #+begin_src + #+OPTIONS: html-multipage-clear-export-directory:t + #+end_src + + - ~org-html-multipage-clear-export-directory~ :: + + #+vindex: org-html-multipage-clear-export-directory + Whether to clear all =.html= files in the export directory before + writing. + + - ~org-html-multipage-export-directory~ :: + + #+vindex: org-html-multipage-export-directory + The directory where the multiple files will be written. Relative to + the path of the Org document or absolute. + + - ~org-html-multipage-head-include-default-style~ :: + + #+vindex: org-html-multipage-head-include-default-style + Whether to include the default CSS style + (=org-html-multipage-style-default=) into every exported file. + + - ~org-html-multipage-join-empty-bodies~ :: + + #+vindex: org-html-multipage-join-empty-bodies + Recursively join subheadlines, if a headline doesn't contain any + text before its subheadline. + + Example: + #+begin_example + ,* Headline 1 + ,** Subheadline 1.1 + ,*** Subsubheadline 1.1.1 + Text of Subsubheadline 1.1.1 + #+end_example + will be put on the same HTML page if this option is set, otherwise + Headline 1 and Subheadline 1.1 will each be put on a separate HTML + page with empty content. + + - ~org-html-multipage-nav-format~ :: + + #+vindex: org-html-multipage-nav-format + The HTML format string for the four navigation elements in the top + navigation menu of each page. See explanation of the variable + ~org-html-multipage-nav-format~. + + - ~org-html-multipage-numbered-filenames~ :: + + #+vindex: org-html-multipage-numbered-filenames + Boolean indicating whether filenames in multipage export should get + their headline-numbering prepended. Note that this option is + independent of the =num:= option and that the backend guarantees + that filenames are unique in any case. + + - ~org-html-multipage-open~ :: + + #+vindex: org-html-multipage-open + If and where to open the top page of the multipage html after + export. Possible values are =browser=, =buffer= or =nil=. Note that + all files will always be written, even for the =buffer= case. + + - ~org-html-multipage-postamble-position~ :: + + #+vindex: org-html-multipage-postamble-position + The position of the postamble in the html output. + Possible choices are =bottom= or =text-content=. + See [[*Multipage HTML specific CSS support]] + + - ~org-html-multipage-preamble-position~ :: + + #+vindex: org-html-multipage-preamble-position + The position of the postamble in the html output. + Possible choices are =top= or =text-content=. + See [[*Multipage HTML specific CSS support]] + + - ~org-html-multipage-split-hooks~ :: + + #+vindex: org-html-multipage-split-hooks + list of additional custom functions to be called during the export + after multipage splitting has taken place and before transcoding + with the =info= communication channel as input. + + - ~org-html-multipage-split-level~ :: + + #+vindex: org-html-multipage-split-level + Where to split the ORG file into multiple HTML pages. Can be either + =toc= for splitting into a separate page for each toc entry or a + number defining the maximum headline level for splitting. + + - ~org-html-multipage-toc-to-top~ :: + + #+vindex: org-html-multipage-toc-to-top + If t links in the table of contents will always point to the top of + the referenced page, otherwise it will link directly to the + referenced headline element. + + *** Multipage HTML specific CSS support + :PROPERTIES: + :DESCRIPTION: Changing the appearance of the Multipage HTML output. + :END: + #+cindex: CSS, for Multipage HTML export + #+cindex: HTML Multipage export, CSS + + #+vindex: org-html-multipage-preamble-position + #+vindex: org-html-multipage-preamble-position + #+vindex: org-html-multipage-postamble-position + In HTML multipage output each page will be generated with the + following structure: + + #+begin_example + ,* html + ,** head + ,** body + ,*** preamble + ,*** org-div-nav-menu + ,*** content + ,**** table-of-contents + ,**** page-main-body + ,***** nav-left + ,***** page-text-body + ,***** nav-right + ,*** postamble + #+end_example + + The default CSS shipped with org-mode will place a table of contents + to the left of the page content below the preamble and the top + navigation menu. This table of contents will contain /all/ headlines + according to the =toc= option, ignoring any =notoc= option within the + document to make every exported page of the document accessible. + + Preamble and postamble can be moved inside the page text body at its + top and bottom using =org-html-multipage-preamble-position= and + =org-html-multipage-postamble-position= respectively. Elements to be + skipped can be hidden by setting their =display= property to =none= in + the CSS. Note that the table of contents will only be generated if + + In addition to the single page HTML CSS support (see [[*CSS support]]) + the HTML Multipage exporter assigns the following special CSS classes + to appropriate parts of the document. They are mainly concerned with + navigation elements. The table of contents CSS below refers to the + table of contents generated for every page of the multipage HTML + output and /not/ to any additional toc inside the text body. + + | ~#org-div-nav-menu~ | Top Navigation Menu | + | ~#table-of-contents~ | the Table of Contents generated for every output page | + | ~#text-table-of-contents~ | the Table of Contents text area after its title | + | ~.ul-toc-level-N~ | the ul element of a toc entry with level N. | + | ~.toc-level-N~ | the li element of a toc entry with level N. | + | ~.toc-hidden~ | the li element of a toc entry to be (optionally) hidden | + | ~.toc-entry~ | the a element of a toc entry. | + | ~.toc-entry-active~ | The anchor of the toc entry currently active. | + | ~#nav-left~ | Navigation contained in the page-main-body div to the previous page. | + | ~#nav-right~ | Navigation contained in the page-main-body div to the next page | + | | | + ** LaTeX Export :PROPERTIES: :DESCRIPTION: Exporting to @LaTeX{} and processing to PDF. *************** *** 16655,16666 **** :UNNUMBERED: notoc :END: ! The Org export can filter not just for backends, but also for ! specific files through the =BIND= keyword. Here is an example with ! two filters; one removes brackets from time stamps, and the other ! removes strike-through text. The filter functions are defined in ! a code block in the same Org file, which is a handy location for ! debugging. #+begin_example ,#+BIND: org-export-filter-timestamp-functions (tmp-f-timestamp) --- 16830,16842 ---- :UNNUMBERED: notoc :END: ! The Org export can filter not just for backends, but also for specific ! files through the =BIND= keyword. Here is an example with two ! filters; one removes brackets from time stamps, and the other removes ! strike-through text. The filter functions are defined in a code block ! in the same Org file, which is a handy location for debugging. Note ! that ~org-export-allow-bind-keywords~ has to be non-nil for this to ! work. #+begin_example ,#+BIND: org-export-filter-timestamp-functions (tmp-f-timestamp) --/jKJUrk4TV58OzGX--