diff options
author | Bastien Guerry <bzg@altern.org> | 2011-07-19 01:25:35 +0200 |
---|---|---|
committer | Bastien Guerry <bzg@altern.org> | 2011-07-19 01:25:35 +0200 |
commit | a90b876b936820f6a80cc2ffa807bc29a9de73eb (patch) | |
tree | d9567c075c782fea0a93bd675505133f005b9160 | |
parent | 58763f36e3e87fb6ee06e9063f7545855b25598b (diff) | |
download | org-mode-a90b876b936820f6a80cc2ffa807bc29a9de73eb.tar.gz |
New experimental exporter from Org to MoinMoin by Puneeth Chaganti.
Thanks to Puneeth Chaganti for this contribution!
-rw-r--r-- | EXPERIMENTAL/org-mm.el | 246 |
1 files changed, 246 insertions, 0 deletions
diff --git a/EXPERIMENTAL/org-mm.el b/EXPERIMENTAL/org-mm.el new file mode 100644 index 0000000..bed4f3d --- /dev/null +++ b/EXPERIMENTAL/org-mm.el @@ -0,0 +1,246 @@ +;;; org-mm.el --- MoinMoin backend for org-export.el +;; +;; Copyright 2010, 2011 Puneeth Chaganti +;; +;; Emacs Lisp Archive Entry +;; Filename: org-mm.el +;; Version: 0.2 +;; Author: Puneeth Chaganti <punchagan [at] gmail [dot] com> +;; Keywords: MoinMoin Org export +;; Description: MoinMoin exporter for Org +;; +;; 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. +;; +;; A portion of this code is based on org-mw.el by Bastien Guerry. +;; +;;; Commentary: +;; +;; org-mm.el lets you convert Org files to MoinMoin files using +;; the org-export.el experimental engine. +;; +;; Put this file into your load-path and the following into your ~/.emacs: +;; (require 'org-mm) +;; +;; You also need to fetch Org's git repository and add the EXPERIMENTAL/ +;; directory in your load path. +;; +;; Fetch Org's git repository: +;; +;; ~$ cd ~/install/git/ +;; ~$ git clone git://repo.or.cz/org-mode.git +;; +;; Put this in your .emacs.el: +;; +;; (add-to-list 'load-path "~/install/git/org-mode/EXPERIMENTAL/") +;; +;; Export Org files to MoinMoin: M-x org-mm-export RET +;; +;;; Todo: +;; +;; - handle radio links +;; - support caption and attributes in tables +;; - better handline of source code and examples +;; - handle inline HTML +;; +;;; Code: + +(require 'org-export) + +(defvar org-mm-emphasis-alist + '(("*" "'''%s'''" nil) + ("/" "''%s''" nil) + ("_" "__%s__" nil) + ("+" "--%s--" nil) + ("=" "`%s`" nil)) + "The list of fontification expressions for MoinMoin.") + +(defvar org-mm-export-table-table-style "") +(defvar org-mm-export-table-header-style "") +(defvar org-mm-export-table-cell-style "") + +(defun org-mm-export () + "Export the current buffer to MoinMoin." + (interactive) + (setq org-export-current-backend 'mm) + (org-export-set-backend "mm") + ;; FIXME see the problem `org-mm-export-footnotes' + ;; (add-hook 'org-export-preprocess-final-hook 'org-mm-export-footnotes) + (add-hook 'org-export-preprocess-before-backend-specifics-hook + 'org-mm-export-src-example) + (org-export-render) + ;; (remove-hook 'org-export-preprocess-final-hook 'org-mm-export-footnotes) + (remove-hook 'org-export-preprocess-before-backend-specifics-hook + 'org-mm-export-src-example)) + +(defun org-mm-export-header () + "Export the header part." + (let* ((p (org-combine-plists (org-infile-export-plist) + org-export-properties)) + (title (plist-get p :title)) + (author (plist-get p :author)) + (date (plist-get p :date)) + (level (plist-get p :headline-levels))) + (insert (format "= %s by %s =\n\n" title author)) + (if (plist-get p :table-of-contents) + (insert (format "<<TableOfContents(%s)>>\n" level))))) + +(defun org-mm-export-first-lines (first-lines) + "Export first lines." + (insert (org-export-render-content first-lines) "\n") + (goto-char (point-max))) + +(defun org-mm-export-heading (section-properties) + "Export MoinMoin heading" + (let* ((p section-properties) + (h (plist-get p :heading)) + (s (make-string (1+ (plist-get p :level)) ?=))) + (insert (format "%s %s %s\n" s h s)))) + +(defun org-mm-export-quote-verse-center () + "Export #+BEGIN_QUOTE/VERSE/CENTER environments." + (let (rpl e) + (while (re-search-forward "^[ \t]*ORG-\\([A-Z]+\\)-\\(START\\|END\\).*$" nil t) + (setq e (if (equal (match-string 2) "END") "/" "")) + (setq rpl + (cond ((equal (match-string 1) "BLOCKQUOTE") "blockquote>") + ((equal (match-string 1) "VERSE") "pre>") + ((equal (match-string 1) "CENTER") "center>"))) + (replace-match (concat "<" e rpl) t)))) + +(defun org-mm-export-fonts () + "Export fontification." + (while (re-search-forward org-emph-re nil t) + (let* ((emph (assoc (match-string 3) org-mm-emphasis-alist)) + (beg (match-beginning 0)) + (begs (match-string 1)) + (end (match-end 0)) + (ends (match-string 5)) + (rpl (format (cadr emph) (match-string 4)))) + (delete-region beg end) + (insert begs rpl ends)))) + +(defun org-mm-export-links () + "Replace Org links with MoinMoin links." + ;; FIXME: This function could be more clever, of course. + (while (re-search-forward org-bracket-link-analytic-regexp nil t) + (cond ((and (equal (match-string 1) "file:") + (save-match-data + (string-match (org-image-file-name-regexp) (match-string 3)))) + (replace-match + (concat "{{" (file-name-nondirectory (match-string 3)) "}}"))) + (t + (replace-match + (concat "[[\\1\\3|" (if (match-string 5) "\\5]]" "]]"))))))) + +;; FIXME this function should test whether [1] is really a footnote. +;; `org-footnote-normalize' should add properties to the normalized +;; footnotes so that we can recognize them. +(defun org-mm-export-footnotes () + "Export footnotes." + (goto-char (point-min)) + (let (refpos rpl begnote begfullnote endnote) + (while (re-search-forward "\[[0-9]+\]" nil t) + (save-excursion + (save-match-data + (goto-char (point-max)) + (search-backward (concat (match-string 0) " ") nil t) + (setq begfullnote (match-beginning 0)) + (setq begnote (match-end 0)) + (goto-char (match-end 0)) + (re-search-forward "^\[[0-9]+\]\\|\\'" nil t) + (setq endnote (match-beginning 0)) + (setq rpl (replace-regexp-in-string + "\n" " " (buffer-substring endnote begnote))) + (setq rpl (replace-regexp-in-string "[ \t]+$" "" rpl)) + (delete-region begfullnote endnote))) + (replace-match (concat "<ref>" rpl "</ref>"))))) + +(defun org-mm-export-src-example () + "Export #+BEGIN_EXAMPLE and #+BEGIN_SRC." + (goto-char (point-min)) + (let (start env) + (while (re-search-forward "^[ \t]*#\\+BEGIN_\\(EXAMPLE\\|SRC\\).*\n" nil t) + (setq env (match-string 1)) + (replace-match "{{{\n") + (setq start (point)) + (re-search-forward (concat "^[ \t]*#\\+END_" env ".*\n") nil t) + (replace-match "}}}\n")))) + +(defun org-mm-export-lists () + "Export lists to MoinMoin syntax." + (while (re-search-forward (org-item-beginning-re) nil t) + (move-beginning-of-line 1) + (insert (org-list-to-generic + (org-list-parse-list t) + (org-combine-plists + '(:splice nil + :ostart "" :oend "" + :ustart "" :uend "" + :dstart "" :dend "" + :dtstart "" :dtend " " + :istart (concat (make-string (* 2 (1+ depth)) ? ) + (if (eq type 'unordered) + "* " "# ")) + :iend "\n" + :icount nil + :csep "\n" + :cbon "[X]" :cboff "[ ]" + :cbtrans "[-]")))))) + + +(defun org-mm-export-tables () + "Convert tables in the current buffer to MoinMoin tables." + (while (re-search-forward "^\\([ \t]*\\)|" nil t) + (org-if-unprotected-at (1- (point)) + (org-table-align) + (let* ((beg (org-table-begin)) + (end (org-table-end)) + (raw-table (buffer-substring beg end)) lines) + (setq lines (org-split-string raw-table "\n")) + (apply 'delete-region (list beg end)) + (when org-export-table-remove-special-lines + (setq lines (org-table-clean-before-export lines 'maybe-quoted))) + (setq lines + (mapcar + (lambda(elem) + (or (and (string-match "[ \t]*|-+" elem) 'hline) + (org-split-string (org-trim elem) "|"))) + lines)) + (insert (orgtbl-to-mm lines nil)))))) + +(defun orgtbl-to-mm (table params) + "Convert TABLE into a MoinMoin table." + (let ((params2 (list + :tstart (concat "" + org-mm-export-table-table-style) + :tend "\n" + :lstart "||" + :lend "||" + :sep "||" + :fmt (concat org-mm-export-table-cell-style " %s ") + :hfmt (concat org-mm-export-table-cell-style "''' %s '''") + :hlsep "||" + ))) + (orgtbl-to-generic table (org-combine-plists params2 params)))) + +;; Various empty function for org-export.el to work: +(defun org-mm-export-footer () "") +(defun org-mm-export-section-beginning (section-properties) "") +(defun org-mm-export-section-end (section-properties) "") +(defun org-export-mm-preprocess (parameters) + "Do extra work for MoinMoin export." + nil) + +(provide 'org-mm) |