| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196 | ;;; org-export-freemind - exporting utilities from org-mode to freemind;; Copyright (C) 2007 Marco Vezzoli;; Author: marco vezzoli <noise.otn@alice.it>;; Created:;; Version: 0.1.0;; Keywords: org-mode export freemind;; Commentary:;; 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 2 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 this program; if not, write to the Free;; Software Foundation, Inc., 51 Franklin Street, Fifth Floor,;; Boston, MA 02110-1301 USA;;; Code:(defgroup org-export-freemind ()  "This group let you customize your own export into freemind format"  :group 'org-export)(defcustom org-freemind-icons-alist  '(("TODO" . "button_cancel")    ("SPEC" . "pencil")    ("WIP"  . "pencil")    ("TEST" . "xmag")    ("DONE" . "button_ok"))  "change the icon according to a regular expression"  :type '(alist :key-type regexp 		:value-type string)  :group 'org-export-freemind)(defcustom org-freemind-cloud-alist  '((":PROJECT:" . "ccffcc")    (":MEETING:" . "ccccff"))  "create a cloud with the defined color if title match a regexp"  :type '(alist :key-type regexp :value-type string)  :group 'org-export-freemind)(defun org-export-as-freemind (&optional buffer outbuffer)  "Export the org buffer as FreeMind XML."  (interactive (list (current-buffer) ()))  ;; A quickie abstraction  ;; Output everything as FreeMind  (with-current-buffer (get-buffer buffer)    (goto-char (point-min))  ;; CD:  beginning-of-buffer is not allowed.    (let* ((opt-plist (org-combine-plists (org-default-export-plist)					(org-infile-export-plist)))	   (title       (or (plist-get opt-plist :title)			    (file-name-sans-extension			     (file-name-nondirectory buffer-file-name))))	   (filename (concat (file-name-as-directory			      (org-export-directory :xoxo opt-plist))			     title			     ".mm"))	   (out (if (bufferp outbuffer)		    outbuffer		    (find-file-noselect filename)))	   (last-level 0)	   (hanging-li nil))      ;; Check the output buffer is empty.      ;; Kick off the output      (unless (bufferp outbuffer)	  (progn	    (with-current-buffer out (erase-buffer))	    (org-export-as-xoxo-insert-into out "<map version='0.8.0'>\n")))      (org-export-as-xoxo-insert-into out 	"<node TEXT='" title "'"	(if (bufferp outbuffer)	    " FOLDED='true'" "")	">\n")      (if (bufferp outbuffer)	  (org-export-as-xoxo-insert-into out "<cloud COLOR='#ccffff'/>\n"))      (while (re-search-forward "^\\(\\*+\\) \\(.+\\)" (point-max) 't)        (let* ((hd (match-string-no-properties 1))               (level (length hd))               (text (match-string-no-properties 2)))	  (save-excursion	    (goto-char (match-end 0))	    (catch 'loop	      (while 't		(forward-line)		(if (looking-at "^[ \t]\\(.*\\)")		    ()		  (throw 'loop "")))))          ;; Handle level rendering	  (cond           ((> level last-level)	    (let ((rept (- level last-level 1))		  (value ()))	      (dotimes (i rept value)		(org-export-as-xoxo-insert-into out "<node FOLDED='false' TEXT='.'>\n")))            (org-export-as-xoxo-insert-into out "\n<node FOLDED='true' TEXT='"))           ((< level last-level)	    (let ((rept (+ (- last-level level) 1))		  (value ()))	      (dotimes (i rept value)		(org-export-as-xoxo-insert-into out "</node>\n")))	    (org-export-as-xoxo-insert-into out "<node FOLDED='true' TEXT='"))           ((equal level last-level)	    (org-export-as-xoxo-insert-into out "</node>\n<node FOLDED='true' TEXT='")))          (setq last-level level)          ;; And output the new node	  (let* ((heading		  (concat "<html><h3>" 			  (replace-regexp-in-string 			   ":.*:" 			   (lambda (x) 			     (concat "<font color='red'>" x "</font>")) 			   text)			  "</h3></html>"))		 (html-quoted-heading (org-html-expand heading))		 (exp-quote-heading (replace-regexp-in-string "'" """ html-quoted-heading)))	    (org-export-as-xoxo-insert-into out exp-quote-heading "'>\n"))	  (dolist (rule org-freemind-icons-alist)	    (if (string-match (car rule) text)		(org-export-as-xoxo-insert-into out "<icon BUILTIN='" (cdr rule) "'/>\n")))	  (dolist (rule org-freemind-cloud-alist)	    (when (string-match (car rule) text)	      (progn		(org-export-as-xoxo-insert-into out 		  "<cloud COLOR='#" (cdr rule) "'/>\n")		(message (cdr rule))		)))	  ))      ;; Finally finish off the map      (let ((value ()))	(org-export-as-xoxo-insert-into out "\n")	(dotimes (i last-level value)	  (org-export-as-xoxo-insert-into out "</node>\n")))      (org-export-as-xoxo-insert-into out "</node>\n")      ;; Finish the buffer off and clean it up.      (unless (bufferp outbuffer)	(progn	  (org-export-as-xoxo-insert-into out "</map>\n")	  (switch-to-buffer-other-window out)	  (indent-region (point-min) (point-max) nil)	  (save-buffer)	  (goto-char (point-min))	  )))))(defun org-export-as-freemind-agenda-files ()  "Export all agenda files into Freemind formateach files is saved with .mm extensioninto the XOXO publishing directory"  (interactive)  (dolist (file org-agenda-files)    (org-check-agenda-file file)    (set-buffer (org-get-agenda-file-buffer file))    (org-export-as-freemind (current-buffer))    ))(defun org-export-as-freemind-agenda-files-one-file (filename)  "Export all agenda files into FreeMind format.All results are grouped in a single .mm file"  (interactive "FFile to save: ")  (let* ((title (file-name-sans-extension		 (file-name-nondirectory filename)))	 (out (find-file-noselect filename)))    (with-current-buffer out (erase-buffer))    (org-export-as-xoxo-insert-into out "<map version='0.8.0'><node TEXT='" title "'>\n")    (dolist (file org-agenda-files)      (org-check-agenda-file file)      (set-buffer (org-get-agenda-file-buffer file))      (org-export-as-freemind (current-buffer) out)      )    (org-export-as-xoxo-insert-into out "</node></map>\n")    (switch-to-buffer-other-window out)    (indent-region (point-min) (point-max) nil)    (save-buffer)    (goto-char (point-min))    ))(define-key org-mode-map "\C-c\C-xf" 'org-export-as-freemind);;; org-export-freemind ends here
 |