;;; ivy-ox.el --- org-export settings for Ivy
;; Copyright (C) 2015 Free Software Foundation, Inc.
;; Author: Oleh Krehel
;; This file is part of GNU Emacs.
;; This file 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.
;; For a full copy of the GNU General Public License
;; see .
;;* ox-texinfo
(require 'ox-texinfo)
(org-export-define-backend 'texinfo
'((bold . org-texinfo-bold)
(center-block . org-texinfo-center-block)
(clock . org-texinfo-clock)
(code . org-texinfo-kbd)
(drawer . org-texinfo-drawer)
(dynamic-block . org-texinfo-dynamic-block)
(entity . org-texinfo-entity)
(example-block . org-texinfo-example-block)
(export-block . org-texinfo-export-block)
(export-snippet . org-texinfo-export-snippet)
(fixed-width . org-texinfo-fixed-width)
(footnote-definition . org-texinfo-footnote-definition)
(footnote-reference . org-texinfo-footnote-reference)
(headline . org-texinfo-headline)
(inline-src-block . org-texinfo-inline-src-block)
(inlinetask . org-texinfo-inlinetask)
(italic . org-texinfo-italic)
(item . org-texinfo-item)
(keyword . org-texinfo-keyword)
(line-break . org-texinfo-line-break)
(link . org-texinfo-link)
(node-property . org-texinfo-node-property)
(paragraph . org-texinfo-paragraph)
(plain-list . org-texinfo-plain-list)
(plain-text . org-texinfo-plain-text)
(planning . org-texinfo-planning)
(property-drawer . org-texinfo-property-drawer)
(quote-block . org-texinfo-quote-block)
(radio-target . org-texinfo-radio-target)
(section . org-texinfo-section)
(special-block . org-texinfo-special-block)
(src-block . org-texinfo-src-block)
(statistics-cookie . org-texinfo-statistics-cookie)
(subscript . org-texinfo-subscript)
(superscript . org-texinfo-superscript)
(table . org-texinfo-table)
(table-cell . org-texinfo-table-cell)
(table-row . org-texinfo-table-row)
(target . org-texinfo-target)
(template . org-texinfo-template)
(timestamp . org-texinfo-timestamp)
(verbatim . org-texinfo-code)
(verse-block . org-texinfo-verse-block))
:filters-alist
'((:filter-headline . org-texinfo--filter-section-blank-lines)
(:filter-parse-tree . org-texinfo--normalize-headlines)
(:filter-section . org-texinfo--filter-section-blank-lines))
:menu-entry
'(?i "Export to Texinfo"
((?t "As TEXI file" org-texinfo-export-to-texinfo)
(?i "As INFO file" org-texinfo-export-to-info)
(?o "As INFO file and open"
(lambda (a s v b)
(if a (org-texinfo-export-to-info t s v b)
(org-open-file (org-texinfo-export-to-info nil s v b)))))))
:options-alist
'((:texinfo-filename "TEXINFO_FILENAME" nil nil t)
(:texinfo-class "TEXINFO_CLASS" nil org-texinfo-default-class t)
(:texinfo-header "TEXINFO_HEADER" nil nil newline)
(:texinfo-post-header "TEXINFO_POST_HEADER" nil nil newline)
(:subtitle "SUBTITLE" nil nil parse)
(:subauthor "SUBAUTHOR" nil nil newline)
(:texinfo-dircat "TEXINFO_DIR_CATEGORY" nil nil t)
(:texinfo-dirtitle "TEXINFO_DIR_TITLE" nil nil t)
(:texinfo-dirdesc "TEXINFO_DIR_DESC" nil nil t)
(:texinfo-printed-title "TEXINFO_PRINTED_TITLE" nil nil t)
;; Other variables.
(:texinfo-classes nil nil org-texinfo-classes)
(:texinfo-format-headline-function nil nil org-texinfo-format-headline-function)
(:texinfo-node-description-column nil nil org-texinfo-node-description-column)
(:texinfo-active-timestamp-format nil nil org-texinfo-active-timestamp-format)
(:texinfo-inactive-timestamp-format nil nil org-texinfo-inactive-timestamp-format)
(:texinfo-diary-timestamp-format nil nil org-texinfo-diary-timestamp-format)
(:texinfo-link-with-unknown-path-format nil nil org-texinfo-link-with-unknown-path-format)
(:texinfo-tables-verbatim nil nil org-texinfo-tables-verbatim)
(:texinfo-table-scientific-notation nil nil org-texinfo-table-scientific-notation)
(:texinfo-def-table-markup nil nil org-texinfo-def-table-markup)
(:texinfo-text-markup-alist nil nil org-texinfo-text-markup-alist)
(:texinfo-format-drawer-function nil nil org-texinfo-format-drawer-function)
(:texinfo-format-inlinetask-function nil nil org-texinfo-format-inlinetask-function)))
(defun org-texinfo-kbd (code _contents _info)
"Transcode a CODE object from Org to Texinfo."
(format "@kbd{%s}" (org-element-property :value code)))
(defun org-texinfo-plain-list (plain-list contents info)
"Transcode a PLAIN-LIST element from Org to Texinfo.
CONTENTS is the contents of the list. INFO is a plist holding
contextual information."
(let* ((attr (org-export-read-attribute :attr_texinfo plain-list))
(indic (or (plist-get attr :indic)
(plist-get info :texinfo-def-table-markup)))
(table-type (plist-get attr :table-type))
(type (org-element-property :type plain-list))
(list-type (cond
((eq type 'ordered) "enumerate")
((eq type 'unordered) "itemize")
((member table-type '("ftable" "vtable")) table-type)
(t "table"))))
(if (equal list-type "table")
(mapconcat (lambda (s)
(cond ((string-match "\\`User Option @code{\\(.*\\)}$" s)
(format "@defopt %s\n%s\n@end defopt\n"
(match-string-no-properties 1 s)
(string-trim
(substring s (1+ (match-end 1))))))
((string-match "\\(.*\\)$" s)
(let* ((line (match-string 1 s))
(body (string-trim
(substring s (1+ (match-end 1)))))
(symbol-index
(if (string-match "@code{\\(\\(?:ivy\\|swiper\\|counsel\\)-[^}]+\\)}" line)
(format "@vindex %s\n" (match-string 1 line))
""))
(key-index
(apply #'concat
(mapcar
(lambda (s)
(format "@kindex %s\n" s))
(iox-extract-kbd line)))))
(format "@subsubheading %s\n%s@indentedblock\n%s\n@end indentedblock"
line
(concat symbol-index
key-index)
body)))
(t
(concat "@subsubheading " s))))
(split-string (substring-no-properties contents) "^@item " t)
"\n")
(format "@%s\n%s@end %s"
(if (eq type 'descriptive) (concat list-type " " indic) list-type)
contents
list-type))))
(defun iox-extract-kbd (str)
(let ((start 0)
res)
(while (string-match "@kbd{\\([^}]+\\)}" str start)
(setq start (match-end 0))
(push (match-string 1 str) res))
(nreverse res)))
;;* ox-html
(require 'ox-html)
(setq org-html-validation-link nil)
(setq org-html-postamble nil)
(setq org-html-text-markup-alist
'((bold . "%s")
(code . "%s")
(italic . "%s")
(strike-through . "%s")
(underline . "%s")
(verbatim . "%s
")))
(setq org-html-style-default nil)
(defvar ivy-info-dir (file-name-directory
(or load-file-name
(buffer-file-name))))
(defun info-ivy ()
(interactive)
(let ((buf (get-buffer "*info*")))
(when buf
(kill-buffer buf)))
(Info-find-node
(expand-file-name "ivy.info" ivy-info-dir)
"Top"))
(provide 'ivy-ox)