| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191 | ;;; ox-confluence --- Confluence Wiki Back-End for Org Export Engine;; Copyright (C) 2012 Sébastien Delafond;; Author: Sébastien Delafond <sdelafond at gmx dot net>;; Keywords: outlines, confluence, wiki;; This file is not part of GNU Emacs.;; GNU Emacs 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.;; GNU Emacs 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/>.;;; Commentary:;;;; ox-confluence.el lets you convert Org files to confluence files;; using the ox.el export engine.;;;; Put this file into your load-path and the following into your ~/.emacs:;;	 (require 'ox-confluence);;;; Export Org files to confluence:;; M-x org-confluence-export-as-confluence RET;;;;; Code:(require 'ox)(require 'ox-ascii);; Define the backend itself(org-export-define-derived-backend confluence ascii  :translate-alist ((bold . org-confluence-bold)                    (example-block . org-confluence-example-block)                    (fixed-width . org-confluence-fixed-width)                    (footnote-definition . org-confluence-empty)                    (footnote-reference . org-confluence-empty)                    (headline . org-confluence-headline)                    (italic . org-confluence-italic)                    (link . org-confluence-link)                    (section . org-confluence-section)                    (src-block . org-confluence-src-block)                    (strike-through . org-confluence-strike-through)                    (table . org-confluence-table)                    (table-cell . org-confluence-table-cell)                    (table-row . org-confluence-table-row)                    (template . org-confluence-template)                    (underline . org-confluence-underline)));; All the functions we use(defun org-confluence-bold (bold contents info)  (format "*%s*" contents))(defun org-confluence-empty (empy contents info)  "")(defun org-confluence-example-block (example-block contents info)  ;; FIXME: provide a user-controlled variable for theme  (let ((content (org-export-format-code-default example-block info)))    (org-confluence--block "none" "Confluence" content)))(defun org-confluence-italic (italic contents info)  (format "_%s_" contents))(defun org-confluence-fixed-width (fixed-width contents info)  (format "\{\{%s\}\}" contents))(defun org-confluence-headline (headline contents info)  (let ((low-level-rank (org-export-low-level-p headline info))        (text (org-export-data (org-element-property :title headline)                               info))        (level (org-export-get-relative-level headline info)))    ;; Else: Standard headline.    (format "h%s. %s\n%s" level text            (if (org-string-nw-p contents) contents              ""))))(defun org-confluence-link (link desc info)  (let ((raw-link (org-element-property :raw-link link)))    (concat "["            (when (org-string-nw-p desc) (format "%s|" desc))            (cond             ((string-match "^confluence:" raw-link)              (replace-regexp-in-string "^confluence:" "" raw-link))             (t              raw-link))            "]")))(defun org-confluence-section (section contents info)  contents)(defun org-confluence-src-block (src-block contents info)  ;; FIXME: provide a user-controlled variable for theme  (let* ((lang (org-element-property :language src-block))         (language (if (string= lang "sh") "bash" ;; FIXME: provide a mapping of some sort                     lang))         (content (org-export-format-code-default src-block info)))    (org-confluence--block language "Emacs" content)))(defun org-confluence-strike-through (strike-through contents info)  (format "-%s-" contents))(defun org-confluence-table (table contents info)  contents)(defun org-confluence-table-row  (table-row contents info)  (concat   (if (org-string-nw-p contents) (format "|%s" contents)     "")   (when (org-export-table-row-ends-header-p table-row info)     "|")))(defun org-confluence-table-cell  (table-cell contents info)  (let ((table-row (org-export-get-parent table-cell)))    (concat     (when (org-export-table-row-starts-header-p table-row info)       "|")     contents "|")))(defun org-confluence-template (contents info)  (let ((depth (plist-get info :with-toc)))    (concat (when depth "\{toc\}\n\n") contents)))(defun org-confluence-underline (underline contents info)  (format "+%s+" contents))(defun org-confluence--block (language theme contents)  (concat "\{code:theme=" theme          (when language (format "|language=%s" language))          "}\n"          contents          "\{code\}\n"));; main interactive entrypoint(defun org-confluence-export-as-confluence  (&optional async subtreep visible-only body-only ext-plist)  "Export current buffer to a text buffer.If narrowing is active in the current buffer, only export itsnarrowed part.If a region is active, export that region.A non-nil optional argument ASYNC means the process should happenasynchronously.  The resulting buffer should be accessiblethrough the `org-export-stack' interface.When optional argument SUBTREEP is non-nil, export the sub-treeat point, extracting information from the headline propertiesfirst.When optional argument VISIBLE-ONLY is non-nil, don't exportcontents of hidden elements.When optional argument BODY-ONLY is non-nil, strip title, tableof contents and footnote definitions from output.EXT-PLIST, when provided, is a property list with externalparameters overriding Org default settings, but still inferior tofile-local settings.Export is done in a buffer named \"*Org E-Confluence Export*\", whichwill be displayed when `org-export-show-temporary-export-buffer'is non-nil."  (interactive)  (if async      (org-export-async-start	  (lambda (output)	    (with-current-buffer (get-buffer-create "*Org E-Confluence Export*")	      (erase-buffer)	      (insert output)	      (goto-char (point-min))	      (text-mode)	      (org-export-add-to-stack (current-buffer) 'confluence)))	`(org-export-as 'confluence ,subtreep ,visible-only ,body-only			',ext-plist))    (let ((outbuf (org-export-to-buffer		   'confluence "*Org E-Confluence Export*"		   subtreep visible-only body-only ext-plist)))      (with-current-buffer outbuf (text-mode))      (when org-export-show-temporary-export-buffer	(switch-to-buffer-other-window outbuf)))))(provide 'ox-confluence)
 |