Changes
[emacs.git] / .emacs.d / elisp / org / ox-man.el
index d58c119..c283f7d 100644 (file)
@@ -1,6 +1,6 @@
 ;; ox-man.el --- Man Back-End for Org Export Engine
 
 ;; ox-man.el --- Man Back-End for Org Export Engine
 
-;; Copyright (C) 2011-2014 Free Software Foundation, Inc.
+;; Copyright (C) 2011-2015 Free Software Foundation, Inc.
 
 ;; Author: Nicolas Goaziou <n.goaziou at gmail dot com>
 ;;      Luis R Anaya <papoanaya aroba hot mail punto com>
 
 ;; Author: Nicolas Goaziou <n.goaziou at gmail dot com>
 ;;      Luis R Anaya <papoanaya aroba hot mail punto com>
@@ -55,8 +55,6 @@
     (center-block . org-man-center-block)
     (clock . org-man-clock)
     (code . org-man-code)
     (center-block . org-man-center-block)
     (clock . org-man-clock)
     (code . org-man-code)
-    (comment . (lambda (&rest args) ""))
-    (comment-block . (lambda (&rest args) ""))
     (drawer . org-man-drawer)
     (dynamic-block . org-man-dynamic-block)
     (entity . org-man-entity)
     (drawer . org-man-drawer)
     (dynamic-block . org-man-dynamic-block)
     (entity . org-man-entity)
     (keyword . org-man-keyword)
     (line-break . org-man-line-break)
     (link . org-man-link)
     (keyword . org-man-keyword)
     (line-break . org-man-line-break)
     (link . org-man-link)
+    (node-property . org-man-node-property)
     (paragraph . org-man-paragraph)
     (plain-list . org-man-plain-list)
     (plain-text . org-man-plain-text)
     (planning . org-man-planning)
     (paragraph . org-man-paragraph)
     (plain-list . org-man-plain-list)
     (plain-text . org-man-plain-text)
     (planning . org-man-planning)
-    (property-drawer . (lambda (&rest args) ""))
+    (property-drawer . org-man-property-drawer)
     (quote-block . org-man-quote-block)
     (quote-block . org-man-quote-block)
-    (quote-section . org-man-quote-section)
     (radio-target . org-man-radio-target)
     (section . org-man-section)
     (special-block . org-man-special-block)
     (radio-target . org-man-radio-target)
     (section . org-man-section)
     (special-block . org-man-special-block)
     (verse-block . org-man-verse-block))
   :export-block "MAN"
   :menu-entry
     (verse-block . org-man-verse-block))
   :export-block "MAN"
   :menu-entry
-  '(?m "Export to MAN"
+  '(?M "Export to MAN"
        ((?m "As MAN file" org-man-export-to-man)
        (?p "As PDF file" org-man-export-to-pdf)
        (?o "As PDF file and open"
        ((?m "As MAN file" org-man-export-to-man)
        (?p "As PDF file" org-man-export-to-pdf)
        (?o "As PDF file and open"
   :options-alist
   '((:man-class "MAN_CLASS" nil nil t)
     (:man-class-options "MAN_CLASS_OPTIONS" nil nil t)
   :options-alist
   '((:man-class "MAN_CLASS" nil nil t)
     (:man-class-options "MAN_CLASS_OPTIONS" nil nil t)
-    (:man-header-extra "MAN_HEADER" nil nil newline)))
+    (:man-header-extra "MAN_HEADER" nil nil newline)
+    ;; Other variables.
+    (:man-tables-centered nil nil org-man-tables-centered)
+    (:man-tables-verbatim nil nil org-man-tables-verbatim)
+    (:man-table-scientific-notation nil nil org-man-table-scientific-notation)
+    (:man-source-highlight nil nil org-man-source-highlight)
+    (:man-source-highlight-langs nil nil org-man-source-highlight-langs)))
 
 
 \f
 
 
 \f
@@ -305,7 +309,8 @@ This function shouldn't be used for floats.  See
   "Return complete document string after Man conversion.
 CONTENTS is the transcoded contents string.  INFO is a plist
 holding export options."
   "Return complete document string after Man conversion.
 CONTENTS is the transcoded contents string.  INFO is a plist
 holding export options."
