| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396 | ;;; org-export.el --- Export engine for Org;;;; Copyright 2008 2010 Bastien Guerry;;;; Emacs Lisp Archive Entry;; Filename: org-export.el;; Version: 0.3;; Author: Bastien <bzg AT altern DOT org>;; Maintainer: Bastien <bzg AT altern DOT org>;; Keywords:;; Description:;; URL: [Not distributed yet];;;; 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, 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 this program; if not, write to the Free Software;; Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.;;;;; Commentary:;;;; org-export.el implements a new experimental export engine for Org.;;;; Put this file into your load-path and the following into your ~/.emacs:;;   (require 'org-export);;;;; Todo:;; ;; Rewrite `org-export-export-preprocess-string'.;;;;; Code:(eval-when-compile  (require 'cl));;; Preparation functions:(defvar org-export-structure nil)(defvar org-export-content nil)(defvar org-export-properties nil)(defun org-export-set-backend (suffix)  "Set the backend functions names from SUFFIX."  (setq org-export-structure	`((header ,(intern (concat "org-" suffix "-export-header")))	  (first-lines ,(intern (concat "org-" suffix "-export-first-lines")))	  (section-beginning ,(intern (concat "org-" suffix "-export-section-beginning")))	  (heading ,(intern (concat "org-" suffix "-export-heading")))	  (section-end ,(intern (concat "org-" suffix "-export-section-end")))	  (footer ,(intern (concat "org-" suffix "-export-footer")))))  (setq org-export-content	`((fonts ,(intern (concat "org-" suffix "-export-fonts")))	  (links ,(intern (concat "org-" suffix "-export-links")))	  (lists ,(intern (concat "org-" suffix "-export-lists")))	  (envs ,(intern (concat "org-" suffix "-export-quote-verse-center")))	  (tables ,(intern (concat "org-" suffix "-export-tables"))))));;; Parsing functions:(defun org-export-parse (&optional level)  "Recursively parse the current buffer.If LEVEL is set, do the parsing at that level of sectioning.Return a nested list containing the structure of the parsedbuffer and information about each section, including itscontent."  (let (output eos)    (save-excursion      (goto-char (point-min))      (while (re-search-forward org-complex-heading-regexp nil t)	(let ((heading (match-string 4))	      (properties (org-entry-properties)))	  (save-restriction	    (narrow-to-region (if (looking-at "\n") (1+ (point)) (point))			      (save-excursion				(setq eos (org-end-of-subtree t t))))	    (setq output		  (append output			  (list			   (list :level (or level 1)				 :heading heading				 :properties properties				 :content (org-export-get-entry-content)				 :subtree (org-export-parse					   (if level (1+ level) 2)))))))	  (goto-char (1- eos)))))    output))(defun org-export-get-entry-content ()  "Extract the content of an entry.The content of a entry is the part before its first subtree orthe end of the entry."  (save-excursion    (goto-char (point-min))    ;; FIXME The following shouldn't be necessary since we are cleaning    ;; up the buffer ith org-export-preprocess-string    (while (or (looking-at org-property-drawer-re)	       (looking-at org-clock-drawer-re)	       (looking-at org-keyword-time-regexp))      (move-beginning-of-line 1))    (buffer-substring     (point)     (if (re-search-forward org-complex-heading-regexp nil t)	 (match-beginning 0) (point-max)))));;; Rendering functions:(defun org-export-render (&optional filter)  "Render the current Org buffer and export it.First parse the buffer and return it as a nested list.  If FILTERis set, use it to filter this list (see `org-export-filter') thenexport the (filtered) list with `org-export-render-structure'."  (setq org-export-properties 	(org-combine-plists (org-default-export-plist)			    (org-infile-export-plist)))  (let* (first-lines	 (bstring (buffer-string))	 (parsed-buffer	  (with-temp-buffer	    (org-mode)	    (insert (apply 'org-export-export-preprocess-string 			   bstring org-export-properties))	    (goto-char (point-min))	    (setq first-lines (org-export-get-entry-content))	    (org-export-parse))))    (switch-to-buffer (get-buffer-create "*Org export*"))    (erase-buffer)    (funcall (cadr (assoc 'header org-export-structure)))    (funcall (cadr (assoc 'first-lines org-export-structure)) first-lines)    (org-export-render-structure parsed-buffer filter)    (funcall (cadr (assoc 'footer org-export-structure)))))(defun org-export-render-structure (parsed-buffer &optional filter)  "Render PARSED-BUFFER.An optional argument FILTER specifies a filter to pass to therendering engine."  (mapc (lambda(s)	  (funcall (cadr (assoc 'section-beginning org-export-structure)) s)	  (funcall (cadr (assoc 'heading org-export-structure)) s)	  (insert (org-export-render-content s) "\n\n")	  (org-export-render-structure (plist-get s :subtree) filter)	  (funcall (cadr (assoc 'section-end org-export-structure)) s))	(org-export-filter parsed-buffer filter)))(defun org-export-render-content (section)  "Render SECTION.  SECTION is either a string or a property list containinginformations (including content) for a section."  (with-temp-buffer    (insert (if (listp section) (plist-get section :content) section))    (mapc (lambda(e)	    (goto-char (point-min))	    (funcall (cadr (assoc e org-export-content))))	  '(fonts tables lists envs links))    (buffer-string)))(defun org-export-filter (parsed-buffer filter)  "Filter out PARSED-BUFFER with FILTER.PARSED-BUFFER is a nested list of sections and subsections, asproduced by `org-export-parse'.  FILTER is an alist of rules toapply to PARSED-BUFFER.  For the syntax of a filter, please checkthe docstring of `org-export-latex-filter'."  ;; FIXME where is org-export-latex-filter  (delete   nil   (mapcar    (lambda(s)      (if (delete	   nil	   (mapcar	    (lambda(f)	      (let ((cnd (car f)) (re (cadr f)) prop-cnd)		(or (and (eq cnd 'heading)			 (string-match re (plist-get s :heading)))		    (and (eq cnd 'content)			 (string-match re (plist-get s :content)))		    (and (setq prop-cnd			       (assoc cnd (plist-get s :properties)))			 (string-match re (cadr prop-cnd))))))	    filter))	  nil  ;; return nil if the section is filtered out	(progn (plist-put s :subtree			  (org-export-filter (plist-get s :subtree) filter))	       s))) ;; return the section if it isn't filtered out    parsed-buffer)));; FIXME This function is a copy of `org-export-preprocess-string' which;; should be rewritten for this export engine to work okay.(defun org-export-export-preprocess-string (string &rest parameters)  "Cleanup STRING so that that the true exported has a more consistent source.This function takes STRING, which should be a buffer-string of an org-fileto export.  It then creates a temporary buffer where it does its job.The result is then again returned as a string, and the exporter workson this string to produce the exported version."  (interactive)  (let* ((htmlp (plist-get parameters :for-html))	 (asciip (plist-get parameters :for-ascii))	 (latexp (plist-get parameters :for-LaTeX))	 (docbookp (plist-get parameters :for-docbook))	 (backend (cond (htmlp 'html)			(latexp 'latex)			(asciip 'ascii)			(docbookp 'docbook)))	 (archived-trees (plist-get parameters :archived-trees))	 (inhibit-read-only t)	 (drawers org-drawers)	 (outline-regexp "\\*+ ")	 target-alist rtn)    (setq org-export-target-aliases nil	  org-export-preferred-target-alist nil	  org-export-id-target-alist nil	  org-export-code-refs nil)    (with-current-buffer (get-buffer-create " org-mode-tmp")      (erase-buffer)      (insert string)      (setq case-fold-search t)      (let ((inhibit-read-only t))	(remove-text-properties (point-min) (point-max)				'(read-only t)))      ;; Remove license-to-kill stuff      ;; The caller marks some stuff for killing, stuff that has been      ;; used to create the page title, for example.      (org-export-kill-licensed-text)      (let ((org-inhibit-startup t)) (org-mode))      (setq case-fold-search t)      (org-install-letbind)      ;; Call the hook      (run-hooks 'org-export-preprocess-hook)      ;; Process the macros      (org-export-preprocess-apply-macros)      (run-hooks 'org-export-preprocess-after-macros-hook)      (untabify (point-min) (point-max))      ;; Handle include files, and call a hook      (org-export-handle-include-files-recurse)      (run-hooks 'org-export-preprocess-after-include-files-hook)      ;; Get rid of archived trees      (org-export-remove-archived-trees archived-trees)      ;; Remove comment environment and comment subtrees      (org-export-remove-comment-blocks-and-subtrees)      ;; Get rid of excluded trees, and call a hook      (org-export-handle-export-tags (plist-get parameters :select-tags)				     (plist-get parameters :exclude-tags))      (run-hooks 'org-export-preprocess-after-tree-selection-hook)      ;; Mark end of lists      (org-export-mark-list-ending backend)      ;; Handle source code snippets      ;; (org-export-export-replace-src-segments-and-examples backend)      ;; Protect short examples marked by a leading colon      (org-export-protect-colon-examples)      ;; Normalize footnotes      (when (plist-get parameters :footnotes)	(org-footnote-normalize nil t))      ;; Find all headings and compute the targets for them      (setq target-alist (org-export-define-heading-targets target-alist))      (run-hooks 'org-export-preprocess-after-headline-targets-hook)      ;; Find HTML special classes for headlines      (org-export-remember-html-container-classes)      ;; Get rid of drawers      (org-export-remove-or-extract-drawers       drawers (plist-get parameters :drawers) backend)      ;; Get the correct stuff before the first headline      (when (plist-get parameters :skip-before-1st-heading)	(goto-char (point-min))	(when (re-search-forward "^\\(#.*\n\\)?\\*+[ \t]" nil t)	  (delete-region (point-min) (match-beginning 0))	  (goto-char (point-min))	  (insert "\n")))      (when (plist-get parameters :text)	(goto-char (point-min))	(insert (plist-get parameters :text) "\n"))      ;; Remove todo-keywords before exporting, if the user has requested so      (org-export-remove-headline-metadata parameters)      ;; Find targets in comments and move them out of comments,      ;; but mark them as targets that should be invisible      (setq target-alist (org-export-handle-invisible-targets target-alist))      ;; Select and protect backend specific stuff, throw away stuff      ;; that is specific for other backends      (run-hooks 'org-export-preprocess-before-selecting-backend-code-hook)      (org-export-select-backend-specific-text backend)      ;; Protect quoted subtrees      (org-export-protect-quoted-subtrees)      ;; Remove clock lines      (org-export-remove-clock-lines)      ;; Protect verbatim elements      (org-export-protect-verbatim)      ;; Blockquotes, verse, and center      (org-export-mark-blockquote-verse-center)      (run-hooks 'org-export-preprocess-after-blockquote-hook)      ;; Remove timestamps, if the user has requested so      (unless (plist-get parameters :timestamps)	(org-export-remove-timestamps))      ;; Attach captions to the correct object      ;; (setq target-alist (org-export-attach-captions-and-attributes      ;; 			  backend target-alist))      ;; Find matches for radio targets and turn them into internal links      (org-export-mark-radio-links)      (run-hooks 'org-export-preprocess-after-radio-targets-hook)      ;; Find all links that contain a newline and put them into a single line      (org-export-concatenate-multiline-links)      ;; Normalize links: Convert angle and plain links into bracket links      ;; and expand link abbreviations      (run-hooks 'org-export-preprocess-before-normalizing-links-hook)      (org-export-normalize-links)      ;; Find all internal links.  If they have a fuzzy match (i.e. not      ;; a *dedicated* target match, let the link  point to the      ;; corresponding section.      (org-export-target-internal-links target-alist)      ;; Find multiline emphasis and put them into single line      (when (plist-get parameters :emph-multiline)	(org-export-concatenate-multiline-emphasis))      ;; Remove special table lines      (when org-export-table-remove-special-lines	(org-export-remove-special-table-lines))      ;; Another hook      (run-hooks 'org-export-preprocess-before-backend-specifics-hook)      ;; LaTeX-specific preprocessing      (when latexp	(require 'org-latex nil)	(org-export-latex-preprocess parameters))      ;; ASCII-specific preprocessing      (when asciip	(org-export-ascii-preprocess parameters))      ;; HTML-specific preprocessing      (when htmlp	(org-export-html-preprocess parameters))      ;; DocBook-specific preprocessing      (when docbookp	(require 'org-docbook nil)	(org-export-docbook-preprocess parameters))      ;; Remove or replace comments      (org-export-handle-comments (plist-get parameters :comments))      ;; Remove #+TBLFM and #+TBLNAME lines      (org-export-handle-table-metalines)            ;; Run the final hook      (run-hooks 'org-export-preprocess-final-hook)      (setq rtn (buffer-string))      (kill-buffer " org-mode-tmp"))    rtn))(provide 'org-export);;;  User Options, Variables;;; org-export.el ends here
 |