mirror of https://github.com/yjwen/org-reveal.git
Initial version.
This commit is contained in:
parent
c02b65c2e5
commit
238fa41446
|
@ -0,0 +1,233 @@
|
||||||
|
#+Title: Introduction to Org-Reveal
|
||||||
|
#+Author: Yujie Wen
|
||||||
|
#+Email: yjwen.ty@gmail.com
|
||||||
|
|
||||||
|
#+OPTIONS: reveal_center:nil
|
||||||
|
#+REVEAL_TRANS: cube
|
||||||
|
#+REVEAL_THEME: moon
|
||||||
|
#+REVEAL_HLEVEL: 2
|
||||||
|
|
||||||
|
* Reveal.js and Org-Reveal
|
||||||
|
|
||||||
|
- *Reveal.js* is a tool for creating good look HTML presentations,
|
||||||
|
authored by Hakim El Hattab. \\
|
||||||
|
For an example of reveal.js presentation, click [[http://lab.hakim.se/reveal-js/#/][here]].
|
||||||
|
- *Org-Reveal* exports your Org documents to reveal.js
|
||||||
|
presentations.\\
|
||||||
|
So you can create beautiful presentations with 3D effects from
|
||||||
|
simple but powerful org contents.
|
||||||
|
|
||||||
|
* Requirements and Installation
|
||||||
|
|
||||||
|
- Reveal.js.
|
||||||
|
- Latest org-mode.
|
||||||
|
- ox-reveal.el.
|
||||||
|
- And, of course, emacs.
|
||||||
|
|
||||||
|
** Obtain Reveal.js
|
||||||
|
|
||||||
|
Download Reveal.js packages from [[https://github.com/hakimel/reveal.js/][here]].
|
||||||
|
|
||||||
|
Extract reveal.js folders from the downloaded zip file.
|
||||||
|
|
||||||
|
** Obtain org-mode
|
||||||
|
|
||||||
|
*Note*: Org-reveal relies on the LATEST org-mode export frame work.
|
||||||
|
Pre-packaged org-mode may be out-of-date.
|
||||||
|
|
||||||
|
If not sure, use the freshest development codes from git repository.
|
||||||
|
#+BEGIN_SRC sh
|
||||||
|
$ git clone git://orgmode.org/org-mode.git
|
||||||
|
#+END_SRC
|
||||||
|
|
||||||
|
Follow the [[http://orgmode.org/worg/dev/org-build-system.html][online instruction]] to build and install Org-mode.
|
||||||
|
|
||||||
|
** TODO Obtain Org-reveal
|
||||||
|
|
||||||
|
Obtain latest Org-reveal from github.
|
||||||
|
|
||||||
|
Copy =ox-reveal.el= to the Org-mode install directory.
|
||||||
|
|
||||||
|
Add the following statement to your =.emacs= file.
|
||||||
|
#+BEGIN_SRC lisp
|
||||||
|
(require 'ox-reveal)
|
||||||
|
#+END_SRC
|
||||||
|
|
||||||
|
* Configuration
|
||||||
|
|
||||||
|
** Set the location of Reveal.js
|
||||||
|
|
||||||
|
Org-reveal must know where reveal.js is before exporting Org
|
||||||
|
contents.
|
||||||
|
|
||||||
|
Default location is =./reveal.js=, relative to the Org file.
|
||||||
|
|
||||||
|
Change variable =org-reveal-root= 's value will change the location
|
||||||
|
globally. For example, add the following statement to your .emacs
|
||||||
|
file:
|
||||||
|
#+BEGIN_SRC lisp
|
||||||
|
(setq org-reveal-root "d:/reveal.js")
|
||||||
|
#+END_SRC
|
||||||
|
|
||||||
|
By setting option =REVEAL_ROOT=, the location is only affected
|
||||||
|
within the Org file.
|
||||||
|
|
||||||
|
#+BEGIN_SRC org
|
||||||
|
,#+REVEAL_ROOT: d:/reveal.js
|
||||||
|
#+END_SRC
|
||||||
|
|
||||||
|
** First Try
|
||||||
|
|
||||||
|
Modifications to =.emacs= will take effect at next time Emacs
|
||||||
|
starts up.
|
||||||
|
|
||||||
|
To wake-up Org-reveal now, type "M-x load-library", then type
|
||||||
|
"ox-reveal".
|
||||||
|
|
||||||
|
Now you can export this manual into Reveal.js presentation by
|
||||||
|
typing "C-c C-e R R".
|
||||||
|
|
||||||
|
Open the generated "Readme.html" in your browser and enjoy the
|
||||||
|
cool slides.
|
||||||
|
|
||||||
|
** The HLevel
|
||||||
|
|
||||||
|
Org-reveal maps each heading and its contents to one Reveal.js
|
||||||
|
slides. Since Reveal.js arrange slides into a 2-dimentional matrix,
|
||||||
|
Org-reveal use *HLevel* value to decide map headings to hozirontal
|
||||||
|
or vertical slides.
|
||||||
|
|
||||||
|
* Headings of level less or equal to HLevel are mapped to hozirontal
|
||||||
|
slides.
|
||||||
|
* Headings of deeper levels are mapped to vertical slides.
|
||||||
|
|
||||||
|
HLevel's default value is 1, means only level 1 headings are arranged
|
||||||
|
horizontally, deeper headings are mapped to vertical slides below its
|
||||||
|
parent level 1 heading.
|
||||||
|
|
||||||
|
*** HLevel's Affects on Slides Layout
|
||||||
|
|
||||||
|
Assume we have a simple Org file as below:
|
||||||
|
#+BEGIN_SRC org
|
||||||
|
,* H1
|
||||||
|
,* H2
|
||||||
|
,** H2.1
|
||||||
|
,*** H2.1.1
|
||||||
|
,* H3
|
||||||
|
#+END_SRC
|
||||||
|
|
||||||
|
If HLevel is 1, the default value, headings H2.1 and H2.1.1 will
|
||||||
|
be mapping to vertical slides below the slides of heading H2.
|
||||||
|
|
||||||
|
[[./images/hlevel.png]]
|
||||||
|
|
||||||
|
If HLevel is changed to 2, slide of heading H2.1 will be changed
|
||||||
|
to the main hozirontal queue, and slide of heading H2.1.1 will be
|
||||||
|
a vertical slide below it.
|
||||||
|
|
||||||
|
[[./images/hlevel2.png]]
|
||||||
|
|
||||||
|
*** Configure HLevel's Value
|
||||||
|
|
||||||
|
* Change variable =org-reveal-hlevel='s value to set HLevel globally.\\
|
||||||
|
For example, add the following statement to your =.emacs= file.
|
||||||
|
#+BEGIN_SRC lisp
|
||||||
|
(setq org-reveal-hlevel 2)
|
||||||
|
#+END_SRC
|
||||||
|
|
||||||
|
* Setting Org files local HLevel to option =REVEAL_HLEVEL=.
|
||||||
|
#+BEGIN_SRC org
|
||||||
|
,#+REVEAL_HLEVEL 2
|
||||||
|
#+END_SRC
|
||||||
|
|
||||||
|
** Select Theme and Transition
|
||||||
|
|
||||||
|
Themes and transitions are set globally throughout the whole file by
|
||||||
|
setting options =REVEAL_THEME= and =REVEAL_TRANS=.
|
||||||
|
|
||||||
|
For example, check the heading parting of this documents.
|
||||||
|
|
||||||
|
Available themes can be find in "css/theme/" in the reveal.js directory.
|
||||||
|
|
||||||
|
Available transitions are: default|cube|page|concave|zoom|linear|fade|none.
|
||||||
|
|
||||||
|
** Fragmented Contents
|
||||||
|
|
||||||
|
Make contents fragmented, show up one-by-one, by setting option =ATTR_REVEAL= with
|
||||||
|
property ":frag frag-style", as illustrated below.
|
||||||
|
|
||||||
|
#+ATTR_REVEAL: :frag roll-in
|
||||||
|
Paragraphs can be fragmented.
|
||||||
|
|
||||||
|
#+ATTR_REVEAL: :frag roll-in
|
||||||
|
Items can be fragmented, too.
|
||||||
|
|
||||||
|
Availabe fragment styles are:
|
||||||
|
#+ATTR_REVEAL: :frag grow
|
||||||
|
* grow
|
||||||
|
#+ATTR_REVEAL: :frag shrink
|
||||||
|
* shrink
|
||||||
|
#+ATTR_REVEAL: :frag roll-in
|
||||||
|
* roll-in
|
||||||
|
#+ATTR_REVEAL: :frag fade-out
|
||||||
|
* fade-out
|
||||||
|
#+ATTR_REVEAL: :frag highlight-red
|
||||||
|
* highlight-red
|
||||||
|
#+ATTR_REVEAL: :frag highlight-green
|
||||||
|
* highlight-green
|
||||||
|
#+ATTR_REVEAL: :frag highlight-blue
|
||||||
|
* highlight-blue
|
||||||
|
|
||||||
|
** Data State
|
||||||
|
:PROPERTIES:
|
||||||
|
:reveal_data_state: alert
|
||||||
|
:END:
|
||||||
|
|
||||||
|
Set property =reveal_data_state= to headings to change this slide's
|
||||||
|
style, as illustrated above.
|
||||||
|
|
||||||
|
** Plug-ins
|
||||||
|
|
||||||
|
Reveal.js provides several plug-in functions.
|
||||||
|
|
||||||
|
- reveal-control : Show/hide browse control pad.
|
||||||
|
- reveal-progress : Show/hide progress bar.
|
||||||
|
- reveal-history : Enable/disable slide history track.
|
||||||
|
- reveal-center : Enable/disable slide centering.
|
||||||
|
|
||||||
|
*** Configure Plug-ins
|
||||||
|
|
||||||
|
Each plug-ins can be set on/off by adding =#+OPTIONS= tags or
|
||||||
|
settinng custom variables.
|
||||||
|
|
||||||
|
- =#+OPTIONS= tags:\\
|
||||||
|
=reveal_control=, =reveal_progress=, =reveal_history=,
|
||||||
|
=reveal_center=
|
||||||
|
- Custom variables:\\
|
||||||
|
=org-reveal-control=, =org-reveal-progress=,
|
||||||
|
=org-reveal-history=, =org-reveal-center=
|
||||||
|
|
||||||
|
** Source Codes
|
||||||
|
|
||||||
|
Org-reveal use Org-Babel to highlight source codes.
|
||||||
|
|
||||||
|
Codes copied from [[http://www.haskell.org/haskellwiki/The_Fibonacci_sequence][Haskell Wiki]].
|
||||||
|
#+BEGIN_SRC haskell
|
||||||
|
|
||||||
|
fibs = 0 : 1 : next fibs
|
||||||
|
where next (a : t@(b:_)) = (a+b) : next t
|
||||||
|
#+END_SRC
|
||||||
|
|
||||||
|
If you saw odd indentation, please set variable =org-html-indent=
|
||||||
|
to nil and export again.
|
||||||
|
|
||||||
|
* Thanks
|
||||||
|
|
||||||
|
Courtesy to:
|
||||||
|
|
||||||
|
#+ATTR_REVEAL: :frag roll-in
|
||||||
|
the powerfull Org-mode,
|
||||||
|
#+ATTR_REVEAL: :frag roll-in
|
||||||
|
and the impressive Reveal.js
|
||||||
|
|
||||||
|
|
Binary file not shown.
After Width: | Height: | Size: 3.2 KiB |
Binary file not shown.
After Width: | Height: | Size: 2.8 KiB |
|
@ -0,0 +1,433 @@
|
||||||
|
;; ox-reveal --- reveal.js Presentation Back-End for Org Export Engine
|
||||||
|
|
||||||
|
;; Copyright (C) 2013 Yujie Wen
|
||||||
|
|
||||||
|
;; Author: Yujie Wen <yjwen.ty at gmail dot com>
|
||||||
|
;; Keywords: outlines, hypermedia, slideshow, presentation
|
||||||
|
|
||||||
|
;; This file is not part of GNU Emacs.
|
||||||
|
|
||||||
|
;; 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 <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
;; Please see "Readme.org" for detail introductions.
|
||||||
|
|
||||||
|
(require 'ox-html)
|
||||||
|
(eval-when-compile (require 'cl))
|
||||||
|
|
||||||
|
(org-export-define-derived-backend reveal html
|
||||||
|
|
||||||
|
:menu-entry
|
||||||
|
(?R "Export to reveal.js HTML Presentation"
|
||||||
|
((?R "To file" org-reveal-export-to-html)))
|
||||||
|
|
||||||
|
:options-alist
|
||||||
|
((:reveal-control nil "reveal_control" org-reveal-control t)
|
||||||
|
(:reveal-progress nil "reveal_progress" org-reveal-progress t)
|
||||||
|
(:reveal-history nil "reveal_history" org-reveal-history t)
|
||||||
|
(:reveal-center nil "reveal_center" org-reveal-center t)
|
||||||
|
(:reveal-root "REVEAL_ROOT" nil org-reveal-root t)
|
||||||
|
(:reveal-trans "REVEAL_TRANS" nil org-reveal-transition t)
|
||||||
|
(:reveal-theme "REVEAL_THEME" nil org-reveal-theme t)
|
||||||
|
(:reveal-hlevel "REVEAL_HLEVEL" nil nil t)
|
||||||
|
)
|
||||||
|
|
||||||
|
:translate-alist
|
||||||
|
((headline . org-reveal-headline)
|
||||||
|
(inner-template . org-reveal-inner-template)
|
||||||
|
(item . org-reveal-item)
|
||||||
|
(paragraph . org-reveal-paragraph)
|
||||||
|
(template . org-reveal-template)))
|
||||||
|
|
||||||
|
(defcustom org-reveal-root "./reveal.js"
|
||||||
|
"The root directory of reveal.js packages. It is the directory
|
||||||
|
within which js/reveal.min.js is."
|
||||||
|
:group 'org-export-reveal)
|
||||||
|
|
||||||
|
(defcustom org-reveal-hlevel 1
|
||||||
|
"The minimum level of headings that should be grouped into
|
||||||
|
vertical slides."
|
||||||
|
:group 'org-export-reveal
|
||||||
|
:type 'integer)
|
||||||
|
|
||||||
|
(defun org-reveal--get-hlevel (info)
|
||||||
|
"Get HLevel value safely.
|
||||||
|
If option \"REVEAL_HLEVEL\" is set, retrieve integer value from it,
|
||||||
|
else get value from custom variable `org-reveal-hlevel'."
|
||||||
|
(let ((hlevel-str (plist-get info :reveal-hlevel)))
|
||||||
|
(if hlevel-str (string-to-int hlevel-str)
|
||||||
|
org-reveal-hlevel)))
|
||||||
|
|
||||||
|
(defcustom org-reveal-title-slide-template
|
||||||
|
"<h1>%t</h1>
|
||||||
|
<h2>%a</h2>
|
||||||
|
<h2>%e</h2>
|
||||||
|
<h2>%d</h2>"
|
||||||
|
"Format template to specify title page slide.
|
||||||
|
See `org-html-postamble-format' for the valid elements which
|
||||||
|
can be include."
|
||||||
|
:group 'org-export-reveal
|
||||||
|
:type 'string)
|
||||||
|
|
||||||
|
(defcustom org-reveal-transition
|
||||||
|
"default"
|
||||||
|
"Reveal transistion style."
|
||||||
|
:group 'org-export-reveal
|
||||||
|
:type 'string)
|
||||||
|
|
||||||
|
(defcustom org-reveal-theme
|
||||||
|
"default"
|
||||||
|
"Reveal theme."
|
||||||
|
:group 'org-export-reveal
|
||||||
|
:type 'string)
|
||||||
|
|
||||||
|
(defcustom org-reveal-control t
|
||||||
|
"Reveal control applet."
|
||||||
|
:group 'org-export-reveal
|
||||||
|
:type 'string)
|
||||||
|
|
||||||
|
(defcustom org-reveal-progress t
|
||||||
|
"Reveal progress applit."
|
||||||
|
:group 'org-export-reveal
|
||||||
|
:type 'boolean)
|
||||||
|
|
||||||
|
(defcustom org-reveal-history t
|
||||||
|
"Reveal history applit."
|
||||||
|
:group 'org-export-reveal
|
||||||
|
:type 'boolean)
|
||||||
|
|
||||||
|
(defcustom org-reveal-center t
|
||||||
|
"Reveal center applit."
|
||||||
|
:group 'org-export-reveal
|
||||||
|
:type 'boolean)
|
||||||
|
|
||||||
|
(defun if-format (fmt val)
|
||||||
|
(if val (format fmt val) ""))
|
||||||
|
|
||||||
|
(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."
|
||||||
|
;; First call org-html-headline to get the formatted HTML contents.
|
||||||
|
;; Then add enclosing <section> tags to mark slides.
|
||||||
|
(setq contents (or contents ""))
|
||||||
|
(let* ((numberedp (org-export-numbered-headline-p headline info))
|
||||||
|
(level (org-export-get-relative-level headline info))
|
||||||
|
(text (org-export-data (org-element-property :title 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)))
|
||||||
|
(tags (and (plist-get info :with-tags)
|
||||||
|
(org-export-get-tags headline info)))
|
||||||
|
(priority (and (plist-get info :with-priority)
|
||||||
|
(org-element-property :priority headline)))
|
||||||
|
(section-number (and (org-export-numbered-headline-p headline info)
|
||||||
|
(mapconcat 'number-to-string
|
||||||
|
(org-export-get-headline-number
|
||||||
|
headline info) ".")))
|
||||||
|
;; Create the headline text.
|
||||||
|
(full-text (org-html-format-headline--wrap headline info)))
|
||||||
|
(cond
|
||||||
|
;; Case 1: This is a footnote section: ignore it.
|
||||||
|
((org-element-property :footnote-section-p headline) nil)
|
||||||
|
;; Case 2. This is a deep sub-tree: export it as a list item.
|
||||||
|
;; Also export as items headlines for which no section
|
||||||
|
;; format has been found.
|
||||||
|
((org-export-low-level-p headline info)
|
||||||
|
;; Build the real contents of the sub-tree.
|
||||||
|
(let* ((type (if numberedp 'ordered 'unordered))
|
||||||
|
(itemized-body (org-reveal-format-list-item
|
||||||
|
contents type nil nil 'none full-text)))
|
||||||
|
(concat
|
||||||
|
(and (org-export-first-sibling-p headline info)
|
||||||
|
(org-html-begin-plain-list type))
|
||||||
|
itemized-body
|
||||||
|
(and (org-export-last-sibling-p headline info)
|
||||||
|
(org-html-end-plain-list type)))))
|
||||||
|
;; Case 3. Standard headline. Export it as a section.
|
||||||
|
(t
|
||||||
|
(let* ((section-number (mapconcat 'number-to-string
|
||||||
|
(org-export-get-headline-number
|
||||||
|
headline info) "-"))
|
||||||
|
(ids (remove 'nil
|
||||||
|
(list (org-element-property :CUSTOM_ID headline)
|
||||||
|
(concat "sec-" section-number)
|
||||||
|
(org-element-property :ID headline))))
|
||||||
|
(extra-ids (cdr ids))
|
||||||
|
(level1 (+ level (1- org-html-toplevel-hlevel)))
|
||||||
|
(hlevel (org-reveal--get-hlevel info))
|
||||||
|
(first-content (car (org-element-contents headline))))
|
||||||
|
(concat
|
||||||
|
(if (or (/= level 1)
|
||||||
|
(not (org-export-first-sibling-p headline info)))
|
||||||
|
;; Stop previous slide.
|
||||||
|
"</section>\n")
|
||||||
|
(if (eq level hlevel)
|
||||||
|
;; Add an extra "<section>" to group following slides
|
||||||
|
;; into vertical ones.
|
||||||
|
"<section>\n")
|
||||||
|
;; Start a new slide.
|
||||||
|
(format "<section%s>\n"
|
||||||
|
(if-format " data-state=\"%s\"" (org-element-property :REVEAL_DATA_STATE headline)))
|
||||||
|
;; The HTML content of this headline.
|
||||||
|
(format "\n<h%d%s>%s%s</h%d>\n"
|
||||||
|
level1
|
||||||
|
(if-format " class=\"fragment %s\""
|
||||||
|
(org-element-property :REVEAL-FRAG headline))
|
||||||
|
(mapconcat
|
||||||
|
(lambda (x)
|
||||||
|
(let ((id (org-export-solidify-link-text
|
||||||
|
(if (org-uuidgen-p x) (concat "ID-" x)
|
||||||
|
x))))
|
||||||
|
(org-html--anchor id)))
|
||||||
|
extra-ids "")
|
||||||
|
full-text
|
||||||
|
level1)
|
||||||
|
;; When there is no section, pretend there is an empty
|
||||||
|
;; one to get the correct <div class="outline- ...>
|
||||||
|
;; which is needed by `org-info.js'.
|
||||||
|
(if (not (eq (org-element-type first-content) 'section))
|
||||||
|
(concat (org-html-section first-content "" info)
|
||||||
|
contents)
|
||||||
|
contents)
|
||||||
|
(if (= level hlevel)
|
||||||
|
;; Add an extra "</section>" to stop vertical slide
|
||||||
|
;; grouping.
|
||||||
|
"</section>\n")
|
||||||
|
(if (and (= level 1)
|
||||||
|
(org-export-last-sibling-p headline info))
|
||||||
|
;; Last head 1. Stop all slides.
|
||||||
|
"</section>")))))))
|
||||||
|
|
||||||
|
(defgroup org-export-reveal nil
|
||||||
|
"Options for exporting Orgmode files to reveal.js HTML pressentations."
|
||||||
|
:tag "Org Export reveal")
|
||||||
|
|
||||||
|
(defun org-reveal--append-path (dir-name path-name)
|
||||||
|
"Append `path-name' to the end of `dir-name' to form a legal path name."
|
||||||
|
(concat (file-name-as-directory dir-name) path-name))
|
||||||
|
|
||||||
|
(defun org-reveal--append-pathes (dir-name pathes)
|
||||||
|
"Append all the path names in `pathes' to the end of `dir-name'
|
||||||
|
to form a legal path name."
|
||||||
|
(if pathes
|
||||||
|
(org-reveal--append-pathes
|
||||||
|
(org-reveal--append-path dir-name (car pathes))
|
||||||
|
(cdr pathes))
|
||||||
|
dir-name))
|
||||||
|
|
||||||
|
|
||||||
|
(defun org-reveal-stylesheets (info)
|
||||||
|
"Return the HTML contents for decalaring reveal stylesheets
|
||||||
|
using custom variable `org-reveal-root'."
|
||||||
|
(let* ((root-path (plist-get info :reveal-root))
|
||||||
|
(css-dir-name (org-reveal--append-path root-path "css"))
|
||||||
|
(min-css-file-name (org-reveal--append-path css-dir-name "reveal.min.css"))
|
||||||
|
(theme-file (format "%s.css" (plist-get info :reveal-theme)))
|
||||||
|
(theme-path (org-reveal--append-path css-dir-name "theme"))
|
||||||
|
(theme-full (org-reveal--append-path theme-path theme-file)))
|
||||||
|
(format "<link rel=\"stylesheet\" href=\"%s\">
|
||||||
|
<link rel=\"stylesheet\" href=\"%s\" id=\"theme\">"
|
||||||
|
min-css-file-name theme-full)))
|
||||||
|
|
||||||
|
|
||||||
|
(defun org-reveal-scripts (info)
|
||||||
|
"Return the necessary scripts for initializing reveal.js using
|
||||||
|
custom variable `org-reveal-root'."
|
||||||
|
(let* ((root-path (plist-get info :reveal-root))
|
||||||
|
(root-dir-name (file-name-as-directory root-path))
|
||||||
|
(lib-dir-name (org-reveal--append-path root-path "lib"))
|
||||||
|
(lib-js-dir-name (org-reveal--append-path lib-dir-name "js"))
|
||||||
|
(plugin-dir-name (org-reveal--append-path root-path "plugin"))
|
||||||
|
(markdown-dir-name (org-reveal--append-path plugin-dir-name "markdown")))
|
||||||
|
(concat
|
||||||
|
(format "<script src=\"%s\"></script>\n<script src=\"%s\"></script>\n"
|
||||||
|
(org-reveal--append-path lib-js-dir-name "head.min.js")
|
||||||
|
(org-reveal--append-pathes root-path '("js" "reveal.min.js")))
|
||||||
|
"<script>\n"
|
||||||
|
(format "
|
||||||
|
// Full list of configuration options available here:
|
||||||
|
// https://github.com/hakimel/reveal.js#configuration
|
||||||
|
Reveal.initialize({
|
||||||
|
controls: %s,
|
||||||
|
progress: %s,
|
||||||
|
history: %s,
|
||||||
|
center: %s,
|
||||||
|
|
||||||
|
theme: Reveal.getQueryHash().theme, // available themes are in /css/theme
|
||||||
|
transition: Reveal.getQueryHash().transition || '%s', // default/cube/page/concave/zoom/linear/fade/none\n"
|
||||||
|
(if (plist-get info :reveal-control) "true" "false")
|
||||||
|
(if (plist-get info :reveal-progress) "true" "false")
|
||||||
|
(if (plist-get info :reveal-history) "true" "false")
|
||||||
|
(if (plist-get info :reveal-center) "true" "false")
|
||||||
|
(plist-get info :reveal-trans))
|
||||||
|
(format "
|
||||||
|
// Optional libraries used to extend on reveal.js
|
||||||
|
dependencies: [
|
||||||
|
{ src: '%s', condition: function() { return !document.body.classList; } },
|
||||||
|
{ src: '%s', condition: function() { return !!document.querySelector( '[data-markdown]' ); } },
|
||||||
|
{ src: '%s', condition: function() { return !!document.querySelector( '[data-markdown]' ); } },
|
||||||
|
{ src: '%s', async: true, callback: function() { hljs.initHighlightingOnLoad(); } },
|
||||||
|
{ src: '%s', async: true, condition: function() { return !!document.body.classList; } },
|
||||||
|
{ src: '%s', async: true, condition: function() { return !!document.body.classList; } }
|
||||||
|
// { src: '%s', async: true, condition: function() { return !!document.body.classList; } }
|
||||||
|
// { src: '%s', async: true, condition: function() { return !!document.body.classList; } }
|
||||||
|
]
|
||||||
|
});\n"
|
||||||
|
(org-reveal--append-path lib-js-dir-name "classList.js")
|
||||||
|
(org-reveal--append-path markdown-dir-name "showdown.js")
|
||||||
|
(org-reveal--append-path markdown-dir-name "markdown.js")
|
||||||
|
(org-reveal--append-pathes plugin-dir-name '("highlight" "highlight.js"))
|
||||||
|
(org-reveal--append-pathes plugin-dir-name '("zoom-js" "zoom.js"))
|
||||||
|
(org-reveal--append-pathes plugin-dir-name '("notes" "notes.js"))
|
||||||
|
(org-reveal--append-pathes plugin-dir-name '("search" "search.js"))
|
||||||
|
(org-reveal--append-pathes plugin-dir-name '("remotes" "remotes.js")))
|
||||||
|
"</script>\n")))
|
||||||
|
|
||||||
|
(defun org-reveal-toc (depth info)
|
||||||
|
"Build a slide of table of contents."
|
||||||
|
(concat
|
||||||
|
"<section>\n"
|
||||||
|
(org-html-toc depth info)
|
||||||
|
"</section>\n"))
|
||||||
|
|
||||||
|
(defun org-reveal-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."
|
||||||
|
(concat
|
||||||
|
;; Table of contents.
|
||||||
|
(let ((depth (plist-get info :with-toc)))
|
||||||
|
(when depth (org-reveal-toc depth info)))
|
||||||
|
;; Document contents.
|
||||||
|
contents))
|
||||||
|
|
||||||
|
(defun org-reveal-format-list-item
|
||||||
|
(content type checkbox &optional term-counter-id frag headline)
|
||||||
|
"Format a list item into Reveal.js HTML."
|
||||||
|
(let ((checkbox (concat (org-html-checkbox checkbox) (and checkbox " "))))
|
||||||
|
(concat
|
||||||
|
(case type
|
||||||
|
(ordered
|
||||||
|
(concat
|
||||||
|
"<li"
|
||||||
|
(if-format " value=\"%s\"" counter)
|
||||||
|
(if-format " class=\"fragment %s\"" frag)
|
||||||
|
">"
|
||||||
|
(if headline (concat headline "<br/>"))))
|
||||||
|
(unordered
|
||||||
|
(concat
|
||||||
|
"<li"
|
||||||
|
(if-format " class=\"fragment %s\"" frag)
|
||||||
|
">"
|
||||||
|
(if headline (concat headline "<br/>"))))
|
||||||
|
(descriptive
|
||||||
|
(concat
|
||||||
|
"<dt"
|
||||||
|
(if-format " class=\"fragment %s\"" frag)
|
||||||
|
">"
|
||||||
|
(concat checkbox (or term-counter-id "(no term)"))
|
||||||
|
"</dt><dd>")))
|
||||||
|
(unless (eq type 'descriptive) checkbox)
|
||||||
|
contents
|
||||||
|
(case type
|
||||||
|
(ordered "</li>")
|
||||||
|
(unordered "</li>")
|
||||||
|
(descriptive "</dd>")))))
|
||||||
|
|
||||||
|
(defun org-reveal--headline-property (property blob)
|
||||||
|
"Get property from BLOB's parent headline and return."
|
||||||
|
(let ((headline (if (eq (org-element-type blob) 'headline) blob
|
||||||
|
(org-export-get-parent-headline blob))))
|
||||||
|
(org-element-property property headline)))
|
||||||
|
|
||||||
|
|
||||||
|
(defun org-reveal--get-frag (info)
|
||||||
|
"Get Reveal fragment settings from context."
|
||||||
|
(let ((frag (plist-get info :reveal-frag)))
|
||||||
|
(if (eq frag "none") nil frag)))
|
||||||
|
|
||||||
|
(defun org-reveal-item (item contents info)
|
||||||
|
"Transcode an ITEM element from Org to Reveal.
|
||||||
|
CONTENTS holds the contents of the item. INFO is aplist holding
|
||||||
|
contextual information."
|
||||||
|
(let* ((plain-list (org-export-get-parent item))
|
||||||
|
(type (org-element-property :type plain-list))
|
||||||
|
(counter (org-element-property :counter item))
|
||||||
|
(checkbox (org-element-property :checkbox item))
|
||||||
|
(tag (let ((tag (org-element-property :tag item)))
|
||||||
|
(and tag (org-export-data tag info))))
|
||||||
|
(frag (org-export-read-attribute :attr_reveal plain-list :frag)))
|
||||||
|
(org-reveal-format-list-item
|
||||||
|
contents type checkbox (or tag counter) frag)))
|
||||||
|
|
||||||
|
(defun org-reveal-paragraph (paragraph contents info)
|
||||||
|
"Transcode a PARAGRAPH element from Org to Reveal HTML.
|
||||||
|
CONTENTS is the contents of the paragraph, as a string. INFO is
|
||||||
|
the plist used as a communication channel."
|
||||||
|
(let ((parent (org-export-get-parent paragraph)))
|
||||||
|
(cond
|
||||||
|
((and (eq (org-element-type parent) 'item)
|
||||||
|
(= (org-element-property :begin paragraph)
|
||||||
|
(org-element-property :contents-begin parent)))
|
||||||
|
;; leading paragraph in a list item have no tags
|
||||||
|
contents)
|
||||||
|
((org-html-standalone-image-p paragraph info)
|
||||||
|
;; standalone image
|
||||||
|
contents)
|
||||||
|
(t (format "<p%s>\n%s</p>"
|
||||||
|
(if-format " class=\"fragment %s\""
|
||||||
|
(org-export-read-attribute :attr_reveal paragraph :frag))
|
||||||
|
contents)))))
|
||||||
|
|
||||||
|
|
||||||
|
(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 "<!doctype html>\n<html%s>\n<head>\n"
|
||||||
|
(if-format " lang=\"%s\"" (plist-get info :language)))
|
||||||
|
(if-format "<title>%s</title>\n" (plist-get info :title))
|
||||||
|
(if-format "<meta name=\"author\" content=\"%s\"/>\n" (plist-get info :author))
|
||||||
|
(if-format "<meta name=\"description\" content=\"%s\"/>\n" (plist-get info :description))
|
||||||
|
(if-format "<meta name=\"keywords\" content=\"%s\"/>\n" (plist-get info :keywords))
|
||||||
|
(org-reveal-stylesheets info)
|
||||||
|
"</head>
|
||||||
|
<body>
|
||||||
|
<div class=\"reveal\">
|
||||||
|
<div class=\"slides\">
|
||||||
|
<section>
|
||||||
|
"
|
||||||
|
(format-spec org-reveal-title-slide-template (org-html-format-spec info))
|
||||||
|
"</section>\n"
|
||||||
|
contents
|
||||||
|
"</div>
|
||||||
|
</div>\n"
|
||||||
|
(org-reveal-scripts info)
|
||||||
|
"</body>
|
||||||
|
</html>\n"))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
(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)))
|
||||||
|
(org-export-to-file
|
||||||
|
'reveal file subtreep visible-only body-only ext-plist)))
|
||||||
|
|
||||||
|
(provide 'ox-reveal)
|
Loading…
Reference in New Issue