-  (let* ((title (org-export-data (plist-get info :title) info))
+  (let* ((title (when (plist-get info :with-title)
+                 (org-export-data (plist-get info :title) info)))
         (attr (read (format "(%s)"
                             (mapconcat
                              #'identity
         (attr (read (format "(%s)"
                             (mapconcat
                              #'identity
@@ -526,7 +531,7 @@ CONTENTS holds the contents of the item.  INFO is a plist holding
 contextual information."
   (let* ((code (org-element-property :value inline-src-block)))
     (cond
 contextual information."
   (let* ((code (org-element-property :value inline-src-block)))
     (cond
-     (org-man-source-highlight
+     ((plist-get info :man-source-highlight)
       (let* ((tmpdir (if (featurep 'xemacs)
                          temp-directory
                        temporary-file-directory ))
       (let* ((tmpdir (if (featurep 'xemacs)
                          temp-directory
                        temporary-file-directory ))
@@ -535,8 +540,9 @@ contextual information."
              (out-file (make-temp-name
                         (expand-file-name "reshilite" tmpdir)))
              (org-lang (org-element-property :language inline-src-block))
              (out-file (make-temp-name
                         (expand-file-name "reshilite" tmpdir)))
              (org-lang (org-element-property :language inline-src-block))
-             (lst-lang (cadr (assq (intern org-lang)
-                                   org-man-source-highlight-langs)))
+             (lst-lang
+             (cadr (assq (intern org-lang)
+                         (plist-get info :man-source-highlight-langs))))
 
              (cmd (concat (expand-file-name "source-highlight")
                           " -s " lst-lang
 
              (cmd (concat (expand-file-name "source-highlight")
                           " -s " lst-lang
@@ -650,6 +656,8 @@ INFO is a plist holding contextual information.  See
                 (t raw-path)))
          protocol)
     (cond
                 (t raw-path)))
          protocol)
     (cond
+     ;; Link type is handled by a special function.
+     ((org-export-custom-protocol-maybe link desc 'man))
      ;; External link with a description part.
      ((and path desc) (format "%s \\fBat\\fP \\fI%s\\fP" path desc))
      ;; External link without a description part.
      ;; External link with a description part.
      ((and path desc) (format "%s \\fBat\\fP \\fI%s\\fP" path desc))
      ;; External link without a description part.
@@ -657,6 +665,16 @@ INFO is a plist holding contextual information.  See
      ;; No path, only description.  Try to do something useful.
      (t (format "\\fI%s\\fP" desc)))))
 
      ;; No path, only description.  Try to do something useful.
      (t (format "\\fI%s\\fP" desc)))))
 
+;;;; Node Property
+
+(defun org-man-node-property (node-property contents info)
+  "Transcode a NODE-PROPERTY element from Org to Man.
+CONTENTS is nil.  INFO is a plist holding contextual
+information."
+  (format "%s:%s"
+          (org-element-property :key node-property)
+          (let ((value (org-element-property :value node-property)))
+            (if value (concat " " value) ""))))
 
 ;;; Paragraph
 
 
 ;;; Paragraph
 
@@ -716,6 +734,12 @@ contextual information."
 
 ;;; Property Drawer
 
 
 ;;; Property Drawer
 
+(defun org-man-property-drawer (property-drawer contents info)
+  "Transcode a PROPERTY-DRAWER element from Org to Man.
+CONTENTS holds the contents of the drawer.  INFO is a plist
+holding contextual information."
+  (and (org-string-nw-p contents)
+       (format ".RS\n.nf\n%s\n.fi\n.RE" contents)))
 
 ;;; Quote Block
 
 
 ;;; Quote Block
 
@@ -727,15 +751,6 @@ holding contextual information."
    quote-block
    (format ".RS\n%s\n.RE" contents)))
 
    quote-block
    (format ".RS\n%s\n.RE" contents)))
 
-;;; Quote Section
-
-(defun org-man-quote-section (quote-section contents info)
-  "Transcode a QUOTE-SECTION element from Org to Man.
-CONTENTS is nil.  INFO is a plist holding contextual information."
-  (let ((value (org-remove-indentation
-                (org-element-property :value quote-section))))
-    (when value (format ".RS\\fI%s\\fP\n.RE\n" value))))
-
 
 ;;; Radio Target
 
 
 ;;; Radio Target
 
@@ -761,7 +776,7 @@ holding contextual information."
   "Transcode a SPECIAL-BLOCK element from Org to Man.
 CONTENTS holds the contents of the block.  INFO is a plist
 holding contextual information."
   "Transcode a SPECIAL-BLOCK element from Org to Man.
 CONTENTS holds the contents of the block.  INFO is a plist
 holding contextual information."
-  (let ((type (downcase (org-element-property :type special-block))))
+  (let ((type (org-element-property :type special-block)))
     (org-man--wrap-label
      special-block
      (format "%s\n" contents))))
     (org-man--wrap-label
      special-block
      (format "%s\n" contents))))
@@ -782,31 +797,22 @@ contextual information."
                       (continued (org-export-get-loc src-block info))
                       (new 0)))
          (retain-labels (org-element-property :retain-labels src-block)))
                       (continued (org-export-get-loc src-block info))
                       (new 0)))
          (retain-labels (org-element-property :retain-labels src-block)))
-    (cond
-     ;; Case 1.  No source fontification.
-     ((not org-man-source-highlight)
-      (format ".RS\n.nf\n\\fC%s\\fP\n.fi\n.RE\n\n"
-             (org-export-format-code-default src-block info)))
-     (org-man-source-highlight
-      (let* ((tmpdir (if (featurep 'xemacs)
-                        temp-directory
-                      temporary-file-directory ))
-
-            (in-file  (make-temp-name
-                       (expand-file-name "srchilite" tmpdir)))
-            (out-file (make-temp-name
-                       (expand-file-name "reshilite" tmpdir)))
-
+    (if (not (plist-get info :man-source-highlight))
+       (format ".RS\n.nf\n\\fC%s\\fP\n.fi\n.RE\n\n"
+               (org-export-format-code-default src-block info))
+      (let* ((tmpdir (if (featurep 'xemacs) temp-directory
+                      temporary-file-directory))
+            (in-file  (make-temp-name (expand-file-name "srchilite" tmpdir)))
+            (out-file (make-temp-name (expand-file-name "reshilite" tmpdir)))
             (org-lang (org-element-property :language src-block))
             (org-lang (org-element-property :language src-block))
-            (lst-lang (cadr (assq (intern org-lang)
-                                  org-man-source-highlight-langs)))
-
+            (lst-lang
+             (cadr (assq (intern org-lang)
+                         (plist-get info :man-source-highlight-langs))))
             (cmd (concat "source-highlight"
                          " -s " lst-lang
                          " -f groff_man "
                          " -i " in-file
                          " -o " out-file)))
             (cmd (concat "source-highlight"
                          " -s " lst-lang
                          " -f groff_man "
                          " -i " in-file
                          " -o " out-file)))
-
        (if lst-lang
            (let ((code-block ""))
              (with-temp-file in-file (insert code))
        (if lst-lang
            (let ((code-block ""))
              (with-temp-file in-file (insert code))
@@ -815,7 +821,7 @@ contextual information."
              (delete-file in-file)
              (delete-file out-file)
              code-block)
              (delete-file in-file)
              (delete-file out-file)
              code-block)
-         (format ".RS\n.nf\n\\fC\\m[black]%s\\m[]\\fP\n.fi\n.RE" code)))))))
+         (format ".RS\n.nf\n\\fC\\m[black]%s\\m[]\\fP\n.fi\n.RE" code))))))
 
 
 ;;; Statistics Cookie
 
 
 ;;; Statistics Cookie
@@ -868,7 +874,7 @@ CONTENTS is the contents of the table.  INFO is a plist holding
 contextual information."
   (cond
    ;; Case 1: verbatim table.
 contextual information."
   (cond
    ;; Case 1: verbatim table.
-   ((or org-man-tables-verbatim
+   ((or (plist-get info :man-tables-verbatim)
         (let ((attr (read (format "(%s)"
                  (mapconcat
                   #'identity
         (let ((attr (read (format "(%s)"
                  (mapconcat
                   #'identity
@@ -943,7 +949,8 @@ This function assumes TABLE has `org' as its `:type' attribute."
                 (let ((placement (plist-get attr :placement)))
                   (cond ((string= placement 'center) "center")
                         ((string= placement 'left) nil)
                 (let ((placement (plist-get attr :placement)))
                   (cond ((string= placement 'center) "center")
                         ((string= placement 'left) nil)
-                        (t (if org-man-tables-centered "center" ""))))
+                        ((plist-get info :man-tables-centered) "center")
+                        (t "")))
                 (or (plist-get attr :boxtype) "box"))))
 
          (title-line  (plist-get attr :title-line))
                 (or (plist-get attr :boxtype) "box"))))
 
          (title-line  (plist-get attr :title-line))
@@ -1018,16 +1025,17 @@ This function assumes TABLE has `org' as its `:type' attribute."
   "Transcode a TABLE-CELL element from Org to Man
 CONTENTS is the cell contents.  INFO is a plist used as
 a communication channel."
   "Transcode a TABLE-CELL element from Org to Man
 CONTENTS is the cell contents.  INFO is a plist used as
 a communication channel."
-    (concat (if (and contents
-                     org-man-table-scientific-notation
-                     (string-match orgtbl-exp-regexp contents))
-                ;; Use appropriate format string for scientific
-                ;; notation.
-              (format org-man-table-scientific-notation
-                        (match-string 1 contents)
-                        (match-string 2 contents))
-              contents )
-            (when (org-export-get-next-element table-cell info) "\t")))
+  (concat
+   (let ((scientific-format (plist-get info :man-table-scientific-notation)))
+     (if (and contents
+             scientific-format
+             (string-match orgtbl-exp-regexp contents))
+        ;; Use appropriate format string for scientific notation.
+        (format scientific-format
+                (match-string 1 contents)
+                (match-string 2 contents))
+       contents))
+   (when (org-export-get-next-element table-cell info) "\t")))
 
 
 ;;; Table Row
 
 
 ;;; Table Row