| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186 | ;;; org-export.el --- Export engine for Org;;;; Copyright 2008 Bastien Guerry;;;; Emacs Lisp Archive Entry;; Filename: org-export.el;; Version: 0.1a;; 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:;;;; This is the export engine for Org.;;;; Put this file into your load-path and the following into your ~/.emacs:;;   (require 'org-export);;;;; Code:(eval-when-compile  (require 'cl));;; Parsing functions:(defun org-export-parse (&optional level)  "Parse the current buffer.Return a nested list reflecting the sectioning structure of thefile and containing all information about each section, includingits content."  (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-parse-clean-content-string					   (org-export-parse-content))				 :subtree (org-export-parse 					   (if level (1+ level) 2)))))))	  (goto-char (1- eos)))))    output))(defun org-export-parse-content ()  "Extract the content of a section.The content of a section is the part before a subtree."  (save-excursion    (goto-char (point-min))    (buffer-substring     (point)     (if (re-search-forward org-complex-heading-regexp nil t)	 (match-beginning 0) (point-max)))))(defun org-export-parse-clean-content-string (s)  "From the content string S, remove stuff also captured by get-properties.So this will remove the clock drawer, the property drawer, and the lineswith planning info (DEADLINE, SCHEDULED, CLOSED)."  (if (string-match org-property-drawer-re s)      (setq s (replace-match "" t t s)))  (if (string-match org-clock-drawer-re s)      (setq s (replace-match "" t t s)))  (while (string-match (concat org-keyword-time-regexp ".*\n?") s)    (setq s (replace-match "" t t s)))  s);;; Rendering functions:(defun org-export-buffer (filter struct-backend content-backend)  "Render the current buffer.It first parses the current buffer into a list.  Then it filtersthis list with FILTER.  Finally it uses STRUCT-BACKEND andCONTENT-BACKEND to render the structure of the buffer and thecontent of each section."  (save-excursion    (let* ((props (org-combine-plists 		   (org-default-export-plist)		   (org-infile-export-plist)))	   (first-lines (org-export-parse-content))	   (parsed-buffer (org-export-parse)))      (switch-to-buffer (get-buffer-create "*Org export*"))      (erase-buffer)      (funcall (cdr (assoc 'header struct-backend)) props)      (funcall (cdr (assoc 'first-lines struct-backend)) 	       first-lines props)      (org-export-render-structure parsed-buffer props filter				   struct-backend content-backend)      (funcall (cdr (assoc 'footer struct-backend)) props))))(defun org-export-render-structure  (parsed-buffer props filter struct-backend content-backend)  "Render PARSED-BUFFER.The optional argument FILTER specifies a filter to pass to therendering engine."  (mapc (lambda(s)	  (funcall (cdr (assoc 'section-beginning struct-backend)) s)	  (funcall (cdr (assoc 'heading struct-backend)) s)	  (insert (org-export-render-content s props content-backend) "\n\n")	  (org-export-render-structure (plist-get s :subtree) props				       filter struct-backend content-backend)	  (funcall (cdr (assoc 'section-end struct-backend)) s))	(org-export-filter parsed-buffer filter)))(defun org-export-render-content (section props content-backend)  "Render SECTION with PROPS.  SECTION is the property listdefining the information for the section.  PROPS is the propertylist defining information for the current export.CONTENT-BACKEND is an association list defining possibleexporting directive the content of this section."  (with-temp-buffer    (insert (plist-get section :content))    (if (not (plist-get props :with-comment))	(funcall (cdr (assoc 'comment content-backend))))    (buffer-string)))(defun org-export-strip-drawer ()  "Strip DRAWERS in the current buffer.Stripped drawers are those matched by `org-drawer-regexp'."  (save-excursion     (while (re-search-forward org-drawer-regexp nil t)      (let ((beg (match-beginning 0))	    (end (and (search-forward ":END:" nil t)		      (match-end 0))))	(delete-region beg end)))));;; Filtering functions:(defun org-export-filter (parsed-buffer filter)  "Filter out PARSED-BUFFER with FILTER.PARSED-BUFFER is a nested list a 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'."  (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)))(provide 'org-export);;;  User Options, Variables;;; org-export.el ends here
 |