1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438 |
- (require 'org-export)
- (eval-when-compile (require 'cl))
- (defvar org-export-man-default-packages-alist)
- (defvar org-export-man-packages-alist)
- (defvar org-e-man-translate-alist
- '((babel-call . org-e-man-babel-call)
- (bold . org-e-man-bold)
- (center-block . org-e-man-center-block)
- (clock . org-e-man-clock)
- (code . org-e-man-code)
- ( . org-e-man-comment)
- (-block . org-e-man-comment-block)
- (drawer . org-e-man-drawer)
- (dynamic-block . org-e-man-dynamic-block)
- (entity . org-e-man-entity)
- (example-block . org-e-man-example-block)
- (export-block . org-e-man-export-block)
- (export-snippet . org-e-man-export-snippet)
- (fixed-width . org-e-man-fixed-width)
- (footnote-definition . org-e-man-footnote-definition)
- (footnote-reference . org-e-man-footnote-reference)
- (headline . org-e-man-headline)
- (horizontal-rule . org-e-man-horizontal-rule)
- (inline-babel-call . org-e-man-inline-babel-call)
- (inline-src-block . org-e-man-inline-src-block)
- (inlinetask . org-e-man-inlinetask)
- (italic . org-e-man-italic)
- (item . org-e-man-item)
- (keyword . org-e-man-keyword)
- (man-environment . org-e-man-man-environment)
- (man-fragment . org-e-man-man-fragment)
- (line-break . org-e-man-line-break)
- (link . org-e-man-link)
- (macro . org-e-man-macro)
- (paragraph . org-e-man-paragraph)
- (plain-list . org-e-man-plain-list)
- (plain-text . org-e-man-plain-text)
- (planning . org-e-man-planning)
- (property-drawer . org-e-man-property-drawer)
- (quote-block . org-e-man-quote-block)
- (quote-section . org-e-man-quote-section)
- (radio-target . org-e-man-radio-target)
- (section . org-e-man-section)
- (special-block . org-e-man-special-block)
- (src-block . org-e-man-src-block)
- (statistics-cookie . org-e-man-statistics-cookie)
- (strike-through . org-e-man-strike-through)
- (subscript . org-e-man-subscript)
- (superscript . org-e-man-superscript)
- (table . org-e-man-table)
- (table-cell . org-e-man-table-cell)
- (table-row . org-e-man-table-row)
- (target . org-e-man-target)
- (template . org-e-man-template)
- (timestamp . org-e-man-timestamp)
- (underline . org-e-man-underline)
- (verbatim . org-e-man-verbatim)
- (verse-block . org-e-man-verse-block))
- "Alist between element or object types and translators.")
- (defconst org-e-man-options-alist
- '((:date "DATE" nil nil t)
- (:man-class "MAN_CLASS" nil nil t)
- (:man-class-options "MAN_CLASS_OPTIONS" nil nil t)
- (:man-header-extra "MAN_HEADER" nil nil newline))
- "Alist between Man export properties and ways to set them.
- See `org-export-options-alist' for more information on the
- structure of the values.")
- (defgroup org-export-e-man nil
- "Options for exporting Org mode files to Man."
- :tag "Org Export Man"
- :group 'org-export)
- (defcustom org-e-man-tables-centered t
- "When non-nil, tables are exported in a center environment."
- :group 'org-export-e-man
- :type 'boolean)
- (defcustom org-e-man-tables-verbatim nil
- "When non-nil, tables are exported verbatim."
- :group 'org-export-e-man
- :type 'boolean)
- (defcustom org-e-man-table-scientific-notation "%sE%s"
- "Format string to display numbers in scientific notation.
- The format should have \"%s\" twice, for mantissa and exponent
- \(i.e. \"%s\\\\times10^{%s}\").
- When nil, no transformation is made."
- :group 'org-export-e-man
- :type '(choice
- (string :tag "Format string")
- (const :tag "No formatting")))
- (defcustom org-e-man-source-highlight nil
- "Use GNU source highlight to embellish source blocks "
- :group 'org-export-e-man
- :type 'boolean)
- (defcustom org-e-man-source-highlight-langs
- '(
- (emacs-lisp "lisp") (lisp "lisp") (clojure "lisp")
- (scheme "scheme")
- (c "c") (cc "cpp") (csharp "csharp") (d "d")
- (fortran "fortran") (cobol "cobol") (pascal "pascal")
- (ada "ada") (asm "asm")
- (perl "perl") (cperl "perl")
- (python "python") (ruby "ruby") (tcl "tcl") (lua "lua")
- (java "java") (javascript "javascript")
- (tex "latex")
- (shell-script "sh") (awk "awk") (diff "diff") (m4 "m4")
- (ocaml "caml") (caml "caml")
- (sql "sql") (sqlite "sql")
- (html "html") (css "css") (xml "xml")
- (bat "bat") (bison "bison") (clipper "clipper")
- (ldap "ldap") (opa "opa")
- (php "php") (postscript "postscript") (prolog "prolog")
- (properties "properties") (makefile "makefile")
- (tml "tml") (vala "vala") (vbscript "vbscript") (xorg "xorg")
- )
- "Alist mapping languages to their listing language counterpart.
- The key is a symbol, the major mode symbol without the \"-mode\".
- The value is the string that should be inserted as the language
- parameter for the listings package. If the mode name and the
- listings name are the same, the language does not need an entry
- in this list - but it does not hurt if it is present."
- :group 'org-export-e-man
- :type '(repeat
- (list
- (symbol :tag "Major mode ")
- (string :tag "Listings language"))))
- (defvar org-e-man-custom-lang-environments nil
- "Alist mapping languages to language-specific Man environments.
- It is used during export of src blocks by the listings and
- man packages. For example,
- \(setq org-e-man-custom-lang-environments
- '\(\(python \"pythoncode\"\)\)\)
- would have the effect that if org encounters begin_src python
- during man export."
- )
- (defcustom org-e-man-quotes
- '(("fr"
- ("\\(\\s-\\|[[(]\\|^\\)\"" . "«~")
- ("\\(\\S-\\)\"" . "~»")
- ("\\(\\s-\\|(\\|^\\)'" . "'"))
- ("en"
- ("\\(\\s-\\|[[(]\\|^\\)\"" . "``")
- ("\\(\\S-\\)\"" . "''")
- ("\\(\\s-\\|(\\|^\\)'" . "`")))
- "Alist for quotes to use when converting english double-quotes.
- The CAR of each item in this alist is the language code.
- The CDR of each item in this alist is a list of three CONS:
- - the first CONS defines the opening quote;
- - the second CONS defines the closing quote;
- - the last CONS defines single quotes.
- For each item in a CONS, the first string is a regexp
- for allowed characters before/after the quote, the second
- string defines the replacement string for this quote."
- :group 'org-export-e-man
- :type '(list
- (cons :tag "Opening quote"
- (string :tag "Regexp for char before")
- (string :tag "Replacement quote "))
- (cons :tag "Closing quote"
- (string :tag "Regexp for char after ")
- (string :tag "Replacement quote "))
- (cons :tag "Single quote"
- (string :tag "Regexp for char before")
- (string :tag "Replacement quote "))))
- (defcustom org-e-man-pdf-process
- '("tbl %f | eqn | groff -man | ps2pdf - > %b.pdf"
- "tbl %f | eqn | groff -man | ps2pdf - > %b.pdf"
- "tbl %f | eqn | groff -man | ps2pdf - > %b.pdf"
- )
- "Commands to process a Man file to a PDF file.
- This is a list of strings, each of them will be given to the
- shell as a command. %f in the command will be replaced by the
- full file name, %b by the file base name \(i.e. without
- extension) and %o by the base directory of the file.
- By default, Org uses 3 runs of to do the processing.
- Alternatively, this may be a Lisp function that does the
- processing. This function should accept the file name as
- its single argument."
- :group 'org-export-pdf
- :type '(choice
- (repeat :tag "Shell command sequence"
- (string :tag "Shell command"))
- (const :tag "2 runs of pdfgroff"
- ("tbl %f | eqn | groff -mm | ps2pdf - > %b.pdf"
- "tbl %f | eqn | groff -mm | ps2pdf - > %b.pdf" ))
- (const :tag "3 runs of pdfgroff"
- ("tbl %f | eqn | groff -mm | ps2pdf - > %b.pdf"
- "tbl %f | eqn | groff -mm | ps2pdf - > %b.pdf"
- "tbl %f | eqn | groff -mm | ps2pdf - > %b.pdf"))
- (function)))
- (defcustom org-e-man-logfiles-extensions
- '("log" "out" "toc")
- "The list of file extensions to consider as Man logfiles."
- :group 'org-export-e-man
- :type '(repeat (string :tag "Extension")))
- (defcustom org-e-man-remove-logfiles t
- "Non-nil means remove the logfiles produced by PDF production.
- These are the .aux, .log, .out, and .toc files."
- :group 'org-export-e-man
- :type 'boolean)
- (add-to-list 'org-element-block-name-alist
- '("MAN" . org-element-export-block-parser))
- (defun org-e-man--caption/label-string (caption label info)
- "Return caption and label Man string for floats.
- CAPTION is a cons cell of secondary strings, the car being the
- standard caption and the cdr its short form. LABEL is a string
- representing the label. INFO is a plist holding contextual
- information.
- If there's no caption nor label, return the empty string.
- For non-floats, see `org-e-man--wrap-label'."
- (let ((label-str "" ))
- (cond
- ((and (not caption) (not label)) "")
- ((not caption) (format "\\fI%s\\fP" label))
-
- ((cdr caption)
- (format "\\fR%s\\fP - \\fI%s\\P - %s\n"
- (org-export-data (cdr caption) info)
- label-str
- (org-export-data (car caption) info)))
-
- (t (format "\\fR%s\\fP"
- (org-export-data (car caption) info)))))
- )
- (defun org-e-man--quotation-marks (text info)
- "Export quotation marks depending on language conventions.
- TEXT is a string containing quotation marks to be replaced. INFO
- is a plist used as a communication channel."
- (mapc (lambda(l)
- (let ((start 0))
- (while (setq start (string-match (car l) text start))
- (let ((new-quote (concat (match-string 1 text) (cdr l))))
- (setq text (replace-match new-quote t t text))))))
- (cdr (or (assoc (plist-get info :language) org-e-man-quotes)
-
- (assoc "en" org-e-man-quotes))))
- text)
- (defun org-e-man--wrap-label (element output)
- "Wrap label associated to ELEMENT around OUTPUT, if appropriate.
- This function shouldn't be used for floats. See
- `org-e-man--caption/label-string'."
- (let ((label (org-element-property :name element)))
- (if (or (not output) (not label) (string= output "") (string= label ""))
- output
- (concat (format "%s\n.br\n" label) output))))
- (defun org-e-man-template (contents info)
- "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))
- (attr
- (read
- (format
- "(%s)"
- (mapconcat
- #'identity
- (list (plist-get info :man-class-options))
- " ")))) )
- (setq section-item (plist-get attr :section-id))
- (concat
- (cond
- ((and title (stringp section-item))
- (format ".TH \"%s\" \"%s\" \n" title section-item )
- )
- ((and (string= "" title) (stringp section-item))
- (format ".TH \"%s\" \"%s\" \n" " " section-item )
- )
- (title
- (format ".TH \"%s\" \"1\" \n" title )
- )
- (t
- ".TH \" \" \"1\" "))
- contents )))
- (defun org-e-man-bold (bold contents info)
- "Transcode BOLD from Org to Man.
- CONTENTS is the text with bold markup. INFO is a plist holding
- contextual information."
- (format "\\fB%s\\fP" contents) )
- (defun org-e-man-center-block (center-block contents info)
- "Transcode a CENTER-BLOCK element from Org to Man.
- CONTENTS holds the contents of the center block. INFO is a plist
- holding contextual information."
- (org-e-man--wrap-label
- center-block
- (format ".ce %d\n.nf\n%s\n.fi"
- (- (length (split-string contents "\n")) 1 )
- contents)))
- (defun org-e-man-clock (clock contents info)
- "Transcode a CLOCK element from Org to Man.
- CONTENTS is nil. INFO is a plist holding contextual
- information."
- "" )
- (defun org-e-man-code (code contents info)
- "Transcode a CODE object from Org to Man.
- CONTENTS is nil. INFO is a plist used as a communication
- channel."
- (format "\\fC%s\\fP" code) )
- (defun org-e-man-drawer (drawer contents info)
- "Transcode a DRAWER element from Org to Man.
- DRAWER holds the drawer information
- CONTENTS holds the contents of the block.
- INFO is a plist holding contextual information. "
- contents)
- (defun org-e-man-dynamic-block (dynamic-block contents info)
- "Transcode a DYNAMIC-BLOCK element from Org to Man.
- CONTENTS holds the contents of the block. INFO is a plist
- holding contextual information. See `org-export-data'."
- (org-e-man--wrap-label dynamic-block contents))
- (defun org-e-man-entity (entity contents info)
- "Transcode an ENTITY object from Org to Man.
- CONTENTS are the definition itself. INFO is a plist holding
- contextual information."
- (let ((ent (org-element-property :utf8 entity))) ent))
- (defun org-e-man-example-block (example-block contents info)
- "Transcode an EXAMPLE-BLOCK element from Org to Man.
- CONTENTS is nil. INFO is a plist holding contextual
- information."
- (org-e-man--wrap-label
- example-block
- (format ".RS\n.nf\n%s\n.fi\n.RE"
- (org-export-format-code-default example-block info))))
- (defun org-e-man-export-block (export-block contents info)
- "Transcode a EXPORT-BLOCK element from Org to Man.
- CONTENTS is nil. INFO is a plist holding contextual information."
- (when (string= (org-element-property :type export-block) "MAN")
- (org-remove-indentation (org-element-property :value export-block))))
- (defun org-e-man-export-snippet (export-snippet contents info)
- "Transcode a EXPORT-SNIPPET object from Org to Man.
- CONTENTS is nil. INFO is a plist holding contextual information."
- (when (eq (org-export-snippet-backend export-snippet) 'e-man)
- (org-element-property :value export-snippet)))
- (defun org-e-man-fixed-width (fixed-width contents info)
- "Transcode a FIXED-WIDTH element from Org to Man.
- CONTENTS is nil. INFO is a plist holding contextual information."
- (org-e-man--wrap-label
- fixed-width
- (format "\\fC\n%s\\fP"
- (org-remove-indentation
- (org-element-property :value fixed-width)))))
- (defun org-e-man-headline (headline contents info)
- "Transcode an HEADLINE element from Org to Man.
- CONTENTS holds the contents of the headline. INFO is a plist
- holding contextual information."
- (let* ((level (org-export-get-relative-level headline info))
- (numberedp (org-export-numbered-headline-p headline info))
-
-
- (section-fmt
- (case level
- (1 ".SH \"%s\"\n%s")
- (2 ".SS \"%s\"\n%s")
- (3 ".SS \"%s\"\n%s")
- (t nil)) )
- (text (org-export-data (org-element-property :title headline) info)) )
- (cond
-
- ((org-element-property :footnote-section-p headline) nil)
-
-
-
- ((or (not section-fmt) (org-export-low-level-p headline info))
-
- (let ((low-level-body
- (concat
-
- (when (org-export-first-sibling-p headline)
- (format "%s\n" ".RS"))
-
- ".TP\n.ft I\n" text "\n.ft\n"
- contents ".RE")))
-
-
-
- (if (not (org-export-last-sibling-p headline)) low-level-body
- (replace-regexp-in-string
- "[ \t\n]*\\'" ""
- low-level-body))))
-
- (t (format section-fmt text contents )))))
- (defun org-e-man-inline-src-block (inline-src-block contents info)
- "Transcode an INLINE-SRC-BLOCK element from Org to Man.
- CONTENTS holds the contents of the item. INFO is a plist holding
- contextual information."
- (let* ((code (org-element-property :value inline-src-block)))
- (cond
- (org-e-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)) )
- (org-lang (org-element-property :language inline-src-block))
- (lst-lang (cadr (assq (intern org-lang)
- org-e-man-source-highlight-langs)))
-
- (cmd (concat (expand-file-name "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))
- (shell-command cmd)
- (setq code-block (org-file-contents out-file) )
- (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\n"
- code))
- ))
-
- (t
- (concat ".RS\n.nf\n" "\\fC" "\n" code "\n"
- "\\fP\n.fi\n.RE\n"))
- )))
- (defun org-e-man-italic (italic contents info)
- "Transcode ITALIC from Org to Man.
- CONTENTS is the text with italic markup. INFO is a plist holding
- contextual information."
- (format "\\fI%s\\fP" contents))
- (defun org-e-man-item (item contents info)
- "Transcode an ITEM element from Org to Man.
- CONTENTS holds the contents of the item. INFO is a plist holding
- contextual information."
- (let* ((counter
- (let ((count (org-element-property :counter item))
- (level
- (loop for parent in (org-export-get-genealogy item)
- count (eq (org-element-type parent) 'plain-list)
- until (eq (org-element-type parent) 'headline))))
- (and count
- (< level 5)
- (concat ""))))
- (bullet (org-element-property :bullet item))
- (type (org-element-property :type (org-element-property :parent item)))
- (checkbox (case (org-element-property :checkbox item)
- (on "\\o'\\(sq\\(mu'")
- (off "\\(sq ")
- (trans "\\o'\\(sq\\(mi'" )))
- (tag (let ((tag (org-element-property :tag item)))
-
- (and tag (format "\\fB%s\\fP"
- (concat checkbox
- (org-export-data tag info)))))))
- (if (and (null tag )
- (null checkbox))
- (let* ((bullet (org-trim bullet))
- (marker (cond ((string= "-" bullet) "\\(em")
- ((string= "*" bullet) "\\(bu")
- ((eq type 'ordered)
- (format "%s " (org-trim bullet)))
- (t "\\(dg") ) ))
- (concat ".IP " marker " 4\n"
- (org-trim (or contents " " ) )))
-
- (concat ".TP\n" (or tag (concat " " checkbox)) "\n"
- (org-trim (or contents " " ) )
-
-
- )) ))
- (defun org-e-man-keyword (keyword contents info)
- "Transcode a KEYWORD element from Org to Man.
- CONTENTS is nil. INFO is a plist holding contextual information."
- (let ((key (org-element-property :key keyword))
- (value (org-element-property :value keyword)))
- (cond
- ((string= key "MAN") value)
- ((string= key "INDEX") nil)
-
- ((string= key "TARGET") nil)
- ((string= key "TOC" ) nil))))
- (defun org-e-man-man-environment (man-environment contents info)
- "Transcode a MAN-ENVIRONMENT element from Org to Man.
- CONTENTS is nil. INFO is a plist holding contextual information."
- (let ((label (org-element-property :name man-environment))
- (value (org-remove-indentation
- (org-element-property :value man-environment))))
- (if (not (org-string-nw-p label)) value
-
-
-
- (with-temp-buffer
- (insert value)
- (goto-char (point-min))
- (forward-line)
- (insert (format "%s\n" label))
- (buffer-string)))))
- (defun org-e-man-man-fragment (man-fragment contents info)
- "Transcode a MAN-FRAGMENT object from Org to Man.
- CONTENTS is nil. INFO is a plist holding contextual information."
- (org-element-property :value man-fragment))
- (defun org-e-man-line-break (line-break contents info)
- "Transcode a LINE-BREAK object from Org to Man.
- CONTENTS is nil. INFO is a plist holding contextual information."
- ".br\n")
- (defun org-e-man-link (link desc info)
- "Transcode a LINK object from Org to Man.
- DESC is the description part of the link, or the empty string.
- INFO is a plist holding contextual information. See
- `org-export-data'."
-
- (let* ((type (org-element-property :type link))
- (raw-path (org-element-property :path link))
-
- (desc (and (not (string= desc "")) desc))
- (path (cond
- ((member type '("http" "https" "ftp" "mailto"))
- (concat type ":" raw-path))
- ((string= type "file")
- (when (string-match "\\(.+\\)::.+" raw-path)
- (setq raw-path (match-string 1 raw-path)))
- (if (file-name-absolute-p raw-path)
- (concat "file://" (expand-file-name raw-path))
- (concat "file://" raw-path)))
- (t raw-path)))
- protocol)
- (cond
-
-
-
- ((and path desc) (format "%s \\fBat\\fP \\fI%s\\fP" path desc))
-
- (path (format "\\fI%s\\fP" path))
-
- (t (format "\\fI%s\\fP" desc)))))
- (defun org-e-man-macro (macro contents info)
- "Transcode a MACRO element from Org to Man.
- CONTENTS is nil. INFO is a plist holding contextual information."
-
- (org-export-expand-macro macro info))
- (defun org-e-man-paragraph (paragraph contents info)
- "Transcode a PARAGRAPH element from Org to Man.
- CONTENTS is the contents of the paragraph, as a string. INFO is
- the plist used as a communication channel."
- (setq parent (plist-get (nth 1 paragraph) :parent))
- (when parent
- (let ((parent-type (car parent))
- (fixed-paragraph ""))
- (cond ((and (eq parent-type 'item)
- (plist-get (nth 1 parent) :bullet ) )
- (setq fixed-paragraph (concat "" contents)) )
- ((eq parent-type 'section)
- (setq fixed-paragraph (concat ".PP\n" contents) ) )
- ((eq parent-type 'footnote-definition)
- (setq fixed-paragraph contents))
- (t (setq fixed-paragraph (concat "" contents) ) )
- )
- fixed-paragraph)
- )
- )
- (defun org-e-man-plain-list (plain-list contents info)
- "Transcode a PLAIN-LIST element from Org to Man.
- CONTENTS is the contents of the list. INFO is a plist holding
- contextual information."
- contents)
- (defun org-e-man-plain-text (text info)
- "Transcode a TEXT string from Org to Man.
- TEXT is the string to transcode. INFO is a plist holding
- contextual information."
-
- (setq text (replace-regexp-in-string
- "\\(?:[^\\]\\|^\\)\\(\\\\\\)\\(?:[^%$#&{}~^_\\]\\|$\\)"
- "$\\" text nil t 1))
-
- (setq text (org-e-man--quotation-marks text info))
-
- (when (plist-get info :preserve-breaks)
- (setq text (replace-regexp-in-string "\\(\\\\\\\\\\)?[ \t]*\n" " \\\\\\\\\n"
- text)))
-
- text)
- (defun org-e-man-quote-block (quote-block contents info)
- "Transcode a QUOTE-BLOCK element from Org to Man.
- CONTENTS holds the contents of the block. INFO is a plist
- holding contextual information."
- (org-e-man--wrap-label
- quote-block
- (format ".RS\n%s\n.RE" contents)))
- (defun org-e-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))))
- (defun org-e-man-radio-target (radio-target text info)
- "Transcode a RADIO-TARGET object from Org to Man.
- TEXT is the text of the target. INFO is a plist holding
- contextual information."
- text )
- (defun org-e-man-section (section contents info)
- "Transcode a SECTION element from Org to Man.
- CONTENTS holds the contents of the section. INFO is a plist
- holding contextual information."
- contents)
- (defun org-e-man-special-block (special-block contents info)
- "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))))
- (org-e-man--wrap-label
- special-block
- (format "%s\n" contents))))
- (defun org-e-man-src-block (src-block contents info)
- "Transcode a SRC-BLOCK element from Org to Man.
- CONTENTS holds the contents of the item. INFO is a plist holding
- contextual information."
- (let* ((lang (org-element-property :language src-block))
- (caption (org-element-property :caption src-block))
- (label (org-element-property :name src-block))
- (code (org-element-property :value src-block))
- (custom-env (and lang
- (cadr (assq (intern lang)
- org-e-man-custom-lang-environments))))
- (num-start (case (org-element-property :number-lines src-block)
- (continued (org-export-get-loc src-block info))
- (new 0)))
- (retain-labels (org-element-property :retain-labels src-block)))
- (cond
-
- ((not org-e-man-source-highlight)
- (let ((caption-str (org-e-man--caption/label-string caption label info))
- (float-env (when caption ".RS\n.nf\\fC%s\\fP\n.fi.RE\n")))
- (format
- (or float-env "%s")
- (concat
- (format ".RS\n.nf\n\\fC%s\\fP\n.fi\n.RE\n\n"
- (org-export-format-code-default src-block info)
- )))))
- ( (and org-e-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)) )
- (org-lang (org-element-property :language src-block))
- (lst-lang (cadr (assq (intern org-lang)
- org-e-man-source-highlight-langs)) )
-
- (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))
- (shell-command cmd)
- (setq code-block (org-file-contents out-file) )
- (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))
- )
- )
- )))
- (defun org-e-man-statistics-cookie (statistics-cookie contents info)
- "Transcode a STATISTICS-COOKIE object from Org to Man.
- CONTENTS is nil. INFO is a plist holding contextual information."
- (org-element-property :value statistics-cookie))
- (defun org-e-man-strike-through (strike-through contents info)
- "Transcode STRIKE-THROUGH from Org to Man.
- CONTENTS is the text with strike-through markup. INFO is a plist
- holding contextual information."
- (format "\\fI%s\\fP" contents))
- (defun org-e-man-subscript (subscript contents info)
- "Transcode a SUBSCRIPT object from Org to Man.
- CONTENTS is the contents of the object. INFO is a plist holding
- contextual information."
- (format "\\d\\s-2%s\\s+2\\u" contents))
- (defun org-e-man-superscript (superscript contents info)
- "Transcode a SUPERSCRIPT object from Org to Man.
- CONTENTS is the contents of the object. INFO is a plist holding
- contextual information."
- (format "\\u\\s-2%s\\s+2\\d" contents))
- (defun org-e-man-table (table contents info)
- "Transcode a TABLE element from Org to Man.
- CONTENTS is the contents of the table. INFO is a plist holding
- contextual information."
- (cond
-
- ((or org-e-man-tables-verbatim
- (let ((attr
- (read
- (format
- "(%s)"
- (mapconcat
- #'identity
- (org-element-property :attr_man table)
- " ")))) )
- (and attr (plist-get attr :verbatim))))
- (format ".nf\n\\fC%s\\fP\n.fi"
-
- (org-trim
- (org-element-interpret-data
- `(table nil ,@(org-element-contents table))))))
-
- (t (org-e-man-table--org-table table contents info))))
- (defun org-e-man-table--align-string (divider table info)
- "Return an appropriate Man alignment string.
- TABLE is the considered table. INFO is a plist used as
- a communication channel."
- (let ((attr
- (read
- (format
- "(%s)"
- (mapconcat
- #'identity
- (org-element-property :attr_man table)
- " ")))))
- (setq align
- (case (plist-get attr :align)
- ('center "c")
- ('left "l")
- ('right "r")))
- (let (alignment)
-
-
- (org-element-map
- (org-element-map
- table 'table-row
- (lambda (row)
- (and (eq (org-element-property :type row) 'standard) row))
- info 'first-match)
- 'table-cell
- (lambda (cell)
- (let* ((borders (org-export-table-cell-borders cell info))
- (raw-width (org-export-table-cell-width cell info))
- (width-cm (when raw-width (/ raw-width 5)))
- (width (if raw-width (format "w(%dc)" (if (< width-cm 1) 1 width-cm)) "") ))
-
- (when (and (memq 'left borders) (not alignment))
- (push "|" alignment))
- (push
- (if (not align)
- (case (org-export-table-cell-alignment cell info)
- (left (concat "l" width divider) )
- (right (concat "r" width divider))
- (center (concat "c" width divider)))
- (concat align divider))
- alignment)
- (when (memq 'right borders) (push "|" alignment))))
- info)
- (apply 'concat (reverse alignment)))
- ))
- (defun org-e-man-table--org-table (table contents info)
- "Return appropriate Man code for an Org table.
- TABLE is the table type element to transcode. CONTENTS is its
- contents, as a string. INFO is a plist used as a communication
- channel.
- This function assumes TABLE has `org' as its `:type' attribute."
- (let* ((label (org-element-property :name table))
- (caption (org-e-man--caption/label-string
- (org-element-property :caption table) label info))
- (attr
- (read
- (format
- "(%s)"
- (mapconcat
- #'identity
- (org-element-property :attr_man table)
- " "))))
- (divider (if (plist-get attr :divider)
- "|"
- " "))
-
- (alignment (org-e-man-table--align-string divider table info))
-
- )
-
- (setq lines (org-split-string contents "\n"))
- (setq attr-list
- (let ((result-list '()))
- (dolist (attr-item
- (list
- (if (plist-get attr :expand)
- "expand"
- nil
- )
- (case (plist-get attr :placement)
- ('center "center")
- ('left nil)
- (t
- (if org-e-man-tables-centered
- "center"
- "" )))
- (case (plist-get attr :boxtype)
- ('box "box")
- ('doublebox "doublebox")
- ('allbox "allbox")
- ('none nil)
- (t "box"))
- ))
- (if attr-item
- (add-to-list 'result-list attr-item)
- ))
- result-list ))
- (setq title-line (plist-get attr :title-line))
- (setq table-format (concat
- (format "%s"
- (or (car attr-list) "" ))
- (or
- (let ((output-list '()))
- (when (cdr attr-list)
- (dolist (attr-item (cdr attr-list))
- (setq output-list (concat output-list (format ",%s" attr-item )) ) ))
- output-list)
- "") ))
-
- (when lines
- (setq first-line (org-split-string (car lines) "\t")))
- (cond
-
- (lines (concat ".TS\n " table-format ";\n"
-
- (format "%s.\n"
- (let ((final-line ""))
- (when title-line
- (dotimes (i (length first-line))
- (setq final-line (concat final-line "cb" divider))
- ))
- (setq final-line (concat final-line "\n"))
- (if alignment
- (setq final-line (concat final-line alignment))
- (dotimes (i (length first-line))
- (setq final-line (concat final-line "c" divider))))
- final-line ))
- (format "%s.TE"
- (let ((final-line ""))
- (dolist (line-item lines)
- (cond
- (t
- (setq lines (org-split-string contents "\n"))
- (setq final-line (concat final-line
- (car (org-split-string line-item "\\\\")) "\n"))
- )
- )
-
- ) final-line) )
- )))))
- (defun org-e-man-table-cell (table-cell contents info)
- "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-e-man-table-scientific-notation
- (string-match orgtbl-exp-regexp contents))
-
-
- (format org-e-man-table-scientific-notation
- (match-string 1 contents)
- (match-string 2 contents))
- contents)
- (when (org-export-get-next-element table-cell) " \t ")))
- (defun org-e-man-table-row (table-row contents info)
- "Transcode a TABLE-ROW element from Org to Man
- CONTENTS is the contents of the row. INFO is a plist used as
- a communication channel."
-
-
- (when (eq (org-element-property :type table-row) 'standard)
- (let* ((attr (mapconcat 'identity
- (org-element-property
- :attr_man (org-export-get-parent table-row))
- " "))
-
- (borders
- (org-export-table-cell-borders
- (car (org-element-contents table-row)) info)))
- (concat
-
- (cond ((and (memq 'top borders) (memq 'above borders)) "_\n"))
- contents "\\\\\n"
- (cond
-
-
- ((and (memq 'bottom borders) (memq 'below borders)) "_\n")
- ((memq 'below borders) "_"))))))
- (defun org-e-man-target (target contents info)
- "Transcode a TARGET object from Org to Man.
- CONTENTS is nil. INFO is a plist holding contextual
- information."
- (format "\\fI%s\\fP"
- (org-export-solidify-link-text (org-element-property :value target))))
- (defun org-e-man-timestamp (timestamp contents info)
- "Transcode a TIMESTAMP object from Org to Man.
- CONTENTS is nil. INFO is a plist holding contextual
- information."
- "" )
- (defun org-e-man-underline (underline contents info)
- "Transcode UNDERLINE from Org to Man.
- CONTENTS is the text with underline markup. INFO is a plist
- holding contextual information."
- (format "\\fI%s\\fP" contents))
- (defun org-e-man-verbatim (verbatim contents info)
- "Transcode a VERBATIM object from Org to Man.
- CONTENTS is nil. INFO is a plist used as a communication
- channel."
- (format ".nf\n%s\n.fi" contents))
- (defun org-e-man-verse-block (verse-block contents info)
- "Transcode a VERSE-BLOCK element from Org to Man.
- CONTENTS is verse block contents. INFO is a plist holding
- contextual information."
- (format ".RS\n.ft I\n%s\n.ft\n.RE" contents))
- (defun org-e-man-export-to-man
- (&optional subtreep visible-only body-only ext-plist pub-dir)
- "Export current buffer to a Man file.
- If narrowing is active in the current buffer, only export its
- narrowed part.
- If a region is active, export that region.
- When optional argument SUBTREEP is non-nil, export the sub-tree
- at point, extracting information from the headline properties
- first.
- When optional argument VISIBLE-ONLY is non-nil, don't export
- contents of hidden elements.
- When optional argument BODY-ONLY is non-nil, only the body
- without any markers.
- EXT-PLIST, when provided, is a property list with external
- parameters overriding Org default settings, but still inferior to
- file-local settings.
- When optional argument PUB-DIR is set, use it as the publishing
- directory.
- Return output file's name."
- (interactive)
- (let ((outfile (org-export-output-file-name ".man" subtreep pub-dir)))
- (org-export-to-file
- 'e-man outfile subtreep visible-only body-only ext-plist)))
- (defun org-e-man-export-to-pdf
- (&optional subtreep visible-only body-only ext-plist pub-dir)
- "Export current buffer to Groff then process through to PDF.
- If narrowing is active in the current buffer, only export its
- narrowed part.
- If a region is active, export that region.
- When optional argument SUBTREEP is non-nil, export the sub-tree
- at point, extracting information from the headline properties
- first.
- When optional argument VISIBLE-ONLY is non-nil, don't export
- contents of hidden elements.
- When optional argument BODY-ONLY is non-nil, only write between
- markers.
- EXT-PLIST, when provided, is a property list with external
- parameters overriding Org default settings, but still inferior to
- file-local settings.
- When optional argument PUB-DIR is set, use it as the publishing
- directory.
- Return PDF file's name."
- (interactive)
- (org-e-man-compile
- (org-e-man-export-to-man
- subtreep visible-only body-only ext-plist pub-dir)))
- (defun org-e-man-compile (grofffile)
- "Compile a Groff file.
- GROFFFILE is the name of the file being compiled. Processing is
- done through the command specified in `org-e-man-pdf-process'.
- Return PDF file name or an error if it couldn't be produced."
- (let* ((wconfig (current-window-configuration))
- (grofffile (file-truename grofffile))
- (base (file-name-sans-extension grofffile))
- errors)
- (message (format "Processing Groff file %s ..." grofffile))
- (unwind-protect
- (progn
- (cond
-
- ((functionp org-e-man-pdf-process)
- (funcall org-e-man-pdf-process (shell-quote-argument grofffile)))
-
-
-
- ((consp org-e-man-pdf-process)
- (let* ((out-dir (or (file-name-directory grofffile) "./"))
- (outbuf (get-buffer-create "*Org PDF Groff Output*")))
- (mapc
- (lambda (command)
- (shell-command
- (replace-regexp-in-string
- "%b" (shell-quote-argument base)
- (replace-regexp-in-string
- "%f" (shell-quote-argument grofffile)
- (replace-regexp-in-string
- "%o" (shell-quote-argument out-dir) command t t) t t) t t)
- outbuf))
- org-e-man-pdf-process)
-
- (setq errors (org-e-man-collect-errors outbuf))))
- (t (error "No valid command to process to PDF")))
- (let ((pdffile (concat base ".pdf")))
-
-
- (if (not (file-exists-p pdffile))
- (error (concat (format "PDF file %s wasn't produced" pdffile)
- (when errors (concat ": " errors))))
-
-
- (when org-e-man-remove-logfiles
- (dolist (ext org-e-man-logfiles-extensions)
- (let ((file (concat base "." ext)))
- (when (file-exists-p file) (delete-file file)))))
- (message (concat "Process completed"
- (if (not errors) "."
- (concat " with errors: " errors)))))
-
- pdffile))
- (set-window-configuration wconfig))))
- (defun org-e-man-collect-errors (buffer)
- "Collect some kind of errors from \"groff\" output
- BUFFER is the buffer containing output.
- Return collected error types as a string, or nil if there was
- none."
- (with-current-buffer buffer
- (save-excursion
- (goto-char (point-max))
-
- nil )))
- (provide 'org-e-man)
|