| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196 | 
							- ;;; ox-ascii.el --- ASCII Back-End for Org Export Engine -*- lexical-binding: t; -*-
 
- ;; Copyright (C) 2012-2019 Free Software Foundation, Inc.
 
- ;; Author: Nicolas Goaziou <n.goaziou at gmail dot com>
 
- ;; Keywords: outlines, hypermedia, calendar, wp
 
- ;; This file is 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 <https://www.gnu.org/licenses/>.
 
- ;;; Commentary:
 
- ;;
 
- ;; This library implements an ASCII back-end for Org generic exporter.
 
- ;; See Org manual for more information.
 
- ;;; Code:
 
- (require 'ox)
 
- (require 'ox-publish)
 
- (require 'cl-lib)
 
- (declare-function aa2u "ext:ascii-art-to-unicode" ())
 
- ;;; Define Back-End
 
- ;;
 
- ;; The following setting won't allow modifying preferred charset
 
- ;; through a buffer keyword or an option item, but, since the property
 
- ;; will appear in communication channel nonetheless, it allows
 
- ;; overriding `org-ascii-charset' variable on the fly by the ext-plist
 
- ;; mechanism.
 
- ;;
 
- ;; We also install a filter for headlines and sections, in order to
 
- ;; control blank lines separating them in output string.
 
- (org-export-define-backend 'ascii
 
-   '((bold . org-ascii-bold)
 
-     (center-block . org-ascii-center-block)
 
-     (clock . org-ascii-clock)
 
-     (code . org-ascii-code)
 
-     (drawer . org-ascii-drawer)
 
-     (dynamic-block . org-ascii-dynamic-block)
 
-     (entity . org-ascii-entity)
 
-     (example-block . org-ascii-example-block)
 
-     (export-block . org-ascii-export-block)
 
-     (export-snippet . org-ascii-export-snippet)
 
-     (fixed-width . org-ascii-fixed-width)
 
-     (footnote-reference . org-ascii-footnote-reference)
 
-     (headline . org-ascii-headline)
 
-     (horizontal-rule . org-ascii-horizontal-rule)
 
-     (inline-src-block . org-ascii-inline-src-block)
 
-     (inlinetask . org-ascii-inlinetask)
 
-     (inner-template . org-ascii-inner-template)
 
-     (italic . org-ascii-italic)
 
-     (item . org-ascii-item)
 
-     (keyword . org-ascii-keyword)
 
-     (latex-environment . org-ascii-latex-environment)
 
-     (latex-fragment . org-ascii-latex-fragment)
 
-     (line-break . org-ascii-line-break)
 
-     (link . org-ascii-link)
 
-     (node-property . org-ascii-node-property)
 
-     (paragraph . org-ascii-paragraph)
 
-     (plain-list . org-ascii-plain-list)
 
-     (plain-text . org-ascii-plain-text)
 
-     (planning . org-ascii-planning)
 
-     (property-drawer . org-ascii-property-drawer)
 
-     (quote-block . org-ascii-quote-block)
 
-     (radio-target . org-ascii-radio-target)
 
-     (section . org-ascii-section)
 
-     (special-block . org-ascii-special-block)
 
-     (src-block . org-ascii-src-block)
 
-     (statistics-cookie . org-ascii-statistics-cookie)
 
-     (strike-through . org-ascii-strike-through)
 
-     (subscript . org-ascii-subscript)
 
-     (superscript . org-ascii-superscript)
 
-     (table . org-ascii-table)
 
-     (table-cell . org-ascii-table-cell)
 
-     (table-row . org-ascii-table-row)
 
-     (target . org-ascii-target)
 
-     (template . org-ascii-template)
 
-     (timestamp . org-ascii-timestamp)
 
-     (underline . org-ascii-underline)
 
-     (verbatim . org-ascii-verbatim)
 
-     (verse-block . org-ascii-verse-block))
 
-   :menu-entry
 
-   '(?t "Export to Plain Text"
 
-        ((?A "As ASCII buffer"
 
- 	    (lambda (a s v b)
 
- 	      (org-ascii-export-as-ascii a s v b '(:ascii-charset ascii))))
 
- 	(?a "As ASCII file"
 
- 	    (lambda (a s v b)
 
- 	      (org-ascii-export-to-ascii a s v b '(:ascii-charset ascii))))
 
- 	(?L "As Latin1 buffer"
 
- 	    (lambda (a s v b)
 
- 	      (org-ascii-export-as-ascii a s v b '(:ascii-charset latin1))))
 
- 	(?l "As Latin1 file"
 
- 	    (lambda (a s v b)
 
- 	      (org-ascii-export-to-ascii a s v b '(:ascii-charset latin1))))
 
- 	(?U "As UTF-8 buffer"
 
- 	    (lambda (a s v b)
 
- 	      (org-ascii-export-as-ascii a s v b '(:ascii-charset utf-8))))
 
- 	(?u "As UTF-8 file"
 
- 	    (lambda (a s v b)
 
- 	      (org-ascii-export-to-ascii a s v b '(:ascii-charset utf-8))))))
 
-   :filters-alist '((:filter-headline . org-ascii-filter-headline-blank-lines)
 
- 		   (:filter-parse-tree org-ascii-filter-paragraph-spacing
 
- 				       org-ascii-filter-comment-spacing)
 
- 		   (:filter-section . org-ascii-filter-headline-blank-lines))
 
-   :options-alist
 
-   '((:subtitle "SUBTITLE" nil nil parse)
 
-     (:ascii-bullets nil nil org-ascii-bullets)
 
-     (:ascii-caption-above nil nil org-ascii-caption-above)
 
-     (:ascii-charset nil nil org-ascii-charset)
 
-     (:ascii-global-margin nil nil org-ascii-global-margin)
 
-     (:ascii-format-drawer-function nil nil org-ascii-format-drawer-function)
 
-     (:ascii-format-inlinetask-function
 
-      nil nil org-ascii-format-inlinetask-function)
 
-     (:ascii-headline-spacing nil nil org-ascii-headline-spacing)
 
-     (:ascii-indented-line-width nil nil org-ascii-indented-line-width)
 
-     (:ascii-inlinetask-width nil nil org-ascii-inlinetask-width)
 
-     (:ascii-inner-margin nil nil org-ascii-inner-margin)
 
-     (:ascii-links-to-notes nil nil org-ascii-links-to-notes)
 
-     (:ascii-list-margin nil nil org-ascii-list-margin)
 
-     (:ascii-paragraph-spacing nil nil org-ascii-paragraph-spacing)
 
-     (:ascii-quote-margin nil nil org-ascii-quote-margin)
 
-     (:ascii-table-keep-all-vertical-lines
 
-      nil nil org-ascii-table-keep-all-vertical-lines)
 
-     (:ascii-table-use-ascii-art nil nil org-ascii-table-use-ascii-art)
 
-     (:ascii-table-widen-columns nil nil org-ascii-table-widen-columns)
 
-     (:ascii-text-width nil nil org-ascii-text-width)
 
-     (:ascii-underline nil nil org-ascii-underline)
 
-     (:ascii-verbatim-format nil nil org-ascii-verbatim-format)))
 
- ;;; User Configurable Variables
 
- (defgroup org-export-ascii nil
 
-   "Options for exporting Org mode files to ASCII."
 
-   :tag "Org Export ASCII"
 
-   :group 'org-export)
 
- (defcustom org-ascii-text-width 72
 
-   "Maximum width of exported text.
 
- This number includes margin size, as set in
 
- `org-ascii-global-margin'."
 
-   :group 'org-export-ascii
 
-   :version "24.4"
 
-   :package-version '(Org . "8.0")
 
-   :type 'integer)
 
- (defcustom org-ascii-global-margin 0
 
-   "Width of the left margin, in number of characters."
 
-   :group 'org-export-ascii
 
-   :version "24.4"
 
-   :package-version '(Org . "8.0")
 
-   :type 'integer)
 
- (defcustom org-ascii-inner-margin 2
 
-   "Width of the inner margin, in number of characters.
 
- Inner margin is applied between each headline."
 
-   :group 'org-export-ascii
 
-   :version "24.4"
 
-   :package-version '(Org . "8.0")
 
-   :type 'integer)
 
- (defcustom org-ascii-quote-margin 6
 
-   "Width of margin used for quoting text, in characters.
 
- This margin is applied on both sides of the text.  It is also
 
- applied on the left side of contents in descriptive lists."
 
-   :group 'org-export-ascii
 
-   :version "24.4"
 
-   :package-version '(Org . "8.0")
 
-   :type 'integer)
 
- (defcustom org-ascii-list-margin 0
 
-   "Width of margin used for plain lists, in characters.
 
- This margin applies to top level list only, not to its
 
- sub-lists."
 
-   :group 'org-export-ascii
 
-   :version "26.1"
 
-   :package-version '(Org . "8.3")
 
-   :type 'integer)
 
- (defcustom org-ascii-inlinetask-width 30
 
-   "Width of inline tasks, in number of characters.
 
- This number ignores any margin."
 
-   :group 'org-export-ascii
 
-   :version "24.4"
 
-   :package-version '(Org . "8.0")
 
-   :type 'integer)
 
- (defcustom org-ascii-headline-spacing '(1 . 2)
 
-   "Number of blank lines inserted around headlines.
 
- This variable can be set to a cons cell.  In that case, its car
 
- represents the number of blank lines present before headline
 
- contents whereas its cdr reflects the number of blank lines after
 
- contents.
 
- A nil value replicates the number of blank lines found in the
 
- original Org buffer at the same place."
 
-   :group 'org-export-ascii
 
-   :version "24.4"
 
-   :package-version '(Org . "8.0")
 
-   :type '(choice
 
- 	  (const :tag "Replicate original spacing" nil)
 
- 	  (cons :tag "Set a uniform spacing"
 
- 		(integer :tag "Number of blank lines before contents")
 
- 		(integer :tag "Number of blank lines after contents"))))
 
- (defcustom org-ascii-indented-line-width 'auto
 
-   "Additional indentation width for the first line in a paragraph.
 
- If the value is an integer, indent the first line of each
 
- paragraph by this width, unless it is located at the beginning of
 
- a section, in which case indentation is removed from that line.
 
- If it is the symbol `auto' preserve indentation from original
 
- document."
 
-   :group 'org-export-ascii
 
-   :version "24.4"
 
-   :package-version '(Org . "8.0")
 
-   :type '(choice
 
- 	  (integer :tag "Number of white spaces characters")
 
- 	  (const :tag "Preserve original width" auto)))
 
- (defcustom org-ascii-paragraph-spacing 'auto
 
-   "Number of white lines between paragraphs.
 
- If the value is an integer, add this number of blank lines
 
- between contiguous paragraphs.  If is it the symbol `auto', keep
 
- the same number of blank lines as in the original document."
 
-   :group 'org-export-ascii
 
-   :version "24.4"
 
-   :package-version '(Org . "8.0")
 
-   :type '(choice
 
- 	  (integer :tag "Number of blank lines")
 
- 	  (const :tag "Preserve original spacing" auto)))
 
- (defcustom org-ascii-charset 'ascii
 
-   "The charset allowed to represent various elements and objects.
 
- Possible values are:
 
- `ascii'    Only use plain ASCII characters
 
- `latin1'   Include Latin-1 characters
 
- `utf-8'    Use all UTF-8 characters"
 
-   :group 'org-export-ascii
 
-   :version "24.4"
 
-   :package-version '(Org . "8.0")
 
-   :type '(choice
 
- 	  (const :tag "ASCII" ascii)
 
- 	  (const :tag "Latin-1" latin1)
 
- 	  (const :tag "UTF-8" utf-8)))
 
- (defcustom org-ascii-underline '((ascii ?= ?~ ?-)
 
- 				 (latin1 ?= ?~ ?-)
 
- 				 (utf-8 ?═ ?─ ?╌ ?┄ ?┈))
 
-   "Characters for underlining headings in ASCII export.
 
- Alist whose key is a symbol among `ascii', `latin1' and `utf-8'
 
- and whose value is a list of characters.
 
- For each supported charset, this variable associates a sequence
 
- of underline characters.  In a sequence, the characters will be
 
- used in order for headlines level 1, 2, ...  If no character is
 
- available for a given level, the headline won't be underlined."
 
-   :group 'org-export-ascii
 
-   :version "24.4"
 
-   :package-version '(Org . "8.0")
 
-   :type '(list
 
- 	  (cons :tag "Underline characters sequence"
 
- 		(const :tag "ASCII charset" ascii)
 
- 		(repeat character))
 
- 	  (cons :tag "Underline characters sequence"
 
- 		(const :tag "Latin-1 charset" latin1)
 
- 		(repeat character))
 
- 	  (cons :tag "Underline characters sequence"
 
- 		(const :tag "UTF-8 charset" utf-8)
 
- 		(repeat character))))
 
- (defcustom org-ascii-bullets '((ascii ?* ?+ ?-)
 
- 			       (latin1 ?§ ?¶)
 
- 			       (utf-8 ?◊))
 
-   "Bullet characters for headlines converted to lists in ASCII export.
 
- Alist whose key is a symbol among `ascii', `latin1' and `utf-8'
 
- and whose value is a list of characters.
 
- The first character is used for the first level considered as low
 
- level, and so on.  If there are more levels than characters given
 
- here, the list will be repeated.
 
- Note that this variable doesn't affect plain lists
 
- representation."
 
-   :group 'org-export-ascii
 
-   :version "24.4"
 
-   :package-version '(Org . "8.0")
 
-   :type '(list
 
- 	  (cons :tag "Bullet characters for low level headlines"
 
- 		(const :tag "ASCII charset" ascii)
 
- 		(repeat character))
 
- 	  (cons :tag "Bullet characters for low level headlines"
 
- 		(const :tag "Latin-1 charset" latin1)
 
- 		(repeat character))
 
- 	  (cons :tag "Bullet characters for low level headlines"
 
- 		(const :tag "UTF-8 charset" utf-8)
 
- 		(repeat character))))
 
- (defcustom org-ascii-links-to-notes t
 
-   "Non-nil means convert links to notes before the next headline.
 
- When nil, the link will be exported in place.  If the line
 
- becomes long in this way, it will be wrapped."
 
-   :group 'org-export-ascii
 
-   :version "24.4"
 
-   :package-version '(Org . "8.0")
 
-   :type 'boolean)
 
- (defcustom org-ascii-table-keep-all-vertical-lines nil
 
-   "Non-nil means keep all vertical lines in ASCII tables.
 
- When nil, vertical lines will be removed except for those needed
 
- for column grouping."
 
-   :group 'org-export-ascii
 
-   :version "24.4"
 
-   :package-version '(Org . "8.0")
 
-   :type 'boolean)
 
- (defcustom org-ascii-table-widen-columns t
 
-   "Non-nil means widen narrowed columns for export.
 
- When nil, narrowed columns will look in ASCII export just like in
 
- Org mode, i.e. with \"=>\" as ellipsis."
 
-   :group 'org-export-ascii
 
-   :version "24.4"
 
-   :package-version '(Org . "8.0")
 
-   :type 'boolean)
 
- (defcustom org-ascii-table-use-ascii-art nil
 
-   "Non-nil means \"table.el\" tables are turned into ASCII art.
 
- It only makes sense when export charset is `utf-8'.  It is nil by
 
- default since it requires \"ascii-art-to-unicode.el\" package,
 
- available through, e.g., GNU ELPA."
 
-   :group 'org-export-ascii
 
-   :version "24.4"
 
-   :package-version '(Org . "8.0")
 
-   :type 'boolean)
 
- (defcustom org-ascii-caption-above nil
 
-   "When non-nil, place caption string before the element.
 
- Otherwise, place it right after it."
 
-   :group 'org-export-ascii
 
-   :version "24.4"
 
-   :package-version '(Org . "8.0")
 
-   :type 'boolean)
 
- (defcustom org-ascii-verbatim-format "`%s'"
 
-   "Format string used for verbatim text and inline code."
 
-   :group 'org-export-ascii
 
-   :version "24.4"
 
-   :package-version '(Org . "8.0")
 
-   :type 'string)
 
- (defcustom org-ascii-format-drawer-function
 
-   (lambda (_name contents _width) contents)
 
-   "Function called to format a drawer in ASCII.
 
- The function must accept three parameters:
 
-   NAME      the drawer name, like \"LOGBOOK\"
 
-   CONTENTS  the contents of the drawer.
 
-   WIDTH     the text width within the drawer.
 
- The function should return either the string to be exported or
 
- nil to ignore the drawer.
 
- The default value simply returns the value of CONTENTS."
 
-   :group 'org-export-ascii
 
-   :version "24.4"
 
-   :package-version '(Org . "8.0")
 
-   :type 'function)
 
- (defcustom org-ascii-format-inlinetask-function
 
-   'org-ascii-format-inlinetask-default
 
-   "Function called to format an inlinetask in ASCII.
 
- The function must accept nine parameters:
 
-   TODO       the todo keyword, as a string
 
-   TODO-TYPE  the todo type, a symbol among `todo', `done' and nil.
 
-   PRIORITY   the inlinetask priority, as a string
 
-   NAME       the inlinetask name, as a string.
 
-   TAGS       the inlinetask tags, as a list of strings.
 
-   CONTENTS   the contents of the inlinetask, as a string.
 
-   WIDTH      the width of the inlinetask, as a number.
 
-   INLINETASK the inlinetask itself.
 
-   INFO       the info channel.
 
- The function should return either the string to be exported or
 
- nil to ignore the inline task."
 
-   :group 'org-export-ascii
 
-   :version "26.1"
 
-   :package-version '(Org . "8.3")
 
-   :type 'function)
 
- ;;; Internal Functions
 
- ;; Internal functions fall into three categories.
 
- ;; The first one is about text formatting.  The core functions are
 
- ;; `org-ascii--current-text-width' and
 
- ;; `org-ascii--current-justification', which determine, respectively,
 
- ;; the current text width allowed to a given element and its expected
 
- ;; justification.  Once this information is known,
 
- ;; `org-ascii--fill-string', `org-ascii--justify-lines',
 
- ;; `org-ascii--justify-element' `org-ascii--box-string' and
 
- ;; `org-ascii--indent-string' can operate on a given output string.
 
- ;; In particular, justification happens at the regular (i.e.,
 
- ;; non-greater) element level, which means that when the exporting
 
- ;; process reaches a container (e.g., a center block) content are
 
- ;; already justified.
 
- ;; The second category contains functions handling elements listings,
 
- ;; triggered by "#+TOC:" keyword.  As such, `org-ascii--build-toc'
 
- ;; returns a complete table of contents, `org-ascii--list-listings'
 
- ;; returns a list of referenceable src-block elements, and
 
- ;; `org-ascii--list-tables' does the same for table elements.
 
- ;; The third category includes general helper functions.
 
- ;; `org-ascii--build-title' creates the title for a given headline
 
- ;; or inlinetask element.  `org-ascii--build-caption' returns the
 
- ;; caption string associated to a table or a src-block.
 
- ;; `org-ascii--describe-links' creates notes about links for
 
- ;; insertion at the end of a section.  It uses
 
- ;; `org-ascii--unique-links' to get the list of links to describe.
 
- ;; Eventually, `org-ascii--translate' translates a string according
 
- ;; to language and charset specification.
 
- (defun org-ascii--fill-string (s text-width info &optional justify)
 
-   "Fill a string with specified text-width and return it.
 
- S is the string being filled.  TEXT-WIDTH is an integer
 
- specifying maximum length of a line.  INFO is the plist used as
 
- a communication channel.
 
- Optional argument JUSTIFY can specify any type of justification
 
- among `left', `center', `right' or `full'.  A nil value is
 
- equivalent to `left'.  For a justification that doesn't also fill
 
- string, see `org-ascii--justify-lines' and
 
- `org-ascii--justify-block'.
 
- Return nil if S isn't a string."
 
-   (when (stringp s)
 
-     (let ((double-space-p sentence-end-double-space))
 
-       (with-temp-buffer
 
- 	(let ((fill-column text-width)
 
- 	      (use-hard-newlines t)
 
- 	      (sentence-end-double-space double-space-p))
 
- 	  (insert (if (plist-get info :preserve-breaks)
 
- 		      (replace-regexp-in-string "\n" hard-newline s)
 
- 		    s))
 
- 	  (fill-region (point-min) (point-max) justify))
 
- 	(buffer-string)))))
 
- (defun org-ascii--justify-lines (s text-width how)
 
-   "Justify all lines in string S.
 
- TEXT-WIDTH is an integer specifying maximum length of a line.
 
- HOW determines the type of justification: it can be `left',
 
- `right', `full' or `center'."
 
-   (with-temp-buffer
 
-     (insert s)
 
-     (goto-char (point-min))
 
-     (let ((fill-column text-width)
 
- 	  ;; Disable `adaptive-fill-mode' so it doesn't prevent
 
- 	  ;; filling lines matching `adaptive-fill-regexp'.
 
- 	  (adaptive-fill-mode nil))
 
-       (while (< (point) (point-max))
 
- 	(justify-current-line how)
 
- 	(forward-line)))
 
-     (buffer-string)))
 
- (defun org-ascii--justify-element (contents element info)
 
-   "Justify CONTENTS of ELEMENT.
 
- INFO is a plist used as a communication channel.  Justification
 
- is done according to the type of element.  More accurately,
 
- paragraphs are filled and other elements are justified as blocks,
 
- that is according to the widest non blank line in CONTENTS."
 
-   (if (not (org-string-nw-p contents)) contents
 
-     (let ((text-width (org-ascii--current-text-width element info))
 
- 	  (how (org-ascii--current-justification element)))
 
-       (cond
 
-        ((eq (org-element-type element) 'paragraph)
 
- 	;; Paragraphs are treated specially as they need to be filled.
 
- 	(org-ascii--fill-string contents text-width info how))
 
-        ((eq how 'left) contents)
 
-        (t (with-temp-buffer
 
- 	    (insert contents)
 
- 	    (goto-char (point-min))
 
- 	    (catch 'exit
 
- 	      (let ((max-width 0))
 
- 		;; Compute maximum width.  Bail out if it is greater
 
- 		;; than page width, since no justification is
 
- 		;; possible.
 
- 		(save-excursion
 
- 		  (while (not (eobp))
 
- 		    (unless (looking-at-p "[ \t]*$")
 
- 		      (end-of-line)
 
- 		      (let ((column (current-column)))
 
- 			(cond
 
- 			 ((>= column text-width) (throw 'exit contents))
 
- 			 ((> column max-width) (setq max-width column)))))
 
- 		    (forward-line)))
 
- 		;; Justify every line according to TEXT-WIDTH and
 
- 		;; MAX-WIDTH.
 
- 		(let ((offset (/ (- text-width max-width)
 
- 				 (if (eq how 'right) 1 2))))
 
- 		  (if (zerop offset) (throw 'exit contents)
 
- 		    (while (not (eobp))
 
- 		      (unless (looking-at-p "[ \t]*$")
 
- 			(indent-to-column offset))
 
- 		      (forward-line)))))
 
- 	      (buffer-string))))))))
 
- (defun org-ascii--indent-string (s width)
 
-   "Indent string S by WIDTH white spaces.
 
- Empty lines are not indented."
 
-   (when (stringp s)
 
-     (replace-regexp-in-string
 
-      "\\(^\\)[ \t]*\\S-" (make-string width ?\s) s nil nil 1)))
 
- (defun org-ascii--box-string (s info)
 
-   "Return string S with a partial box to its left.
 
- INFO is a plist used as a communication channel."
 
-   (let ((utf8p (eq (plist-get info :ascii-charset) 'utf-8)))
 
-     (format (if utf8p "┌────\n%s\n└────" ",----\n%s\n`----")
 
- 	    (replace-regexp-in-string
 
- 	     "^" (if utf8p "│ " "| ")
 
- 	     ;; Remove last newline character.
 
- 	     (replace-regexp-in-string "\n[ \t]*\\'" "" s)))))
 
- (defun org-ascii--current-text-width (element info)
 
-   "Return maximum text width for ELEMENT's contents.
 
- INFO is a plist used as a communication channel."
 
-   (pcase (org-element-type element)
 
-     ;; Elements with an absolute width: `headline' and `inlinetask'.
 
-     (`inlinetask (plist-get info :ascii-inlinetask-width))
 
-     (`headline
 
-      (- (plist-get info :ascii-text-width)
 
-         (let ((low-level-rank (org-export-low-level-p element info)))
 
-           (if low-level-rank (* low-level-rank 2)
 
-             (plist-get info :ascii-global-margin)))))
 
-     ;; Elements with a relative width: store maximum text width in
 
-     ;; TOTAL-WIDTH.
 
-     (_
 
-      (let* ((genealogy (org-element-lineage element nil t))
 
-             ;; Total width is determined by the presence, or not, of an
 
-             ;; inline task among ELEMENT parents.
 
-             (total-width
 
-              (if (cl-some (lambda (parent)
 
-                             (eq (org-element-type parent) 'inlinetask))
 
-                           genealogy)
 
-                  (plist-get info :ascii-inlinetask-width)
 
-                ;; No inlinetask: Remove global margin from text width.
 
-                (- (plist-get info :ascii-text-width)
 
-                   (plist-get info :ascii-global-margin)
 
-                   (let ((parent (org-export-get-parent-headline element)))
 
-                     ;; Inner margin doesn't apply to text before first
 
-                     ;; headline.
 
-                     (if (not parent) 0
 
-                       (let ((low-level-rank
 
-                              (org-export-low-level-p parent info)))
 
-                         ;; Inner margin doesn't apply to contents of
 
-                         ;; low level headlines, since they've got their
 
-                         ;; own indentation mechanism.
 
-                         (if low-level-rank (* low-level-rank 2)
 
-                           (plist-get info :ascii-inner-margin)))))))))
 
-        (- total-width
 
-           ;; Each `quote-block' and `verse-block' above narrows text
 
-           ;; width by twice the standard margin size.
 
-           (+ (* (cl-count-if (lambda (parent)
 
-                                (memq (org-element-type parent)
 
-                                      '(quote-block verse-block)))
 
-                              genealogy)
 
-                 2
 
-                 (plist-get info :ascii-quote-margin))
 
-              ;; Apply list margin once per "top-level" plain-list
 
-              ;; containing current line
 
-              (* (cl-count-if
 
-                  (lambda (e)
 
-                    (and (eq (org-element-type e) 'plain-list)
 
-                         (not (eq (org-element-type (org-export-get-parent e))
 
-                                  'item))))
 
-                  genealogy)
 
-                 (plist-get info :ascii-list-margin))
 
-              ;; Compute indentation offset due to current list.  It is
 
- 	     ;; `org-ascii-quote-margin' per descriptive item in the
 
- 	     ;; genealogy, bullet's length otherwise.
 
-              (let ((indentation 0))
 
-                (dolist (e genealogy)
 
-                  (cond
 
-                   ((not (eq 'item (org-element-type e))))
 
-                   ((eq (org-element-property :type (org-export-get-parent e))
 
-                        'descriptive)
 
-                    (cl-incf indentation org-ascii-quote-margin))
 
-                   (t
 
-                    (cl-incf indentation
 
-                             (+ (string-width
 
-                                 (or (org-ascii--checkbox e info) ""))
 
-                                (string-width
 
-                                 (org-element-property :bullet e)))))))
 
-                indentation)))))))
 
- (defun org-ascii--current-justification (element)
 
-   "Return expected justification for ELEMENT's contents.
 
- Return value is a symbol among `left', `center', `right' and
 
- `full'."
 
-   (let (justification)
 
-     (while (and (not justification)
 
- 		(setq element (org-element-property :parent element)))
 
-       (pcase (org-element-type element)
 
- 	(`center-block (setq justification 'center))
 
- 	(`special-block
 
- 	 (let ((name (org-element-property :type element)))
 
- 	   (cond ((string= name "JUSTIFYRIGHT") (setq justification 'right))
 
- 		 ((string= name "JUSTIFYLEFT") (setq justification 'left)))))))
 
-     (or justification 'left)))
 
- (defun org-ascii--build-title
 
-     (element info text-width &optional underline notags toc)
 
-   "Format ELEMENT title and return it.
 
- ELEMENT is either an `headline' or `inlinetask' element.  INFO is
 
- a plist used as a communication channel.  TEXT-WIDTH is an
 
- integer representing the maximum length of a line.
 
- When optional argument UNDERLINE is non-nil, underline title,
 
- without the tags, according to `org-ascii-underline'
 
- specifications.
 
- If optional argument NOTAGS is non-nil, no tags will be added to
 
- the title.
 
- When optional argument TOC is non-nil, use optional title if
 
- possible.  It doesn't apply to `inlinetask' elements."
 
-   (let* ((headlinep (eq (org-element-type element) 'headline))
 
- 	 (numbers
 
- 	  ;; Numbering is specific to headlines.
 
- 	  (and headlinep
 
- 	       (org-export-numbered-headline-p element info)
 
- 	       (let ((numbering (org-export-get-headline-number element info)))
 
- 		 (if toc (format "%d. " (org-last numbering))
 
- 		   (concat (mapconcat #'number-to-string numbering ".")
 
- 			   " ")))))
 
- 	 (text
 
- 	  (org-trim
 
- 	   (org-export-data
 
- 	    (if (and toc headlinep) (org-export-get-alt-title element info)
 
- 	      (org-element-property :title element))
 
- 	    info)))
 
- 	 (todo
 
- 	  (and (plist-get info :with-todo-keywords)
 
- 	       (let ((todo (org-element-property :todo-keyword element)))
 
- 		 (and todo (concat (org-export-data todo info) " ")))))
 
- 	 (tags (and (not notags)
 
- 		    (plist-get info :with-tags)
 
- 		    (let ((tag-list (org-export-get-tags element info)))
 
- 		      (and tag-list
 
- 			   (org-make-tag-string tag-list)))))
 
- 	 (priority
 
- 	  (and (plist-get info :with-priority)
 
- 	       (let ((char (org-element-property :priority element)))
 
- 		 (and char (format "(#%c) " char)))))
 
- 	 (first-part (concat numbers todo priority text)))
 
-     (concat
 
-      first-part
 
-      ;; Align tags, if any.
 
-      (when tags
 
-        (format
 
- 	(format " %%%ds"
 
- 		(max (- text-width  (1+ (string-width first-part)))
 
- 		     (string-width tags)))
 
- 	tags))
 
-      ;; Maybe underline text, if ELEMENT type is `headline' and an
 
-      ;; underline character has been defined.
 
-      (when (and underline headlinep)
 
-        (let ((under-char
 
- 	      (nth (1- (org-export-get-relative-level element info))
 
- 		   (cdr (assq (plist-get info :ascii-charset)
 
- 			      (plist-get info :ascii-underline))))))
 
- 	 (and under-char
 
- 	      (concat "\n"
 
- 		      (make-string (/ (string-width first-part)
 
- 				      (char-width under-char))
 
- 				   under-char))))))))
 
- (defun org-ascii--has-caption-p (element _info)
 
-   "Non-nil when ELEMENT has a caption affiliated keyword.
 
- INFO is a plist used as a communication channel.  This function
 
- is meant to be used as a predicate for `org-export-get-ordinal'."
 
-   (org-element-property :caption element))
 
- (defun org-ascii--build-caption (element info)
 
-   "Return caption string for ELEMENT, if applicable.
 
- INFO is a plist used as a communication channel.
 
- The caption string contains the sequence number of ELEMENT along
 
- with its real caption.  Return nil when ELEMENT has no affiliated
 
- caption keyword."
 
-   (let ((caption (org-export-get-caption element)))
 
-     (when caption
 
-       ;; Get sequence number of current src-block among every
 
-       ;; src-block with a caption.
 
-       (let ((reference
 
- 	     (org-export-get-ordinal
 
- 	      element info nil 'org-ascii--has-caption-p))
 
- 	    (title-fmt (org-ascii--translate
 
- 			(pcase (org-element-type element)
 
- 			  (`table "Table %d:")
 
- 			  (`src-block "Listing %d:"))
 
- 			info)))
 
- 	(org-ascii--fill-string
 
- 	 (concat (format title-fmt reference)
 
- 		 " "
 
- 		 (org-export-data caption info))
 
- 	 (org-ascii--current-text-width element info) info)))))
 
- (defun org-ascii--build-toc (info &optional n keyword local)
 
-   "Return a table of contents.
 
- INFO is a plist used as a communication channel.
 
- Optional argument N, when non-nil, is an integer specifying the
 
- depth of the table.
 
- Optional argument KEYWORD specifies the TOC keyword, if any, from
 
- which the table of contents generation has been initiated.
 
- When optional argument LOCAL is non-nil, build a table of
 
- contents according to the current headline."
 
-   (concat
 
-    (unless local
 
-      (let ((title (org-ascii--translate "Table of Contents" info)))
 
-        (concat title "\n"
 
- 	       (make-string
 
- 		(string-width title)
 
- 		(if (eq (plist-get info :ascii-charset) 'utf-8) ?─ ?_))
 
- 	       "\n\n")))
 
-    (let ((text-width
 
- 	  (if keyword (org-ascii--current-text-width keyword info)
 
- 	    (- (plist-get info :ascii-text-width)
 
- 	       (plist-get info :ascii-global-margin)))))
 
-      (mapconcat
 
-       (lambda (headline)
 
- 	(let* ((level (org-export-get-relative-level headline info))
 
- 	       (indent (* (1- level) 3)))
 
- 	  (concat
 
- 	   (unless (zerop indent) (concat (make-string (1- indent) ?.) " "))
 
- 	   (org-ascii--build-title
 
- 	    headline info (- text-width indent) nil
 
- 	    (or (not (plist-get info :with-tags))
 
- 		(eq (plist-get info :with-tags) 'not-in-toc))
 
- 	    'toc))))
 
-       (org-export-collect-headlines info n (and local keyword)) "\n"))))
 
- (defun org-ascii--list-listings (keyword info)
 
-   "Return a list of listings.
 
- KEYWORD is the keyword that initiated the list of listings
 
- generation.  INFO is a plist used as a communication channel."
 
-   (let ((title (org-ascii--translate "List of Listings" info)))
 
-     (concat
 
-      title "\n"
 
-      (make-string (string-width title)
 
- 		  (if (eq (plist-get info :ascii-charset) 'utf-8) ?─ ?_))
 
-      "\n\n"
 
-      (let ((text-width
 
- 	    (if keyword (org-ascii--current-text-width keyword info)
 
- 	      (- (plist-get info :ascii-text-width)
 
- 		 (plist-get info :ascii-global-margin))))
 
- 	   ;; Use a counter instead of retrieving ordinal of each
 
- 	   ;; src-block.
 
- 	   (count 0))
 
-        (mapconcat
 
- 	(lambda (src-block)
 
- 	  ;; Store initial text so its length can be computed.  This is
 
- 	  ;; used to properly align caption right to it in case of
 
- 	  ;; filling (like contents of a description list item).
 
- 	  (let* ((initial-text
 
- 		  (format (org-ascii--translate "Listing %d:" info)
 
- 			  (cl-incf count)))
 
- 		 (initial-width (string-width initial-text)))
 
- 	    (concat
 
- 	     initial-text " "
 
- 	     (org-trim
 
- 	      (org-ascii--indent-string
 
- 	       (org-ascii--fill-string
 
- 		;; Use short name in priority, if available.
 
- 		(let ((caption (or (org-export-get-caption src-block t)
 
- 				   (org-export-get-caption src-block))))
 
- 		  (org-export-data caption info))
 
- 		(- text-width initial-width) info)
 
- 	       initial-width)))))
 
- 	(org-export-collect-listings info) "\n")))))
 
- (defun org-ascii--list-tables (keyword info)
 
-   "Return a list of tables.
 
- KEYWORD is the keyword that initiated the list of tables
 
- generation.  INFO is a plist used as a communication channel."
 
-   (let ((title (org-ascii--translate "List of Tables" info)))
 
-     (concat
 
-      title "\n"
 
-      (make-string (string-width title)
 
- 		  (if (eq (plist-get info :ascii-charset) 'utf-8) ?─ ?_))
 
-      "\n\n"
 
-      (let ((text-width
 
- 	    (if keyword (org-ascii--current-text-width keyword info)
 
- 	      (- (plist-get info :ascii-text-width)
 
- 		 (plist-get info :ascii-global-margin))))
 
- 	   ;; Use a counter instead of retrieving ordinal of each
 
- 	   ;; src-block.
 
- 	   (count 0))
 
-        (mapconcat
 
- 	(lambda (table)
 
- 	  ;; Store initial text so its length can be computed.  This is
 
- 	  ;; used to properly align caption right to it in case of
 
- 	  ;; filling (like contents of a description list item).
 
- 	  (let* ((initial-text
 
- 		  (format (org-ascii--translate "Table %d:" info)
 
- 			  (cl-incf count)))
 
- 		 (initial-width (string-width initial-text)))
 
- 	    (concat
 
- 	     initial-text " "
 
- 	     (org-trim
 
- 	      (org-ascii--indent-string
 
- 	       (org-ascii--fill-string
 
- 		;; Use short name in priority, if available.
 
- 		(let ((caption (or (org-export-get-caption table t)
 
- 				   (org-export-get-caption table))))
 
- 		  (org-export-data caption info))
 
- 		(- text-width initial-width) info)
 
- 	       initial-width)))))
 
- 	(org-export-collect-tables info) "\n")))))
 
- (defun org-ascii--unique-links (element info)
 
-   "Return a list of unique link references in ELEMENT.
 
- ELEMENT is either a headline element or a section element.  INFO
 
- is a plist used as a communication channel."
 
-   (let* (seen
 
- 	 (unique-link-p
 
- 	  ;; Return LINK if it wasn't referenced so far, or nil.
 
- 	  ;; Update SEEN links along the way.
 
- 	  (lambda (link)
 
- 	    (let ((footprint
 
- 		   ;; Normalize description in footprints.
 
- 		   (cons (org-element-property :raw-link link)
 
- 			 (let ((contents (org-element-contents link)))
 
- 			   (and contents
 
- 				(replace-regexp-in-string
 
- 				 "[ \r\t\n]+" " "
 
- 				 (org-trim
 
- 				  (org-element-interpret-data contents))))))))
 
- 	      ;; Ignore LINK if it hasn't been translated already.  It
 
- 	      ;; can happen if it is located in an affiliated keyword
 
- 	      ;; that was ignored.
 
- 	      (when (and (org-string-nw-p
 
- 			  (gethash link (plist-get info :exported-data)))
 
- 			 (not (member footprint seen)))
 
- 		(push footprint seen) link)))))
 
-     (org-element-map (if (eq (org-element-type element) 'section)
 
- 			 element
 
- 		       ;; In a headline, only retrieve links in title
 
- 		       ;; and relative section, not in children.
 
- 		       (list (org-element-property :title element)
 
- 			     (car (org-element-contents element))))
 
- 	'link unique-link-p info nil 'headline t)))
 
- (defun org-ascii--describe-datum (datum info)
 
-   "Describe DATUM object or element.
 
- If DATUM is a string, consider it to be a file name, per
 
- `org-export-resolve-id-link'.  INFO is the communication channel,
 
- as a plist."
 
-   (pcase (org-element-type datum)
 
-     (`plain-text (format "See file %s" datum)) ;External file
 
-     (`headline
 
-      (format (org-ascii--translate "See section %s" info)
 
- 	     (if (org-export-numbered-headline-p datum info)
 
- 		 (mapconcat #'number-to-string
 
- 			    (org-export-get-headline-number datum info)
 
- 			    ".")
 
- 	       (org-export-data (org-element-property :title datum) info))))
 
-     (_
 
-      (let ((number (org-export-get-ordinal
 
- 		    datum info nil #'org-ascii--has-caption-p))
 
- 	   ;; If destination is a target, make sure we can name the
 
- 	   ;; container it refers to.
 
- 	   (enumerable
 
- 	    (org-element-lineage datum
 
- 				 '(headline paragraph src-block table) t)))
 
-        (pcase (org-element-type enumerable)
 
- 	 (`headline
 
- 	  (format (org-ascii--translate "See section %s" info)
 
- 		  (if (org-export-numbered-headline-p enumerable info)
 
- 		      (mapconcat #'number-to-string number ".")
 
- 		    (org-export-data
 
- 		     (org-element-property :title enumerable) info))))
 
- 	 ((guard (not number))
 
- 	  (org-ascii--translate "Unknown reference" info))
 
- 	 (`paragraph
 
- 	  (format (org-ascii--translate "See figure %s" info) number))
 
- 	 (`src-block
 
- 	  (format (org-ascii--translate "See listing %s" info) number))
 
- 	 (`table
 
- 	  (format (org-ascii--translate "See table %s" info) number))
 
- 	 (_ (org-ascii--translate "Unknown reference" info)))))))
 
- (defun org-ascii--describe-links (links width info)
 
-   "Return a string describing a list of links.
 
- LINKS is a list of link type objects, as returned by
 
- `org-ascii--unique-links'.  WIDTH is the text width allowed for
 
- the output string.  INFO is a plist used as a communication
 
- channel."
 
-   (mapconcat
 
-    (lambda (link)
 
-      (let* ((type (org-element-property :type link))
 
- 	    (description (org-element-contents link))
 
- 	    (anchor (org-export-data
 
- 		     (or description (org-element-property :raw-link link))
 
- 		     info)))
 
-        (cond
 
- 	((member type '("coderef" "radio")) nil)
 
- 	((member type '("custom-id" "fuzzy" "id"))
 
- 	 ;; Only links with a description need an entry.  Other are
 
- 	 ;; already handled in `org-ascii-link'.
 
- 	 (when description
 
- 	   (let ((dest (if (equal type "fuzzy")
 
- 			   (org-export-resolve-fuzzy-link link info)
 
- 			 (org-export-resolve-id-link link info))))
 
- 	     (concat
 
- 	      (org-ascii--fill-string
 
- 	       (format "[%s] %s" anchor (org-ascii--describe-datum dest info))
 
- 	       width info)
 
- 	      "\n\n"))))
 
- 	;; Do not add a link that cannot be resolved and doesn't have
 
- 	;; any description: destination is already visible in the
 
- 	;; paragraph.
 
- 	((not (org-element-contents link)) nil)
 
- 	;; Do not add a link already handled by custom export
 
- 	;; functions.
 
- 	((org-export-custom-protocol-maybe link anchor 'ascii) nil)
 
- 	(t
 
- 	 (concat
 
- 	  (org-ascii--fill-string
 
- 	   (format "[%s] <%s>" anchor (org-element-property :raw-link link))
 
- 	   width info)
 
- 	  "\n\n")))))
 
-    links ""))
 
- (defun org-ascii--checkbox (item info)
 
-   "Return checkbox string for ITEM or nil.
 
- INFO is a plist used as a communication channel."
 
-   (let ((utf8p (eq (plist-get info :ascii-charset) 'utf-8)))
 
-     (pcase (org-element-property :checkbox item)
 
-       (`on (if utf8p "☑ " "[X] "))
 
-       (`off (if utf8p "☐ " "[ ] "))
 
-       (`trans (if utf8p "☒ " "[-] ")))))
 
- ;;; Template
 
- (defun org-ascii-template--document-title (info)
 
-   "Return document title, as a string.
 
- INFO is a plist used as a communication channel."
 
-   (let* ((text-width (plist-get info :ascii-text-width))
 
- 	 ;; Links in the title will not be resolved later, so we make
 
- 	 ;; sure their path is located right after them.
 
- 	 (info (org-combine-plists info '(:ascii-links-to-notes nil)))
 
- 	 (with-title (plist-get info :with-title))
 
- 	 (title (org-export-data
 
- 		 (when with-title (plist-get info :title)) info))
 
- 	 (subtitle (org-export-data
 
- 		    (when with-title (plist-get info :subtitle)) info))
 
- 	 (author (and (plist-get info :with-author)
 
- 		      (let ((auth (plist-get info :author)))
 
- 			(and auth (org-export-data auth info)))))
 
- 	 (email (and (plist-get info :with-email)
 
- 		     (org-export-data (plist-get info :email) info)))
 
- 	 (date (and (plist-get info :with-date)
 
- 		    (org-export-data (org-export-get-date info) info))))
 
-     ;; There are two types of title blocks depending on the presence
 
-     ;; of a title to display.
 
-     (if (string= title "")
 
- 	;; Title block without a title.  DATE is positioned at the top
 
- 	;; right of the document, AUTHOR to the top left and EMAIL
 
- 	;; just below.
 
- 	(cond
 
- 	 ((and (org-string-nw-p date) (org-string-nw-p author))
 
- 	  (concat
 
- 	   author
 
- 	   (make-string (- text-width (string-width date) (string-width author))
 
- 			?\s)
 
- 	   date
 
- 	   (when (org-string-nw-p email) (concat "\n" email))
 
- 	   "\n\n\n"))
 
- 	 ((and (org-string-nw-p date) (org-string-nw-p email))
 
- 	  (concat
 
- 	   email
 
- 	   (make-string (- text-width (string-width date) (string-width email))
 
- 			?\s)
 
- 	   date "\n\n\n"))
 
- 	 ((org-string-nw-p date)
 
- 	  (concat
 
- 	   (org-ascii--justify-lines date text-width 'right)
 
- 	   "\n\n\n"))
 
- 	 ((and (org-string-nw-p author) (org-string-nw-p email))
 
- 	  (concat author "\n" email "\n\n\n"))
 
- 	 ((org-string-nw-p author) (concat author "\n\n\n"))
 
- 	 ((org-string-nw-p email) (concat email "\n\n\n")))
 
-       ;; Title block with a title.  Document's TITLE, along with the
 
-       ;; AUTHOR and its EMAIL are both overlined and an underlined,
 
-       ;; centered.  Date is just below, also centered.
 
-       (let* ((utf8p (eq (plist-get info :ascii-charset) 'utf-8))
 
- 	     ;; Format TITLE.  It may be filled if it is too wide,
 
- 	     ;; that is wider than the two thirds of the total width.
 
- 	     (title-len (min (apply #'max
 
- 				    (mapcar #'length
 
- 					    (org-split-string
 
- 					     (concat title "\n" subtitle) "\n")))
 
- 			     (/ (* 2 text-width) 3)))
 
- 	     (formatted-title (org-ascii--fill-string title title-len info))
 
- 	     (formatted-subtitle (when (org-string-nw-p subtitle)
 
- 				   (org-ascii--fill-string subtitle title-len info)))
 
- 	     (line
 
- 	      (make-string
 
- 	       (min (+ (max title-len
 
- 			    (string-width (or author ""))
 
- 			    (string-width (or email "")))
 
- 		       2)
 
- 		    text-width) (if utf8p ?━ ?_))))
 
- 	(org-ascii--justify-lines
 
- 	 (concat line "\n"
 
- 		 (unless utf8p "\n")
 
- 		 (upcase formatted-title)
 
- 		 (and formatted-subtitle (concat "\n" formatted-subtitle))
 
- 		 (cond
 
- 		  ((and (org-string-nw-p author) (org-string-nw-p email))
 
- 		   (concat "\n\n" author "\n" email))
 
- 		  ((org-string-nw-p author) (concat "\n\n" author))
 
- 		  ((org-string-nw-p email) (concat "\n\n" email)))
 
- 		 "\n" line
 
- 		 (when (org-string-nw-p date) (concat "\n\n\n" date))
 
- 		 "\n\n\n") text-width 'center)))))
 
- (defun org-ascii-inner-template (contents info)
 
-   "Return complete document string after ASCII conversion.
 
- CONTENTS is the transcoded contents string.  INFO is a plist
 
- holding export options."
 
-   (org-element-normalize-string
 
-    (let ((global-margin (plist-get info :ascii-global-margin)))
 
-      (org-ascii--indent-string
 
-       (concat
 
-        ;; 1. Document's body.
 
-        contents
 
-        ;; 2. Footnote definitions.
 
-        (let ((definitions (org-export-collect-footnote-definitions info))
 
- 	     ;; Insert full links right inside the footnote definition
 
- 	     ;; as they have no chance to be inserted later.
 
- 	     (info (org-combine-plists info '(:ascii-links-to-notes nil))))
 
- 	 (when definitions
 
- 	   (concat
 
- 	    "\n\n\n"
 
- 	    (let ((title (org-ascii--translate "Footnotes" info)))
 
- 	      (concat
 
- 	       title "\n"
 
- 	       (make-string
 
- 		(string-width title)
 
- 		(if (eq (plist-get info :ascii-charset) 'utf-8) ?─ ?_))))
 
- 	    "\n\n"
 
- 	    (let ((text-width (- (plist-get info :ascii-text-width)
 
- 				 global-margin)))
 
- 	      (mapconcat
 
- 	       (lambda (ref)
 
- 		 (let ((id (format "[%s] " (car ref))))
 
- 		   ;; Distinguish between inline definitions and
 
- 		   ;; full-fledged definitions.
 
- 		   (org-trim
 
- 		    (let ((def (nth 2 ref)))
 
- 		      (if (org-element-map def org-element-all-elements
 
- 			    #'identity info 'first-match)
 
- 			  ;; Full-fledged definition: footnote ID is
 
- 			  ;; inserted inside the first parsed
 
- 			  ;; paragraph (FIRST), if any, to be sure
 
- 			  ;; filling will take it into consideration.
 
- 			  (let ((first (car (org-element-contents def))))
 
- 			    (if (not (eq (org-element-type first) 'paragraph))
 
- 				(concat id "\n" (org-export-data def info))
 
- 			      (push id (nthcdr 2 first))
 
- 			      (org-export-data def info)))
 
- 			;; Fill paragraph once footnote ID is inserted
 
- 			;; in order to have a correct length for first
 
- 			;; line.
 
- 			(org-ascii--fill-string
 
- 			 (concat id (org-export-data def info))
 
- 			 text-width info))))))
 
- 	       definitions "\n\n"))))))
 
-       global-margin))))
 
- (defun org-ascii-template (contents info)
 
-   "Return complete document string after ASCII conversion.
 
- CONTENTS is the transcoded contents string.  INFO is a plist
 
- holding export options."
 
-   (let ((global-margin (plist-get info :ascii-global-margin)))
 
-     (concat
 
-      ;; Build title block.
 
-      (org-ascii--indent-string
 
-       (concat (org-ascii-template--document-title info)
 
- 	      ;; 2. Table of contents.
 
- 	      (let ((depth (plist-get info :with-toc)))
 
- 		(when depth
 
- 		  (concat
 
- 		   (org-ascii--build-toc info (and (wholenump depth) depth))
 
- 		   "\n\n\n"))))
 
-       global-margin)
 
-      ;; Document's body.
 
-      contents
 
-      ;; Creator.  Justify it to the bottom right.
 
-      (and (plist-get info :with-creator)
 
- 	  (org-ascii--indent-string
 
- 	   (let ((text-width
 
- 		  (- (plist-get info :ascii-text-width) global-margin)))
 
- 	     (concat
 
- 	      "\n\n\n"
 
- 	      (org-ascii--fill-string
 
- 	       (plist-get info :creator) text-width info 'right)))
 
- 	   global-margin)))))
 
- (defun org-ascii--translate (s info)
 
-   "Translate string S according to specified language and charset.
 
- INFO is a plist used as a communication channel."
 
-   (let ((charset (intern (format ":%s" (plist-get info :ascii-charset)))))
 
-     (org-export-translate s charset info)))
 
- ;;; Transcode Functions
 
- ;;;; Bold
 
- (defun org-ascii-bold (_bold contents _info)
 
-   "Transcode BOLD from Org to ASCII.
 
- CONTENTS is the text with bold markup.  INFO is a plist holding
 
- contextual information."
 
-   (format "*%s*" contents))
 
- ;;;; Center Block
 
- (defun org-ascii-center-block (_center-block contents _info)
 
-   "Transcode a CENTER-BLOCK element from Org to ASCII.
 
- CONTENTS holds the contents of the block.  INFO is a plist
 
- holding contextual information."
 
-   ;; Center has already been taken care of at a lower level, so
 
-   ;; there's nothing left to do.
 
-   contents)
 
- ;;;; Clock
 
- (defun org-ascii-clock (clock _contents info)
 
-   "Transcode a CLOCK object from Org to ASCII.
 
- CONTENTS is nil.  INFO is a plist holding contextual
 
- information."
 
-   (org-ascii--justify-element
 
-    (concat org-clock-string " "
 
- 	   (org-timestamp-translate (org-element-property :value clock))
 
- 	   (let ((time (org-element-property :duration clock)))
 
- 	     (and time
 
- 		  (concat " => "
 
- 			  (apply 'format
 
- 				 "%2s:%02s"
 
- 				 (org-split-string time ":"))))))
 
-    clock info))
 
- ;;;; Code
 
- (defun org-ascii-code (code _contents info)
 
-   "Return a CODE object from Org to ASCII.
 
- CONTENTS is nil.  INFO is a plist holding contextual
 
- information."
 
-   (format (plist-get info :ascii-verbatim-format)
 
- 	  (org-element-property :value code)))
 
- ;;;; Drawer
 
- (defun org-ascii-drawer (drawer contents info)
 
-   "Transcode a DRAWER element from Org to ASCII.
 
- CONTENTS holds the contents of the block.  INFO is a plist
 
- holding contextual information."
 
-   (let ((name (org-element-property :drawer-name drawer))
 
- 	(width (org-ascii--current-text-width drawer info)))
 
-     (funcall (plist-get info :ascii-format-drawer-function)
 
- 	     name contents width)))
 
- ;;;; Dynamic Block
 
- (defun org-ascii-dynamic-block (_dynamic-block contents _info)
 
-   "Transcode a DYNAMIC-BLOCK element from Org to ASCII.
 
- CONTENTS holds the contents of the block.  INFO is a plist
 
- holding contextual information."
 
-   contents)
 
- ;;;; Entity
 
- (defun org-ascii-entity (entity _contents info)
 
-   "Transcode an ENTITY object from Org to ASCII.
 
- CONTENTS are the definition itself.  INFO is a plist holding
 
- contextual information."
 
-   (org-element-property
 
-    (intern (concat ":" (symbol-name (plist-get info :ascii-charset))))
 
-    entity))
 
- ;;;; Example Block
 
- (defun org-ascii-example-block (example-block _contents info)
 
-   "Transcode a EXAMPLE-BLOCK element from Org to ASCII.
 
- CONTENTS is nil.  INFO is a plist holding contextual information."
 
-   (org-ascii--justify-element
 
-    (org-ascii--box-string
 
-     (org-export-format-code-default example-block info) info)
 
-    example-block info))
 
- ;;;; Export Snippet
 
- (defun org-ascii-export-snippet (export-snippet _contents _info)
 
-   "Transcode a EXPORT-SNIPPET object from Org to ASCII.
 
- CONTENTS is nil.  INFO is a plist holding contextual information."
 
-   (when (eq (org-export-snippet-backend export-snippet) 'ascii)
 
-     (org-element-property :value export-snippet)))
 
- ;;;; Export Block
 
- (defun org-ascii-export-block (export-block _contents info)
 
-   "Transcode a EXPORT-BLOCK element from Org to ASCII.
 
- CONTENTS is nil.  INFO is a plist holding contextual information."
 
-   (when (string= (org-element-property :type export-block) "ASCII")
 
-     (org-ascii--justify-element
 
-      (org-element-property :value export-block) export-block info)))
 
- ;;;; Fixed Width
 
- (defun org-ascii-fixed-width (fixed-width _contents info)
 
-   "Transcode a FIXED-WIDTH element from Org to ASCII.
 
- CONTENTS is nil.  INFO is a plist holding contextual information."
 
-   (org-ascii--justify-element
 
-    (org-ascii--box-string
 
-     (org-remove-indentation
 
-      (org-element-property :value fixed-width)) info)
 
-    fixed-width info))
 
- ;;;; Footnote Definition
 
- ;; Footnote Definitions are ignored.  They are compiled at the end of
 
- ;; the document, by `org-ascii-inner-template'.
 
- ;;;; Footnote Reference
 
- (defun org-ascii-footnote-reference (footnote-reference _contents info)
 
-   "Transcode a FOOTNOTE-REFERENCE element from Org to ASCII.
 
- CONTENTS is nil.  INFO is a plist holding contextual information."
 
-   (format "[%s]" (org-export-get-footnote-number footnote-reference info)))
 
- ;;;; Headline
 
- (defun org-ascii-headline (headline contents info)
 
-   "Transcode a HEADLINE element from Org to ASCII.
 
- CONTENTS holds the contents of the headline.  INFO is a plist
 
- holding contextual information."
 
-   ;; Don't export footnote section, which will be handled at the end
 
-   ;; of the template.
 
-   (unless (org-element-property :footnote-section-p headline)
 
-     (let* ((low-level (org-export-low-level-p headline info))
 
- 	   (width (org-ascii--current-text-width headline info))
 
- 	   ;; Export title early so that any link in it can be
 
- 	   ;; exported and seen in `org-ascii--unique-links'.
 
- 	   (title (org-ascii--build-title headline info width (not low-level)))
 
- 	   ;; Blank lines between headline and its contents.
 
- 	   ;; `org-ascii-headline-spacing', when set, overwrites
 
- 	   ;; original buffer's spacing.
 
- 	   (pre-blanks
 
- 	    (make-string (or (car (plist-get info :ascii-headline-spacing))
 
- 			     (org-element-property :pre-blank headline)
 
- 			     0)
 
- 			 ?\n))
 
- 	   (links (and (plist-get info :ascii-links-to-notes)
 
- 		       (org-ascii--describe-links
 
- 			(org-ascii--unique-links headline info) width info)))
 
- 	   ;; Re-build contents, inserting section links at the right
 
- 	   ;; place.  The cost is low since build results are cached.
 
- 	   (body
 
- 	    (if (not (org-string-nw-p links)) contents
 
- 	      (let* ((contents (org-element-contents headline))
 
- 		     (section (let ((first (car contents)))
 
- 				(and (eq (org-element-type first) 'section)
 
- 				     first))))
 
- 		(concat (and section
 
- 			     (concat (org-element-normalize-string
 
- 				      (org-export-data section info))
 
- 				     "\n\n"))
 
- 			links
 
- 			(mapconcat (lambda (e) (org-export-data e info))
 
- 				   (if section (cdr contents) contents)
 
- 				   ""))))))
 
-       ;; Deep subtree: export it as a list item.
 
-       (if low-level
 
- 	  (let* ((bullets (cdr (assq (plist-get info :ascii-charset)
 
- 				     (plist-get info :ascii-bullets))))
 
- 		 (bullet
 
- 		  (format "%c "
 
- 			  (nth (mod (1- low-level) (length bullets)) bullets))))
 
- 	    (concat bullet title "\n" pre-blanks
 
- 		    ;; Contents, indented by length of bullet.
 
- 		    (org-ascii--indent-string body (length bullet))))
 
- 	;; Else: Standard headline.
 
- 	(concat title "\n" pre-blanks body)))))
 
- ;;;; Horizontal Rule
 
- (defun org-ascii-horizontal-rule (horizontal-rule _contents info)
 
-   "Transcode an HORIZONTAL-RULE object from Org to ASCII.
 
- CONTENTS is nil.  INFO is a plist holding contextual
 
- information."
 
-   (let ((text-width (org-ascii--current-text-width horizontal-rule info))
 
- 	(spec-width
 
- 	 (org-export-read-attribute :attr_ascii horizontal-rule :width)))
 
-     (org-ascii--justify-lines
 
-      (make-string (if (and spec-width (string-match "^[0-9]+$" spec-width))
 
- 		      (string-to-number spec-width)
 
- 		    text-width)
 
- 		  (if (eq (plist-get info :ascii-charset) 'utf-8) ?― ?-))
 
-      text-width 'center)))
 
- ;;;; Inline Src Block
 
- (defun org-ascii-inline-src-block (inline-src-block _contents info)
 
-   "Transcode an INLINE-SRC-BLOCK element from Org to ASCII.
 
- CONTENTS holds the contents of the item.  INFO is a plist holding
 
- contextual information."
 
-   (format (plist-get info :ascii-verbatim-format)
 
- 	  (org-element-property :value inline-src-block)))
 
- ;;;; Inlinetask
 
- (defun org-ascii-format-inlinetask-default
 
-   (_todo _type _priority _name _tags contents width inlinetask info)
 
-   "Format an inline task element for ASCII export.
 
- See `org-ascii-format-inlinetask-function' for a description
 
- of the parameters."
 
-   (let* ((utf8p (eq (plist-get info :ascii-charset) 'utf-8))
 
- 	 (width (or width (plist-get info :ascii-inlinetask-width))))
 
-     (org-ascii--indent-string
 
-      (concat
 
-       ;; Top line, with an additional blank line if not in UTF-8.
 
-       (make-string width (if utf8p ?━ ?_)) "\n"
 
-       (unless utf8p (concat (make-string width ? ) "\n"))
 
-       ;; Add title.  Fill it if wider than inlinetask.
 
-       (let ((title (org-ascii--build-title inlinetask info width)))
 
- 	(if (<= (string-width title) width) title
 
- 	  (org-ascii--fill-string title width info)))
 
-       "\n"
 
-       ;; If CONTENTS is not empty, insert it along with
 
-       ;; a separator.
 
-       (when (org-string-nw-p contents)
 
-         (concat (make-string width (if utf8p ?─ ?-)) "\n" contents))
 
-       ;; Bottom line.
 
-       (make-string width (if utf8p ?━ ?_)))
 
-      ;; Flush the inlinetask to the right.
 
-      (- (plist-get info :ascii-text-width) (plist-get info :ascii-global-margin)
 
- 	(if (not (org-export-get-parent-headline inlinetask)) 0
 
- 	  (plist-get info :ascii-inner-margin))
 
- 	(org-ascii--current-text-width inlinetask info)))))
 
- (defun org-ascii-inlinetask (inlinetask contents info)
 
-   "Transcode an INLINETASK element from Org to ASCII.
 
- CONTENTS holds the contents of the block.  INFO is a plist
 
- holding contextual information."
 
-   (let ((width (org-ascii--current-text-width inlinetask info)))
 
-     (funcall (plist-get info :ascii-format-inlinetask-function)
 
- 	     ;; todo.
 
- 	     (and (plist-get info :with-todo-keywords)
 
- 		  (let ((todo (org-element-property
 
- 			       :todo-keyword inlinetask)))
 
- 		    (and todo (org-export-data todo info))))
 
- 	     ;; todo-type
 
- 	     (org-element-property :todo-type inlinetask)
 
- 	     ;; priority
 
- 	     (and (plist-get info :with-priority)
 
- 		  (org-element-property :priority inlinetask))
 
- 	     ;; title
 
- 	     (org-export-data (org-element-property :title inlinetask) info)
 
- 	     ;; tags
 
- 	     (and (plist-get info :with-tags)
 
- 		  (org-element-property :tags inlinetask))
 
- 	     ;; contents and width
 
- 	     contents width inlinetask info)))
 
- ;;;; Italic
 
- (defun org-ascii-italic (_italic contents _info)
 
-   "Transcode italic from Org to ASCII.
 
- CONTENTS is the text with italic markup.  INFO is a plist holding
 
- contextual information."
 
-   (format "/%s/" contents))
 
- ;;;; Item
 
- (defun org-ascii-item (item contents info)
 
-   "Transcode an ITEM element from Org to ASCII.
 
- CONTENTS holds the contents of the item.  INFO is a plist holding
 
- contextual information."
 
-   (let* ((utf8p (eq (plist-get info :ascii-charset) 'utf-8))
 
- 	 (checkbox (org-ascii--checkbox item info))
 
- 	 (list-type (org-element-property :type (org-export-get-parent item)))
 
- 	 (bullet
 
- 	  ;; First parent of ITEM is always the plain-list.  Get
 
- 	  ;; `:type' property from it.
 
- 	  (pcase list-type
 
- 	    (`descriptive
 
- 	     (concat checkbox
 
- 		     (org-export-data (org-element-property :tag item)
 
- 				      info)))
 
- 	    (`ordered
 
- 	     ;; Return correct number for ITEM, paying attention to
 
- 	     ;; counters.
 
- 	     (let* ((struct (org-element-property :structure item))
 
- 		    (bul (org-list-bullet-string
 
- 			  (org-element-property :bullet item)))
 
- 		    (num (number-to-string
 
- 			  (car (last (org-list-get-item-number
 
- 				      (org-element-property :begin item)
 
- 				      struct
 
- 				      (org-list-prevs-alist struct)
 
- 				      (org-list-parents-alist struct)))))))
 
- 	       (replace-regexp-in-string "[0-9]+" num bul)))
 
- 	    (_ (let ((bul (org-list-bullet-string
 
- 			   (org-element-property :bullet item))))
 
- 		 ;; Change bullets into more visible form if UTF-8 is active.
 
- 		 (if (not utf8p) bul
 
- 		   (replace-regexp-in-string
 
- 		    "-" "•"
 
- 		    (replace-regexp-in-string
 
- 		     "\\+" "⁃"
 
- 		     (replace-regexp-in-string "\\*" "‣" bul))))))))
 
- 	 (indentation (if (eq list-type 'descriptive) org-ascii-quote-margin
 
- 			(string-width bullet))))
 
-     (concat
 
-      bullet
 
-      checkbox
 
-      ;; Contents: Pay attention to indentation.  Note: check-boxes are
 
-      ;; already taken care of at the paragraph level so they don't
 
-      ;; interfere with indentation.
 
-      (let ((contents (org-ascii--indent-string contents indentation)))
 
-        ;; Determine if contents should follow the bullet or start
 
-        ;; a new line.  Do the former when the first contributing
 
-        ;; element to contents is a paragraph.  In descriptive lists
 
-        ;; however, contents always start a new line.
 
-        (if (and (not (eq list-type 'descriptive))
 
- 		(org-string-nw-p contents)
 
- 		(eq 'paragraph
 
- 		    (org-element-type
 
- 		     (cl-some (lambda (e)
 
- 				(and (org-string-nw-p (org-export-data e info))
 
- 				     e))
 
- 			      (org-element-contents item)))))
 
- 	   (org-trim contents)
 
- 	 (concat "\n" contents))))))
 
- ;;;; Keyword
 
- (defun org-ascii-keyword (keyword _contents info)
 
-   "Transcode a KEYWORD element from Org to ASCII.
 
- 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 "ASCII") (org-ascii--justify-element value keyword info))
 
-      ((string= key "TOC")
 
-       (org-ascii--justify-element
 
-        (let ((case-fold-search t))
 
- 	 (cond
 
- 	  ((string-match-p "\\<headlines\\>" value)
 
- 	   (let ((depth (and (string-match "\\<[0-9]+\\>" value)
 
- 			     (string-to-number (match-string 0 value))))
 
- 		 (localp (string-match-p "\\<local\\>" value)))
 
- 	     (org-ascii--build-toc info depth keyword localp)))
 
- 	  ((string-match-p "\\<tables\\>" value)
 
- 	   (org-ascii--list-tables keyword info))
 
- 	  ((string-match-p "\\<listings\\>" value)
 
- 	   (org-ascii--list-listings keyword info))))
 
-        keyword info)))))
 
- ;;;; Latex Environment
 
- (defun org-ascii-latex-environment (latex-environment _contents info)
 
-   "Transcode a LATEX-ENVIRONMENT element from Org to ASCII.
 
- CONTENTS is nil.  INFO is a plist holding contextual
 
- information."
 
-   (when (plist-get info :with-latex)
 
-     (org-ascii--justify-element
 
-      (org-remove-indentation (org-element-property :value latex-environment))
 
-      latex-environment info)))
 
- ;;;; Latex Fragment
 
- (defun org-ascii-latex-fragment (latex-fragment _contents info)
 
-   "Transcode a LATEX-FRAGMENT object from Org to ASCII.
 
- CONTENTS is nil.  INFO is a plist holding contextual
 
- information."
 
-   (when (plist-get info :with-latex)
 
-     (org-element-property :value latex-fragment)))
 
- ;;;; Line Break
 
- (defun org-ascii-line-break (_line-break _contents _info)
 
-   "Transcode a LINE-BREAK object from Org to ASCII.
 
- CONTENTS is nil.  INFO is a plist holding contextual
 
-   information."  hard-newline)
 
- ;;;; Link
 
- (defun org-ascii-link (link desc info)
 
-   "Transcode a LINK object from Org to ASCII.
 
- DESC is the description part of the link, or the empty string.
 
- INFO is a plist holding contextual information."
 
-   (let ((type (org-element-property :type link)))
 
-     (cond
 
-      ((org-export-custom-protocol-maybe link desc 'ascii))
 
-      ((string= type "coderef")
 
-       (let ((ref (org-element-property :path link)))
 
- 	(format (org-export-get-coderef-format ref desc)
 
- 		(org-export-resolve-coderef ref info))))
 
-      ;; Do not apply a special syntax on radio links.  Though, use
 
-      ;; transcoded target's contents as output.
 
-      ((string= type "radio") desc)
 
-      ((member type '("custom-id" "fuzzy" "id"))
 
-       (let ((destination (if (string= type "fuzzy")
 
- 			     (org-export-resolve-fuzzy-link link info)
 
- 			   (org-export-resolve-id-link link info))))
 
- 	(pcase (org-element-type destination)
 
- 	  ((guard desc)
 
- 	   (if (plist-get info :ascii-links-to-notes)
 
- 	       (format "[%s]" desc)
 
- 	     (concat desc
 
- 		     (format " (%s)"
 
- 			     (org-ascii--describe-datum destination info)))))
 
- 	  ;; External file.
 
- 	  (`plain-text destination)
 
- 	  (`headline
 
- 	   (if (org-export-numbered-headline-p destination info)
 
- 	       (mapconcat #'number-to-string
 
- 			  (org-export-get-headline-number destination info)
 
- 			  ".")
 
- 	     (org-export-data (org-element-property :title destination) info)))
 
- 	  ;; Handle enumerable elements and targets within them.
 
- 	  ((and (let number (org-export-get-ordinal
 
- 			     destination info nil #'org-ascii--has-caption-p))
 
- 		(guard number))
 
- 	   (if (atom number) (number-to-string number)
 
- 	     (mapconcat #'number-to-string number ".")))
 
- 	  ;; Don't know what to do.  Signal it.
 
- 	  (_ "???"))))
 
-      (t
 
-       (let ((raw-link (concat (org-element-property :type link)
 
- 			      ":"
 
- 			      (org-element-property :path link))))
 
- 	(if (not (org-string-nw-p desc)) (format "<%s>" raw-link)
 
- 	  (concat (format "[%s]" desc)
 
- 		  (and (not (plist-get info :ascii-links-to-notes))
 
- 		       (format " (<%s>)" raw-link)))))))))
 
- ;;;; Node Properties
 
- (defun org-ascii-node-property (node-property _contents _info)
 
-   "Transcode a NODE-PROPERTY element from Org to ASCII.
 
- 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
 
- (defun org-ascii-paragraph (paragraph contents info)
 
-   "Transcode a PARAGRAPH element from Org to ASCII.
 
- CONTENTS is the contents of the paragraph, as a string.  INFO is
 
- the plist used as a communication channel."
 
-   (org-ascii--justify-element
 
-    (let ((indented-line-width (plist-get info :ascii-indented-line-width)))
 
-      (if (not (wholenump indented-line-width)) contents
 
-        (concat
 
- 	;; Do not indent first paragraph in a section.
 
- 	(unless (and (not (org-export-get-previous-element paragraph info))
 
- 		     (eq (org-element-type (org-export-get-parent paragraph))
 
- 			 'section))
 
- 	  (make-string indented-line-width ?\s))
 
- 	(replace-regexp-in-string "\\`[ \t]+" "" contents))))
 
-    paragraph info))
 
- ;;;; Plain List
 
- (defun org-ascii-plain-list (plain-list contents info)
 
-   "Transcode a PLAIN-LIST element from Org to ASCII.
 
- CONTENTS is the contents of the list.  INFO is a plist holding
 
- contextual information."
 
-   (let ((margin (plist-get info :ascii-list-margin)))
 
-     (if (or (< margin 1)
 
- 	    (eq (org-element-type (org-export-get-parent plain-list)) 'item))
 
- 	contents
 
-       (org-ascii--indent-string contents margin))))
 
- ;;;; Plain Text
 
- (defun org-ascii-plain-text (text info)
 
-   "Transcode a TEXT string from Org to ASCII.
 
- INFO is a plist used as a communication channel."
 
-   (let ((utf8p (eq (plist-get info :ascii-charset) 'utf-8)))
 
-     (when (and utf8p (plist-get info :with-smart-quotes))
 
-       (setq text (org-export-activate-smart-quotes text :utf-8 info)))
 
-     (if (not (plist-get info :with-special-strings)) text
 
-       (setq text (replace-regexp-in-string "\\\\-" "" text))
 
-       (if (not utf8p) text
 
- 	;; Usual replacements in utf-8 with proper option set.
 
- 	(replace-regexp-in-string
 
- 	 "\\.\\.\\." "…"
 
- 	 (replace-regexp-in-string
 
- 	  "--" "–"
 
- 	  (replace-regexp-in-string "---" "—" text)))))))
 
- ;;;; Planning
 
- (defun org-ascii-planning (planning _contents info)
 
-   "Transcode a PLANNING element from Org to ASCII.
 
- CONTENTS is nil.  INFO is a plist used as a communication
 
- channel."
 
-   (org-ascii--justify-element
 
-    (mapconcat
 
-     #'identity
 
-     (delq nil
 
- 	  (list (let ((closed (org-element-property :closed planning)))
 
- 		  (when closed
 
- 		    (concat org-closed-string " "
 
- 			    (org-timestamp-translate closed))))
 
- 		(let ((deadline (org-element-property :deadline planning)))
 
- 		  (when deadline
 
- 		    (concat org-deadline-string " "
 
- 			    (org-timestamp-translate deadline))))
 
- 		(let ((scheduled (org-element-property :scheduled planning)))
 
- 		  (when scheduled
 
- 		    (concat org-scheduled-string " "
 
- 			    (org-timestamp-translate scheduled))))))
 
-     " ")
 
-    planning info))
 
- ;;;; Property Drawer
 
- (defun org-ascii-property-drawer (property-drawer contents info)
 
-   "Transcode a PROPERTY-DRAWER element from Org to ASCII.
 
- CONTENTS holds the contents of the drawer.  INFO is a plist
 
- holding contextual information."
 
-   (and (org-string-nw-p contents)
 
-        (org-ascii--justify-element contents property-drawer info)))
 
- ;;;; Quote Block
 
- (defun org-ascii-quote-block (_quote-block contents info)
 
-   "Transcode a QUOTE-BLOCK element from Org to ASCII.
 
- CONTENTS holds the contents of the block.  INFO is a plist
 
- holding contextual information."
 
-   (org-ascii--indent-string contents (plist-get info :ascii-quote-margin)))
 
- ;;;; Radio Target
 
- (defun org-ascii-radio-target (_radio-target contents _info)
 
-   "Transcode a RADIO-TARGET object from Org to ASCII.
 
- CONTENTS is the contents of the target.  INFO is a plist holding
 
- contextual information."
 
-   contents)
 
- ;;;; Section
 
- (defun org-ascii-section (section contents info)
 
-   "Transcode a SECTION element from Org to ASCII.
 
- CONTENTS is the contents of the section.  INFO is a plist holding
 
- contextual information."
 
-   (let ((links
 
- 	 (and (plist-get info :ascii-links-to-notes)
 
- 	      ;; Take care of links in first section of the document.
 
- 	      (not (org-element-lineage section '(headline)))
 
- 	      (org-ascii--describe-links
 
- 	       (org-ascii--unique-links section info)
 
- 	       (org-ascii--current-text-width section info)
 
- 	       info))))
 
-     (org-ascii--indent-string
 
-      (if (not (org-string-nw-p links)) contents
 
-        (concat (org-element-normalize-string contents) "\n\n" links))
 
-      ;; Do not apply inner margin if parent headline is low level.
 
-      (let ((headline (org-export-get-parent-headline section)))
 
-        (if (or (not headline) (org-export-low-level-p headline info)) 0
 
- 	 (plist-get info :ascii-inner-margin))))))
 
- ;;;; Special Block
 
- (defun org-ascii-special-block (_special-block contents _info)
 
-   "Transcode a SPECIAL-BLOCK element from Org to ASCII.
 
- CONTENTS holds the contents of the block.  INFO is a plist
 
- holding contextual information."
 
-   ;; "JUSTIFYLEFT" and "JUSTIFYRIGHT" have already been taken care of
 
-   ;; at a lower level.  There is no other special block type to
 
-   ;; handle.
 
-   contents)
 
- ;;;; Src Block
 
- (defun org-ascii-src-block (src-block _contents info)
 
-   "Transcode a SRC-BLOCK element from Org to ASCII.
 
- CONTENTS holds the contents of the item.  INFO is a plist holding
 
- contextual information."
 
-   (let ((caption (org-ascii--build-caption src-block info))
 
- 	(caption-above-p (plist-get info :ascii-caption-above))
 
- 	(code (org-export-format-code-default src-block info)))
 
-     (if (equal code "") ""
 
-       (org-ascii--justify-element
 
-        (concat
 
- 	(and caption caption-above-p (concat caption "\n"))
 
- 	(org-ascii--box-string code info)
 
- 	(and caption (not caption-above-p) (concat "\n" caption)))
 
-        src-block info))))
 
- ;;;; Statistics Cookie
 
- (defun org-ascii-statistics-cookie (statistics-cookie _contents _info)
 
-   "Transcode a STATISTICS-COOKIE object from Org to ASCII.
 
- CONTENTS is nil.  INFO is a plist holding contextual information."
 
-   (org-element-property :value statistics-cookie))
 
- ;;;; Subscript
 
- (defun org-ascii-subscript (subscript contents _info)
 
-   "Transcode a SUBSCRIPT object from Org to ASCII.
 
- CONTENTS is the contents of the object.  INFO is a plist holding
 
- contextual information."
 
-   (if (org-element-property :use-brackets-p subscript)
 
-       (format "_{%s}" contents)
 
-     (format "_%s" contents)))
 
- ;;;; Superscript
 
- (defun org-ascii-superscript (superscript contents _info)
 
-   "Transcode a SUPERSCRIPT object from Org to ASCII.
 
- CONTENTS is the contents of the object.  INFO is a plist holding
 
- contextual information."
 
-   (if (org-element-property :use-brackets-p superscript)
 
-       (format "^{%s}" contents)
 
-     (format "^%s" contents)))
 
- ;;;; Strike-through
 
- (defun org-ascii-strike-through (_strike-through contents _info)
 
-   "Transcode STRIKE-THROUGH from Org to ASCII.
 
- CONTENTS is text with strike-through markup.  INFO is a plist
 
- holding contextual information."
 
-   (format "+%s+" contents))
 
- ;;;; Table
 
- (defun org-ascii-table (table contents info)
 
-   "Transcode a TABLE element from Org to ASCII.
 
- CONTENTS is the contents of the table.  INFO is a plist holding
 
- contextual information."
 
-   (let ((caption (org-ascii--build-caption table info))
 
- 	(caption-above-p (plist-get info :ascii-caption-above)))
 
-     (org-ascii--justify-element
 
-      (concat
 
-       ;; Possibly add a caption string above.
 
-       (and caption caption-above-p (concat caption "\n"))
 
-       ;; Insert table.  Note: "table.el" tables are left unmodified.
 
-       (cond ((eq (org-element-property :type table) 'org) contents)
 
- 	    ((and (plist-get info :ascii-table-use-ascii-art)
 
- 		  (eq (plist-get info :ascii-charset) 'utf-8)
 
- 		  (require 'ascii-art-to-unicode nil t))
 
- 	     (with-temp-buffer
 
- 	       (insert (org-remove-indentation
 
- 			(org-element-property :value table)))
 
- 	       (goto-char (point-min))
 
- 	       (aa2u)
 
- 	       (goto-char (point-max))
 
- 	       (skip-chars-backward " \r\t\n")
 
- 	       (buffer-substring (point-min) (point))))
 
- 	    (t (org-remove-indentation (org-element-property :value table))))
 
-       ;; Possible add a caption string below.
 
-       (and (not caption-above-p) caption))
 
-      table info)))
 
- ;;;; Table Cell
 
- (defun org-ascii--table-cell-width (table-cell info)
 
-   "Return width of TABLE-CELL.
 
- INFO is a plist used as a communication channel.
 
- Width of a cell is determined either by a width cookie in the
 
- same column as the cell, or by the maximum cell's length in that
 
- column.
 
- When `org-ascii-table-widen-columns' is non-nil, width cookies
 
- are ignored."
 
-   (let* ((row (org-export-get-parent table-cell))
 
- 	 (table (org-export-get-parent row))
 
- 	 (col (let ((cells (org-element-contents row)))
 
- 		(- (length cells) (length (memq table-cell cells)))))
 
- 	 (cache
 
- 	  (or (plist-get info :ascii-table-cell-width-cache)
 
- 	      (plist-get (setq info
 
- 			       (plist-put info :ascii-table-cell-width-cache
 
- 					  (make-hash-table :test 'equal)))
 
- 			 :ascii-table-cell-width-cache)))
 
- 	 (key (cons table col))
 
- 	 (widenp (plist-get info :ascii-table-widen-columns)))
 
-     (or (gethash key cache)
 
- 	(puthash
 
- 	 key
 
- 	 (let ((cookie-width (org-export-table-cell-width table-cell info)))
 
- 	   (or (and (not widenp) cookie-width)
 
- 	       (let ((contents-width
 
- 		      (let ((max-width 0))
 
- 			(org-element-map table 'table-row
 
- 			  (lambda (row)
 
- 			    (setq max-width
 
- 				  (max (string-width
 
- 					(org-export-data
 
- 					 (org-element-contents
 
- 					  (elt (org-element-contents row) col))
 
- 					 info))
 
- 				       max-width)))
 
- 			  info)
 
- 			max-width)))
 
- 		 (cond ((not cookie-width) contents-width)
 
- 		       (widenp (max cookie-width contents-width))
 
- 		       (t cookie-width)))))
 
- 	 cache))))
 
- (defun org-ascii-table-cell (table-cell contents info)
 
-   "Transcode a TABLE-CELL object from Org to ASCII.
 
- CONTENTS is the cell contents.  INFO is a plist used as
 
- a communication channel."
 
-   ;; Determine column width.  When `org-ascii-table-widen-columns'
 
-   ;; is nil and some width cookie has set it, use that value.
 
-   ;; Otherwise, compute the maximum width among transcoded data of
 
-   ;; each cell in the column.
 
-   (let ((width (org-ascii--table-cell-width table-cell info)))
 
-     ;; When contents are too large, truncate them.
 
-     (unless (or (plist-get info :ascii-table-widen-columns)
 
- 		(<= (string-width (or contents "")) width))
 
-       (setq contents (concat (substring contents 0 (- width 2)) "=>")))
 
-     ;; Align contents correctly within the cell.
 
-     (let* ((indent-tabs-mode nil)
 
- 	   (data
 
- 	    (when contents
 
- 	      (org-ascii--justify-lines
 
- 	       contents width
 
- 	       (org-export-table-cell-alignment table-cell info)))))
 
-       (setq contents
 
- 	    (concat data
 
- 		    (make-string (- width (string-width (or data ""))) ?\s))))
 
-     ;; Return cell.
 
-     (concat (format " %s " contents)
 
- 	    (when (memq 'right (org-export-table-cell-borders table-cell info))
 
- 	      (if (eq (plist-get info :ascii-charset) 'utf-8) "│" "|")))))
 
- ;;;; Table Row
 
- (defun org-ascii-table-row (table-row contents info)
 
-   "Transcode a TABLE-ROW element from Org to ASCII.
 
- CONTENTS is the row contents.  INFO is a plist used as
 
- a communication channel."
 
-   (when (eq (org-element-property :type table-row) 'standard)
 
-     (let ((build-hline
 
- 	   (function
 
- 	    (lambda (lcorner horiz vert rcorner)
 
- 	      (concat
 
- 	       (apply
 
- 		'concat
 
- 		(org-element-map table-row 'table-cell
 
- 		  (lambda (cell)
 
- 		    (let ((width (org-ascii--table-cell-width cell info))
 
- 			  (borders (org-export-table-cell-borders cell info)))
 
- 		      (concat
 
- 		       ;; In order to know if CELL starts the row, do
 
- 		       ;; not compare it with the first cell in the
 
- 		       ;; row as there might be a special column.
 
- 		       ;; Instead, compare it with first exportable
 
- 		       ;; cell, obtained with `org-element-map'.
 
- 		       (when (and (memq 'left borders)
 
- 				  (eq (org-element-map table-row 'table-cell
 
- 					'identity info t)
 
- 				      cell))
 
- 			 lcorner)
 
- 		       (make-string (+ 2 width) (string-to-char horiz))
 
- 		       (cond
 
- 			((not (memq 'right borders)) nil)
 
- 			((eq (car (last (org-element-contents table-row))) cell)
 
- 			 rcorner)
 
- 			(t vert)))))
 
- 		  info)) "\n"))))
 
- 	  (utf8p (eq (plist-get info :ascii-charset) 'utf-8))
 
- 	  (borders (org-export-table-cell-borders
 
- 		    (org-element-map table-row 'table-cell 'identity info t)
 
- 		    info)))
 
-       (concat (cond
 
- 	       ((and (memq 'top borders) (or utf8p (memq 'above borders)))
 
- 		(if utf8p (funcall build-hline "┍" "━" "┯" "┑")
 
- 		  (funcall build-hline "+" "-" "+" "+")))
 
- 	       ((memq 'above borders)
 
- 		(if utf8p (funcall build-hline "├" "─" "┼" "┤")
 
- 		  (funcall build-hline "+" "-" "+" "+"))))
 
- 	      (when (memq 'left borders) (if utf8p "│" "|"))
 
- 	      contents "\n"
 
- 	      (when (and (memq 'bottom borders) (or utf8p (memq 'below borders)))
 
- 		(if utf8p (funcall build-hline "┕" "━" "┷" "┙")
 
- 		  (funcall build-hline "+" "-" "+" "+")))))))
 
- ;;;; Timestamp
 
- (defun org-ascii-timestamp (timestamp _contents info)
 
-   "Transcode a TIMESTAMP object from Org to ASCII.
 
- CONTENTS is nil.  INFO is a plist holding contextual information."
 
-   (org-ascii-plain-text (org-timestamp-translate timestamp) info))
 
- ;;;; Underline
 
- (defun org-ascii-underline (_underline contents _info)
 
-   "Transcode UNDERLINE from Org to ASCII.
 
- CONTENTS is the text with underline markup.  INFO is a plist
 
- holding contextual information."
 
-   (format "_%s_" contents))
 
- ;;;; Verbatim
 
- (defun org-ascii-verbatim (verbatim _contents info)
 
-   "Return a VERBATIM object from Org to ASCII.
 
- CONTENTS is nil.  INFO is a plist holding contextual information."
 
-   (format (plist-get info :ascii-verbatim-format)
 
- 	  (org-element-property :value verbatim)))
 
- ;;;; Verse Block
 
- (defun org-ascii-verse-block (verse-block contents info)
 
-   "Transcode a VERSE-BLOCK element from Org to ASCII.
 
- CONTENTS is verse block contents.  INFO is a plist holding
 
- contextual information."
 
-   (org-ascii--indent-string
 
-    (org-ascii--justify-element contents verse-block info)
 
-    (plist-get info :ascii-quote-margin)))
 
- ;;; Filters
 
- (defun org-ascii-filter-headline-blank-lines (headline _backend info)
 
-   "Filter controlling number of blank lines after a headline.
 
- HEADLINE is a string representing a transcoded headline.  BACKEND
 
- is symbol specifying back-end used for export.  INFO is plist
 
- containing the communication channel.
 
- This function only applies to `ascii' back-end.  See
 
- `org-ascii-headline-spacing' for information."
 
-   (let ((headline-spacing (plist-get info :ascii-headline-spacing)))
 
-     (if (not headline-spacing) headline
 
-       (let ((blanks (make-string (1+ (cdr headline-spacing)) ?\n)))
 
- 	(replace-regexp-in-string "\n\\(?:\n[ \t]*\\)*\\'" blanks headline)))))
 
- (defun org-ascii-filter-paragraph-spacing (tree _backend info)
 
-   "Filter controlling number of blank lines between paragraphs.
 
- TREE is the parse tree.  BACKEND is the symbol specifying
 
- back-end used for export.  INFO is a plist used as
 
- a communication channel.
 
- See `org-ascii-paragraph-spacing' for information."
 
-   (let ((paragraph-spacing (plist-get info :ascii-paragraph-spacing)))
 
-     (when (wholenump paragraph-spacing)
 
-       (org-element-map tree 'paragraph
 
- 	(lambda (p)
 
- 	  (when (eq (org-element-type (org-export-get-next-element p info))
 
- 		    'paragraph)
 
- 	    (org-element-put-property p :post-blank paragraph-spacing))))))
 
-   tree)
 
- (defun org-ascii-filter-comment-spacing (tree _backend info)
 
-   "Filter removing blank lines between comments.
 
- TREE is the parse tree.  BACKEND is the symbol specifying
 
- back-end used for export.  INFO is a plist used as
 
- a communication channel."
 
-   (org-element-map tree '(comment comment-block)
 
-     (lambda (c)
 
-       (when (memq (org-element-type (org-export-get-next-element c info))
 
- 		  '(comment comment-block))
 
- 	(org-element-put-property c :post-blank 0))))
 
-   tree)
 
- ;;; End-user functions
 
- ;;;###autoload
 
- (defun org-ascii-convert-region-to-ascii ()
 
-   "Assume region has Org syntax, and convert it to plain ASCII."
 
-   (interactive)
 
-   (let ((org-ascii-charset 'ascii))
 
-     (org-export-replace-region-by 'ascii)))
 
- ;;;###autoload
 
- (defun org-ascii-convert-region-to-utf8 ()
 
-   "Assume region has Org syntax, and convert it to UTF-8."
 
-   (interactive)
 
-   (let ((org-ascii-charset 'utf-8))
 
-     (org-export-replace-region-by 'ascii)))
 
- ;;;###autoload
 
- (defun org-ascii-export-as-ascii
 
-   (&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 its
 
- narrowed part.
 
- If a region is active, export that region.
 
- A non-nil optional argument ASYNC means the process should happen
 
- asynchronously.  The resulting buffer should be accessible
 
- through the `org-export-stack' interface.
 
- 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, strip title and
 
- table of contents from output.
 
- EXT-PLIST, when provided, is a property list with external
 
- parameters overriding Org default settings, but still inferior to
 
- file-local settings.
 
- Export is done in a buffer named \"*Org ASCII Export*\", which
 
- will be displayed when `org-export-show-temporary-export-buffer'
 
- is non-nil."
 
-   (interactive)
 
-   (org-export-to-buffer 'ascii "*Org ASCII Export*"
 
-     async subtreep visible-only body-only ext-plist (lambda () (text-mode))))
 
- ;;;###autoload
 
- (defun org-ascii-export-to-ascii
 
-   (&optional async subtreep visible-only body-only ext-plist)
 
-   "Export current buffer to a text file.
 
- If narrowing is active in the current buffer, only export its
 
- narrowed part.
 
- If a region is active, export that region.
 
- A non-nil optional argument ASYNC means the process should happen
 
- asynchronously.  The resulting file should be accessible through
 
- the `org-export-stack' interface.
 
- 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, strip title and
 
- table of contents from output.
 
- EXT-PLIST, when provided, is a property list with external
 
- parameters overriding Org default settings, but still inferior to
 
- file-local settings.
 
- Return output file's name."
 
-   (interactive)
 
-   (let ((file (org-export-output-file-name ".txt" subtreep)))
 
-     (org-export-to-file 'ascii file
 
-       async subtreep visible-only body-only ext-plist)))
 
- ;;;###autoload
 
- (defun org-ascii-publish-to-ascii (plist filename pub-dir)
 
-   "Publish an Org file to ASCII.
 
- FILENAME is the filename of the Org file to be published.  PLIST
 
- is the property list for the given project.  PUB-DIR is the
 
- publishing directory.
 
- Return output file name."
 
-   (org-publish-org-to
 
-    'ascii filename ".txt" `(:ascii-charset ascii ,@plist) pub-dir))
 
- ;;;###autoload
 
- (defun org-ascii-publish-to-latin1 (plist filename pub-dir)
 
-   "Publish an Org file to Latin-1.
 
- FILENAME is the filename of the Org file to be published.  PLIST
 
- is the property list for the given project.  PUB-DIR is the
 
- publishing directory.
 
- Return output file name."
 
-   (org-publish-org-to
 
-    'ascii filename ".txt" `(:ascii-charset latin1 ,@plist) pub-dir))
 
- ;;;###autoload
 
- (defun org-ascii-publish-to-utf8 (plist filename pub-dir)
 
-   "Publish an org file to UTF-8.
 
- FILENAME is the filename of the Org file to be published.  PLIST
 
- is the property list for the given project.  PUB-DIR is the
 
- publishing directory.
 
- Return output file name."
 
-   (org-publish-org-to
 
-    'ascii filename ".txt" `(:ascii-charset utf-8 ,@plist) pub-dir))
 
- (provide 'ox-ascii)
 
- ;; Local variables:
 
- ;; generated-autoload-file: "org-loaddefs.el"
 
- ;; coding: utf-8
 
- ;; End:
 
- ;;; ox-ascii.el ends here
 
 
  |