From e81799409e3e1ac2ac0c0e3815bba8ad239632d3 Mon Sep 17 00:00:00 2001 From: Andreas Gerler Date: Tue, 28 Aug 2018 20:22:38 +0200 Subject: [PATCH] Add ox-reveal Signed-off-by: Andreas Gerler --- bba.org | 13 + .../ox-reveal-autoloads.el | 33 + elpa/ox-reveal-20161027.926/ox-reveal-pkg.el | 2 + elpa/ox-reveal-20161027.926/ox-reveal.el | 1192 +++++++++++++++++ 4 files changed, 1240 insertions(+) create mode 100644 elpa/ox-reveal-20161027.926/ox-reveal-autoloads.el create mode 100644 elpa/ox-reveal-20161027.926/ox-reveal-pkg.el create mode 100644 elpa/ox-reveal-20161027.926/ox-reveal.el diff --git a/bba.org b/bba.org index 8b7bb9a1..369c6420 100644 --- a/bba.org +++ b/bba.org @@ -968,6 +968,19 @@ never heard of orgmode. ) #+END_SRC +** ox-reveal +[2017-11-06 Mon 23:26] + +Get reveal.js as well: + +#+BEGIN_SRC sh :tangle never + git clone https://github.com/hakimel/reveal.js/ +#+END_SRC + +#+BEGIN_SRC emacs-lisp :tangle yes + (require 'ox-reveal) +#+END_SRC + ** ox-publish [2018-01-24 Wed 20:29] diff --git a/elpa/ox-reveal-20161027.926/ox-reveal-autoloads.el b/elpa/ox-reveal-20161027.926/ox-reveal-autoloads.el new file mode 100644 index 00000000..21c83365 --- /dev/null +++ b/elpa/ox-reveal-20161027.926/ox-reveal-autoloads.el @@ -0,0 +1,33 @@ +;;; ox-reveal-autoloads.el --- automatically extracted autoloads +;; +;;; Code: + +(add-to-list 'load-path (directory-file-name + (or (file-name-directory #$) (car load-path)))) + + +;;;### (autoloads nil "ox-reveal" "ox-reveal.el" (0 0 0 0)) +;;; Generated autoloads from ox-reveal.el + +(autoload 'org-reveal-publish-to-reveal "ox-reveal" "\ +Publish an org file to Html. + +FILENAME is the filename of the Org file to be published. PLIST +is the property list for the given project. PUB-DIR is the +publishing directory. + +Return output file name. + +\(fn PLIST FILENAME PUB-DIR)" nil nil) + +(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "ox-reveal" '("org-reveal-" "client-multiplex" "frag-" "if-format"))) + +;;;*** + +;; Local Variables: +;; version-control: never +;; no-byte-compile: t +;; no-update-autoloads: t +;; coding: utf-8 +;; End: +;;; ox-reveal-autoloads.el ends here diff --git a/elpa/ox-reveal-20161027.926/ox-reveal-pkg.el b/elpa/ox-reveal-20161027.926/ox-reveal-pkg.el new file mode 100644 index 00000000..3aea48f4 --- /dev/null +++ b/elpa/ox-reveal-20161027.926/ox-reveal-pkg.el @@ -0,0 +1,2 @@ +;;; -*- no-byte-compile: t -*- +(define-package "ox-reveal" "20161027.926" "reveal.js Presentation Back-End for Org Export Engine" '((org "20150330")) :commit "001567cc12d50ba07612edd1718b86a12e8c2547" :keywords '("outlines" "hypermedia" "slideshow" "presentation") :authors '(("Yujie Wen ")) :maintainer '("Yujie Wen ")) diff --git a/elpa/ox-reveal-20161027.926/ox-reveal.el b/elpa/ox-reveal-20161027.926/ox-reveal.el new file mode 100644 index 00000000..19ff6798 --- /dev/null +++ b/elpa/ox-reveal-20161027.926/ox-reveal.el @@ -0,0 +1,1192 @@ +;;; ox-reveal.el --- reveal.js Presentation Back-End for Org Export Engine + +;; Copyright (C) 2013 Yujie Wen + +;; Author: Yujie Wen +;; Created: 2013-04-27 +;; Version: 1.0 +;; Package-Version: 20161027.926 +;; Package-Requires: ((org "20150330")) +;; Keywords: outlines, hypermedia, slideshow, presentation + +;; This file is not part of GNU Emacs. + +;;; Copyright Notice: + +;; This program is free software: you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with GNU Emacs. If not, see . + +;; Please see "Readme.org" for detail introductions. + +;; Pull request: Multiplex Support - Stephen Barrett \n%s\n\n" contents) + (org-html-special-block special-block contents info)))) + +;; Copied from org-html-headline and modified to embed org-reveal +;; specific attributes. +(defun org-reveal-headline (headline contents info) + "Transcode a HEADLINE element from Org to HTML. +CONTENTS holds the contents of the headline. INFO is a plist +holding contextual information." + (unless (org-element-property :footnote-section-p headline) + (if (org-export-low-level-p headline info) + ;; This is a deep sub-tree: export it as in ox-html. + (org-html-headline headline contents info) + ;; Standard headline. Export it as a slide + (let* ((level (org-export-get-relative-level headline info)) + (preferred-id (or (org-element-property :CUSTOM_ID headline) + (org-export-get-reference headline info) + (org-element-property :ID headline))) + (hlevel (org-reveal--get-hlevel info)) + (header (plist-get info :reveal-slide-header)) + (header-div (when header (format "
%s
\n" header))) + (footer (plist-get info :reveal-slide-footer)) + (footer-div (when footer (format "
%s
\n" footer))) + (first-sibling (org-export-first-sibling-p headline info)) + (last-sibling (org-export-last-sibling-p headline info)) + (default-slide-background (plist-get info :reveal-default-slide-background)) + (default-slide-background-size (plist-get info :reveal-default-slide-background-size)) + (default-slide-background-position (plist-get info :reveal-default-slide-background-position)) + (default-slide-background-repeat (plist-get info :reveal-default-slide-background-repeat)) + (default-slide-background-transition (plist-get info :reveal-default-slide-background-transition)) + (slide-section-tag (format "
\n" + (org-html--make-attribute-string + `(:id ,(format "slide-%s" preferred-id) + :data-transition ,(org-element-property :REVEAL_DATA_TRANSITION headline) + :data-state ,(org-element-property :REVEAL_DATA_STATE headline) + :data-background ,(or (org-element-property :REVEAL_BACKGROUND headline) + default-slide-background) + :data-background-size ,(or (org-element-property :REVEAL_BACKGROUND_SIZE headline) + default-slide-background-size) + :data-background-position ,(or (org-element-property :REVEAL_BACKGROUND_POSITION headline) + default-slide-background-position) + :data-background-repeat ,(or (org-element-property :REVEAL_BACKGROUND_REPEAT headline) + default-slide-background-repeat) + :data-background-transition ,(or (org-element-property :REVEAL_BACKGROUND_TRANS headline) + default-slide-background-transition))) + (let ((extra-attrs (org-element-property :REVEAL_EXTRA_ATTR headline))) + (if extra-attrs (format " %s" extra-attrs) "")))) + (ret (concat + (if (or (/= level 1) (not first-sibling)) + ;; Not the first heading. Close previou slide. + (concat + ;; Slide footer if any + footer-div + ;; Close previous slide + "
\n" + (if (<= level hlevel) + ;; Close previous vertical slide group. + "\n"))) + (if (<= level hlevel) + ;; Add an extra "
" to group following slides + ;; into vertical slide group. Transition override + ;; attributes are attached at this level, too. + (let ((attrs + (org-html--make-attribute-string + `(:data-transition ,(org-element-property :REVEAL_DATA_TRANSITION headline))))) + (if (string= attrs "") + "
\n" + (format "
\n" attrs)))) + ;; Start a new slide. + (prog1 + slide-section-tag + ;; Cache the current slide's section tag, except the id attr + (setq org-reveal--last-slide-section-tag + (replace-regexp-in-string "id\\s-*=\\s-*[\][\"].*?[\][\"]" + "" slide-section-tag))) + ;; Slide header if any. + header-div + ;; The HTML content of the headline + ;; Strip the
tags, if any + (let ((html (org-html-headline headline contents info))) + (if (string-prefix-p " and the last
tags from html + (concat "<" + (mapconcat 'identity + (butlast (cdr (split-string html "<" t))) + "<")) + ;; Return the HTML content unchanged + html)) + (if (and (= level 1) + (org-export-last-sibling-p headline info)) + ;; Last head 1. Close all slides. + (concat + ;; Slide footer if any + footer-div + "
\n
\n"))))) + ret)))) + +(defgroup org-export-reveal nil + "Options for exporting Orgmode files to reveal.js HTML pressentations." + :tag "Org Export Reveal" + :group 'org-export) + +(defun org-reveal--read-file (file) + "Return the content of file" + (with-temp-buffer + (insert-file-contents-literally file) + (buffer-string))) + +(defun org-reveal--file-url-to-path (url) + "Convert URL that points to local files to file path." + (replace-regexp-in-string + (if (string-equal system-type "windows-nt") "^file:///" "^file://") + "" url)) + +(defun org-reveal--css-label (in-single-file file-name style-id) + "Generate an HTML label for including a CSS file, if + IN-SINGLE-FILE is t, the content of FILE-NAME is embedded, + otherwise, a `' label is generated." + (when (and file-name (not (string= file-name ""))) + (if in-single-file + ;; Single-file + (let ((local-file-name (org-reveal--file-url-to-path file-name))) + (if (file-readable-p local-file-name) + (concat "\n") + ;; But file is not readable. + (error "Cannot read %s" file-name))) + ;; Not in-single-file + (concat "\n")))) + +(defun org-reveal-stylesheets (info) + "Return the HTML contents for declaring reveal stylesheets +using custom variable `org-reveal-root'." + (let* ((root-path (file-name-as-directory (plist-get info :reveal-root))) + (reveal-css (concat root-path "css/reveal.css")) + (theme (plist-get info :reveal-theme)) + (theme-css (concat root-path "css/theme/" theme ".css")) + (extra-css (plist-get info :reveal-extra-css)) + (in-single-file (plist-get info :reveal-single-file))) + (concat + ;; Default embedded style sheets + " +" + ;; stylesheets + (mapconcat (lambda (elem) (org-reveal--css-label in-single-file (car elem) (cdr elem))) + (append (list (cons reveal-css nil) + (cons theme-css "theme")) + (mapcar (lambda (a) (cons a nil)) + (split-string extra-css "\n"))) + "\n") + + ;; Include CSS for highlight.js if necessary + (if (org-reveal--using-highlight.js info) + (format "" + (format-spec (plist-get info :reveal-highlight-css) + `((?r . ,(directory-file-name root-path)))))) + ;; print-pdf + (if in-single-file "" + (format " + + +" + root-path))))) + +(defun org-reveal-mathjax-scripts (info) + "Return the HTML contents for declaring MathJax scripts" + (if (plist-get info :reveal-mathjax) + ;; MathJax enabled. + (format "\n" + (plist-get info :reveal-mathjax-url)))) + +(defun org-reveal-scripts (info) + "Return the necessary scripts for initializing reveal.js using +custom variable `org-reveal-root'." + (let* ((root-path (file-name-as-directory (plist-get info :reveal-root))) + (head-min-js (concat root-path "lib/js/head.min.js")) + (reveal-js (concat root-path "js/reveal.js")) + ;; Local files + (local-root-path (org-reveal--file-url-to-path root-path)) + (local-head-min-js (concat local-root-path "lib/js/head.min.js")) + (local-reveal-js (concat local-root-path "js/reveal.js")) + (in-single-file (plist-get info :reveal-single-file))) + (concat + ;; reveal.js/lib/js/head.min.js + ;; reveal.js/js/reveal.js + (if (and in-single-file + (file-readable-p local-head-min-js) + (file-readable-p local-reveal-js)) + ;; Embed scripts into HTML + (concat "") + ;; Fall-back to extern script links + (if in-single-file + ;; Tried to embed scripts but failed. Print a message about possible errors. + (error (concat "Cannot read " + (mapconcat 'identity + (delq nil (mapcar (lambda (file) (if (not (file-readable-p file)) file)) + (list local-head-min-js local-reveal-js))) + ", ")))) + (concat + "\n" + "\n")) + ;; plugin headings + " +\n"))) + +(defun org-reveal-toc (depth info) + "Build a slide of table of contents." + (let ((toc (org-html-toc depth info))) + (if toc + (format "
\n%s
\n" + (replace-regexp-in-string "\n%s" org-reveal--last-slide-section-tag "")))) + +(defun org-reveal-parse-keyword-value (value) + "According to the value content, return HTML tags to split slides." + (let ((tokens (mapcar + (lambda (x) (split-string x ":")) + (split-string value)))) + (mapconcat + (lambda (x) (apply 'org-reveal-parse-token x)) + tokens + ""))) + +;; Copied from org-html-format-list-item. Overwrite HTML class +;; attribute when there is attr_html attributes. +(defun org-reveal-format-list-item (contents type checkbox attributes info + &optional term-counter-id + headline) + "Format a list item into HTML." + (let ((attr-html (cond (attributes (format " %s" (org-html--make-attribute-string attributes))) + (checkbox (format " class=\"%s\"" (symbol-name checkbox))) + (t ""))) + (checkbox (concat (org-html-checkbox checkbox info) + (and checkbox " "))) + (br (org-html-close-tag "br" nil info))) + (concat + (case type + (ordered + (let* ((counter term-counter-id) + (extra (if counter (format " value=\"%s\"" counter) ""))) + (concat + (format "" attr-html extra) + (when headline (concat headline br))))) + (unordered + (let* ((id term-counter-id) + (extra (if id (format " id=\"%s\"" id) ""))) + (concat + (format "" attr-html extra) + (when headline (concat headline br))))) + (descriptive + (let* ((term term-counter-id)) + (setq term (or term "(no term)")) + ;; Check-boxes in descriptive lists are associated to tag. + (concat (format "%s" + attr-html (concat checkbox term)) + (format "" attr-html))))) + (unless (eq type 'descriptive) checkbox) + (and contents (org-trim contents)) + (case type + (ordered "") + (unordered "") + (descriptive ""))))) + +;; Copied from org-html-item, changed to call +;; org-reveal-format-list-item. +(defun org-reveal-item (item contents info) + "Transcode an ITEM element from Org to Reveal. +CONTENTS holds the contents of the item. INFO is a plist holding +contextual information." + (let* ((plain-list (org-export-get-parent item)) + (type (org-element-property :type plain-list)) + (counter (org-element-property :counter item)) + (attributes (org-export-read-attribute :attr_html item)) + ; (attributes (org-html--make-attribute-string (org-export-read-attribute :attr_html item))) + (checkbox (org-element-property :checkbox item)) + (tag (let ((tag (org-element-property :tag item))) + (and tag (org-export-data tag info))))) + (org-reveal-format-list-item + contents type checkbox attributes info (or tag counter)))) + +(defun org-reveal-keyword (keyword contents info) + "Transcode a KEYWORD element from Org to Reveal, +and may change custom variables as SIDE EFFECT. +CONTENTS is nil. INFO is a plist holding contextual information." + (let ((key (org-element-property :key keyword)) + (value (org-element-property :value keyword))) + (case (intern key) + (REVEAL (org-reveal-parse-keyword-value value)) + (REVEAL_HTML value) + (HTML value)))) +(defun org-reveal-embedded-svg (path) + "Embed the SVG content into Reveal HTML." + (with-temp-buffer + (insert-file-contents-literally path) + (let ((start (re-search-forward "<[ \t\n]*svg[ \t\n]")) + (end (re-search-forward "<[ \t\n]*/svg[ \t\n]*>"))) + (concat "\n%s\n\n" + (if attrs (concat " " (org-html--make-attribute-string attrs)) "") + (org-html-latex-environment latex-env contents info)))) + +(defun org-reveal-plain-list (plain-list contents info) + "Transcode a PLAIN-LIST element from Org to Reveal. + +CONTENTS is the contents of the list. INFO is a plist holding +contextual information. + +Extract and set `attr_html' to plain-list tag attributes." + (let ((tag (case (org-element-property :type plain-list) + (ordered "ol") + (unordered "ul") + (descriptive "dl"))) + (attrs (org-export-read-attribute :attr_html plain-list))) + (format "%s<%s%s>\n%s\n%s" + (if (string= org-html-checkbox-type 'html) "
" "") + tag + (if attrs (concat " " (org-html--make-attribute-string attrs)) "") + contents + tag + (if (string= org-html-checkbox-type 'html) "
" "")))) + +(defun org-reveal--build-pre/postamble (type info) + "Return document preamble or postamble as a string, or nil." + (let ((section (plist-get info (intern (format ":reveal-%s" type)))) + (spec (org-html-format-spec info))) + (when section + (let ((section-contents + (if (functionp (intern section)) (funcall (intern section) info) + ;; else section is a string. + (format-spec section spec)))) + (when (org-string-nw-p section-contents) + (org-element-normalize-string section-contents)))))) + + +(defun org-reveal-section (section contents info) + "Transcode a SECTION element from Org to Reveal. +CONTENTS holds the contents of the section. INFO is a plist +holding contextual information." + ;; Just return the contents. No "
" tags. + contents) + +(defun org-reveal--using-highlight.js (info) + "Check whether highlight.js plugin is enabled." + (let ((reveal-plugins (condition-case e + (car (read-from-string (plist-get info :reveal-plugins))) + (end-of-file nil) + (wrong-type-argument nil)))) + (memq 'highlight (or (and reveal-plugins (listp reveal-plugins) reveal-plugins) + org-reveal-plugins)))) + +(defun org-reveal-src-block (src-block contents info) + "Transcode a SRC-BLOCK element from Org to Reveal. +CONTENTS holds the contents of the item. INFO is a plist holding +contextual information." + (if (org-export-read-attribute :attr_html src-block :textarea) + (org-html--textarea-block src-block) + (let* ((use-highlight (org-reveal--using-highlight.js info)) + (lang (org-element-property :language src-block)) + (caption (org-export-get-caption src-block)) + (code (if (not use-highlight) + (org-html-format-code src-block info) + (cl-letf (((symbol-function 'org-html-htmlize-region-for-paste) + #'buffer-substring)) + (org-html-format-code src-block info)))) + (frag (org-export-read-attribute :attr_reveal src-block :frag)) + (code-attribs (or (org-export-read-attribute + :attr_reveal src-block :code_attribs) "")) + (label (let ((lbl (org-element-property :name src-block))) + (if (not lbl) "" + (format " id=\"%s\"" lbl))))) + (if (not lang) + (format "
\n%s
" + (or (frag-class frag info) " class=\"example\"") + label + code) + (format + "
\n%s%s\n
" + (if (not caption) "" + (format "" + (org-export-data caption info))) + (if use-highlight + (format "\n%s" + (or (frag-class frag info) "") + label lang code-attribs code) + (format "\n
%s
" + (or (frag-class frag info) + (format " class=\"src src-%s\"" lang)) + label code))))))) + +(defun org-reveal-quote-block (quote-block contents info) + "Transcode a QUOTE-BLOCK element from Org to Reveal. +CONTENTS holds the contents of the block INFO is a plist holding +contextual information." + (format "
\n%s
" + (frag-class (org-export-read-attribute :attr_reveal quote-block :frag) info) + contents)) + + +(defun org-reveal--auto-title-slide-template (info) + "Generate the automatic title slide template." + (let* ((spec (org-html-format-spec info)) + (title (org-export-data (plist-get info :title) info)) + (author (cdr (assq ?a spec))) + (email (cdr (assq ?e spec))) + (date (cdr (assq ?d spec)))) + (concat + (when (and (plist-get info :with-title) + (org-string-nw-p title)) + (concat "

" title "

")) + (when (and (plist-get info :with-author) + (org-string-nw-p author)) + (concat "

" author "

")) + (when (and (plist-get info :with-email) + (org-string-nw-p email)) + (concat "

" email "

")) + (when (and (plist-get info :with-date) + (org-string-nw-p date)) + (concat "

" date "

")) + (when (plist-get info :time-stamp-file) + (concat "

" + (org-html--translate "Created" info) + ": " + (format-time-string + (plist-get info :html-metadata-timestamp-format)) + "

"))))) + +(defun org-reveal-template (contents info) + "Return complete document string after HTML conversion. +contents is the transcoded contents string. +info is a plist holding export options." + (concat + (format "\n\n\n" + (if-format " lang=\"%s\"" (plist-get info :language))) + "\n" + (if-format "%s\n" (org-export-data (plist-get info :title) info)) + (if-format "\n" (plist-get info :author)) + (if-format "\n" (plist-get info :description)) + (if-format "\n" (plist-get info :keywords)) + (org-reveal-stylesheets info) + (org-reveal-mathjax-scripts info) + (org-reveal--build-pre/postamble 'head-preamble info) + (org-element-normalize-string (plist-get info :html-head)) + (org-element-normalize-string (plist-get info :html-head-extra)) + " +\n" + (org-reveal--build-pre/postamble 'preamble info) + "
+
\n" + ;; Title slides + (let ((title-slide (plist-get info :reveal-title-slide))) + (when (and title-slide (not (plist-get info :reveal-subtree))) + (let ((title-slide-background (plist-get info :reveal-title-slide-background)) + (title-slide-background-size (plist-get info :reveal-title-slide-background-size)) + (title-slide-background-position (plist-get info :reveal-title-slide-background-position)) + (title-slide-background-repeat (plist-get info :reveal-title-slide-background-repeat)) + (title-slide-background-transition (plist-get info :reveal-title-slide-background-transition))) + (concat "
" + (cond ((eq title-slide nil) nil) + ((stringp title-slide) (format-spec title-slide (org-html-format-spec info))) + ((eq title-slide 'auto) (org-reveal--auto-title-slide-template info))) + "\n
\n")))) + contents + "
+
\n" + (org-reveal--build-pre/postamble 'postamble info) + (org-reveal-scripts info) + " +\n")) + +(defun org-reveal-filter-parse-tree (tree backend info) + "Do filtering before parsing TREE. + +Tree is the parse tree being exported. BACKEND is the export +back-end used. INFO is a plist-used as a communication channel. + +Assuming BACKEND is `reveal'. + +Each `attr_reveal' attribute is mapped to corresponding +`attr_html' attributes." + (let ((default-frag-style (plist-get info :reveal-default-frag-style))) + (org-element-map tree (remq 'item org-element-all-elements) + (lambda (elem) (org-reveal-append-frag elem default-frag-style)))) + ;; Return the updated tree. + tree) + +(defun org-reveal--update-attr-html (elem frag default-style &optional frag-index) + "Update ELEM's attr_html atrribute with reveal's +fragment attributes." + (let ((attr-html (org-element-property :attr_html elem))) + (when (and frag (not (string= frag "none"))) + (push (cond ((string= frag t) + (if default-style (format ":class fragment %s" default-style) + ":class fragment")) + (t (format ":class fragment %s" frag))) + attr-html) + (when frag-index + (push (format ":data-fragment-index %s" frag-index) attr-html))) + (org-element-put-property elem :attr_html attr-html))) + +(defun org-reveal-append-frag (elem default-style) + "Read org-reveal's fragment attribute from ELEM and append +transformed fragment attribute to ELEM's attr_html plist." + (let ((frag (org-export-read-attribute :attr_reveal elem :frag)) + (frag-index (org-export-read-attribute :attr_reveal elem :frag_idx))) + (if frag + (cond ((and (string= (org-element-type elem) 'plain-list) + (char-equal (string-to-char frag) ?\()) + (let* ((frag-list (car (read-from-string frag))) + (frag-list (if default-style + (mapcar (lambda (s) + "Replace t with default-style" + (if (string= s t) default-style + s)) + frag-list) + frag-list)) + (items (org-element-contents elem))) + (if frag-index + (mapcar* 'org-reveal--update-attr-html + items frag-list default-style (car (read-from-string frag-index))) + (let* ((last-frag (car (last frag-list))) + (tail-list (mapcar (lambda (a) last-frag) + (number-sequence (+ (length frag-list) 1) + (length items)))) + (default-style-list + (mapcar (lambda (a) default-style) + (number-sequence 1 (length items))))) + (nconc frag-list tail-list) + (mapcar* 'org-reveal--update-attr-html items frag-list default-style-list))))) + (t (org-reveal--update-attr-html elem frag default-style frag-index))) + elem))) + +(defvar client-multiplex nil + "used to cause generation of client html file for multiplex") + +(defun org-reveal-export-to-html + (&optional async subtreep visible-only body-only ext-plist) + "Export current buffer to a reveal.js HTML file." + (interactive) + (let* ((extension (concat "." org-html-extension)) + (file (org-export-output-file-name extension subtreep)) + (clientfile (org-export-output-file-name (concat "_client" extension) subtreep))) + + ; export filename_client HTML file if multiplexing + (setq client-multiplex nil) + (setq retfile (org-export-to-file 'reveal file + async subtreep visible-only body-only ext-plist)) + + ; export the client HTML file if client-multiplex is set true + ; by previous call to org-export-to-file + (if (eq client-multiplex t) + (org-export-to-file 'reveal clientfile + async subtreep visible-only body-only ext-plist)) + (cond (t retfile)))) + +(defun org-reveal-export-to-html-and-browse + (&optional async subtreep visible-only body-only ext-plist) + "Export current buffer to a reveal.js and browse HTML file." + (interactive) + (browse-url-of-file (expand-file-name (org-reveal-export-to-html async subtreep visible-only body-only ext-plist)))) + +(defun org-reveal-export-current-subtree + (&optional async subtreep visible-only body-only ext-plist) + "Export current subtree to a Reveal.js HTML file." + (interactive) + (org-narrow-to-subtree) + (let ((ret (org-reveal-export-to-html async subtreep visible-only body-only (plist-put ext-plist :reveal-subtree t)))) + (widen) + ret)) + +;;;###autoload +(defun org-reveal-publish-to-reveal + (plist filename pub-dir) + "Publish an org file to Html. + +FILENAME is the filename of the Org file to be published. PLIST +is the property list for the given project. PUB-DIR is the +publishing directory. + +Return output file name." + (org-publish-org-to 'reveal filename ".html" plist pub-dir)) + +;; Register auto-completion for speaker notes. +(when org-reveal-note-key-char + (add-to-list 'org-structure-template-alist + (list org-reveal-note-key-char "#+BEGIN_NOTES\n\?\n#+END_NOTES"))) + +(provide 'ox-reveal) + +;;; ox-reveal.el ends here -- 2.47.3