]> git.eshelyaron.com Git - emacs.git/commitdiff
Sync with Org 8.2.8.
authorBastien Guerry <bzg@gnu.org>
Fri, 3 Oct 2014 08:13:51 +0000 (10:13 +0200)
committerBastien Guerry <bzg@gnu.org>
Fri, 3 Oct 2014 08:13:51 +0000 (10:13 +0200)
44 files changed:
doc/misc/ChangeLog
doc/misc/org.texi
etc/org/OrgOdtContentTemplate.xml
etc/org/OrgOdtStyles.xml
lisp/org/ChangeLog
lisp/org/ob-C.el
lisp/org/ob-R.el
lisp/org/ob-core.el
lisp/org/ob-exp.el
lisp/org/ob-haskell.el
lisp/org/ob-lilypond.el
lisp/org/ob-python.el
lisp/org/ob-sh.el
lisp/org/ob-tangle.el
lisp/org/org-agenda.el
lisp/org/org-attach.el
lisp/org/org-bbdb.el
lisp/org/org-bibtex.el
lisp/org/org-capture.el
lisp/org/org-clock.el
lisp/org/org-compat.el
lisp/org/org-element.el
lisp/org/org-entities.el
lisp/org/org-habit.el
lisp/org/org-list.el
lisp/org/org-macs.el
lisp/org/org-mobile.el
lisp/org/org-mouse.el
lisp/org/org-src.el
lisp/org/org-table.el
lisp/org/org-timer.el
lisp/org/org-version.el
lisp/org/org.el
lisp/org/ox-ascii.el
lisp/org/ox-beamer.el
lisp/org/ox-html.el
lisp/org/ox-icalendar.el
lisp/org/ox-latex.el
lisp/org/ox-md.el
lisp/org/ox-odt.el
lisp/org/ox-org.el
lisp/org/ox-publish.el
lisp/org/ox-texinfo.el
lisp/org/ox.el

index 0ad35d3803a7a748d2fa11b8aa7201e869112626..6e0b164b72b7b072ecc04b8cbecbb5fd2b1648bb 100644 (file)
@@ -1,3 +1,25 @@
+2014-10-02  Bastien Guerry  <bzg@gnu.org>
+
+       * org.texi (Key bindings and useful functions): Fix typo.  Use the
+       correct function's name.
+
+2014-10-02  Michael Brand  <michael.ch.brand@gmail.com>
+
+       * org.texi (Formula syntax for Calc): Add `f-1' to TBLFM example
+       about `nan'.
+
+2014-10-02  Nicolas Goaziou  <mail@nicolasgoaziou.fr>
+
+       * org.texi (Export settings): Be more explicit about how output
+       file name is built.
+
+       * org.texi (Headings and sectioning structure): Document menus.
+
+2014-10-02  Nicolas Goaziou  <n.goaziou@gmail.com>
+
+       * org.texi (Include files, Publishing options): Remove reference
+       to inexistent variable.
+
 2014-07-25  Stephen Berman  <stephen.berman@gmx.net>
 
        * todo-mode.texi (Marked Items): Correct omission of item deletion
index 3800a41d2394239be3379bef62a0302e53681651..d8a83fc18a4a1b5413a96eee96582e9ac0b1fd8f 100644 (file)
@@ -2,7 +2,7 @@
 @c %**start of header
 @setfilename ../../info/org
 @settitle The Org Manual
-@set VERSION 8.2.6
+@set VERSION 8.2.8
 
 @c Version and Contact Info
 @set MAINTAINERSITE @uref{http://orgmode.org,maintainers web page}
@@ -584,8 +584,9 @@ Exporting
 * Markdown export::             Exporting to Markdown
 * OpenDocument Text export::    Exporting to OpenDocument Text
 * Org export::                  Exporting to Org
+* Texinfo export::              Exporting to Texinfo
 * iCalendar export::            Exporting to iCalendar
-* Other built-in back-ends::    Exporting to @code{Texinfo} or a man page
+* Other built-in back-ends::    Exporting to a man page
 * Export in foreign buffers::   Author tables and lists in Org syntax
 * Advanced configuration::      Fine-tuning the export output
 
@@ -637,6 +638,16 @@ Advanced topics in ODT export
 * Customizing tables in ODT export::  How to define and use Table templates
 * Validating OpenDocument XML::  How to debug corrupt OpenDocument files
 
+Texinfo export
+
+* Texinfo export commands::     How to invoke Texinfo export
+* Document preamble::           File header, title and copyright page
+* Headings and sectioning structure:: Building document structure
+* Indices::                     Creating indices
+* Quoting Texinfo code::        Incorporating literal Texinfo code
+* Texinfo specific attributes:: Controlling Texinfo output
+* An example::
+
 Publishing
 
 * Configuration::               Defining projects
@@ -2725,9 +2736,11 @@ Operations, , Logical Operations, calc, GNU Emacs Calc Manual}).  For example
 @item if($1 < 20, teen, string(""))
 "teen" if age $1 is less than 20, else the Org table result field is set to
 empty with the empty string.
-@item if("$1" == "nan" || "$2" == "nan", string(""), $1 + $2); E
+@item if("$1" == "nan" || "$2" == "nan", string(""), $1 + $2); E f-1
 Sum of the first two columns.  When at least one of the input fields is empty
-the Org table result field is set to empty.
+the Org table result field is set to empty.  @samp{E} is required to not
+convert empty fields to 0.  @samp{f-1} is an optional Calc format string
+similar to @samp{%.1f} but leaves empty results empty.
 @item if(typeof(vmean($1..$7)) == 12, string(""), vmean($1..$7); E
 Mean value of a range unless there is any empty field.  Every field in the
 range that is empty is replaced by @samp{nan} which lets @samp{vmean} result
@@ -4410,7 +4423,7 @@ To record a timestamp without a note for TODO keywords configured with
 
 @noindent
 @vindex org-log-done
-you not only define global TODO keywords and fast access keys, but also
+You not only define global TODO keywords and fast access keys, but also
 request that a time is recorded when the entry is set to
 DONE@footnote{It is possible that Org mode will record two timestamps
 when you are using both @code{org-log-done} and state change logging.
@@ -9951,11 +9964,10 @@ include your @file{.emacs} file, you could use:
 @end example
 
 @noindent
-The optional second and third parameter are the markup (e.g., @samp{quote},
-@samp{example}, or @samp{src}), and, if the markup is @samp{src}, the
-language for formatting the contents.  The markup is optional; if it is not
-given, the text will be assumed to be in Org mode format and will be
-processed normally.
+The optional second and third parameter are the markup (i.e., @samp{example}
+or @samp{src}), and, if the markup is @samp{src}, the language for formatting
+the contents.  The markup is optional; if it is not given, the text will be
+assumed to be in Org mode format and will be processed normally.
 
 Contents of the included file will belong to the same structure (headline,
 item) containing the @code{INCLUDE} keyword.  In particular, headlines within
@@ -10364,8 +10376,9 @@ in the iCalendar format.
 * Markdown export::             Exporting to Markdown
 * OpenDocument Text export::    Exporting to OpenDocument Text
 * Org export::                  Exporting to Org
+* Texinfo export::              Exporting to Texinfo
 * iCalendar export::            Exporting to iCalendar
-* Other built-in back-ends::    Exporting to @code{Texinfo} or a man page
+* Other built-in back-ends::    Exporting to a man page
 * Export in foreign buffers::   Author tables and lists in Org syntax
 * Advanced configuration::      Fine-tuning the export output
 @end menu
@@ -10690,16 +10703,12 @@ Toggle inclusion of TODO keywords into exported text
 Toggle inclusion of tables (@code{org-export-with-tables}).
 @end table
 
-@cindex property, EXPORT_FILE_NAME
 When exporting only a subtree, each of the previous keywords@footnote{With
 the exception of @samp{SETUPFILE}.} can be overridden locally by special node
 properties.  These begin with @samp{EXPORT_}, followed by the name of the
 keyword they supplant.  For example, @samp{DATE} and @samp{OPTIONS} keywords
 become, respectively, @samp{EXPORT_DATE} and @samp{EXPORT_OPTIONS}
-properties.  Subtree export also supports the self-explicit
-@samp{EXPORT_FILE_NAME} property@footnote{There is no buffer-wide equivalent
-for this property.  The file name in this case is derived from the file
-associated to the buffer, if possible, or asked to the user otherwise.}.
+properties.
 
 @cindex #+BIND
 @vindex org-export-allow-bind-keywords
@@ -10708,6 +10717,13 @@ can become buffer-local during export by using the BIND keyword.  Its syntax
 is @samp{#+BIND: variable value}.  This is particularly useful for in-buffer
 settings that cannot be changed using specific keywords.
 
+@cindex property, EXPORT_FILE_NAME
+The name of the output file to be generated is taken from the file associated
+to the buffer, when possible, or asked to you otherwise.  For subtree export,
+you can also set @samp{EXPORT_FILE_NAME} property.  In all cases, only the
+base name of the file is retained, and a back-end specific extension is
+added.
+
 @node ASCII/Latin-1/UTF-8 export, Beamer export, Export settings, Exporting
 @section ASCII/Latin-1/UTF-8 export
 @cindex ASCII export
@@ -12228,7 +12244,7 @@ height:width ratio, do the following
 @cindex #+ATTR_ODT
 You can control the manner in which an image is anchored by setting the
 @code{:anchor} property of it's @code{#+ATTR_ODT} line.  You can specify one
-of the the following three values for the @code{:anchor} property:
+of the following three values for the @code{:anchor} property:
 @samp{"as-char"}, @samp{"paragraph"} and @samp{"page"}.
 
 To create an image that is anchored to a page, do the following:
@@ -12834,7 +12850,324 @@ Export to a temporary buffer.  Do not create a file.
 Export to an Org file, then open it.
 @end table
 
-@node iCalendar export, Other built-in back-ends, Org export, Exporting
+@node Texinfo export, iCalendar export, Org export, Exporting
+@section Texinfo export
+@cindex Texinfo export
+
+@samp{texinfo} export back-end generates Texinfo code and can compile it into
+an Info file.
+
+@menu
+* Texinfo export commands::     How to invoke Texinfo export
+* Document preamble::           File header, title and copyright page
+* Headings and sectioning structure:: Building document structure
+* Indices::                     Creating indices
+* Quoting Texinfo code::        Incorporating literal Texinfo code
+* Texinfo specific attributes:: Controlling Texinfo output
+* An example::
+@end menu
+
+@node Texinfo export commands, Document preamble, Texinfo export, Texinfo export
+@subsection Texinfo export commands
+
+@vindex org-texinfo-info-process
+@table @kbd
+@orgcmd{C-c C-e i t,org-texinfo-export-to-texinfo}
+Export as a Texinfo file.  For an Org file, @file{myfile.org}, the resulting
+file will be @file{myfile.texi}.  The file will be overwritten without
+warning.
+@orgcmd{C-c C-e i i,org-texinfo-export-to-info}
+Export to Texinfo and then process to an Info file@footnote{By setting
+@code{org-texinfo-info-process}, it is possible to generate other formats,
+including DocBook.}.
+@end table
+
+@node Document preamble, Headings and sectioning structure, Texinfo export commands, Texinfo export
+@subsection Document preamble
+
+When processing a document, @samp{texinfo} back-end generates a minimal file
+header along with a title page, a copyright page, and a menu.  You control
+the latter through the structure of the document (@pxref{Headings and
+sectioning structure}).  Various keywords allow to tweak the other parts.  It
+is also possible to give directions to install the document in the @samp{Top}
+node.
+
+@subsubheading File header
+
+@cindex #+TEXINFO_FILENAME
+Upon creating the header of a Texinfo file, the back-end guesses a name for
+the Info file to be compiled.  This may not be a sensible choice, e.g., if
+you want to produce the final document in a different directory.  Specify an
+alternate path with @code{#+TEXINFO_FILENAME} keyword to override the default
+destination.
+
+@vindex org-texinfo-coding-system
+@vindex org-texinfo-classes
+@cindex #+TEXINFO_HEADER
+@cindex #+TEXINFO_CLASS
+Along with the output file name, the header contains information about the
+language (@pxref{Export settings}) and current encoding used@footnote{See
+@code{org-texinfo-coding-system} for more information.}.  Insert
+a @code{#+TEXINFO_HEADER} keyword for each additional command needed, e.g.,
+@@code@{@@synindex@}.
+
+If you happen to regularly install the same set of commands, it may be easier
+to define your own class in @code{org-texinfo-classes}, which see.  Set
+@code{#+TEXINFO_CLASS} keyword accordingly in your document to activate it.
+
+@subsubheading Title and copyright page
+
+@cindex #+TEXINFO_PRINTED_TITLE
+@cindex #+SUBTITLE
+The default template includes a title page for hard copy output.  The title
+and author displayed on this page are extracted from, respectively,
+@code{#+TITLE} and @code{#+AUTHOR} keywords (@pxref{Export settings}).  It is
+also possible to print a different, more specific, title with
+@code{#+TEXINFO_PRINTED_TITLE} keyword, and add subtitles with
+@code{#+SUBTITLE} keyword.  Both expect raw Texinfo code in their value.
+
+@cindex #+SUBAUTHOR
+Likewise, information brought by @code{#+AUTHOR} may not be enough.  You can
+include other authors with several @code{#+SUBAUTHOR} keywords.  Values are
+also expected to be written in Texinfo code.
+
+@example
+#+AUTHOR: Jane Smith
+#+SUBAUTHOR: John Doe
+#+TEXINFO_PRINTED_TITLE: This Long Title@@inlinefmt@{tex,@@*@} Is Broken in @@TeX@{@}
+@end example
+
+@cindex property, COPYING
+Copying material is defined in a dedicated headline with a non-nil
+@code{:COPYING:} property.  The contents are inserted within
+a @code{@@copying} command at the beginning of the document whereas the
+heading itself does not appear in the structure of the document.
+
+Copyright information is printed on the back of the title page.
+
+@example
+* Copying
+  :PROPERTIES:
+  :COPYING: t
+  :END:
+
+  This is a short example of a complete Texinfo file, version 1.0.
+
+  Copyright \copy 2014 Free Software Foundation, Inc.
+@end example
+
+@subsubheading The Top node
+
+@cindex #+TEXINFO_DIR_CATEGORY
+@cindex #+TEXINFO_DIR_TITLE
+@cindex #+TEXINFO_DIR_DESC
+You may ultimately want to install your new Info file to your system.  You
+can write an appropriate entry in the top level directory specifying its
+category and title with, respectively, @code{#+TEXINFO_DIR_CATEGORY} and
+@code{#+TEXINFO_DIR_TITLE}.  Optionally, you can add a short description
+using @code{#+TEXINFO_DIR_DESC}.  The following example would write an entry
+similar to Org's in the @samp{Top} node.
+
+@example
+#+TEXINFO_DIR_CATEGORY: Emacs
+#+TEXINFO_DIR_TITLE: Org Mode: (org)
+#+TEXINFO_DIR_DESC: Outline-based notes management and organizer
+@end example
+
+@node Headings and sectioning structure, Indices, Document preamble, Texinfo export
+@subsection Headings and sectioning structure
+
+@vindex org-texinfo-classes
+@vindex org-texinfo-default-class
+@cindex #+TEXINFO_CLASS
+@samp{texinfo} uses a pre-defined scheme, or class, to convert headlines into
+Texinfo structuring commands.  For example, a top level headline appears as
+@code{@@chapter} if it should be numbered or as @code{@@unnumbered}
+otherwise.  If you need to use a different set of commands, e.g., to start
+with @code{@@part} instead of @code{@@chapter}, install a new class in
+@code{org-texinfo-classes}, then activate it with @code{#+TEXINFO_CLASS}
+keyword.  Export process defaults to @code{org-texinfo-default-class} when
+there is no such keyword in the document.
+
+If a headline's level has no associated structuring command, or is below
+a certain threshold @pxref{Export settings}, that headline becomes a list in
+Texinfo output.
+
+@cindex property, APPENDIX
+As an exception, a headline with a non-nil @code{:APPENDIX:} property becomes
+an appendix, independently on its level and the class used.
+
+@cindex property, DESCRIPTION
+Each regular sectioning structure creates a menu entry, named after the
+heading.  You can provide a different, e.g., shorter, title in
+@code{:ALT_TITLE:} property (@pxref{Table of contents}).  Optionally, you can
+specify a description for the item in @code{:DESCRIPTION:} property.  E.g.,
+
+@example
+* Controlling Screen Display
+  :PROPERTIES:
+  :ALT_TITLE: Display
+  :DESCRIPTION: Controlling Screen Display
+  :END:
+@end example
+
+@node Indices, Quoting Texinfo code, Headings and sectioning structure, Texinfo export
+@subsection Indices
+
+@cindex #+CINDEX
+@cindex #+FINDEX
+@cindex #+KINDEX
+@cindex #+PINDEX
+@cindex #+TINDEX
+@cindex #+VINDEX
+Index entries are created using dedicated keywords.  @samp{texinfo} back-end
+provides one for each predefined type: @code{#+CINDEX}, @code{#+FINDEX},
+@code{#+KINDEX}, @code{#+PINDEX}, @code{#+TINDEX} and @code{#+VINDEX}.  For
+custom indices, you can write raw Texinfo code (@pxref{Quoting Texinfo
+code}).
+
+@example
+#+CINDEX: Defining indexing entries
+@end example
+
+@cindex property, INDEX
+To generate an index, you need to set the @code{:INDEX:} property of
+a headline to an appropriate abbreviation (e.g., @samp{cp} or @samp{vr}).
+The headline is then exported as an unnumbered chapter or section command and
+the index is inserted after its contents.
+
+@example
+* Concept Index
+  :PROPERTIES:
+  :INDEX: cp
+  :END:
+@end example
+
+@node Quoting Texinfo code, Texinfo specific attributes, Indices, Texinfo export
+@subsection Quoting Texinfo code
+
+It is possible to insert raw Texinfo code using any of the following
+constructs
+
+@cindex #+TEXINFO
+@cindex #+BEGIN_TEXINFO
+@example
+Richard @@@@texinfo:@@sc@{@@@@Stallman@@@@texinfo:@}@@@@ commence' GNU.
+
+#+TEXINFO: @@need800
+This paragraph is preceded by...
+
+#+BEGIN_TEXINFO
+@@auindex Johnson, Mark
+@@auindex Lakoff, George
+#+END_TEXINFO
+@end example
+
+@node Texinfo specific attributes, An example, Quoting Texinfo code, Texinfo export
+@subsection Texinfo specific attributes
+
+@cindex #+ATTR_TEXINFO
+@samp{texinfo} back-end understands several attributes in plain lists and
+tables.  They must be specified using an @code{#+ATTR_TEXINFO} keyword,
+written just above the list or table.
+
+@subsubheading Plain lists
+
+In Texinfo output, description lists appear as two-column tables, using the
+default command @code{@@table}.  You can use @code{@@ftable} or
+@code{@@vtable}@footnote{For more information, @inforef{Two-column
+Tables,,texinfo}.} instead with @code{:table-type} attribute.
+
+@vindex org-texinfo-def-table-markup
+In any case, these constructs require a highlighting command for entries in
+the list.  You can provide one with @code{:indic} attribute.  If you do not,
+it defaults to the value stored in @code{org-texinfo-def-table-markup}, which
+see.
+
+@example
+#+ATTR_TEXINFO: :indic @@asis
+- foo :: This is the text for /foo/, with no highlighting.
+@end example
+
+@subsubheading Tables
+
+When exporting a table, column widths are deduced from the longest cell in
+each column.  You can also define them explicitly as fractions of the line
+length, using @code{:columns} attribute.
+
+@example
+#+ATTR_TEXINFO: :columns .5 .5
+| a cell | another cell |
+@end example
+
+@node An example,  , Texinfo specific attributes, Texinfo export
+@subsection An example
+
+Here is a thorough example, taken from @inforef{GNU Sample Texts,,texinfo}.
+
+@smallexample
+#+MACRO: version 2.0
+#+MACRO: updated last updated 4 March 2014
+
+#+OPTIONS: ':t toc:t author:t email:t
+#+TITLE: GNU Sample @{@{@{version@}@}@}
+#+AUTHOR: A.U. Thor
+#+EMAIL: bug-sample@@gnu.org
+#+LANGUAGE: en
+
+#+TEXINFO_FILENAME: sample.info
+#+TEXINFO_HEADER: @@syncodeindex pg cp
+
+#+TEXINFO_DIR_CATEGORY: Texinfo documentation system
+#+TEXINFO_DIR_TITLE: sample: (sample)
+#+TEXINFO_DIR_DESC: Invoking sample
+
+#+TEXINFO_PRINTED_TITLE: GNU Sample
+#+SUBTITLE: for version 2.0, last updated 4 March 2014
+
+* Copying 
+  :PROPERTIES:
+  :COPYING:  t
+  :END:
+
+  This manual is for GNU Sample (version @{@{@{version@}@}@},
+  @{@{@{updated@}@}@}), which is an example in the Texinfo documentation.
+
+  Copyright @@@@texinfo:@@copyright@{@}@@@@ 2013 Free Software Foundation,
+  Inc.
+
+  #+BEGIN_QUOTE
+  Permission is granted to copy, distribute and/or modify this
+  document under the terms of the GNU Free Documentation License,
+  Version 1.3 or any later version published by the Free Software
+  Foundation; with no Invariant Sections, with no Front-Cover Texts,
+  and with no Back-Cover Texts.  A copy of the license is included in
+  the section entitled "GNU Free Documentation License".
+  #+END_QUOTE
+
+* Invoking sample
+
+  #+PINDEX: sample
+  #+CINDEX: invoking @@command@{sample@}
+
+  This is a sample manual.  There is no sample program to invoke, but
+  if there were, you could see its basic usage and command line
+  options here.
+
+* GNU Free Documentation License
+  :PROPERTIES:
+  :APPENDIX: t
+  :END:
+
+  #+TEXINFO: @@include fdl.texi
+
+* Index
+  :PROPERTIES:
+  :INDEX:    cp
+  :END:
+@end smallexample
+
+@node iCalendar export, Other built-in back-ends, Texinfo export, Exporting
 @section iCalendar export
 @cindex iCalendar export
 
@@ -12912,12 +13245,11 @@ On top of the aforementioned back-ends, Org comes with other built-in ones:
 
 @itemize
 @item @file{ox-man.el}: export to a man page.
-@item @file{ox-texinfo.el}: export to @code{Texinfo} format.
 @end itemize
 
 To activate these export back-end, customize @code{org-export-backends} or
-load them directly with e.g., @code{(require 'ox-texinfo)}.  This will add
-new keys in the export dispatcher (@pxref{The Export Dispatcher}).
+load them directly with e.g., @code{(require 'ox-man)}.  This will add new
+keys in the export dispatcher (@pxref{The Export Dispatcher}).
 
 See the comment section of these files for more information on how to use
 them.
@@ -13334,7 +13666,6 @@ string of these options for details.
 @item @code{:headline-levels}       @tab @code{org-export-headline-levels}
 @item @code{:language}              @tab @code{org-export-default-language}
 @item @code{:preserve-breaks}       @tab @code{org-export-preserve-breaks}
-@item @code{:publishing-directory}  @tab @code{org-export-publishing-directory}
 @item @code{:section-numbers}       @tab @code{org-export-with-section-numbers}
 @item @code{:select-tags}           @tab @code{org-export-select-tags}
 @item @code{:with-author}           @tab @code{org-export-with-author}
@@ -15473,10 +15804,10 @@ are active:
 @item @kbd{C-c C-c} @tab @code{org-babel-execute-src-block}
 @kindex C-c C-o
 @item @kbd{C-c C-o} @tab @code{org-babel-open-src-block-result}
-@kindex C-up
-@item @kbd{C-@key{up}}    @tab @code{org-babel-load-in-session}
+@kindex M-up
+@item @kbd{M-@key{up}}    @tab @code{org-babel-load-in-session}
 @kindex M-down
-@item @kbd{M-@key{down}}  @tab @code{org-babel-pop-to-session}
+@item @kbd{M-@key{down}}  @tab @code{org-babel-switch-to-session}
 @end multitable
 
 In an Org mode buffer, the following key bindings are active:
@@ -18208,7 +18539,6 @@ org-customize @key{RET}} and then click yourself through the tree.
 @bye
 
 @c Local variables:
-@c coding: utf-8
 @c fill-column: 77
 @c indent-tabs-mode: nil
 @c paragraph-start:    "\b\\|^@[a-zA-Z]*[ \n]\\|^@x?org\\(key\\|cmd\\)\\|\f\\|[         ]*$"
index 55e1b787066652a15dc2d31408b0e81a0d449bd6..d0c98a3e51c079e74780d54289b09ba8ba52ac64 100644 (file)
 
   <!-- automatic styles -->
   <office:automatic-styles>
+
     <!-- Section styles -->
+
+    <!-- Section styles for Table Of Contents and Other Indices -->
+    <style:style style:name="OrgIndexSection" style:family="section">
+      <style:section-properties fo:background-color="#c0c0c0" style:editable="false">
+       <style:columns fo:column-count="1" fo:column-gap="0cm"/>
+       <style:background-image/>
+      </style:section-properties>
+    </style:style>
+
+    <!-- Indented sections, used as container for tables that occur
+         within list items -->
     <style:style style:name="OrgIndentedSection-Level-1" style:family="section">
       <style:section-properties text:dont-balance-text-columns="false" fo:margin-left="1.281cm" fo:margin-right="0cm" style:editable="false">
        <style:columns fo:column-count="1" fo:column-gap="0cm"/>
index 5dfcfa83890f1a0be1503da0de53be904e31616b..f41d9840cbed6c956d5a294448ff1e779b3b406b 100644 (file)
 
   <style:style style:name="Standard" style:family="paragraph" style:class="text"/>
   <style:style style:name="Heading" style:family="paragraph" style:parent-style-name="Standard" style:next-style-name="Text_20_body" style:class="text">
-   <style:paragraph-properties fo:margin-top="0.423cm" fo:margin-bottom="0.212cm" fo:keep-with-next="always"/>
+   <style:paragraph-properties fo:margin-top="0.423cm" fo:margin-bottom="0.212cm" fo:keep-with-next="always">
+     <style:tab-stops>
+       <style:tab-stop style:position="17cm" style:type="right"/>
+     </style:tab-stops>
+   </style:paragraph-properties>
    <style:text-properties style:font-name="Arial" fo:font-size="14pt" style:font-name-asian="SimSun" style:font-size-asian="14pt" style:font-name-complex="Tahoma" style:font-size-complex="14pt"/>
   </style:style>
   <style:style style:name="Text_20_body" style:display-name="Text body" style:family="paragraph" style:parent-style-name="Standard" style:class="text">
   <style:style style:name="Quotations" style:family="paragraph" style:parent-style-name="Standard" style:class="html">
    <style:paragraph-properties fo:margin-left="1cm" fo:margin-right="1cm" fo:margin-top="0cm" fo:margin-bottom="0.499cm" fo:text-indent="0cm" style:auto-text-indent="false"/>
   </style:style>
+  <style:style style:name="OrgFootnoteQuotations" style:family="paragraph" style:parent-style-name="Footnote" style:class="html">
+   <style:paragraph-properties fo:margin-left="1cm" fo:margin-right="1cm" fo:margin-top="0cm" fo:margin-bottom="0.499cm" fo:text-indent="0cm" style:auto-text-indent="false"/>
+  </style:style>
   <style:style style:name="Preformatted_20_Text" style:display-name="Preformatted Text" style:family="paragraph" style:parent-style-name="Standard" style:class="html">
    <style:paragraph-properties fo:margin-top="0cm" fo:margin-bottom="0cm"/>
    <style:text-properties style:font-name="Courier New" fo:font-size="10pt" style:font-name-asian="NSimSun" style:font-size-asian="10pt" style:font-name-complex="Courier New" style:font-size-complex="10pt"/>
   </style:style>
+
   <style:style style:name="OrgVerse" style:family="paragraph" style:parent-style-name="Preformatted_20_Text">
-   <style:paragraph-properties fo:background-color="#c0c0c0" fo:padding="0.049cm" fo:border="0.018cm solid #000000" style:shadow="none">
+   <style:paragraph-properties fo:background-color="transparent" fo:padding="0cm" fo:border="none" style:shadow="none">
     <style:background-image/>
    </style:paragraph-properties>
   </style:style>
 
+  <style:style style:name="OrgClock" style:family="paragraph" style:parent-style-name="Text_20_body">
+   <style:paragraph-properties fo:margin-top="0cm" fo:margin-bottom="0cm"/>
+  </style:style>
+  <style:style style:name="OrgClockLastLine" style:family="paragraph" style:parent-style-name="OrgClock"/>
+  <style:style style:name="OrgPlanning" style:family="paragraph" style:parent-style-name="Text_20_body"/>
+
+  <!-- Fixed width block -->
   <style:style style:name="OrgFixedWidthBlock" style:family="paragraph" style:parent-style-name="Preformatted_20_Text">
-   <style:paragraph-properties fo:background-color="#c0c0c0" fo:padding="0.049cm" fo:border="0.018cm solid #000000" style:shadow="none">
+   <style:paragraph-properties fo:background-color="#c0c0c0" fo:padding="0.049cm" fo:border="0.06pt solid #000000" style:shadow="none">
     <style:background-image/>
    </style:paragraph-properties>
   </style:style>
-
   <style:style style:name="OrgFixedWidthBlockLastLine" style:family="paragraph" style:parent-style-name="OrgFixedWidthBlock">
    <style:paragraph-properties fo:margin-top="0cm" fo:margin-bottom="0.21cm"/>
   </style:style>
 
+  <style:style style:name="OrgFormula" style:family="paragraph" style:parent-style-name="Text_20_body">
+   <style:paragraph-properties>
+    <style:tab-stops>
+     <style:tab-stop style:position="17cm" style:type="right"/>
+    </style:tab-stops>
+   </style:paragraph-properties>
+  </style:style>
+
   <style:style style:name="OrgSrcBlockLastLine" style:family="paragraph" style:parent-style-name="OrgSrcBlock">
    <style:paragraph-properties fo:margin-top="0cm" fo:margin-bottom="0.21cm"/>
   </style:style>
   <style:style style:name="OrgCenter" style:family="paragraph" style:parent-style-name="Text_20_body">
    <style:paragraph-properties fo:text-align="center" style:justify-single-word="false"/>
   </style:style>
+  <style:style style:name="OrgFootnoteCenter" style:family="paragraph" style:parent-style-name="Footnote">
+   <style:paragraph-properties fo:text-align="center" style:justify-single-word="false"/>
+  </style:style>
   <style:style style:name="OrgTableContents" style:family="paragraph" style:parent-style-name="Text_20_body"/>
   <style:style style:name="OrgTableHeading" style:family="paragraph" style:parent-style-name="OrgTableContents" style:class="extra">
     <style:paragraph-properties fo:text-align="center" style:justify-single-word="false" text:number-lines="false" text:line-number="0"/>
    </style:paragraph-properties>
   </style:style>
   <style:style style:name="Horizontal_20_Line" style:display-name="Horizontal Line" style:family="paragraph" style:parent-style-name="Standard" style:next-style-name="Text_20_body" style:class="html">
-   <style:paragraph-properties fo:margin-top="0cm" fo:margin-bottom="0.499cm" style:border-line-width-bottom="0.002cm 0.035cm 0.002cm" fo:padding="0cm" fo:border-left="none" fo:border-right="none" fo:border-top="none" fo:border-bottom="0.039cm double #808080" text:number-lines="false" text:line-number="0" style:join-border="false"/>
+   <style:paragraph-properties fo:margin-top="0cm" fo:margin-bottom="0.21cm" style:page-number="auto" fo:padding="0cm" fo:border-left="none" fo:border-right="none" fo:border-top="none" fo:border-bottom="0.06pt solid #000000" style:shadow="none" text:number-lines="false" text:line-number="0" style:join-border="false"/>
    <style:text-properties fo:font-size="6pt" style:font-size-asian="6pt" style:font-size-complex="6pt"/>
   </style:style>
+
   <style:style style:name="Emphasis" style:family="text">
    <style:text-properties fo:font-style="italic" style:font-style-asian="italic" style:font-style-complex="italic"/>
   </style:style>
   <style:style style:name="OrgCode" style:family="text" style:parent-style-name="Source_20_Text"/>
 
   <!-- BEGIN: Org Agenda Styles -->
-  <style:style style:name="OrgTodo" style:family="text">
-   <style:text-properties fo:color="#ff0000"/>
-  </style:style>
-  <style:style style:name="OrgDone" style:family="text">
-   <style:text-properties fo:color="#008000"/>
-  </style:style>
+  <style:style style:name="OrgTodo" style:family="text"/>
+  <style:style style:name="OrgDone" style:family="text"/>
+
   <style:style style:name="OrgTag" style:family="text">
-   <style:text-properties fo:background-color="#add8e6"/>
+   <style:text-properties fo:font-variant="small-caps" fo:background-color="transparent"/>
   </style:style>
-  <style:style style:name="OrgTimestamp" style:family="text">
-   <style:text-properties fo:color="#bebebe"/>
+  <style:style style:name="OrgTags" style:family="text"/>
+
+  <style:style style:name="OrgPriority" style:family="text"/>
+  <style:style style:name="OrgPriority-A" style:family="text" style:parent-style-name="OrgPriority"/>
+  <style:style style:name="OrgPriority-B" style:family="text" style:parent-style-name="OrgPriority"/>
+  <style:style style:name="OrgPriority-C" style:family="text" style:parent-style-name="OrgPriority"/>
+
+  <style:style style:name="OrgTimestamp" style:display-name="OrgTimestamp" style:family="text">
+    <style:text-properties style:font-name="Courier New" fo:background-color="transparent" style:font-name-asian="NSimSun" style:font-name-complex="Courier New"/>
   </style:style>
+  <style:style style:name="OrgActiveTimestamp" style:family="text" style:parent-style-name="OrgTimestamp"/>
+  <style:style style:name="OrgInactiveTimestamp" style:family="text" style:parent-style-name="OrgTimestamp"/>
   <style:style style:name="OrgTimestampKeyword" style:family="text">
-   <style:text-properties fo:color="#5f9ea0"/>
+   <style:text-properties style:use-window-font-color="true" fo:font-weight="bold"/>
   </style:style>
+  <style:style style:name="OrgScheduledKeyword" style:family="text" style:parent-style-name="OrgTimestampKeyword"/>
+  <style:style style:name="OrgDeadlineKeyword" style:family="text" style:parent-style-name="OrgTimestampKeyword"/>
+  <style:style style:name="OrgClockKeyword" style:family="text" style:parent-style-name="OrgTimestampKeyword"/>
+  <style:style style:name="OrgClosedKeyword" style:family="text" style:parent-style-name="OrgTimestampKeyword"/>
   <style:style style:name="OrgTimestampWrapper" style:family="text"/>
   <style:style style:name="OrgTarget" style:family="text"/>
+
+  <number:date-style style:name="OrgDate" number:automatic-order="true">
+   <number:day number:style="long"/>
+   <number:text>/</number:text>
+   <number:month number:style="long"/>
+   <number:text>/</number:text>
+   <number:year number:style="long"/>
+  </number:date-style>
   <!-- END: Org Agenda Styles -->
 
   <style:style style:name="Bold" style:family="text">
   </style:style>
 
   <style:style style:name="OrgFormulaCaptionFrame" style:family="graphic" style:parent-style-name="Frame">
-    <style:graphic-properties fo:margin-top="0cm" fo:margin-bottom="0cm" style:vertical-pos="middle" style:vertical-rel="text" style:horizontal-pos="from-left" style:horizontal-rel="paragraph-content" fo:padding="0cm" fo:border="none"/>
+   <style:graphic-properties text:anchor-type="paragraph" fo:margin-left="0cm" fo:margin-right="0cm" fo:margin-top="0cm" fo:margin-bottom="0cm" style:wrap="right" style:number-wrapped-paragraphs="1" style:wrap-contour="false" style:vertical-pos="top" style:vertical-rel="paragraph" style:horizontal-pos="center" style:horizontal-rel="paragraph" fo:padding="0cm" fo:border="none"/>
   </style:style>
 
   <style:style style:name="OrgCaptionedFormula" style:family="graphic" style:parent-style-name="OrgFormula">
index a74388b7d710a27203a5eff6898e207c7581bb2f..0e2838e6469300f36e612be52cc53f48c604393f 100644 (file)
@@ -1,3 +1,598 @@
+2014-10-02  Achim Gratz  <Stromeko@Stromeko.DE>
+
+       * ob-sh.el (org-babel-sh-initiate-session): After initiating a
+       session, initialize the marker `comint-last-output-start' since it
+       is going to be used by the ANSI color filter without further
+       checks in Emacs 23 and throws an error.
+
+       * ob-lilypond.el, testing/lisp/test-ob-lilypond.el: Change prefix
+       from `ly-' to `org-babel-lilypond-' throughout.
+
+       * org-footnote.el: Forward declare `org-element-context',
+       `org-element-property' and `org-element-type'.
+
+       * org.el: Add forward declarations for a number of functions that
+       the compiler otherwise warns about as potentially undefined at
+       runtime.
+
+       * ob-core.el: Add comment to forward declaration of
+       'org-src-preserve-indentations'.
+
+       * ob-exp.el: Require org-src to import
+       'org-src-preserve-indentations'.
+
+       * ob-haskell.el, lisp/ob-python.el: Remove superfluous forward
+       declaration of 'org-src-preserve-indentations', since it gets
+       imported by other requires.
+
+       * ob-core.el (org-every): Forward declare 'org-every'.
+
+       * ob-C.el: Require cl during compilation so that lexical-let is
+       known.
+
+       * org-entities.el: Remove superfluous require of org-macs.
+       Forward declare 'org-toggle-pretty-entities' and
+       'org-pretty-entities'.
+
+       * ox.el (org-export-get-parent): Move definition of
+       'org-export-get-parent' before first use.  Leave comment at original
+       place of definition.
+
+       * org.el (org-uniquify): Move definition of 'org-uniquify' before
+       first use.  Leave comment at original place of definition.
+
+       * ob-tangle.el (org-babel-tangle): When `file-name-directory'
+       returns nil, do not run make-directory.  Remove superfluous when
+       clauses by using short-circuiting `and' instead.
+
+2014-10-02  Alex Kosorukoff  <alex@3form.com>  (tiny change)
+
+       * org-capture.el (org-capture-fill-template): Set `mark-active' to
+       nil.
+
+2014-10-02  Bastien Guerry  <bzg@gnu.org>
+
+       * org-agenda.el (org-agenda-prepare): Reset preset filters when
+       using sticky agendas.
+
+       * org-agenda.el (org-agenda-get-sexps): Don't add tags as text
+       properties.
+
+       * org-capture.el (org-capture-fill-template): Take
+       `org-extend-today-until' into account when setting the format time
+       string.
+
+       * org.el (org-paste-subtree): Fix match subexpression.
+
+       * org.el (org-fix-ellipsis-at-bol): Delete.
+       (org-mode, org-show-context, org-isearch-end): Don't use
+       `org-fix-ellipsis-at-bol'.
+
+       * org-agenda.el (org-agenda-filter-apply): Fix setting of
+       `org-agenda-filtered-by-category'.
+
+       * org.el (org-fontify-meta-lines-and-blocks-1): Fix handling
+       of `org-hidden-keywords'.
+
+       * org-agenda.el (org-cmp-ts): Fix agenda entry type checking.
+
+       * org-agenda.el (org-entries-lessp): Fix inactive timestamp
+       comparison.
+
+       * org-agenda.el (org-agenda-mode): Let `org-agenda-redo' DTRT
+       when agenda are sticky.
+       (org-agenda-tag-filter-while-redo): Delete.
+       (org-agenda-list, org-agenda-redo, org-agenda-filter-by-tag):
+       Remove unused code.
+       (org-agenda-clockreport-mode, org-agenda-set-mode-name): Don't
+       consider tag filters.
+
+       * org.el (org-fix-ellipsis-at-bol)
+       (org-first-headline-recenter): Use `set-window-start' instead
+       of `recenter'.
+
+       * org-agenda.el (org-recenter-heading): Delete.
+
+       * org.el (org-insert-heading): With one universal prefix argument
+       or `org-insert-heading-respect-content' set to `t', always respect
+       the content, i.e. don't insert a list item and don't convert
+       normal lines into headings.  Update docstring.
+       (org-insert-heading-respect-content): Remove unused arg.
+       (org-insert-todo-heading-respect-content): Don't use
+       `org-insert-todo-heading-respect-content', use the second argument
+       of `org-insert-todo-heading' instead.
+
+       * org-mobile.el (org-mobile-edit): Use only one arg.
+
+       * org.el (org-overview): Don't call `recenter'.
+
+       * org-agenda.el (org-agenda-custom-commands-local-options): Fix
+       misquoted values.
+
+       * org.el (org-property-re): Also match null properties by default.
+       (org-entry-delete): Also delete null properties.
+       (org-read-property-value): Allow the empty string as a new value.
+       (org-delete-property): Throw a message when there is not property
+       to delete.
+
+       * org-agenda.el (org-agenda-insert-diary-make-new-entry): Fix
+       docstring.
+
+       * org.el (org-re-property): New parameter `allow-null' to match
+       property with a null value.
+       (org-entry-put): Correctly update a property with a null
+       value.
+
+       * ox-md.el (org-md-headline): When exporting with a HTML table of
+       contents, add HTML anchors to Markdown headlines.
+
+       * org.el (org-insert-heading): Don't insert an item when called
+       with two universal prefix arguments.
+
+       * org-agenda.el (org-agenda-finalize): Remove duplicate check for
+       'org-hd-marker.
+
+       * org-agenda.el (org-agenda-prepare-window): New parameter
+       `filter-alist' to set the filters correctly when
+       `org-agenda-persistent-filter' is on.
+       (org-agenda-prepare): Use the new parameter for
+       `org-agenda-prepare-window'.
+
+       * org-compat.el (org-in-invisibility-spec-p): Tiny code cleanup.
+       (org-move-to-column): Only remove '(org-filtered) from
+       `buffer-invisibility-spec'.
+
+       * org-agenda.el (org-agenda-mode): Add buffer invisibility specs.
+       (org-agenda-filter-hide-line, org-agenda-remove-filter): Set
+       the 'invisible text property to 'org-filtered.
+       (org-agenda-show-new-time): Add the default face to avoid the
+       foreground of the last character on the line to leak into the
+       timestamp notification.
+
+       * org-agenda.el (org-get-time-of-day): Don't return time string
+       from within links.
+
+       * org-timer.el (org-timer-value-string): Always return a positive
+       value.  Add docstring.
+
+       * org-capture.el (org-capture-steal-local-variables): Don't steal
+       `mark-active', which should be nil in the target buffer.
+
+       * org-agenda.el (org-agenda-remove-filter): Use `save-excursion'.
+
+       * org.el (org-move-subtree-down): Use `org-end-of-subtree' instead
+       of `outline-end-of-subtree'.
+       (outline-end-of-subtree): Remove advice.
+
+       * org-mouse.el (org-mouse-move-tree, org-mouse-do-remotely): Use
+       `org-end-of-subtree' instead of `outline-end-of-subtree'.
+
+       * org-agenda.el (org-cmp-ts): Argument `type' is not optional.
+       Don't quote it.
+
+       * org-habit.el (org-habit-insert-consistency-graphs): Don't remove
+       filter overlays as we don't use overlays for filters anymore.
+
+       * org-agenda.el (org-agenda-local-vars): Add
+       `org-agenda-top-headline-filter'.
+       (org-agenda-filter-by-category): Fix syntax.
+       (org-agenda-filter-show-all-top-filter): New function.
+       (org-agenda-filter-by-top-headline)
+       (org-agenda-filter-remove-all): Use the new function.
+       (org-agenda-filter-top-headline-apply): Use a dedicated symbol
+       `top-headline'.
+
+       * org.el (org-entry-properties): Ensure the special property is
+       not commented out when matched.
+
+       * org-agenda.el (org-agenda-write): Code cleanup.
+       (org-agenda-mark-filtered-text)
+       (org-agenda-unmark-filtered-text)
+       (org-agenda-fix-tags-filter-overlays-at): Delete.
+       (org-agenda-remove-marked-text): Use the `property' argument
+       instead of hard-coding 'org-filtered.
+       (org-agenda-filter-remove-all): Use `org-agenda-finalize'.
+       (org-agenda-filter-hide-line): Rewrite using text properties
+       instead of overlays.
+       (org-agenda-remove-filter): New function.
+       (org-agenda-filter-show-all-tag)
+       (org-agenda-filter-show-all-cat)
+       (org-agenda-filter-show-all-re): Rewrite using
+       `org-agenda-remove-filter'.
+
+       * org-attach.el (org-attach-dir): When the property is "inherited"
+       from a variable outside of the file, do not use
+       `org-entry-property-inherited-from' to find the attachment
+       position, assume we need to go back to the current headline.
+
+       * ob-R.el (org-babel-R-assign-elisp): Fix parsing of a
+       one-dimensional value.
+
+       * org.el (org-insert-heading): Fix bug when trying to insert a
+       heading when point is before the first headline and not at the
+       beginning of a line.
+
+       * org-table.el (org-table-eval-formula): Fix conversion of
+       inactive timestamps to active ones.
+
+       * org.el (org-set-regexps-and-options): Allow
+       `org-complex-heading-regexp-format' to match [/] and [%] cookies
+       when they are both before and after the heading.
+
+       * org-agenda.el (org-agenda-max-todos, org-agenda-max-tags)
+       (org-agenda-max-effort): Fix type strings.
+
+       * org-capture.el (org-capture-fill-template): Deactivate region
+       while trying to align tags on the current headline.
+
+       * org-agenda.el (org-agenda-finalize): Filter by top headline if
+       `org-agenda-top-headline-filter' is set.
+
+2014-10-02  Bernt Hansen  <bernt@norang.ca>
+
+       * org-macs.el: Remove restriction when locating markers.
+
+2014-10-02  Dmitry Gorbik  <dgorbik@me.com>  (tiny change)
+
+       * org.el (org-fast-tag-selection): Fix window splitting.
+
+2014-10-02  Eric Schulte  <schulte.eric@gmail.com>
+
+       * ob-screen.el (org-babel-screen-test): Use unpredictable name for
+       temporary file.
+
+       * ob-screen.el (org-babel-screen-session-write-temp-file): Use
+       unpredictable temp file name, fixes bug#17416.
+
+2014-10-02  Ian Kelling  <ian@iankelling.org>
+
+       * ob-core.el (org-babel-insert-result): Test all list elements
+       against listp and (eq element 'hline) instead of checking just the
+       first.
+
+2014-10-02  Konstantin Kliakhandler  <kosta@slumpy.org>  (tiny change)
+
+       * org-agenda.el (org-agenda-redo): Reapply the filters correctly.
+
+2014-10-02  Kyle Meyer  <kyle@kyleam.com>  (tiny change)
+
+       * ox.el (org-export-show-temporary-export-buffer): Fix typo.
+
+2014-10-02  Matt Lundin  <mdl@imapmail.org>
+
+       * ox-publish.el (org-publish-find-title, org-publish-find-date):
+       Make sure to call org-export-get-environment in copy of buffer if
+       emacs is already visiting. Otherwise, #+bind variables meant for
+       export can be set in live buffers.
+
+       * org.el (org-agenda-inhibit-startup): fix docstring to reflect
+       default value
+
+       * ox-publish.el (org-publish-find-title, org-publish-find-date):
+       Fix unnecessary invocations of org-mode with org-inhibit-startup.
+
+2014-10-02  Nick Dokos  <ndokos@gmail.com>
+
+       * org-table.el (org-table-clean-before-export): The regexes match
+       spaces in addition to the special characters that might be used in
+       the first column as special marking characters.  Remove the space
+       from the character class.
+
+       * ox-ascii.el (org-ascii-superscript): Change _ to ^ in the
+       output.
+
+2014-10-02  Nick Dokos  <ndokos@redhat.com>
+
+       * org-table.el (org-table-show-reference): Call `set-window-start'
+       with the calculated values `min' and `max', not with
+       (point-min) and (point-max).
+
+2014-10-02  Nicolas Goaziou  <n.goaziou@gmail.com>
+
+       * ox-latex.el (org-latex-link): Improve test for unnumbered
+       headlines.
+
+       * ox-ascii.el (org-ascii--fill-string): Allow filling even when
+       `org-export-preserve-breaks' is non-nil.
+
+       * org.el (org-N-empty-lines-before-current): Make sure to delete
+       only empty lines, not trailing whitespaces.
+
+       * ox-html.el (org-html-headline): Make sure even listified
+       headlines have proper anchors so internal links can refer to them.
+       Small refactoring.
+
+       * org-src.el (org-edit-src-code): Fix regexp.
+       (org-edit-src-exit): Do not remove auto-save timer.  This is
+       handled by the timer itself.
+
+       * org.el (org-re-property): Fix regexp.  Improve docstring.
+
+       * org-element.el (org-element-property-drawer-parser)
+       (org-element-node-property-parser): Ignore lines that are not node
+       properties.
+       (org-element-node-property-interpreter): Allow nil properties.
+
+       * org.el (org-re-property): Fix regexp to match properties with
+       empty values.
+
+       * org-element.el (org-element-headline-interpreter): Take into
+       consideration `org-odd-levels-only' value.  Small refactoring.
+
+       * ox-texinfo.el (org-texinfo--get-node): Return a node or anchor
+       name.
+       (org-texinfo--sanitize-content): Fix regexp.
+       (org-texinfo-link): Fix various bugs in link export.
+
+       * ox-beamer.el (org-beamer-link):
+       * ox-html.el (org-html-link):
+       * ox-latex.el (org-latex-link):
+       * ox-odt.el (org-odt-link): When radio link has no valid
+       target (e.g., this is a subtree export and the radio target is not
+       in the exported subtree), simply return contents.
+
+       * org.el (org-called-with-limited-levels): Initialize variable.
+
+       * org-agenda.el (org-agenda-write): Write headings in proper
+       order.
+
+       * org-element.el (org-element-table-interpreter): Enhance
+       docstring.
+
+       * ox-md.el (org-md-link): Allow custom link type export function.
+
+       * ox-texinfo.el (org-texinfo-template): Fix language and encoding
+       case.
+
+       * ox-md.el (org-md-separate-elements): Outside of lists, preserve
+       blank lines between paragraphs and plain lists.
+
+       * org-element.el (org-element-normalize-contents): Fix indentation
+       removal when there is an empty line within a verse block.
+
+       * ox-texinfo.el (org-texinfo--normalize-headlines): Properly add a
+       section to the contents.
+
+       * ox-texinfo.el (org-texinfo--normalize-headlines): Do not set pre
+       blanks since the value is now hard-coded.
+       (org-texinfo-headline): Force one blank line before contents, when non
+       empty.  Refactoring.
+       (org-texinfo-src-block): Refactor code.  Comply to predicate naming.
+
+       * ox-texinfo.el (org-texinfo--sanitize-node): Handle
+       " (not)allowed" case.
+
+       * ox-texinfo.el (org-texinfo-headline): Remove wrong code
+       comments.
+
+       * ox-texinfo.el (org-texinfo-headline): Remove `not-in-toc'
+       special case for tags.
+
+       * ox-texinfo.el (org-texinfo-headline): Remove LaTeXism (optional
+       arguments within square brackets).
+
+       * ox-texinfo.el (org-texinfo-info-process): Fix docstring.
+       (org-texinfo-compile): Do not check for impossible cases (e.g., if the
+       previous variable contains a function).
+
+       * ox-texinfo.el (org-texinfo-max-toc-depth): Fix docstring.
+
+       * ox-texinfo.el (org-texinfo--make-option-string,
+       org-texinfo--sanitize-headline,
+       org-texinfo--sanitize-headline-contents): Remove.
+
+       * ox-texinfo.el (org-texinfo--sanitize-node): "@", "{" and "}"
+       characters are allowed in a node name.  So are "(" and ")" unless
+       "(" starts the name and there is ")" somewhere in the name.  Also
+       trim and collapse whitespace characters.  Renamed from
+       `org-texinfo--sanitize-menu'.
+       (org-texinfo--get-node): Do not sanitize node names over zealously.
+       Ensure returned node names are unique.
+       (org-texinfo-headline): Only add @node command where it makes sense.
+
+       * ox-texinfo.el (org-texinfo--sanitize-menu)
+       (org-texinfo--sanitize-content): Fix docstrings.
+
+       * ox-texinfo.el (org-texinfo--normalize-headlines): Make sure a
+       blank line always follows nodes.
+
+       * ox-texinfo.el (org-texinfo-make-menu): Change signature.  Remove
+       some intermediate functions.  Generate the full master menu when
+       asked.
+       (org-texinfo--build-menu): Use a simpler algorithm.
+       (org-texinfo--format-entries): Fix entries when both node and title
+       are different.
+       (org-texinfo--menu-entries): Renamed from `org-texinfo--generate-menu-list'.
+       (org-texinfo-headline): Move menu handling to next function.
+       (org-texinfo-section): Handle menu for current parent.
+       (org-texinfo--menu-headlines, org-texinfo--generate-detailed): Remove
+       functions.
+       (org-texinfo--normalize-headlines): New function.
+
+       * ox-texinfo.el (org-texinfo-headline): Fix @appendix command.
+
+       * ox-texinfo.el (org-texinfo-headline): Do not sanitize heading
+       text for sectioning command.
+
+       * ox-texinfo.el (org-texinfo--generate-menu-list): ":COPYING: nil"
+       is expected to be equivalent to no COPYING property at all.
+
+       * ox-texinfo.el (org-texinfo-item): Fix blank lines between items.
+
+       * ox-texinfo.el (org-texinfo-plain-list): Fix format string.
+       Small refactoring.
+
+       * ox-texinfo.el (texinfo): Provide new export property.
+       (org-texinfo-template): Use dedicated title for hard copy, when
+       available.
+
+       * ox-texinfo.el (org-texinfo-headline): Always obey to a non-nil
+       :APPENDIX: property.  Small refactoring.
+
+       * ox-texinfo.el (org-texinfo-verse-block): Generate somewhat
+       meaningful Texinfo code instead of LaTeX.
+
+       * ox-texinfo.el (org-texinfo-table): Remove reference to
+       "verbatim" attribute.  Handle table.el tables.  Tiny refactoring.
+       (org-texinfo-table--org-table, org-texinfo-table--table.el-table):
+       Remove functions.
+       (org-texinfo-table-column-widths): Indent code correctly.  Ignore
+       special column, if any.  Add a comment about the limitation on the
+       width computation.
+       (org-texinfo-table-row): Small refactoring.
+
+       * ox-texinfo.el (texinfo): Do not provide a default value for
+       @setfilename value.
+       (org-texinfo-filename): Remove variable.
+       (org-texinfo-template): Correctly find value for @setfilename command.
+       If none is possible, do not provide the command at all.
+
+       * ox.el (org-export-to-file): Provide output file name in
+       communication channel, through :output-file property.
+
+       * ox-texinfo.el (org-texinfo-template): Do not hardcode "Manual"
+       in top node.
+
+       * ox-texinfo.el (org-texinfo-classes): Change default value.
+       Update docstring.
+       (org-texinfo-template): Insert header string from current class after
+       "@settitle" command.  Always provide "\input texinfo" at the beginning
+       of the output.
+
+       * ox-texinfo.el (org-texinfo-template): Remove spurious blank
+       lines in output.  Refactor code.
+
+       * ox-texinfo.el (org-texinfo-template): Fix multi-line subtitles.
+
+       * ox-texinfo.el (org-texinfo-template): Make sure table of
+       contents are allowed before inserting them.
+
+       * ox-texinfo.el (org-texinfo-template): Check if copying data is
+       not nil before using it.
+
+       * ox-texinfo.el (org-texinfo-template): Fix multi-line subauthors.
+       Correctly add email, when provided.  Check if author info is
+       wanted first.
+
+       * ox-texinfo.el (org-texinfo-node-description-column)
+       (org-texinfo-format-drawer-function): Fix docstrings.
+
+       * ox-texinfo.el (texinfo): Make sure comments are ignored.
+       (org-texinfo-comment, org-texinfo-comment-block): Remove functions.
+
+       * ox-texinfo.el (org-texinfo-template): Properly pad @direntry
+       description.
+
+       * org-element.el (org-element-headline-parser): Add missing
+       `:post-blank' property in docstring.
+
+       * ox-latex.el (org-latex-table-scientific-notation): Set
+       appropriate value.
+       (org-latex-listings-options): Fix docstring.
+
+       * ox.el (org-export-raw-special-block-p): New function.
+
+       * org-element.el (org-element-link-parser): Properly handle
+       multi-line links according to RFC 3986 when enclosed within square
+       brackets.
+
+       * org-element.el (org-element-parse-secondary-string): Clone all
+       local variables from current buffer before parsing a secondary
+       string.  Small refactoring.
+       (org-element-object-variables): Remove variable.
+
+       * ox-odt.el (org-odt--format-paragraph): Change signature to
+       include info.
+       (org-odt-footnote-reference, org-odt-paragraph): Apply signature
+       change.
+
+       * org-clock.el (org-clocktable-indent-string): Use "\emsp" instead
+       of "\__", which is not supported anymore since Org 8.0.
+
+       * ox-odt.el (org-odt--paragraph-style): New function.
+       (org-odt--format-paragraph): Use new function to get proper style
+       to apply.
+
+       * org-element.el (org-element--current-element): Fix regexp.
+
+       * org-element.el (org-element--current-element): Fix regexp
+       matching latex environments.  Discrepancy with regexp used in
+       `org-element-latex-environment-parser' introduced matching errors.
+
+       * ox-ascii.el (org-ascii--table-cell-width): Correctly export
+       tables with width cookies.
+
+       * org.el (org-insert-heading): Fix error when inserting a headline
+       before first headline, with point not at bol.  Remove source block
+       check for consistency with behavior after first headline.  Tiny
+       fix to docstring.
+
+       * org.el (org-scan-tags): Fix typo in docstring.
+
+       * ox.el (org-export--get-inbuffer-options): Return the empty
+       string instead of nil when TITLE keywords has no value.
+       (org-export--get-buffer-attributes): Do not set :title property
+       early.
+       (org-export--get-global-options): Do not ignore anymore nil values.
+       Small refactoring.
+       (org-export-as): Correctly set :title here.
+
+       * org-list.el (org-list-repair): Fix typo in docstring.
+
+       * ox-ascii.el (org-ascii--current-text-width): Tiny fix.
+
+       * ox-org.el (org-org-section): Tiny refactoring.  Use appropriate
+       property.
+
+       * ox-org.el (org-org-headline): Ignore footnote sections.
+       (org-org-section): New function.
+
+       * ox-beamer.el (org-beamer-select-environment): Ignore persistent
+       tags when displaying environments.
+
+       * ox-ascii.el (org-ascii-indented-line-width): Update docstring.
+       (org-ascii-paragraph): Do not apply indentation to the very first line
+       of a section.
+
+       * ox-latex.el (org-latex-inlinetask): Skip body if contents are
+       empty.
+
+       * ox-html.el (org-html-standalone-image-p): Ensure paragraph
+       contains at least a link before return a non-nil value.  Clarify
+       docstring.
+
+       * ox.el (org-export-data): Always return a string, as specified
+       by the docstring.
+
+       * ox-ascii.el (org-ascii--indent-string): Fix regexp to avoid
+       stack overflow in regexp matcher on very long lines.
+
+       * org-element.el (org-element-timestamp-parser): Fix docstring.
+
+       * ox-icalendar.el (org-icalendar-include-sexps,
+       org-icalendar-blocked-headline-p): Fix docstrings.
+       (org-icalendar-clear-blank-lines): Fix docstring and regexp.
+
+       * ox-icalendar.el (org-icalendar-entry): Use
+       `org-icalendar-with-timestamps'.
+
+2014-10-02  Nicolas Richard  <theonewiththeevillook@yahoo.fr>
+
+       * org.el (org-cycle-internal-local): Don't show a trailing
+       character when cycling a subtree that ends with a non-newline
+       character at the end of the buffer or the narrowed region.
+
+2014-10-02  Sebastien Vauban  <sva-news-D0wtAvR13HarG/iDocfnWg@public.gmane.org>
+
+       * ox-ascii.el (org-ascii--box-string): Choose more universal
+       Unicode characters for boxquote corners.
+
+2014-10-02  marcowahlsoft@gmail.com  <marcowahlsoft@gmail.com>  (tiny change)
+
+       * org-agenda.el (org-agenda-bulk-mark)
+       (org-agenda-bulk-mark-regexp, org-agenda-bulk-toggle-all): Fix
+       org-agenda-bulk-mark-all when time-grid is shown.
+
 2014-05-12  Eric Schulte  <eric.schulte@gmx.com>
 
        * ob-screen.el (org-babel-screen-session-write-temp-file)
index c460be326f82a8c6d02bfecf248215149eab6e24..2fcec790c436bc3e2b19e3f29c0947a049ff3bf7 100644 (file)
@@ -30,6 +30,8 @@
 ;; - not much in the way of error feedback
 
 ;;; Code:
+(eval-when-compile
+  (require 'cl))
 (require 'ob)
 (require 'cc-mode)
 
index 93d6fe284f5b5e6998431341b3b8668aef9e311b..b97fd912eae248c1324b70718eb4ddf42a8e6758 100644 (file)
@@ -173,12 +173,11 @@ This function is called by `org-babel-execute-src-block'."
 (defun org-babel-R-assign-elisp (name value colnames-p rownames-p)
   "Construct R code assigning the elisp VALUE to a variable named NAME."
   (if (listp value)
-      (let ((max (apply #'max (mapcar #'length (org-remove-if-not
-                                               #'sequencep value))))
-           (min (apply #'min (mapcar #'length (org-remove-if-not
-                                               #'sequencep value))))
-           (transition-file (org-babel-temp-file "R-import-")))
-        ;; ensure VALUE has an orgtbl structure (depth of at least 2)
+      (let* ((lengths (mapcar 'length (org-remove-if-not 'sequencep value)))
+            (max (if lengths (apply 'max lengths) 0))
+            (min (if lengths (apply 'min lengths) 0))
+            (transition-file (org-babel-temp-file "R-import-")))
+        ;; Ensure VALUE has an orgtbl structure (depth of at least 2).
         (unless (listp (car value)) (setq value (list value)))
         (with-temp-file transition-file
           (insert
index e8943c6656114113d33b3583f79f8321fcf03dc9..eef408fd44f0b1ec08c8de796ac7f3c457689058 100644 (file)
@@ -38,6 +38,7 @@
 (defvar org-src-lang-modes)
 (defvar org-babel-library-of-babel)
 (declare-function show-all "outline" ())
+(declare-function org-every "org" (pred seq))
 (declare-function org-reduce "org" (CL-FUNC CL-SEQ &rest CL-KEYS))
 (declare-function org-mark-ring-push "org" (&optional pos buffer))
 (declare-function tramp-compat-make-temp-file "tramp-compat"
@@ -1348,7 +1349,7 @@ specified in the properties of the current outline entry."
          (org-entry-get org-babel-current-src-block-location
                         (concat "header-args:" lang) 'inherit))))))
 
-(defvar org-src-preserve-indentation)
+(defvar org-src-preserve-indentation) ;; declare defcustom from org-src
 (defun org-babel-parse-src-block-match ()
   "Parse the results from a match of the `org-babel-src-block-regexp'."
   (let* ((block-indentation (length (match-string 1)))
@@ -2100,9 +2101,9 @@ code ---- the results are extracted in the syntax of the source
                 ((funcall proper-list-p result)
                  (goto-char beg)
                  (insert (concat (orgtbl-to-orgtbl
-                                  (if (or (eq 'hline (car result))
-                                          (and (listp (car result))
-                                               (listp (cdr (car result)))))
+                                  (if (org-every
+                                       (lambda (el) (or (listp el) (eq el 'hline)))
+                                       result)
                                       result (list result))
                                   '(:fmt (lambda (cell) (format "%s" cell)))) "\n"))
                  (goto-char beg) (when (org-at-table-p) (org-table-align)))
index 6d65496dbd4ed540515c7f93448a01456d06b63d..761c9f17ad02a7021bf908676ccc99597596bdeb 100644 (file)
@@ -24,6 +24,7 @@
 
 ;;; Code:
 (require 'ob-core)
+(require 'org-src)
 (eval-when-compile
   (require 'cl))
 
index 22240addd8a5f50df9f1ac192558685e1283df00..00066702a519b051fe108720d47d132fc637343c 100644 (file)
@@ -147,7 +147,6 @@ specifying a variable of the same value."
       (concat "[" (mapconcat #'org-babel-haskell-var-to-haskell var ", ") "]")
     (format "%S" var)))
 
-(defvar org-src-preserve-indentation)
 (defvar org-export-copy-to-kill-ring)
 (declare-function org-export-to-file "ox"
                  (backend file
index 9b575464ea9bcb9fcb962d92bdff221ea89aa16d..00a951d32d124ec2a57abef20f2a95747cf990fc 100644 (file)
 (defvar org-babel-default-header-args:lilypond '()
   "Default header arguments for lilypond code blocks.
 NOTE: The arguments are determined at lilypond compile time.
-See (ly-set-header-args)")
+See (org-babel-lilypond-set-header-args)")
 
-(defvar ly-compile-post-tangle t
+(defvar org-babel-lilypond-compile-post-tangle t
   "Following the org-babel-tangle (C-c C-v t) command,
-ly-compile-post-tangle determines whether ob-lilypond should
+org-babel-lilypond-compile-post-tangle determines whether ob-lilypond should
 automatically attempt to compile the resultant tangled file.
 If the value is nil, no automated compilation takes place.
 Default value is t")
 
-(defvar ly-display-pdf-post-tangle t
+(defvar org-babel-lilypond-display-pdf-post-tangle t
   "Following a successful LilyPond compilation
-ly-display-pdf-post-tangle determines whether to automate the
+org-babel-lilypond-display-pdf-post-tangle determines whether to automate the
 drawing / redrawing of the resultant pdf.  If the value is nil,
 the pdf is not automatically redrawn.  Default value is t")
 
-(defvar ly-play-midi-post-tangle t
+(defvar org-babel-lilypond-play-midi-post-tangle t
   "Following a successful LilyPond compilation
-ly-play-midi-post-tangle determines whether to automate the
+org-babel-lilypond-play-midi-post-tangle determines whether to automate the
 playing of the resultant midi file.  If the value is nil,
 the midi file is not automatically played.  Default value is t")
 
-(defvar ly-OSX-ly-path
+(defvar org-babel-lilypond-OSX-ly-path
   "/Applications/lilypond.app/Contents/Resources/bin/lilypond")
-(defvar ly-OSX-pdf-path "open")
-(defvar ly-OSX-midi-path "open")
+(defvar org-babel-lilypond-OSX-pdf-path "open")
+(defvar org-babel-lilypond-OSX-midi-path "open")
 
-(defvar ly-nix-ly-path "/usr/bin/lilypond")
-(defvar ly-nix-pdf-path "evince")
-(defvar ly-nix-midi-path "timidity")
+(defvar org-babel-lilypond-nix-ly-path "/usr/bin/lilypond")
+(defvar org-babel-lilypond-nix-pdf-path "evince")
+(defvar org-babel-lilypond-nix-midi-path "timidity")
 
-(defvar ly-w32-ly-path "lilypond")
-(defvar ly-w32-pdf-path "")
-(defvar ly-w32-midi-path "")
+(defvar org-babel-lilypond-w32-ly-path "lilypond")
+(defvar org-babel-lilypond-w32-pdf-path "")
+(defvar org-babel-lilypond-w32-midi-path "")
 
-(defvar ly-gen-png nil
+(defvar org-babel-lilypond-gen-png nil
   "Image generation (png) can be turned on by default by setting
-LY-GEN-PNG to t")
+ORG-BABEL-LILYPOND-GEN-PNG to t")
 
-(defvar ly-gen-svg nil
+(defvar org-babel-lilypond-gen-svg nil
   "Image generation (SVG) can be turned on by default by setting
-LY-GEN-SVG to t")
+ORG-BABEL-LILYPOND-GEN-SVG to t")
 
-(defvar ly-gen-html nil
+(defvar org-babel-lilypond-gen-html nil
   "HTML generation can be turned on by default by setting
-LY-GEN-HTML to t")
+ORG-BABEL-LILYPOND-GEN-HTML to t")
 
-(defvar ly-gen-pdf nil
+(defvar org-babel-lilypond-gen-pdf nil
   "PDF generation can be turned on by default by setting
-LY-GEN-PDF to t")
+ORG-BABEL-LILYPOND-GEN-PDF to t")
 
-(defvar ly-use-eps nil
+(defvar org-babel-lilypond-use-eps nil
   "You can force the compiler to use the EPS backend by setting
-LY-USE-EPS to t")
+ORG-BABEL-LILYPOND-USE-EPS to t")
 
-(defvar ly-arrange-mode nil
-  "Arrange mode is turned on by setting LY-ARRANGE-MODE
+(defvar org-babel-lilypond-arrange-mode nil
+  "Arrange mode is turned on by setting ORG-BABEL-LILYPOND-ARRANGE-MODE
 to t.  In Arrange mode the following settings are altered
 from default...
 :tangle yes,    :noweb yes
@@ -123,20 +123,20 @@ Depending on whether we are in arrange mode either:
 1. Attempt to execute lilypond block according to header settings
   (This is the default basic mode)
 2. Tangle all lilypond blocks and process the result (arrange mode)"
-  (ly-set-header-args ly-arrange-mode)
-  (if ly-arrange-mode
-      (ly-tangle)
-    (ly-process-basic body params)))
+  (org-babel-lilypond-set-header-args org-babel-lilypond-arrange-mode)
+  (if org-babel-lilypond-arrange-mode
+      (org-babel-lilypond-tangle)
+    (org-babel-lilypond-process-basic body params)))
 
-(defun ly-tangle ()
+(defun org-babel-lilypond-tangle ()
   "ob-lilypond specific tangle, attempts to invoke
 =ly-execute-tangled-ly= if tangle is successful.  Also passes
 specific arguments to =org-babel-tangle="
   (interactive)
   (if (org-babel-tangle nil "yes" "lilypond")
-      (ly-execute-tangled-ly) nil))
+      (org-babel-lilypond-execute-tangled-ly) nil))
 
-(defun ly-process-basic (body params)
+(defun org-babel-lilypond-process-basic (body params)
   "Execute a lilypond block in basic mode."
   (let* ((result-params (cdr (assoc :result-params params)))
         (out-file (cdr (assoc :file params)))
@@ -148,7 +148,7 @@ specific arguments to =org-babel-tangle="
       (insert (org-babel-expand-body:generic body params)))
     (org-babel-eval
      (concat
-      (ly-determine-ly-path)
+      (org-babel-lilypond-determine-ly-path)
       " -dbackend=eps "
       "-dno-gs-load-fonts "
       "-dinclude-eps-fonts "
@@ -167,45 +167,45 @@ specific arguments to =org-babel-tangle="
   "Return an error because LilyPond exporter does not support sessions."
   (error "Sorry, LilyPond does not currently support sessions!"))
 
-(defun ly-execute-tangled-ly ()
+(defun org-babel-lilypond-execute-tangled-ly ()
   "Compile result of block tangle with lilypond.
 If error in compilation, attempt to mark the error in lilypond org file"
-  (when ly-compile-post-tangle
-    (let ((ly-tangled-file (ly-switch-extension
+  (when org-babel-lilypond-compile-post-tangle
+    (let ((org-babel-lilypond-tangled-file (org-babel-lilypond-switch-extension
                             (buffer-file-name) ".lilypond"))
-          (ly-temp-file (ly-switch-extension
+          (org-babel-lilypond-temp-file (org-babel-lilypond-switch-extension
                          (buffer-file-name) ".ly")))
-      (if (file-exists-p ly-tangled-file)
+      (if (file-exists-p org-babel-lilypond-tangled-file)
           (progn
-            (when (file-exists-p ly-temp-file)
-              (delete-file ly-temp-file))
-            (rename-file ly-tangled-file
-                         ly-temp-file))
+            (when (file-exists-p org-babel-lilypond-temp-file)
+              (delete-file org-babel-lilypond-temp-file))
+            (rename-file org-babel-lilypond-tangled-file
+                         org-babel-lilypond-temp-file))
         (error "Error: Tangle Failed!") t)
       (switch-to-buffer-other-window "*lilypond*")
       (erase-buffer)
-      (ly-compile-lilyfile ly-temp-file)
+      (org-babel-lilypond-compile-lilyfile org-babel-lilypond-temp-file)
       (goto-char (point-min))
-      (if (not (ly-check-for-compile-error ly-temp-file))
+      (if (not (org-babel-lilypond-check-for-compile-error org-babel-lilypond-temp-file))
           (progn
             (other-window -1)
-            (ly-attempt-to-open-pdf ly-temp-file)
-            (ly-attempt-to-play-midi ly-temp-file))
+            (org-babel-lilypond-attempt-to-open-pdf org-babel-lilypond-temp-file)
+            (org-babel-lilypond-attempt-to-play-midi org-babel-lilypond-temp-file))
         (error "Error in Compilation!")))) nil)
 
-(defun ly-compile-lilyfile (file-name &optional test)
+(defun org-babel-lilypond-compile-lilyfile (file-name &optional test)
   "Compile lilypond file and check for compile errors
 FILE-NAME is full path to lilypond (.ly) file"
   (message "Compiling LilyPond...")
-  (let ((arg-1 (ly-determine-ly-path)) ;program
+  (let ((arg-1 (org-babel-lilypond-determine-ly-path)) ;program
         (arg-2 nil)                    ;infile
         (arg-3 "*lilypond*")           ;buffer
        (arg-4 t)                      ;display
-       (arg-5 (if ly-gen-png  "--png"  "")) ;&rest...
-       (arg-6 (if ly-gen-html "--html" ""))
-        (arg-7 (if ly-gen-pdf "--pdf" ""))
-        (arg-8 (if ly-use-eps  "-dbackend=eps" ""))
-        (arg-9 (if ly-gen-svg  "-dbackend=svg" ""))
+       (arg-5 (if org-babel-lilypond-gen-png  "--png"  "")) ;&rest...
+       (arg-6 (if org-babel-lilypond-gen-html "--html" ""))
+        (arg-7 (if org-babel-lilypond-gen-pdf "--pdf" ""))
+        (arg-8 (if org-babel-lilypond-use-eps  "-dbackend=eps" ""))
+        (arg-9 (if org-babel-lilypond-gen-svg  "-dbackend=svg" ""))
         (arg-10 (concat "--output=" (file-name-sans-extension file-name)))
         (arg-11 file-name))
     (if test
@@ -215,7 +215,7 @@ FILE-NAME is full path to lilypond (.ly) file"
        arg-1 arg-2 arg-3 arg-4 arg-5 arg-6
        arg-7 arg-8 arg-9 arg-10 arg-11))))
 
-(defun ly-check-for-compile-error (file-name &optional test)
+(defun org-babel-lilypond-check-for-compile-error (file-name &optional test)
   "Check for compile error.
 This is performed by parsing the *lilypond* buffer
 containing the output message from the compilation.
@@ -226,24 +226,24 @@ nil as file-name since it is unused in this context"
     (if (not test)
         (if (not is-error)
             nil
-          (ly-process-compile-error file-name))
+          (org-babel-lilypond-process-compile-error file-name))
       is-error)))
 
-(defun ly-process-compile-error (file-name)
+(defun org-babel-lilypond-process-compile-error (file-name)
   "Process the compilation error that has occurred.
 FILE-NAME is full path to lilypond file"
-  (let ((line-num (ly-parse-line-num)))
-    (let ((error-lines (ly-parse-error-line file-name line-num)))
-      (ly-mark-error-line file-name error-lines)
+  (let ((line-num (org-babel-lilypond-parse-line-num)))
+    (let ((error-lines (org-babel-lilypond-parse-error-line file-name line-num)))
+      (org-babel-lilypond-mark-error-line file-name error-lines)
       (error "Error: Compilation Failed!"))))
 
-(defun ly-mark-error-line (file-name line)
+(defun org-babel-lilypond-mark-error-line (file-name line)
   "Mark the erroneous lines in the lilypond org buffer.
 FILE-NAME is full path to lilypond file.
 LINE is the erroneous line"
   (switch-to-buffer-other-window
    (concat (file-name-nondirectory
-            (ly-switch-extension file-name ".org"))))
+            (org-babel-lilypond-switch-extension file-name ".org"))))
   (let ((temp (point)))
     (goto-char (point-min))
     (setq case-fold-search nil)
@@ -254,7 +254,7 @@ LINE is the erroneous line"
           (goto-char (- (point) (length line))))
       (goto-char temp))))
 
-(defun ly-parse-line-num (&optional buffer)
+(defun org-babel-lilypond-parse-line-num (&optional buffer)
   "Extract error line number."
   (when buffer
     (set-buffer buffer))
@@ -276,12 +276,12 @@ LINE is the erroneous line"
               nil)))
       nil)))
 
-(defun ly-parse-error-line (file-name lineNo)
+(defun org-babel-lilypond-parse-error-line (file-name lineNo)
   "Extract the erroneous line from the tangled .ly file
 FILE-NAME is full path to lilypond file.
 LINENO is the number of the erroneous line"
   (with-temp-buffer
-    (insert-file-contents (ly-switch-extension file-name ".ly")
+    (insert-file-contents (org-babel-lilypond-switch-extension file-name ".ly")
                          nil nil nil t)
     (if (> lineNo 0)
        (progn
@@ -290,128 +290,128 @@ LINENO is the number of the erroneous line"
          (buffer-substring (point) (point-at-eol)))
       nil)))
 
-(defun ly-attempt-to-open-pdf (file-name &optional test)
+(defun org-babel-lilypond-attempt-to-open-pdf (file-name &optional test)
   "Attempt to display the generated pdf file
 FILE-NAME is full path to lilypond file
 If TEST is non-nil, the shell command is returned and is not run"
-  (when ly-display-pdf-post-tangle
-    (let ((pdf-file (ly-switch-extension file-name ".pdf")))
+  (when org-babel-lilypond-display-pdf-post-tangle
+    (let ((pdf-file (org-babel-lilypond-switch-extension file-name ".pdf")))
       (if (file-exists-p pdf-file)
           (let ((cmd-string
-                 (concat (ly-determine-pdf-path) " " pdf-file)))
+                 (concat (org-babel-lilypond-determine-pdf-path) " " pdf-file)))
             (if test
                 cmd-string
              (start-process
               "\"Audition pdf\""
               "*lilypond*"
-              (ly-determine-pdf-path)
+              (org-babel-lilypond-determine-pdf-path)
               pdf-file)))
        (message  "No pdf file generated so can't display!")))))
 
-(defun ly-attempt-to-play-midi (file-name &optional test)
+(defun org-babel-lilypond-attempt-to-play-midi (file-name &optional test)
   "Attempt to play the generated MIDI file
 FILE-NAME is full path to lilypond file
 If TEST is non-nil, the shell command is returned and is not run"
-  (when ly-play-midi-post-tangle
-    (let ((midi-file (ly-switch-extension file-name ".midi")))
+  (when org-babel-lilypond-play-midi-post-tangle
+    (let ((midi-file (org-babel-lilypond-switch-extension file-name ".midi")))
       (if (file-exists-p midi-file)
           (let ((cmd-string
-                 (concat (ly-determine-midi-path) " " midi-file)))
+                 (concat (org-babel-lilypond-determine-midi-path) " " midi-file)))
             (if test
                 cmd-string
               (start-process
                "\"Audition midi\""
                "*lilypond*"
-               (ly-determine-midi-path)
+               (org-babel-lilypond-determine-midi-path)
                midi-file)))
         (message "No midi file generated so can't play!")))))
 
-(defun ly-determine-ly-path (&optional test)
+(defun org-babel-lilypond-determine-ly-path (&optional test)
   "Return correct path to ly binary depending on OS
 If TEST is non-nil, it contains a simulation of the OS for test purposes"
   (let ((sys-type
          (or test system-type)))
     (cond ((string= sys-type  "darwin")
-           ly-OSX-ly-path)
+           org-babel-lilypond-OSX-ly-path)
           ((string= sys-type "windows-nt")
-           ly-w32-ly-path)
-          (t ly-nix-ly-path))))
+           org-babel-lilypond-w32-ly-path)
+          (t org-babel-lilypond-nix-ly-path))))
 
-(defun ly-determine-pdf-path (&optional test)
+(defun org-babel-lilypond-determine-pdf-path (&optional test)
   "Return correct path to pdf viewer depending on OS
 If TEST is non-nil, it contains a simulation of the OS for test purposes"
   (let ((sys-type
          (or test system-type)))
     (cond ((string= sys-type  "darwin")
-           ly-OSX-pdf-path)
+           org-babel-lilypond-OSX-pdf-path)
           ((string= sys-type "windows-nt")
-           ly-w32-pdf-path)
-          (t ly-nix-pdf-path))))
+           org-babel-lilypond-w32-pdf-path)
+          (t org-babel-lilypond-nix-pdf-path))))
 
-(defun ly-determine-midi-path (&optional test)
+(defun org-babel-lilypond-determine-midi-path (&optional test)
   "Return correct path to midi player depending on OS
 If TEST is non-nil, it contains a simulation of the OS for test purposes"
   (let ((sys-type
          (or test test system-type)))
     (cond ((string= sys-type  "darwin")
-           ly-OSX-midi-path)
+           org-babel-lilypond-OSX-midi-path)
           ((string= sys-type "windows-nt")
-           ly-w32-midi-path)
-          (t ly-nix-midi-path))))
+           org-babel-lilypond-w32-midi-path)
+          (t org-babel-lilypond-nix-midi-path))))
 
-(defun ly-toggle-midi-play ()
+(defun org-babel-lilypond-toggle-midi-play ()
   "Toggle whether midi will be played following a successful compilation."
   (interactive)
-  (setq ly-play-midi-post-tangle
-        (not ly-play-midi-post-tangle))
+  (setq org-babel-lilypond-play-midi-post-tangle
+        (not org-babel-lilypond-play-midi-post-tangle))
   (message (concat "Post-Tangle MIDI play has been "
-                   (if ly-play-midi-post-tangle
+                   (if org-babel-lilypond-play-midi-post-tangle
                        "ENABLED." "DISABLED."))))
 
-(defun ly-toggle-pdf-display ()
+(defun org-babel-lilypond-toggle-pdf-display ()
   "Toggle whether pdf will be displayed following a successful compilation."
   (interactive)
-  (setq ly-display-pdf-post-tangle
-        (not ly-display-pdf-post-tangle))
+  (setq org-babel-lilypond-display-pdf-post-tangle
+        (not org-babel-lilypond-display-pdf-post-tangle))
   (message (concat "Post-Tangle PDF display has been "
-                   (if ly-display-pdf-post-tangle
+                   (if org-babel-lilypond-display-pdf-post-tangle
                        "ENABLED." "DISABLED."))))
 
-(defun ly-toggle-png-generation ()
+(defun org-babel-lilypond-toggle-png-generation ()
   "Toggle whether png image will be generated by compilation."
   (interactive)
-  (setq ly-gen-png (not ly-gen-png))
+  (setq org-babel-lilypond-gen-png (not org-babel-lilypond-gen-png))
   (message (concat "PNG image generation has been "
-                   (if ly-gen-png "ENABLED." "DISABLED."))))
+                   (if org-babel-lilypond-gen-png "ENABLED." "DISABLED."))))
 
-(defun ly-toggle-html-generation ()
+(defun org-babel-lilypond-toggle-html-generation ()
   "Toggle whether html will be generated by compilation."
   (interactive)
-  (setq ly-gen-html (not ly-gen-html))
+  (setq org-babel-lilypond-gen-html (not org-babel-lilypond-gen-html))
   (message (concat "HTML generation has been "
-                   (if ly-gen-html "ENABLED." "DISABLED."))))
+                   (if org-babel-lilypond-gen-html "ENABLED." "DISABLED."))))
 
-(defun ly-toggle-pdf-generation ()
+(defun org-babel-lilypond-toggle-pdf-generation ()
   "Toggle whether pdf will be generated by compilation."
   (interactive)
-  (setq ly-gen-pdf (not ly-gen-pdf))
+  (setq org-babel-lilypond-gen-pdf (not org-babel-lilypond-gen-pdf))
   (message (concat "PDF generation has been "
-                   (if ly-gen-pdf "ENABLED." "DISABLED."))))
+                   (if org-babel-lilypond-gen-pdf "ENABLED." "DISABLED."))))
 
-(defun ly-toggle-arrange-mode ()
+(defun org-babel-lilypond-toggle-arrange-mode ()
   "Toggle whether in Arrange mode or Basic mode."
   (interactive)
-  (setq ly-arrange-mode
-        (not ly-arrange-mode))
+  (setq org-babel-lilypond-arrange-mode
+        (not org-babel-lilypond-arrange-mode))
   (message (concat "Arrange mode has been "
-                   (if ly-arrange-mode "ENABLED." "DISABLED."))))
+                   (if org-babel-lilypond-arrange-mode "ENABLED." "DISABLED."))))
 
-(defun ly-switch-extension (file-name ext)
+(defun org-babel-lilypond-switch-extension (file-name ext)
   "Utility command to swap current FILE-NAME extension with EXT"
   (concat (file-name-sans-extension
            file-name) ext))
 
-(defun ly-get-header-args (mode)
+(defun org-babel-lilypond-get-header-args (mode)
   "Default arguments to use when evaluating a lilypond
 source block.  These depend upon whether we are in arrange
 mode i.e.  ARRANGE-MODE is t"
@@ -425,11 +425,11 @@ mode i.e.  ARRANGE-MODE is t"
          '((:results . "file")
            (:exports . "results")))))
 
-(defun ly-set-header-args (mode)
+(defun org-babel-lilypond-set-header-args (mode)
   "Set org-babel-default-header-args:lilypond
-dependent on LY-ARRANGE-MODE"
+dependent on ORG-BABEL-LILYPOND-ARRANGE-MODE"
   (setq org-babel-default-header-args:lilypond
-        (ly-get-header-args mode)))
+        (org-babel-lilypond-get-header-args mode)))
 
 (provide 'ob-lilypond)
 
index baa5764ac42f04a4119f8d04374a14a9b3b2ad63..7cee104669043c35259ae93c20132b6af54b8bb6 100644 (file)
@@ -56,8 +56,6 @@ This will typically be either 'python or 'python-mode."
   :package-version '(Org . "8.0")
   :type 'symbol)
 
-(defvar org-src-preserve-indentation)
-
 (defcustom org-babel-python-hline-to "None"
   "Replace hlines in incoming tables with this when translating to python."
   :group 'org-babel
index 96f275bc87acf8db741e6e25b1da9119c91d32db..856c7a01c887c41e4f93827e334c87fead484b0e 100644 (file)
@@ -123,7 +123,13 @@ Emacs-lisp table, otherwise return the results as a string."
   (when (and session (not (string= session "none")))
     (save-window-excursion
       (or (org-babel-comint-buffer-livep session)
-          (progn (shell session) (get-buffer (current-buffer)))))))
+          (progn
+           (shell session)
+           ;; Needed for Emacs 23 since the marker is initially
+           ;; undefined and the filter functions try to use it without
+           ;; checking.
+           (set-marker comint-last-output-start (point))
+           (get-buffer (current-buffer)))))))
 
 (defvar org-babel-sh-eoe-indicator "echo 'org_babel_sh_eoe'"
   "String to indicate that evaluation has completed.")
index 37b2d92a8cf405a56597c7813651ff29e5f23925..3a43b42e3ad760e31fb6e207f160c561a8b09f14 100644 (file)
@@ -225,13 +225,14 @@ used to limit the exported source code blocks by language."
                                          (concat base-name "." ext) base-name))))
                    (when file-name
                      ;; Possibly create the parent directories for file.
-                     (when (let ((m (funcall get-spec :mkdirp)))
-                              (and m (not (string= m "no"))))
-                       (make-directory (file-name-directory file-name) 'parents))
+                     (let ((m (funcall get-spec :mkdirp))
+                           (fnd (file-name-directory file-name)))
+                       (and m fnd (not (string= m "no"))
+                            (make-directory fnd 'parents)))
                      ;; delete any old versions of file
-                     (when (and (file-exists-p file-name)
-                                (not (member file-name (mapcar #'car path-collector))))
-                       (delete-file file-name))
+                     (and (file-exists-p file-name)
+                          (not (member file-name (mapcar #'car path-collector)))
+                          (delete-file file-name))
                      ;; drop source-block to file
                      (with-temp-buffer
                        (when (fboundp lang-f) (ignore-errors (funcall lang-f)))
index 18fada15de88d2cf7736629350f8a6f57800393c..6f9db514d436901ebf158d689f971884b1a5822b 100644 (file)
@@ -390,32 +390,36 @@ the daily/weekly agenda, see `org-agenda-skip-function'.")
                           (repeat :inline t :tag "Conditions for skipping"
                                   (choice
                                    :tag "Condition type"
-                                   (list :tag "Regexp matches" :inline t (const :format "" regexp) (regexp))
-                                   (list :tag "Regexp does not match" :inline t (const :format "" notregexp) (regexp))
+                                   (list :tag "Regexp matches" :inline t
+                                         (const :format "" 'regexp)
+                                         (regexp))
+                                   (list :tag "Regexp does not match" :inline t
+                                         (const :format "" 'notregexp)
+                                         (regexp))
                                    (list :tag "TODO state is" :inline t
-                                         (const todo)
+                                         (const 'todo)
                                          (choice
-                                          (const :tag "any not-done state" todo)
-                                          (const :tag "any done state" done)
-                                          (const :tag "any state" any)
+                                          (const :tag "Any not-done state" 'todo)
+                                          (const :tag "Any done state" 'done)
+                                          (const :tag "Any state" 'any)
                                           (list :tag "Keyword list"
                                                 (const :format "" quote)
                                                 (repeat (string :tag "Keyword")))))
                                    (list :tag "TODO state is not" :inline t
-                                         (const nottodo)
+                                         (const 'nottodo)
                                          (choice
-                                          (const :tag "any not-done state" todo)
-                                          (const :tag "any done state" done)
-                                          (const :tag "any state" any)
+                                          (const :tag "Any not-done state" 'todo)
+                                          (const :tag "Any done state" 'done)
+                                          (const :tag "Any state" 'any)
                                           (list :tag "Keyword list"
                                                 (const :format "" quote)
                                                 (repeat (string :tag "Keyword")))))
-                                   (const :tag "scheduled" scheduled)
-                                   (const :tag "not scheduled" notscheduled)
-                                   (const :tag "deadline" deadline)
-                                   (const :tag "no deadline" notdeadline)
-                                   (const :tag "timestamp" timestamp)
-                                   (const :tag "no timestamp" nottimestamp))))))
+                                   (const :tag "scheduled" 'scheduled)
+                                   (const :tag "not scheduled" 'notscheduled)
+                                   (const :tag "deadline" 'deadline)
+                                   (const :tag "no deadline" 'notdeadline)
+                                   (const :tag "timestamp" 'timestamp)
+                                   (const :tag "no timestamp" 'nottimestamp))))))
                   (list :tag "Non-standard skipping condition"
                         :value (org-agenda-skip-function)
                         (const org-agenda-skip-function)
@@ -2092,11 +2096,9 @@ When nil, `q' will kill the single agenda buffer."
     org-agenda-info
     org-agenda-pre-window-conf
     org-agenda-columns-active
-    org-agenda-tag-filter-overlays
     org-agenda-tag-filter
-    org-agenda-cat-filter-overlays
     org-agenda-category-filter
-    org-agenda-re-filter-overlays
+    org-agenda-top-headline-filter
     org-agenda-regexp-filter
     org-agenda-markers
     org-agenda-last-search-view-search-was-boolean
@@ -2158,10 +2160,11 @@ The following commands are available:
                nil t)
   (unless org-agenda-keep-modes
     (setq org-agenda-follow-mode org-agenda-start-with-follow-mode
-         org-agenda-entry-text-mode org-agenda-start-with-entry-text-mode
-         org-agenda-clockreport-mode org-agenda-start-with-clockreport-mode
-         org-agenda-show-log org-agenda-start-with-log-mode))
-
+         org-agenda-entry-text-mode org-agenda-start-with-entry-text-mode))
+  (setq org-agenda-show-log org-agenda-start-with-log-mode)
+  (setq org-agenda-clockreport-mode org-agenda-start-with-clockreport-mode)
+  (add-to-invisibility-spec '(org-filtered))
+  (add-to-invisibility-spec '(org-link))
   (easy-menu-change
    '("Agenda") "Agenda Files"
    (append
@@ -2604,7 +2607,7 @@ type."
   :package-version '(Org . "8.0")
   :group 'org-agenda-custom-commands
   :type '(choice (symbol :tag "No limit" nil)
-                (integer :tag "Max number of entries")
+                (integer :tag "Max number of TODOs")
                 (repeat
                  (cons (choice :tag "Agenda type"
                                (const agenda)
@@ -2612,7 +2615,7 @@ type."
                                (const tags)
                                (const search)
                                (const timeline))
-                       (integer :tag "Max number of entries")))))
+                       (integer :tag "Max number of TODOs")))))
 
 (defcustom org-agenda-max-tags nil
   "Maximum number of tagged entries to display in an agenda.
@@ -2623,7 +2626,7 @@ type."
   :package-version '(Org . "8.0")
   :group 'org-agenda-custom-commands
   :type '(choice (symbol :tag "No limit" nil)
-                (integer :tag "Max number of entries")
+                (integer :tag "Max number of tagged entries")
                 (repeat
                  (cons (choice :tag "Agenda type"
                                (const agenda)
@@ -2631,7 +2634,7 @@ type."
                                (const tags)
                                (const search)
                                (const timeline))
-                       (integer :tag "Max number of entries")))))
+                       (integer :tag "Max number of tagged entries")))))
 
 (defcustom org-agenda-max-effort nil
   "Maximum cumulated effort duration for the agenda.
@@ -2642,7 +2645,7 @@ to limit entries to in this type."
   :package-version '(Org . "8.0")
   :group 'org-agenda-custom-commands
   :type '(choice (symbol :tag "No limit" nil)
-                (integer :tag "Max number of entries")
+                (integer :tag "Max number of minutes")
                 (repeat
                  (cons (choice :tag "Agenda type"
                                (const agenda)
@@ -2650,7 +2653,7 @@ to limit entries to in this type."
                                (const tags)
                                (const search)
                                (const timeline))
-                       (integer :tag "Max number of entries")))))
+                       (integer :tag "Max number of minutes")))))
 
 (defvar org-keys nil)
 (defvar org-match nil)
@@ -3324,19 +3327,12 @@ If AGENDA-BUFFER-NAME, use this as the buffer name for the agenda to write."
   (org-let (if nosettings nil org-agenda-exporter-settings)
     '(save-excursion
        (save-window-excursion
-        (org-agenda-mark-filtered-text)
         (let ((bs (copy-sequence (buffer-string))) beg content)
-          (org-agenda-unmark-filtered-text)
           (with-temp-buffer
             (rename-buffer org-agenda-write-buffer-name t)
             (set-buffer-modified-p nil)
             (insert bs)
             (org-agenda-remove-marked-text 'org-filtered)
-            (while (setq beg (text-property-any (point-min) (point-max)
-                                                'org-filtered t))
-              (delete-region
-               beg (or (next-single-property-change beg 'org-filtered)
-                       (point-max))))
             (run-hooks 'org-agenda-before-write-hook)
             (cond
              ((org-bound-and-true-p org-mobile-creating-agendas)
@@ -3356,7 +3352,7 @@ If AGENDA-BUFFER-NAME, use this as the buffer name for the agenda to write."
                           content)))
                 (find-file file)
                 (erase-buffer)
-                (mapcar (lambda (s) (org-paste-subtree 1 s)) (reverse content))
+                (dolist (s content) (org-paste-subtree 1 s))
                 (write-file file)
                 (kill-buffer (current-buffer))
                 (message "Org file written to %s" file)))
@@ -3402,28 +3398,6 @@ If AGENDA-BUFFER-NAME, use this as the buffer name for the agenda to write."
                    org-agenda-buffer-name)))
   (when open (org-open-file file)))
 
-(defvar org-agenda-tag-filter-overlays nil)
-(defvar org-agenda-cat-filter-overlays nil)
-(defvar org-agenda-re-filter-overlays nil)
-
-(defun org-agenda-mark-filtered-text ()
-  "Mark all text hidden by filtering with a text property."
-  (let ((inhibit-read-only t))
-    (mapc
-     (lambda (o)
-       (when (equal (overlay-buffer o) (current-buffer))
-        (put-text-property
-         (overlay-start o) (overlay-end o)
-         'org-filtered t)))
-     (append org-agenda-tag-filter-overlays
-            org-agenda-cat-filter-overlays
-            org-agenda-re-filter-overlays))))
-
-(defun org-agenda-unmark-filtered-text ()
-  "Remove the filtering text property."
-  (let ((inhibit-read-only t))
-    (remove-text-properties (point-min) (point-max) '(org-filtered t))))
-
 (defun org-agenda-remove-marked-text (property &optional value)
   "Delete all text marked with VALUE of PROPERTY.
 VALUE defaults to t."
@@ -3432,7 +3406,7 @@ VALUE defaults to t."
     (while (setq beg (text-property-any (point-min) (point-max)
                                        property value))
       (delete-region
-       beg (or (next-single-property-change beg 'org-filtered)
+       beg (or (next-single-property-change beg property)
               (point-max))))))
 
 (defun org-agenda-add-entry-text ()
@@ -3557,7 +3531,6 @@ removed from the entry content.  Currently only `planning' is allowed here."
 (defvar org-agenda-category-filter nil)
 (defvar org-agenda-regexp-filter nil)
 (defvar org-agenda-top-headline-filter nil)
-(defvar org-agenda-tag-filter-while-redo nil)
 (defvar org-agenda-tag-filter-preset nil
   "A preset of the tags filter used for secondary agenda filtering.
 This must be a list of strings, each string must be a single tag preceded
@@ -3609,10 +3582,12 @@ generating a new one."
       ;; does not have org variables local
       org-agenda-this-buffer-is-sticky))))
 
-(defun org-agenda-prepare-window (abuf)
-  "Setup agenda buffer in the window."
-  (let* ((awin (get-buffer-window abuf))
-        wconf)
+(defun org-agenda-prepare-window (abuf filter-alist)
+  "Setup agenda buffer in the window.
+ABUF is the buffer for the agenda window.
+FILTER-ALIST is an alist of filters we need to apply when
+`org-agenda-persistent-filter' is non-nil."
+  (let* ((awin (get-buffer-window abuf)) wconf)
     (cond
      ((equal (current-buffer) abuf) nil)
      (awin (select-window awin))
@@ -3626,68 +3601,76 @@ generating a new one."
      ((equal org-agenda-window-setup 'reorganize-frame)
       (delete-other-windows)
       (org-switch-to-buffer-other-window abuf)))
-    ;; additional test in case agenda is invoked from within agenda
-    ;; buffer via elisp link
+    (setq org-agenda-tag-filter (cdr (assoc 'tag filter-alist)))
+    (setq org-agenda-category-filter (cdr (assoc 'cat filter-alist)))
+    (setq org-agenda-regexp-filter (cdr (assoc 're filter-alist)))
+    ;; Additional test in case agenda is invoked from within agenda
+    ;; buffer via elisp link.
     (unless (equal (current-buffer) abuf)
       (org-pop-to-buffer-same-window abuf))
     (setq org-agenda-pre-window-conf
          (or org-agenda-pre-window-conf wconf))))
 
 (defun org-agenda-prepare (&optional name)
-  (if (org-agenda-use-sticky-p)
-      (progn
-       ;; Popup existing buffer
-       (org-agenda-prepare-window (get-buffer org-agenda-buffer-name))
-       (message "Sticky Agenda buffer, use `r' to refresh")
-       (or org-agenda-multi (org-agenda-fit-window-to-buffer))
-       (throw 'exit "Sticky Agenda buffer, use `r' to refresh"))
-    (setq org-todo-keywords-for-agenda nil)
-    (setq org-drawers-for-agenda nil)
-    (unless org-agenda-persistent-filter
-      (setq org-agenda-tag-filter nil
-           org-agenda-category-filter nil
-           org-agenda-regexp-filter nil))
-    (put 'org-agenda-tag-filter :preset-filter
-        org-agenda-tag-filter-preset)
-    (put 'org-agenda-category-filter :preset-filter
-        org-agenda-category-filter-preset)
-    (put 'org-agenda-regexp-filter :preset-filter
-        org-agenda-regexp-filter-preset)
-    (if org-agenda-multi
+  (let ((filter-alist (if org-agenda-persistent-filter
+                         (list `(tag . ,org-agenda-tag-filter)
+                               `(re . ,org-agenda-regexp-filter)
+                               `(car . ,org-agenda-category-filter)))))
+    (if (org-agenda-use-sticky-p)
        (progn
-         (setq buffer-read-only nil)
-         (goto-char (point-max))
-         (unless (or (bobp) org-agenda-compact-blocks
-                     (not org-agenda-block-separator))
-           (insert "\n"
-                   (if (stringp org-agenda-block-separator)
-                       org-agenda-block-separator
-                     (make-string (window-width) org-agenda-block-separator))
-                   "\n"))
-         (narrow-to-region (point) (point-max)))
-      (setq org-done-keywords-for-agenda nil)
-
-      ;; Setting any org variables that are in org-agenda-local-vars
-      ;; list need to be done after the prepare call
-      (org-agenda-prepare-window (get-buffer-create org-agenda-buffer-name))
-      (setq buffer-read-only nil)
-      (org-agenda-reset-markers)
-      (let ((inhibit-read-only t)) (erase-buffer))
-      (org-agenda-mode)
-      (setq org-agenda-buffer (current-buffer))
-      (setq org-agenda-contributing-files nil)
-      (setq org-agenda-columns-active nil)
-      (org-agenda-prepare-buffers (org-agenda-files nil 'ifmode))
-      (setq org-todo-keywords-for-agenda
-           (org-uniquify org-todo-keywords-for-agenda))
-      (setq org-done-keywords-for-agenda
-           (org-uniquify org-done-keywords-for-agenda))
-      (setq org-drawers-for-agenda (org-uniquify org-drawers-for-agenda))
-      (setq org-agenda-last-prefix-arg current-prefix-arg)
-      (setq org-agenda-this-buffer-name org-agenda-buffer-name)
-      (and name (not org-agenda-name)
-          (org-set-local 'org-agenda-name name)))
-    (setq buffer-read-only nil)))
+         (put 'org-agenda-tag-filter :preset-filter nil)
+         (put 'org-agenda-category-filter :preset-filter nil)
+         (put 'org-agenda-regexp-filter :preset-filter nil)
+         ;; Popup existing buffer
+         (org-agenda-prepare-window (get-buffer org-agenda-buffer-name)
+                                    filter-alist)
+         (message "Sticky Agenda buffer, use `r' to refresh")
+         (or org-agenda-multi (org-agenda-fit-window-to-buffer))
+         (throw 'exit "Sticky Agenda buffer, use `r' to refresh"))
+      (setq org-todo-keywords-for-agenda nil)
+      (setq org-drawers-for-agenda nil)
+      (put 'org-agenda-tag-filter :preset-filter
+          org-agenda-tag-filter-preset)
+      (put 'org-agenda-category-filter :preset-filter
+          org-agenda-category-filter-preset)
+      (put 'org-agenda-regexp-filter :preset-filter
+          org-agenda-regexp-filter-preset)
+      (if org-agenda-multi
+         (progn
+           (setq buffer-read-only nil)
+           (goto-char (point-max))
+           (unless (or (bobp) org-agenda-compact-blocks
+                       (not org-agenda-block-separator))
+             (insert "\n"
+                     (if (stringp org-agenda-block-separator)
+                         org-agenda-block-separator
+                       (make-string (window-width) org-agenda-block-separator))
+                     "\n"))
+           (narrow-to-region (point) (point-max)))
+       (setq org-done-keywords-for-agenda nil)
+
+       ;; Setting any org variables that are in org-agenda-local-vars
+       ;; list need to be done after the prepare call
+       (org-agenda-prepare-window
+        (get-buffer-create org-agenda-buffer-name) filter-alist)
+       (setq buffer-read-only nil)
+       (org-agenda-reset-markers)
+       (let ((inhibit-read-only t)) (erase-buffer))
+       (org-agenda-mode)
+       (setq org-agenda-buffer (current-buffer))
+       (setq org-agenda-contributing-files nil)
+       (setq org-agenda-columns-active nil)
+       (org-agenda-prepare-buffers (org-agenda-files nil 'ifmode))
+       (setq org-todo-keywords-for-agenda
+             (org-uniquify org-todo-keywords-for-agenda))
+       (setq org-done-keywords-for-agenda
+             (org-uniquify org-done-keywords-for-agenda))
+       (setq org-drawers-for-agenda (org-uniquify org-drawers-for-agenda))
+       (setq org-agenda-last-prefix-arg current-prefix-arg)
+       (setq org-agenda-this-buffer-name org-agenda-buffer-name)
+       (and name (not org-agenda-name)
+            (org-set-local 'org-agenda-name name)))
+      (setq buffer-read-only nil))))
 
 (defvar org-agenda-overriding-columns-format)  ; From org-colview.el
 (defun org-agenda-finalize ()
@@ -3739,13 +3722,15 @@ generating a new one."
            (save-excursion
              (goto-char (point-min))
              (while (equal (forward-line) 0)
-               (when (setq mrk (or (get-text-property (point) 'org-hd-marker)
-                                   (get-text-property (point) 'org-hd-marker)))
+               (when (setq mrk (get-text-property (point) 'org-hd-marker))
                  (put-text-property (point-at-bol) (point-at-eol)
                                     'tags (org-with-point-at mrk
                                             (delete-dups
                                              (mapcar 'downcase (org-get-tags-at))))))))))
        (run-hooks 'org-agenda-finalize-hook)
+       (when org-agenda-top-headline-filter
+         (org-agenda-filter-top-headline-apply
+          org-agenda-top-headline-filter))
        (when org-agenda-tag-filter
          (org-agenda-filter-apply org-agenda-tag-filter 'tag))
        (when (get 'org-agenda-tag-filter :preset-filter)
@@ -4326,14 +4311,6 @@ items if they have an hour specification like [h]h:mm."
          (setq p (plist-put p :tstart clocktable-start))
          (setq p (plist-put p :tend clocktable-end))
          (setq p (plist-put p :scope 'agenda))
-         (when (and (eq org-agenda-clockreport-mode 'with-filter)
-                    (setq filter (or org-agenda-tag-filter-while-redo
-                                     (get 'org-agenda-tag-filter :preset-filter))))
-           (setq p (plist-put p :tags (mapconcat (lambda (x)
-                                                   (if (string-match "[<>=]" x)
-                                                       ""
-                                                     x))
-                                                 filter ""))))
          (setq tbl (apply 'org-clock-get-clocktable p))
          (insert tbl)))
       (goto-char (point-min))
@@ -5703,7 +5680,7 @@ This function is invoked if `org-agenda-todo-ignore-deadlines',
            (setq txt (org-agenda-format-item extra txt level category tags 'time))
            (org-add-props txt props 'org-marker marker
                           'org-category category 'date date 'todo-state todo-state
-                          'org-category-position category-pos 'tags tags
+                          'org-category-position category-pos
                           'level level
                           'type "sexp" 'warntime warntime)
            (push txt ee)))))
@@ -6781,8 +6758,10 @@ The optional STRING argument forces conversion into a 5 character wide string
 HH:MM."
   (save-match-data
     (when
-       (or (string-match "\\<\\([012]?[0-9]\\)\\(:\\([0-5][0-9]\\)\\)\\([AaPp][Mm]\\)?\\> *" s)
-           (string-match "\\<\\([012]?[0-9]\\)\\(:\\([0-5][0-9]\\)\\)?\\([AaPp][Mm]\\)\\> *" s))
+       (and
+        (or (string-match "\\<\\([012]?[0-9]\\)\\(:\\([0-5][0-9]\\)\\)\\([AaPp][Mm]\\)?\\> *" s)
+            (string-match "\\<\\([012]?[0-9]\\)\\(:\\([0-5][0-9]\\)\\)?\\([AaPp][Mm]\\)\\> *" s))
+        (not (eq (get-text-property 1 'face s) 'org-link)))
       (let* ((h (string-to-number (match-string 1 s)))
             (m (if (match-end 3) (string-to-number (match-string 3 s)) 0))
             (ampm (if (match-end 4) (downcase (match-string 4 s))))
@@ -7010,7 +6989,7 @@ The optional argument TYPE tells the agenda type."
     (cond ((< ta tb) -1)
          ((< tb ta) +1))))
 
-(defsubst org-cmp-ts (a b &optional type)
+(defsubst org-cmp-ts (a b type)
   "Compare the timestamps values of entries A and B.
 When TYPE is \"scheduled\", \"deadline\", \"timestamp\" or
 \"timestamp_ia\", compare within each of these type.  When TYPE
@@ -7018,9 +6997,11 @@ is the empty string, compare all timestamps without respect of
 their type."
   (let* ((def (if org-sort-agenda-notime-is-late most-positive-fixnum -1))
         (ta (or (and (string-match type (or (get-text-property 1 'type a) ""))
-                     (get-text-property 1 'ts-date a)) def))
+                     (get-text-property 1 'ts-date a))
+                def))
         (tb (or (and (string-match type (or (get-text-property 1 'type b) ""))
-                     (get-text-property 1 'ts-date b)) def)))
+                     (get-text-property 1 'ts-date b))
+                def)))
     (cond ((< ta tb) -1)
          ((< tb ta) +1))))
 
@@ -7046,7 +7027,7 @@ their type."
                               (org-cmp-ts a b "deadline")))
         (deadline-down   (if deadline-up (- deadline-up) nil))
         (tsia-up         (and (org-em 'tsia-up 'tsia-down ss)
-                              (org-cmp-ts a b "iatimestamp_ia")))
+                              (org-cmp-ts a b "timestamp_ia")))
         (tsia-down       (if tsia-up (- tsia-up) nil))
         (ts-up           (and (org-em 'ts-up 'ts-down ss)
                               (org-cmp-ts a b "timestamp")))
@@ -7283,7 +7264,6 @@ in the agenda."
         (cat-preset (get 'org-agenda-category-filter :preset-filter))
         (re-filter org-agenda-regexp-filter)
         (re-preset (get 'org-agenda-regexp-filter :preset-filter))
-        (org-agenda-tag-filter-while-redo (or tag-filter tag-preset))
         (cols org-agenda-columns-active)
         (line (org-current-line))
         (window-line (- line (org-current-line (window-start))))
@@ -7316,9 +7296,12 @@ in the agenda."
     (put 'org-agenda-tag-filter :preset-filter tag-preset)
     (put 'org-agenda-category-filter :preset-filter cat-preset)
     (put 'org-agenda-regexp-filter :preset-filter re-preset)
-    (and (or tag-filter tag-preset) (org-agenda-filter-apply tag-filter 'tag))
-    (and (or cat-filter cat-preset) (org-agenda-filter-apply cat-filter 'category))
-    (and (or re-filter re-preset) (org-agenda-filter-apply re-filter 'regexp))
+    (let ((tag (or tag-filter tag-preset))
+         (cat (or cat-filter cat-preset))
+         (re  (or re-filter re-preset)))
+      (when tag (org-agenda-filter-apply tag 'tag))
+      (when cat (org-agenda-filter-apply cat 'category))
+      (when re  (org-agenda-filter-apply re 'regexp)))
     (and top-hl-filter (org-agenda-filter-top-headline-apply top-hl-filter))
     (and cols (org-called-interactively-p 'any) (org-agenda-columns))
     (org-goto-line line)
@@ -7344,7 +7327,7 @@ The category is that of the current line."
         (org-agenda-filter-apply
          (setq org-agenda-category-filter
               (list (concat "+" cat))) 'category))
-       ((error "No category at point"))))))
+       ((error "No category at point"))))))
 
 (defun org-find-top-headline (&optional pos)
   "Find the topmost parent headline and return it."
@@ -7365,10 +7348,10 @@ The top headline is that of the current line."
       (progn
         (setq org-agenda-filtered-by-top-headline nil
              org-agenda-top-headline-filter nil)
-        (org-agenda-filter-show-all-cat))
-    (let ((cat (org-find-top-headline (org-get-at-bol 'org-hd-marker))))
-      (if cat (org-agenda-filter-top-headline-apply cat strip)
-        (error "No top-level category at point")))))
+        (org-agenda-filter-show-all-top-filter))
+    (let ((toph (org-find-top-headline (org-get-at-bol 'org-hd-marker))))
+      (if toph (org-agenda-filter-top-headline-apply toph strip)
+        (error "No top-level headline at point")))))
 
 (defvar org-agenda-regexp-filter nil)
 (defun org-agenda-filter-by-regexp (strip)
@@ -7397,7 +7380,10 @@ With two prefix arguments, remove the regexp filters."
   (when org-agenda-category-filter
     (org-agenda-filter-show-all-cat))
   (when org-agenda-regexp-filter
-    (org-agenda-filter-show-all-re)))
+    (org-agenda-filter-show-all-re))
+  (when org-agenda-top-headline-filter
+    (org-agenda-filter-show-all-top-filter))
+  (org-agenda-finalize))
 
 (defun org-agenda-filter-by-tag (strip &optional char narrow)
   "Keep only those lines in the agenda buffer that have a specific tag.
@@ -7500,8 +7486,7 @@ to switch to narrowing."
       (org-agenda-filter-apply org-agenda-tag-filter 'tag)
       (setq maybe-refresh t))
      (t (error "Invalid tag selection character %c" char)))
-    (when (and maybe-refresh
-              (eq org-agenda-clockreport-mode 'with-filter))
+    (when maybe-refresh
       (org-agenda-redo))))
 
 (defun org-agenda-get-represented-tags ()
@@ -7622,13 +7607,12 @@ When NO-OPERATOR is non-nil, do not add the + operator to returned tags."
   ;; Deactivate `org-agenda-entry-text-mode' when filtering
   (if org-agenda-entry-text-mode (org-agenda-entry-text-mode))
   (let (tags cat txt)
-    (setq org-agenda-filter-form
-         (org-agenda-filter-make-matcher filter type))
-    (if (and (eq type 'category)
-            (not (equal (substring (car filter) 0 1) "-")))
-       ;; Only set `org-agenda-filtered-by-category' to t
-       ;; when a unique category is used as the filter
-       (setq org-agenda-filtered-by-category t))
+    (setq org-agenda-filter-form (org-agenda-filter-make-matcher filter type))
+    ;; Only set `org-agenda-filtered-by-category' to t when a unique
+    ;; category is used as the filter:
+    (setq org-agenda-filtered-by-category
+         (and (eq type 'category)
+              (not (equal (substring (car filter) 0 1) "-"))))
     (org-agenda-set-mode-name)
     (save-excursion
       (goto-char (point-min))
@@ -7659,7 +7643,7 @@ When NO-OPERATOR is non-nil, do not add the + operator to returned tags."
              (tophl (and pos (org-find-top-headline pos))))
         (if (and tophl (funcall (if negative 'identity 'not)
                                (string= hl tophl)))
-            (org-agenda-filter-hide-line 'category)))
+            (org-agenda-filter-hide-line 'top-headline)))
       (beginning-of-line 2)))
   (if (get-char-property (point) 'invisible)
       (org-agenda-previous-line))
@@ -7669,50 +7653,35 @@ When NO-OPERATOR is non-nil, do not add the + operator to returned tags."
 (defun org-agenda-filter-hide-line (type)
   "Hide lines with TYPE in the agenda buffer."
   (let* ((b (max (point-min) (1- (point-at-bol))))
-        (e (point-at-eol))
-        (ov (make-overlay b e)))
-    (overlay-put ov 'invisible t)
-    (overlay-put ov 'intangible t)
-    (overlay-put ov 'type type)
-    (cond ((eq type 'tag) (push ov org-agenda-tag-filter-overlays))
-         ((eq type 'category) (push ov org-agenda-cat-filter-overlays))
-         ((eq type 'regexp) (push ov org-agenda-re-filter-overlays)))))
-
-(defun org-agenda-fix-tags-filter-overlays-at (&optional pos)
-  (setq pos (or pos (point)))
+        (e (point-at-eol)))
+    (let ((inhibit-read-only t))
+      (add-text-properties
+       b e `(invisible org-filtered org-filter-type ,type)))))
+
+(defun org-agenda-remove-filter (type)
+  (interactive)
+  "Remove filter of type TYPE from the agenda buffer."
   (save-excursion
-    (dolist (ov (overlays-at pos))
-      (when (and (overlay-get ov 'invisible)
-                (eq (overlay-get ov 'type) 'tag))
+    (goto-char (point-min))
+    (let ((inhibit-read-only t) pos)
+      (while (setq pos (text-property-any (point) (point-max) 'org-filter-type type))
        (goto-char pos)
-       (if (< (overlay-start ov) (point-at-eol))
-           (move-overlay ov (point-at-eol)
-                         (overlay-end ov)))))))
+       (remove-text-properties
+        (point) (next-single-property-change (point) 'org-filter-type)
+        `(invisible org-filtered org-filter-type ,type))))
+    (set (intern (format "org-agenda-%s-filter" (intern-soft type))) nil)
+    (setq org-agenda-filter-form nil)
+    (org-agenda-set-mode-name)
+    (org-agenda-finalize)))
 
 (defun org-agenda-filter-show-all-tag nil
-  "Remove tag filter overlays from the agenda buffer."
-  (mapc 'delete-overlay org-agenda-tag-filter-overlays)
-  (setq org-agenda-tag-filter-overlays nil
-       org-agenda-tag-filter nil
-       org-agenda-filter-form nil)
-  (org-agenda-set-mode-name))
-
+  (org-agenda-remove-filter 'tag))
 (defun org-agenda-filter-show-all-re nil
-  "Remove regexp filter overlays from the agenda buffer."
-  (mapc 'delete-overlay org-agenda-re-filter-overlays)
-  (setq org-agenda-re-filter-overlays nil
-       org-agenda-regexp-filter nil
-       org-agenda-filter-form nil)
-  (org-agenda-set-mode-name))
-
+  (org-agenda-remove-filter 'regexp))
 (defun org-agenda-filter-show-all-cat nil
-  "Remove category filter overlays from the agenda buffer."
-  (mapc 'delete-overlay org-agenda-cat-filter-overlays)
-  (setq org-agenda-cat-filter-overlays nil
-       org-agenda-filtered-by-category nil
-       org-agenda-category-filter nil
-       org-agenda-filter-form nil)
-  (org-agenda-set-mode-name))
+  (org-agenda-remove-filter 'category))
+(defun org-agenda-filter-show-all-top-filter nil
+  (org-agenda-remove-filter 'top-headline))
 
 (defun org-agenda-manipulate-query-add ()
   "Manipulate the query by adding a search term with positive selection.
@@ -8106,15 +8075,12 @@ so that the date SD will be in that range."
               (format " (maximum number of lines is %d)"
                       (if (integerp arg) arg org-agenda-entry-text-maxlines))))))
 
-(defun org-agenda-clockreport-mode (&optional with-filter)
-  "Toggle clocktable mode in an agenda buffer.
-With prefix arg WITH-FILTER, make the clocktable respect the current
-agenda filter."
-  (interactive "P")
+(defun org-agenda-clockreport-mode ()
+  "Toggle clocktable mode in an agenda buffer."
+  (interactive)
   (org-agenda-check-type t 'agenda)
-  (if with-filter
-      (setq org-agenda-clockreport-mode 'with-filter)
-    (setq org-agenda-clockreport-mode (not org-agenda-clockreport-mode)))
+  (setq org-agenda-clockreport-mode (not org-agenda-clockreport-mode))
+  (setq org-agenda-start-with-clockreport-mode org-agenda-clockreport-mode)
   (org-agenda-set-mode-name)
   (org-agenda-redo)
   (message "Clocktable mode is %s"
@@ -8135,6 +8101,7 @@ With a double `C-u' prefix arg, show *only* log items, nothing else."
              nil 'clockcheck))
         (special '(closed clock state))
         (t (not org-agenda-show-log))))
+  (setq org-agenda-start-with-log-mode org-agenda-show-log)
   (org-agenda-set-mode-name)
   (org-agenda-redo)
   (message "Log mode is %s"
@@ -8252,10 +8219,7 @@ When called with a prefix argument, include all archive files as well."
                      " Archives"
                    (format " :%s:" org-archive-tag))
                "")
-             (if org-agenda-clockreport-mode
-                 (if (eq org-agenda-clockreport-mode 'with-filter)
-                     " Clock{}" " Clock")
-               "")))
+             (if org-agenda-clockreport-mode " Clock" "")))
   (force-mode-line-update))
 
 (define-obsolete-function-alias
@@ -8623,7 +8587,8 @@ if it was hidden in the outline."
   (interactive "p")
   (let ((win (selected-window)))
     (org-agenda-goto t)
-    (org-recenter-heading 1)
+    (org-back-to-heading)
+    (set-window-start (selected-window) (point-at-bol))
     (cond
      ((= more 0)
       (hide-subtree)
@@ -8662,11 +8627,6 @@ if it was hidden in the outline."
       (message "Remote: SUBTREE AND ALL DRAWERS")))
     (select-window win)))
 
-(defun org-recenter-heading (n)
-  (save-excursion
-    (org-back-to-heading)
-    (recenter n)))
-
 (defvar org-agenda-cycle-counter nil)
 (defun org-agenda-cycle-show (&optional n)
   "Show the current entry in another window, with default settings.
@@ -9177,8 +9137,6 @@ Called with a universal prefix arg, show the priority instead of setting it."
        (when (equal marker (org-get-at-bol 'org-marker))
          (remove-text-properties (point-at-bol) (point-at-eol) '(display))
          (org-move-to-column (- (window-width) (length stamp)) t)
-
-         (org-agenda-fix-tags-filter-overlays-at (point))
           (if (featurep 'xemacs)
              ;; Use `duplicable' property to trigger undo recording
               (let ((ex (make-extent nil nil))
@@ -9190,7 +9148,7 @@ Called with a universal prefix arg, show the priority instead of setting it."
             (add-text-properties
             (1- (point)) (point-at-eol)
             (list 'display (org-add-props stamp nil
-                             'face 'secondary-selection))))
+                             'face '(secondary-selection default)))))
          (beginning-of-line 1))
        (beginning-of-line 0)))))
 
@@ -9478,9 +9436,9 @@ a timestamp can be added there."
   (if org-adapt-indentation (org-indent-to-column 2)))
 
 (defun org-agenda-insert-diary-make-new-entry (text)
-  "Make new entry as last child of current entry.
-Add TEXT as headline, and position the cursor in the second line so that
-a timestamp can be added there."
+  "Make a new entry with TEXT as the first child of the current subtree.
+Position the point in the line right after the new heading so
+that a timestamp can be added there."
   (let ((org-show-following-heading t)
        (org-show-siblings t)
        (org-show-hierarchy-above t)
@@ -9669,7 +9627,7 @@ This is a command that has to be installed in `calendar-mode-map'."
          (overlay-put ov 'type 'org-marked-entry-overlay))
        (end-of-line 1)
        (or (ignore-errors
-             (goto-char (next-single-property-change (point) 'txt)))
+             (goto-char (next-single-property-change (point) 'org-hd-marker)))
            (beginning-of-line 2))
        (while (and (get-char-property (point) 'invisible) (not (eobp)))
          (beginning-of-line 2))
@@ -9687,7 +9645,7 @@ This is a command that has to be installed in `calendar-mode-map'."
   (let ((entries-marked 0) txt-at-point)
     (save-excursion
       (goto-char (point-min))
-      (goto-char (next-single-property-change (point) 'txt))
+      (goto-char (next-single-property-change (point) 'org-hd-marker))
       (while (and (re-search-forward regexp nil t)
                  (setq txt-at-point (get-text-property (point) 'txt)))
        (when (string-match regexp txt-at-point)
@@ -9723,7 +9681,7 @@ This is a command that has to be installed in `calendar-mode-map'."
   (save-excursion
     (goto-char (point-min))
     (while (ignore-errors
-            (goto-char (next-single-property-change (point) 'txt)))
+            (goto-char (next-single-property-change (point) 'org-hd-marker)))
       (org-agenda-bulk-toggle))))
 
 (defun org-agenda-bulk-toggle ()
index 07307e68f6fda2cfb1a9401f12ca19c94c768c6f..bcf7ba736fd52be0e66a2983b00365f62966b252 100644 (file)
@@ -208,7 +208,9 @@ the directory and (if necessary) the corresponding ID will be created."
            (save-excursion
              (save-restriction
                (widen)
-               (goto-char org-entry-property-inherited-from)
+               (if (marker-position org-entry-property-inherited-from)
+                   (goto-char org-entry-property-inherited-from)
+                 (org-back-to-heading t))
                (let (org-attach-allow-inheritance)
                  (org-attach-dir create-if-not-exists-p)))))
       (org-attach-check-absolute-path attach-dir)
index b9841a65b84280ad716054d6c6106c33b69799e7..cfd5b3b6a8c44c92476a6988e577cb4cd4e90d5c 100644 (file)
@@ -400,8 +400,11 @@ This is used by Org to re-create the anniversary hash table."
 (defun org-bbdb-complete-link ()
   "Read a bbdb link with name completion."
   (require 'bbdb-com)
-  (concat "bbdb:"
-         (bbdb-record-name (car (bbdb-completing-read-record "Name: ")))))
+  (let ((rec (bbdb-completing-read-record "Name: ")))
+    (concat "bbdb:"
+           (bbdb-record-name (if (listp rec)
+                                 (car rec)
+                               rec)))))
 
 (defun org-bbdb-anniv-export-ical ()
   "Extract anniversaries from BBDB and convert them to icalendar format."
index b6557108845e318e2eea1f3e85eea720aa6592f0..75ac69ba70416f8c826a39cde83a5a628c63c8f6 100644 (file)
     (:pages        . "One or more page numbers or range of numbers, such as 42-111 or 7,41,73-97 or 43+ (the â€˜+’ in this last example indicates pages following that don’t form simple range). BibTEX requires double dashes for page ranges (--).")
     (:publisher    . "The publisher’s name.")
     (:school       . "The name of the school where a thesis was written.")
-    (:series       . "The name of a series or set of books.  When citing an entire book, the the title field gives its title and an optional series field gives the name of a series or multi-volume set in which the book is published.")
+    (:series       . "The name of a series or set of books.  When citing an entire book, the title field gives its title and an optional series field gives the name of a series or multi-volume set in which the book is published.")
     (:title        . "The work’s title, typed as explained in the LaTeX book.")
     (:type         . "The type of a technical report for example, 'Research Note'.")
     (:volume       . "The volume of a journal or multi-volume book.")
index 0433306a909be13c68d078acf02906d0f260e6c2..c70868374378e25fd23b2abf0df397ef5c0df2ae 100644 (file)
@@ -1529,8 +1529,8 @@ The template may still contain \"%?\" for cursor positioning."
         (v-x (or (org-get-x-clipboard 'PRIMARY)
                  (org-get-x-clipboard 'CLIPBOARD)
                  (org-get-x-clipboard 'SECONDARY)))
-        (v-t (format-time-string (car org-time-stamp-formats) ct))
-        (v-T (format-time-string (cdr org-time-stamp-formats) ct))
+        (v-t (format-time-string (car org-time-stamp-formats) ct1))
+        (v-T (format-time-string (cdr org-time-stamp-formats) ct1))
         (v-u (concat "[" (substring v-t 1 -1) "]"))
         (v-U (concat "[" (substring v-T 1 -1) "]"))
         ;; `initial' and `annotation' might habe been passed.
@@ -1587,7 +1587,7 @@ The template may still contain \"%?\" for cursor positioning."
       (insert template)
       (goto-char (point-min))
       (org-capture-steal-local-variables buffer)
-      (setq buffer-file-name nil)
+      (setq buffer-file-name nil mark-active nil)
 
       ;; %[] Insert contents of a file.
       (goto-char (point-min))
@@ -1674,7 +1674,9 @@ The template may still contain \"%?\" for cursor positioning."
                (or (equal (char-before) ?:) (insert ":"))
                (insert ins)
                (or (equal (char-after) ?:) (insert ":"))
-               (and (org-at-heading-p) (org-set-tags nil 'align)))))
+               (and (org-at-heading-p)
+                    (let ((org-ignore-region t))
+                      (org-set-tags nil 'align))))))
           ((equal char "C")
            (cond ((= (length clipboards) 1) (insert (car clipboards)))
                  ((> (length clipboards) 1)
index f2a37484cc09c0af9223ba021e4326cf897a308c..892ae18108aef4fc688e8cd8746889c38a3088cb 100644 (file)
@@ -2556,13 +2556,10 @@ from the dynamic block definition."
     total-time))
 
 (defun org-clocktable-indent-string (level)
-  (if (= level 1)
-      ""
-    (let ((str "\\__"))
-      (while (> level 2)
-       (setq level (1- level)
-             str (concat str "___")))
-      (concat str " "))))
+  (if (= level 1) ""
+    (let ((str " "))
+      (dotimes (k (1- level) str)
+       (setq str (concat "\\emsp" str))))))
 
 (defun org-clocktable-steps (params)
   "Step through the range to make a number of clock tables."
index 70c41d53cd953033379646860f9bdb9e4a4c7548..90380a8806ca6fa1c963eeb82d36b6c53df381c1 100644 (file)
@@ -312,8 +312,7 @@ Works on both Emacs and XEmacs."
 (defun org-in-invisibility-spec-p (arg)
   "Is ARG a member of `buffer-invisibility-spec'?"
   (if (consp buffer-invisibility-spec)
-      (member arg buffer-invisibility-spec)
-    nil))
+      (member arg buffer-invisibility-spec)))
 
 (defmacro org-xemacs-without-invisibility (&rest body)
   "Turn off extents with invisibility while executing BODY."
@@ -347,18 +346,8 @@ Works on both Emacs and XEmacs."
   "Move to column COLUMN.
 Pass COLUMN and FORCE to `move-to-column'.
 Pass BUFFER to the XEmacs version of `move-to-column'."
-  (let* ((with-bracket-link
-         (save-excursion
-           (forward-line 0)
-           (looking-at (concat "^.*" org-bracket-link-regexp))))
-        (buffer-invisibility-spec
-         (cond
-          ((or (not (derived-mode-p 'org-mode))
-               (and with-bracket-link (org-invisible-p2)))
-           (remove '(org-link) buffer-invisibility-spec))
-          (with-bracket-link
-           (remove t buffer-invisibility-spec))
-          (t buffer-invisibility-spec))))
+  (let ((buffer-invisibility-spec
+        (remove '(org-filtered) buffer-invisibility-spec)))
     (if (featurep 'xemacs)
        (org-xemacs-without-invisibility
         (move-to-column column force buffer))
index b44466e53df59c23a5b700c9575594e93b90d139..eb8ff415861f239b6368e0a186a5e203da48e385 100644 (file)
@@ -360,11 +360,6 @@ still has an entry since one of its properties (`:title') does.")
     (footnote-reference . :inline-definition))
   "Alist between element types and location of secondary value.")
 
-(defconst org-element-object-variables '(org-link-abbrev-alist-local)
-  "List of buffer-local variables used when parsing objects.
-These variables are copied to the temporary buffer created by
-`org-export-secondary-string'.")
-
 
 \f
 ;;; Accessors and Setters
@@ -732,11 +727,11 @@ CONTENTS is the contents of the footnote-definition."
 
 Return a list whose CAR is `headline' and CDR is a plist
 containing `:raw-value', `:title', `:alt-title', `:begin',
-`:end', `:pre-blank', `:hiddenp', `:contents-begin' and
+`:end', `:pre-blank', `:hiddenp', `:contents-begin',
 `:contents-end', `:level', `:priority', `:tags',
 `:todo-keyword',`:todo-type', `:scheduled', `:deadline',
-`:closed', `:quotedp', `:archivedp', `:commentedp' and
-`:footnote-section-p' keywords.
+`:closed', `:quotedp', `:archivedp', `:commentedp',
+`:footnote-section-p' and `:post-blank' keywords.
 
 The plist also contains any property set in the property drawer,
 with its name in upper cases and colons added at the
@@ -875,38 +870,40 @@ CONTENTS is the contents of the element."
                                         (org-element-property :tags headline))
                                 (org-element-property :tags headline))))
                 (and tag-list
-                     (format ":%s:" (mapconcat 'identity tag-list ":")))))
+                     (format ":%s:" (mapconcat #'identity tag-list ":")))))
         (commentedp (org-element-property :commentedp headline))
         (quotedp (org-element-property :quotedp headline))
         (pre-blank (or (org-element-property :pre-blank headline) 0))
-        (heading (concat (make-string (org-reduced-level level) ?*)
-                         (and todo (concat " " todo))
-                         (and quotedp (concat " " org-quote-string))
-                         (and commentedp (concat " " org-comment-string))
-                         (and priority
-                              (format " [#%s]" (char-to-string priority)))
-                         (cond ((and org-footnote-section
-                                     (org-element-property
-                                      :footnote-section-p headline))
-                                (concat " " org-footnote-section))
-                               (title (concat " " title))))))
-    (concat heading
-           ;; Align tags.
-           (when tags
-             (cond
-              ((zerop org-tags-column) (format " %s" tags))
-              ((< org-tags-column 0)
-               (concat
-                (make-string
-                 (max (- (+ org-tags-column (length heading) (length tags))) 1)
-                 ? )
-                tags))
-              (t
-               (concat
-                (make-string (max (- org-tags-column (length heading)) 1) ? )
-                tags))))
-           (make-string (1+ pre-blank) 10)
-           contents)))
+        (heading
+         (concat (make-string (if org-odd-levels-only (1- (* level 2)) level)
+                              ?*)
+                 (and todo (concat " " todo))
+                 (and quotedp (concat " " org-quote-string))
+                 (and commentedp (concat " " org-comment-string))
+                 (and priority (format " [#%s]" (char-to-string priority)))
+                 " "
+                 (if (and org-footnote-section
+                          (org-element-property :footnote-section-p headline))
+                     org-footnote-section
+                   title))))
+    (concat
+     heading
+     ;; Align tags.
+     (when tags
+       (cond
+       ((zerop org-tags-column) (format " %s" tags))
+       ((< org-tags-column 0)
+        (concat
+         (make-string
+          (max (- (+ org-tags-column (length heading) (length tags))) 1)
+          ?\s)
+         tags))
+       (t
+        (concat
+         (make-string (max (- org-tags-column (length heading)) 1) ?\s)
+         tags))))
+     (make-string (1+ pre-blank) ?\n)
+     contents)))
 
 
 ;;;; Inlinetask
@@ -1315,36 +1312,36 @@ containing `:begin', `:end', `:hiddenp', `:contents-begin',
 `:contents-end', `:post-blank' and `:post-affiliated' keywords.
 
 Assume point is at the beginning of the property drawer."
-  (save-excursion
-    (let ((case-fold-search t))
-      (if (not (save-excursion
-                (re-search-forward "^[ \t]*:END:[ \t]*$" limit t)))
-         ;; Incomplete drawer: parse it as a paragraph.
-         (org-element-paragraph-parser limit affiliated)
-       (save-excursion
-         (let* ((drawer-end-line (match-beginning 0))
-                (begin (car affiliated))
-                (post-affiliated (point))
-                (contents-begin (progn (forward-line)
-                                       (and (< (point) drawer-end-line)
-                                            (point))))
-                (contents-end (and contents-begin drawer-end-line))
-                (hidden (org-invisible-p2))
-                (pos-before-blank (progn (goto-char drawer-end-line)
-                                         (forward-line)
-                                         (point)))
-                (end (progn (skip-chars-forward " \r\t\n" limit)
-                            (if (eobp) (point) (line-beginning-position)))))
-           (list 'property-drawer
-                 (nconc
-                  (list :begin begin
-                        :end end
-                        :hiddenp hidden
-                        :contents-begin contents-begin
-                        :contents-end contents-end
-                        :post-blank (count-lines pos-before-blank end)
-                        :post-affiliated post-affiliated)
-                  (cdr affiliated)))))))))
+  (let ((case-fold-search t))
+    (if (not (save-excursion (re-search-forward "^[ \t]*:END:[ \t]*$" limit t)))
+       ;; Incomplete drawer: parse it as a paragraph.
+       (org-element-paragraph-parser limit affiliated)
+      (save-excursion
+       (let* ((drawer-end-line (match-beginning 0))
+              (begin (car affiliated))
+              (post-affiliated (point))
+              (contents-begin
+               (progn
+                 (forward-line)
+                 (and (re-search-forward org-property-re drawer-end-line t)
+                      (line-beginning-position))))
+              (contents-end (and contents-begin drawer-end-line))
+              (hidden (org-invisible-p2))
+              (pos-before-blank (progn (goto-char drawer-end-line)
+                                       (forward-line)
+                                       (point)))
+              (end (progn (skip-chars-forward " \r\t\n" limit)
+                          (if (eobp) (point) (line-beginning-position)))))
+         (list 'property-drawer
+               (nconc
+                (list :begin begin
+                      :end end
+                      :hiddenp hidden
+                      :contents-begin contents-begin
+                      :contents-end contents-end
+                      :post-blank (count-lines pos-before-blank end)
+                      :post-affiliated post-affiliated)
+                (cdr affiliated))))))))
 
 (defun org-element-property-drawer-interpreter (property-drawer contents)
   "Interpret PROPERTY-DRAWER element as Org syntax.
@@ -2099,28 +2096,28 @@ LIMIT bounds the search.
 Return a list whose CAR is `node-property' and CDR is a plist
 containing `:key', `:value', `:begin', `:end' and `:post-blank'
 keywords."
-  (save-excursion
-    (looking-at org-property-re)
-    (let ((case-fold-search t)
-         (begin (point))
-         (key   (org-match-string-no-properties 2))
-         (value (org-match-string-no-properties 3))
-         (pos-before-blank (progn (forward-line) (point)))
-         (end (progn (skip-chars-forward " \r\t\n" limit)
-                     (if (eobp) (point) (point-at-bol)))))
-      (list 'node-property
-           (list :key key
-                 :value value
-                 :begin begin
-                 :end end
-                 :post-blank (count-lines pos-before-blank end))))))
+  (looking-at org-property-re)
+  (let ((begin (point))
+       (key   (org-match-string-no-properties 2))
+       (value (org-match-string-no-properties 3))
+       (end (save-excursion
+              (end-of-line)
+              (if (re-search-forward org-property-re limit t)
+                  (line-beginning-position)
+                limit))))
+    (list 'node-property
+         (list :key key
+               :value value
+               :begin begin
+               :end end
+               :post-blank 0))))
 
 (defun org-element-node-property-interpreter (node-property contents)
   "Interpret NODE-PROPERTY element as Org syntax.
 CONTENTS is nil."
   (format org-property-format
          (format ":%s:" (org-element-property :key node-property))
-         (org-element-property :value node-property)))
+         (or (org-element-property :value node-property) "")))
 
 
 ;;;; Paragraph
@@ -2486,7 +2483,7 @@ Assume point is at the beginning of the table."
 
 (defun org-element-table-interpreter (table contents)
   "Interpret TABLE element as Org syntax.
-CONTENTS is nil."
+CONTENTS is a string, if table's type is `org', or nil."
   (if (eq (org-element-property :type table) 'table.el)
       (org-remove-indentation (org-element-property :value table))
     (concat (with-temp-buffer (insert contents)
@@ -3112,16 +3109,20 @@ Assume point is at the beginning of the link."
        (cond
         ;; File type.
         ((or (file-name-absolute-p raw-link)
-             (string-match "^\\.\\.?/" raw-link))
+             (string-match "\\`\\.\\.?/" raw-link))
          (setq type "file" path raw-link))
         ;; Explicit type (http, irc, bbdb...).  See `org-link-types'.
-        ((string-match org-link-re-with-space3 raw-link)
-         (setq type (match-string 1 raw-link) path (match-string 2 raw-link)))
+        ((string-match org-link-types-re raw-link)
+         (setq type (match-string 1 raw-link)
+               ;; According to RFC 3986, extra whitespace should be
+               ;; ignored when a URI is extracted.
+               path (replace-regexp-in-string
+                     "[ \t]*\n[ \t]*" "" (substring raw-link (match-end 0)))))
         ;; Id type: PATH is the id.
-        ((string-match "^id:\\([-a-f0-9]+\\)" raw-link)
+        ((string-match "\\`id:\\([-a-f0-9]+\\)" raw-link)
          (setq type "id" path (match-string 1 raw-link)))
         ;; Code-ref type: PATH is the name of the reference.
-        ((string-match "^(\\(.*\\))$" raw-link)
+        ((string-match "\\`(\\(.*\\))\\'" raw-link)
          (setq type "coderef" path (match-string 1 raw-link)))
         ;; Custom-id type: PATH is the name of the custom id.
         ((= (aref raw-link 0) ?#)
@@ -3541,7 +3542,7 @@ Return a list whose CAR is `timestamp', and CDR a plist with
 `:month-end', `:day-end', `:hour-end', `:minute-end',
 `:repeater-type', `:repeater-value', `:repeater-unit',
 `:warning-type', `:warning-value', `:warning-unit', `:begin',
-`:end', `:value' and `:post-blank' keywords.
+`:end' and `:post-blank' keywords.
 
 Assume point is at the beginning of the timestamp."
   (save-excursion
@@ -3890,8 +3891,7 @@ element it has to parse."
              (goto-char (car affiliated))
              (org-element-keyword-parser limit nil))
             ;; LaTeX Environment.
-            ((looking-at
-              "[ \t]*\\\\begin{[A-Za-z0-9*]+}\\(\\[.*?\\]\\|{.*?}\\)*[ \t]*$")
+            ((looking-at "[ \t]*\\\\begin{\\([A-Za-z0-9]+\\*?\\)}\\(\\[.*?\\]\\|{.*?}\\)*[ \t]*$")
              (org-element-latex-environment-parser limit affiliated))
             ;; Drawer and Property Drawer.
             ((looking-at org-drawer-regexp)
@@ -4090,21 +4090,18 @@ looked after.
 Optional argument PARENT, when non-nil, is the element or object
 containing the secondary string.  It is used to set correctly
 `:parent' property within the string."
-  ;; Copy buffer-local variables listed in
-  ;; `org-element-object-variables' into temporary buffer.  This is
-  ;; required since object parsing is dependent on these variables.
-  (let ((pairs (delq nil (mapcar (lambda (var)
-                                  (when (boundp var)
-                                    (cons var (symbol-value var))))
-                                org-element-object-variables))))
+  (let ((local-variables (buffer-local-variables)))
     (with-temp-buffer
-      (mapc (lambda (pair) (org-set-local (car pair) (cdr pair))) pairs)
+      (dolist (v local-variables)
+       (ignore-errors
+         (if (symbolp v) (makunbound v)
+           (org-set-local (car v) (cdr v)))))
       (insert string)
+      (restore-buffer-modified-p nil)
       (let ((secondary (org-element--parse-objects
                        (point-min) (point-max) nil restriction)))
        (when parent
-         (mapc (lambda (obj) (org-element-put-property obj :parent parent))
-               secondary))
+         (dolist (o secondary) (org-element-put-property o :parent parent)))
        secondary))))
 
 (defun org-element-map
@@ -4617,29 +4614,29 @@ indentation is not done with TAB characters."
   (let* ((min-ind most-positive-fixnum)
         find-min-ind                   ; For byte-compiler.
         (find-min-ind
-         (function
-          ;; Return minimal common indentation within BLOB.  This is
-          ;; done by walking recursively BLOB and updating MIN-IND
-          ;; along the way.  FIRST-FLAG is non-nil when the first
-          ;; string hasn't been seen yet.  It is required as this
-          ;; string is the only one whose indentation doesn't happen
-          ;; after a newline character.
-          (lambda (blob first-flag)
-            (dolist (object (org-element-contents blob))
-              (when (and first-flag (stringp object))
-                (setq first-flag nil)
-                (string-match "\\`\\( *\\)" object)
-                (let ((len (length (match-string 1 object))))
-                  ;; An indentation of zero means no string will be
-                  ;; modified.  Quit the process.
-                  (if (zerop len) (throw 'zero (setq min-ind 0))
-                    (setq min-ind (min len min-ind)))))
-              (cond
-               ((stringp object)
-                (dolist (line (delq "" (cdr (org-split-string object " *\n"))))
-                  (setq min-ind (min (org-get-indentation line) min-ind))))
-               ((memq (org-element-type object) org-element-recursive-objects)
-                (funcall find-min-ind object first-flag))))))))
+         ;; Return minimal common indentation within BLOB.  This is
+         ;; done by walking recursively BLOB and updating MIN-IND
+         ;; along the way.  FIRST-FLAG is non-nil when the first
+         ;; string hasn't been seen yet.  It is required as this
+         ;; string is the only one whose indentation doesn't happen
+         ;; after a newline character.
+         (lambda (blob first-flag)
+           (dolist (object (org-element-contents blob))
+             (when (and first-flag (stringp object))
+               (setq first-flag nil)
+               (string-match "\\` *" object)
+               (let ((len (match-end 0)))
+                 ;; An indentation of zero means no string will be
+                 ;; modified.  Quit the process.
+                 (if (zerop len) (throw 'zero (setq min-ind 0))
+                   (setq min-ind (min len min-ind)))))
+             (cond
+              ((stringp object)
+               (dolist (line (cdr (org-split-string object " *\n")))
+                 (unless (string= line "")
+                   (setq min-ind (min (org-get-indentation line) min-ind)))))
+              ((memq (org-element-type object) org-element-recursive-objects)
+               (funcall find-min-ind object first-flag)))))))
     ;; Find minimal indentation in ELEMENT.
     (catch 'zero (funcall find-min-ind element (not ignore-first)))
     (if (or (zerop min-ind) (= min-ind most-positive-fixnum)) element
index ba1eed12bdbeed93e88ba72fb7607ab8b1e822f8..6324a625dbd907e496ef13b5c871399308917b3a 100644 (file)
@@ -27,9 +27,8 @@
 
 ;;; Code:
 
-(require 'org-macs)
-
-(declare-function org-table-align "org-table" ())
+(declare-function org-toggle-pretty-entities "org"       ())
+(declare-function org-table-align            "org-table" ())
 
 (eval-when-compile
   (require 'cl))
@@ -568,6 +567,7 @@ Kind can be any of `latex', `html', `ascii', `latin1', or `utf8'."
     (goto-char pos)
     (org-table-align)))
 
+(defvar org-pretty-entities) ;; declare defcustom from org
 (defun org-entities-help ()
   "Create a Help buffer with all available entities."
   (interactive)
index 721718d2b6cfa99b60e85d8aba9b1d940072f179..60137568c00692e2353263f9d036f03b08f0b44f 100644 (file)
@@ -351,14 +351,7 @@ current time."
   (let ((inhibit-read-only t) l c
        (buffer-invisibility-spec '(org-link))
        (moment (time-subtract (current-time)
-                              (list 0 (* 3600 org-extend-today-until) 0)))
-       disabled-overlays)
-    ;; Disable filters; this helps with alignment if there are links.
-    (mapc (lambda (ol)
-           (when (overlay-get ol 'invisible)
-             (overlay-put ol 'invisible nil)
-             (setq disabled-overlays (cons ol disabled-overlays))))
-         (overlays-in (point-min) (point-max)))
+                              (list 0 (* 3600 org-extend-today-until) 0))))
     (save-excursion
       (goto-char (if line (point-at-bol) (point-min)))
       (while (not (eobp))
@@ -374,9 +367,7 @@ current time."
              (time-subtract moment (days-to-time org-habit-preceding-days))
              moment
              (time-add moment (days-to-time org-habit-following-days))))))
-       (forward-line)))
-    (mapc (lambda (ol) (overlay-put ol 'invisible t))
-         disabled-overlays)))
+       (forward-line)))))
 
 (defun org-habit-toggle-habits ()
   "Toggle display of habits in an agenda buffer."
index d24dad28363de28ceadac9b06c426b7eefb94d05..a00e557371c07e25f1bb8bf5ee10cb2864d0e319 100644 (file)
@@ -1254,7 +1254,7 @@ some heuristics to guess the result."
 If POS is before first character after bullet of the item, the
 new item will be created before the current one.
 
-STRUCT is the list structure.  PREVS is the the alist of previous
+STRUCT is the list structure.  PREVS is the alist of previous
 items, as returned by `org-list-prevs-alist'.
 
 Insert a checkbox if CHECKBOX is non-nil, and string AFTER-BULLET
@@ -2237,7 +2237,7 @@ item is invisible."
          t)))))
 
 (defun org-list-repair ()
-  "Fix indentation, bullets and checkboxes is the list at point."
+  "Fix indentation, bullets and checkboxes in the list at point."
   (interactive)
   (unless (org-at-item-p) (error "This is not a list"))
   (let* ((struct (org-list-struct))
index ddd6e2e90f544d801a2f03b848692ba728b831c1..96265ec02fee5509f929ecb83bfdb487004f093c 100644 (file)
@@ -154,9 +154,9 @@ We use a macro so that the test can happen at compilation time."
     `(let ((,mpom ,pom))
        (save-excursion
         (if (markerp ,mpom) (set-buffer (marker-buffer ,mpom)))
-        (save-excursion
-          (goto-char (or ,mpom (point)))
-          ,@body)))))
+        (org-with-wide-buffer
+         (goto-char (or ,mpom (point)))
+         ,@body)))))
 (def-edebug-spec org-with-point-at (form body))
 (put 'org-with-point-at 'lisp-indent-function 1)
 
index f59d1c4791194531a993f067bd4d36bcb61bcece..41a995867423f2236061a00ae5c140880f277693 100644 (file)
@@ -1074,7 +1074,7 @@ be returned that indicates what went wrong."
            ;; which prevents correct insertion when point is invisible
            (org-show-subtree)
            (end-of-line 1)
-           (org-insert-heading-respect-content '(16) t)
+           (org-insert-heading-respect-content t)
            (org-demote))
        (beginning-of-line)
        (insert "* "))
index 27dc0e070fc1de5da59165fa11db4d2e134f76dc..74046c73fe316d43bab628427a1686cc1e66395f 100644 (file)
@@ -953,20 +953,23 @@ This means, between the beginning of line and the point."
                       (point)
                       (save-excursion (goto-char start)
                                       (org-back-to-heading) (point))))
-           (outline-end-of-subtree)
+           (progn (org-end-of-subtree nil t)
+                  (unless (eobp) (backward-char)))
            (end-of-line)
            (if (eobp) (newline) (forward-char)))
 
          (when (looking-at org-outline-regexp)
            (let ((level (- (match-end 0) (match-beginning 0))))
              (when (> end (match-end 0))
-               (outline-end-of-subtree)
+               (progn (org-end-of-subtree nil t)
+                      (unless (eobp) (backward-char)))
                (end-of-line)
                (if (eobp) (newline) (forward-char))
                (setq level (1+ level)))
              (org-paste-subtree level)
              (save-excursion
-               (outline-end-of-subtree)
+               (progn (org-end-of-subtree nil t)
+                      (unless (eobp) (backward-char)))
                (when (bolp) (delete-char -1))))))))))
 
 
@@ -1003,8 +1006,8 @@ This means, between the beginning of line and the point."
           (org-mouse-main-buffer (current-buffer)))
       (when (eq (with-current-buffer buffer major-mode) 'org-mode)
        (let ((endmarker (with-current-buffer buffer
-                          (outline-end-of-subtree)
-                          (forward-char 1)
+                          (org-end-of-subtree nil t)
+                          (unless (eobp) (forward-char 1))
                           (copy-marker (point)))))
          (org-with-remote-undo buffer
            (with-current-buffer buffer
index f870b2c714d1217ba043bd777192b2ba4a81fd97..752fa30bd1223f97f9a8314768423e0404c52f5e 100644 (file)
@@ -376,23 +376,21 @@ the display of windows containing the Org buffer and the code buffer."
          (when (fboundp edit-prep-func)
            (funcall edit-prep-func full-info)))
        (or org-edit-src-code-timer
+           (zerop org-edit-src-auto-save-idle-delay)
            (setq org-edit-src-code-timer
-                 (unless (zerop org-edit-src-auto-save-idle-delay)
-                   (run-with-idle-timer
-                    org-edit-src-auto-save-idle-delay t
-                    (lambda ()
-                      (cond
-                       ((and (string-match "\*Org Src" (buffer-name))
-                             (buffer-modified-p))
-                        (org-edit-src-save))
-                       ((not
-                         (delq nil (mapcar
-                                    (lambda (b)
-                                      (string-match "\*Org Src" (buffer-name b)))
-                                    (buffer-list))))
-                        (cancel-timer org-edit-src-code-timer)
-                        (setq org-edit-src-code-timer)))))))))
-       t)))
+                 (run-with-idle-timer
+                  org-edit-src-auto-save-idle-delay t
+                  (lambda ()
+                    (cond
+                     ((org-string-match-p "\\`\\*Org Src" (buffer-name))
+                      (when (buffer-modified-p) (org-edit-src-save)))
+                     ((not (org-some (lambda (b)
+                                       (org-string-match-p "\\`\\*Org Src"
+                                                           (buffer-name b)))
+                                     (buffer-list)))
+                      (cancel-timer org-edit-src-code-timer)
+                      (setq org-edit-src-code-timer nil))))))))
+      t)))
 
 (defun org-edit-src-continue (e)
   "Continue editing source blocks." ;; Fixme: be more accurate
@@ -757,8 +755,8 @@ with \",*\", \",#+\", \",,*\" and \",,#+\"."
       (delete-region beg (max beg end))
       (unless (string-match "\\`[ \t]*\\'" code)
        (insert code))
-       ;; Make sure the overlay stays in place
-       (when (eq context 'save) (move-overlay ovl beg (point)))
+      ;; Make sure the overlay stays in place
+      (when (eq context 'save) (move-overlay ovl beg (point)))
       (goto-char beg)
       (if single (just-one-space)))
     (if (memq t (mapcar (lambda (overlay)
@@ -774,9 +772,6 @@ with \",*\", \",#+\", \",,*\" and \",,#+\"."
     (unless (eq context 'save)
       (move-marker beg nil)
       (move-marker end nil)))
-  (when org-edit-src-code-timer
-    (cancel-timer org-edit-src-code-timer)
-    (setq org-edit-src-code-timer nil))
   (unless (eq context 'save)
     (when org-edit-src-saved-temp-window-config
       (set-window-configuration org-edit-src-saved-temp-window-config)
index c9522341106540ff29bb066469b0eabe8673e96d..30a66c9c2340a10536a00dd6f8282848275e6ca2 100644 (file)
@@ -2712,7 +2712,8 @@ not overwrite the stored one."
          (or (fboundp 'calc-eval)
              (user-error "Calc does not seem to be installed, and is needed to evaluate the formula"))
          ;; Use <...> time-stamps so that Calc can handle them
-         (setq form (replace-regexp-in-string org-ts-regexp3 "<\\1>" form))
+         (while (string-match (concat "\\[" org-ts-regexp1 "\\]") form)
+           (setq form (replace-match "<\\1>" nil nil form)))
          ;; I18n-ize local time-stamps by setting (system-time-locale "C")
          (when (string-match org-ts-regexp2 form)
            (let* ((ts (match-string 0 form))
@@ -3862,9 +3863,10 @@ With prefix ARG, apply the new formulas to the table."
        (push org-table-current-begin-pos org-show-positions)
        (let ((min (apply 'min org-show-positions))
              (max (apply 'max org-show-positions)))
-         (goto-char min) (recenter 0)
+         (set-window-start (selected-window) min)
          (goto-char max)
-         (or (pos-visible-in-window-p max) (recenter -1))))
+         (or (pos-visible-in-window-p max)
+             (set-window-start (selected-window) max))))
       (select-window win))))
 
 (defun org-table-force-dataline ()
index 1a86ffa7488d7ad90ff5ac1fef09c02a7f654340..8161699f316105a701aa53a3106af0dcd32fbb3c 100644 (file)
@@ -186,7 +186,10 @@ it in the buffer."
     (insert (org-timer-value-string))))
 
 (defun org-timer-value-string ()
-  (format org-timer-format (org-timer-secs-to-hms (floor (org-timer-seconds)))))
+  "Set the timer string."
+  (format org-timer-format
+         (org-timer-secs-to-hms
+          (abs (floor (org-timer-seconds))))))
 
 (defvar org-timer-timer-is-countdown nil)
 (defun org-timer-seconds ()
index 4909d45530a973d0e7c8288b56114aafb6e11f2a..b96025785c2af3d3f642e3a6edf68f2cbeeedb73 100644 (file)
@@ -5,13 +5,13 @@
 (defun org-release ()
   "The release version of org-mode.
   Inserted by installing org-mode or when a release is made."
-   (let ((org-release "8.2.6"))
+   (let ((org-release "8.2.8"))
      org-release))
 ;;;###autoload
 (defun org-git-version ()
   "The Git version of org-mode.
   Inserted by installing org-mode or when a release is made."
-   (let ((org-git-version "release_8.2.6-1"))
+   (let ((org-git-version "release_8.2.8"))
      org-git-version))
 \f
 (provide 'org-version)
index 2a451ed5456975959c714718d51bea96cb0086c5..c42102cac3735c628f8d1c33e760828be6826798 100644 (file)
@@ -111,6 +111,8 @@ Stars are put in group 1 and the trimmed body in group 2.")
 (unless (boundp 'diary-fancy-buffer)
   (org-defvaralias 'diary-fancy-buffer 'fancy-diary-buffer))
 
+(declare-function org-add-archive-files "org-archive" (files))
+
 (declare-function org-inlinetask-at-task-p "org-inlinetask" ())
 (declare-function org-inlinetask-outline-regexp "org-inlinetask" ())
 (declare-function org-inlinetask-toggle-visibility "org-inlinetask" ())
@@ -118,7 +120,10 @@ Stars are put in group 1 and the trimmed body in group 2.")
 (declare-function org-clock-get-last-clock-out-time "org-clock" ())
 (declare-function org-clock-timestamps-up "org-clock" (&optional n))
 (declare-function org-clock-timestamps-down "org-clock" (&optional n))
+(declare-function org-clock-remove-overlays "org-clock" (&optional beg end noremove))
 (declare-function org-clock-sum-current-item "org-clock" (&optional tstart))
+(declare-function org-clock-update-time-maybe "org-clock" ())
+(declare-function org-clocktable-shift "org-clock" (dir n))
 
 (declare-function orgtbl-mode "org-table" (&optional arg))
 (declare-function org-clock-out "org-clock" (&optional switch-to-state fail-quietly at-time))
@@ -133,6 +138,10 @@ Stars are put in group 1 and the trimmed body in group 2.")
 (declare-function org-agenda-list "org-agenda" (&optional arg start-day span))
 (declare-function org-agenda-redo "org-agenda" (&optional all))
 (declare-function org-table-align "org-table" ())
+(declare-function org-table-begin "org-table" (&optional table-type))
+(declare-function org-table-blank-field "org-table" ())
+(declare-function org-table-end "org-table" (&optional table-type))
+(declare-function org-table-insert-row "org-table" (&optional arg))
 (declare-function org-table-paste-rectangle "org-table" ())
 (declare-function org-table-maybe-eval-formula "org-table" ())
 (declare-function org-table-maybe-recalculate-line "org-table" ())
@@ -179,6 +188,7 @@ Stars are put in group 1 and the trimmed body in group 2.")
                         (intern (concat "org-babel-expand-body:" lang)))))))
        org-babel-load-languages))
 
+(declare-function org-babel-tangle-file "ob-tangle" (file &optional target-file lang))
 ;;;###autoload
 (defun org-babel-load-file (file &optional compile)
   "Load Emacs Lisp source code blocks in the Org-mode FILE.
@@ -5109,9 +5119,9 @@ Support for group tags is controlled by the option
                    "\\(?: +\\(\\[#.\\]\\)\\)?"
                    "\\(?: +"
                    ;; Stats cookies can be stuck to body.
-                   "\\(?:\\[[0-9%%/]+\\] *\\)?"
+                   "\\(?:\\[[0-9%%/]+\\] *\\)*"
                    "\\(%s\\)"
-                   "\\(?: *\\[[0-9%%/]+\\]\\)?"
+                   "\\(?: *\\[[0-9%%/]+\\]\\)*"
                    "\\)"
                    (org-re "\\(?:[ \t]+\\(:[[:alnum:]_@#%%:]+:\\)\\)?")
                    "[ \t]*$")
@@ -5417,8 +5427,7 @@ The following commands are available:
       (org-add-hook 'isearch-mode-end-hook 'org-isearch-end 'append 'local)
     ;; Emacs 22 deals with this through a special variable
     (org-set-local 'outline-isearch-open-invisible-function
-                  (lambda (&rest ignore) (org-show-context 'isearch)))
-    (org-add-hook 'isearch-mode-end-hook 'org-fix-ellipsis-at-bol 'append 'local))
+                  (lambda (&rest ignore) (org-show-context 'isearch))))
 
   ;; Setup the pcomplete hooks
   (set (make-local-variable 'pcomplete-command-completion-function)
@@ -5473,9 +5482,6 @@ The following commands are available:
 
 (put 'org-mode 'flyspell-mode-predicate 'org-mode-flyspell-verify)
 
-(defsubst org-fix-ellipsis-at-bol ()
-  (save-excursion (goto-char (window-start)) (recenter 0)))
-
 (defun org-find-invisible-foreground ()
   (let ((candidates (remove
                     "unspecified-bg"
@@ -5881,7 +5887,7 @@ by a #."
           ((member dc1 '("+title:" "+author:" "+email:" "+date:"))
            (add-text-properties
             beg (match-end 3)
-            (if (member (intern (substring dc1 0 -1)) org-hidden-keywords)
+            (if (member (intern (substring dc1 1 -1)) org-hidden-keywords)
                 '(font-lock-fontified t invisible t)
               '(font-lock-fontified t face org-document-info-keyword)))
            (add-text-properties
@@ -6145,15 +6151,25 @@ Use `org-reduced-level' to remove the effect of `org-odd-levels'."
 
 (defvar org-font-lock-keywords nil)
 
-(defsubst org-re-property (property &optional literal)
+(defsubst org-re-property (property &optional literal allow-null)
   "Return a regexp matching a PROPERTY line.
-Match group 3 will be set to the value if it exists."
-  (concat "^\\(?4:[ \t]*\\)\\(?1::\\(?2:"
-         (if literal property (regexp-quote property))
-         "\\):\\)[ \t]+\\(?3:[^ \t\r\n].*?\\)\\(?5:[ \t]*\\)$"))
+
+When optional argument LITERAL is non-nil, do not quote PROPERTY.
+This is useful when PROPERTY is a regexp.  When ALLOW-NULL is
+non-nil, match properties even without a value.
+
+Match group 3 is set to the value when it exists.  If there is no
+value and ALLOW-NULL is non-nil, it is set to the empty string."
+  (concat
+   "^\\(?4:[ \t]*\\)"
+   (format "\\(?1::\\(?2:%s\\):\\)"
+          (if literal property (regexp-quote property)))
+   (if allow-null
+       "\\(?:\\(?3:$\\)\\|[ \t]+\\(?3:.*?\\)\\)\\(?5:[ \t]*\\)$"
+     "[ \t]+\\(?3:[^ \r\t\n]+.*?\\)\\(?5:[ \t]*\\)$")))
 
 (defconst org-property-re
-  (org-re-property ".*?" 'literal)
+  (org-re-property ".*?" 'literal t)
   "Regular expression matching a property line.
 There are four matching groups:
 1: :PROPKEY: including the leading and trailing colon,
@@ -6712,7 +6728,8 @@ in special contexts.
       (setq org-cycle-global-status 'overview)
       (run-hook-with-args 'org-cycle-hook 'overview)))))
 
-(defvar org-called-with-limited-levels);Dyn-bound in Ì€org-with-limited-levels'.
+(defvar org-called-with-limited-levels nil
+  "Non-nil when `org-with-limited-levels' is currently active.")
 
 (defun org-cycle-internal-local ()
   "Do the local cycling action."
@@ -6729,7 +6746,8 @@ in special contexts.
            (setq has-children (org-list-has-child-p (point) struct)))
        (org-back-to-heading)
        (setq eoh (save-excursion (outline-end-of-heading) (point)))
-       (setq eos (save-excursion (1- (org-end-of-subtree t t))))
+       (setq eos (save-excursion (org-end-of-subtree t t)
+                                 (when (bolp) (backward-char)) (point)))
        (setq has-children
              (or (save-excursion
                    (let ((level (funcall outline-level)))
@@ -6894,21 +6912,20 @@ With a numeric prefix, show all headlines up to that level."
 ;; buffers, where outline-regexp is needed.
 (defun org-overview ()
   "Switch to overview mode, showing only top-level headlines.
-Really, this shows all headlines with level equal or greater than the level
+This shows all headlines with a level equal or greater than the level
 of the first headline in the buffer.  This is important, because if the
 first headline is not level one, then (hide-sublevels 1) gives confusing
 results."
   (interactive)
-  (let ((pos (point))
-       (level (save-excursion
-                (goto-char (point-min))
-                (if (re-search-forward (concat "^" outline-regexp) nil t)
-                    (progn
-                      (goto-char (match-beginning 0))
-                      (funcall outline-level))))))
-    (and level (hide-sublevels level))
-    (recenter '(4))
-    (goto-char pos)))
+  (save-excursion
+    (let ((level
+          (save-excursion
+            (goto-char (point-min))
+            (if (re-search-forward (concat "^" outline-regexp) nil t)
+                (progn
+                  (goto-char (match-beginning 0))
+                  (funcall outline-level))))))
+      (and level (hide-sublevels level)))))
 
 (defun org-content (&optional arg)
   "Show all headlines in the buffer, like a table of contents.
@@ -7105,13 +7122,11 @@ Otherwise make it visible."
   (pos-visible-in-window-p
    (save-excursion (org-end-of-subtree t) (point))))
 
-(defun org-first-headline-recenter (&optional N)
-  "Move cursor to the first headline and recenter the headline.
-Optional argument N means put the headline into the Nth line of the window."
+(defun org-first-headline-recenter ()
+  "Move cursor to the first headline and recenter the headline."
   (goto-char (point-min))
   (when (re-search-forward (concat "^\\(" org-outline-regexp "\\)") nil t)
-    (beginning-of-line)
-    (recenter (prefix-numeric-value N))))
+    (set-window-start (selected-window) (point-at-bol))))
 
 ;;; Saving and restoring visibility
 
@@ -7545,23 +7560,22 @@ When NEXT is non-nil, check the next line instead."
           (looking-at "[ \t]*$")))))
 
 (defun org-insert-heading (&optional arg invisible-ok)
-  "Insert a new heading or item with same depth at point.
+  "Insert a new heading or an item with the same depth at point.
 
 If point is at the beginning of a heading or a list item, insert
-a heading or a list item before it.
-
-If point is at the beginning of a normal line, turn this line
-into a heading.
+a new heading or a new item above the current one.  If point is
+at the beginning of a normal line, turn the line into a heading.
 
 If point is in the middle of a headline or a list item, split the
 headline or the item and create a new headline/item with the text
 in the current line after point \(see `org-M-RET-may-split-line'
 on how to modify this behavior).
 
-With one universal prefix argument: If point is within a list,
-insert a heading instead of a list item.  Otherwise, set the
-value of `org-insert-heading-respect-content' to `t' for the
-duration of the command.
+With one universal prefirx argument, set the user option
+`org-insert-heading-respect-content' to t for the duration of
+the command.  This modifies the behavior described above in this
+ways: on list items and at the beginning of normal lines, force
+the insertion of a heading after the current subtree.
 
 With two universal prefix arguments, insert the heading at the
 end of the grandparent subtree.  For example, if point is within
@@ -7589,12 +7603,19 @@ command."
               (or arg (not itemp))))
       ;; At beginning of buffer or so high up that only a heading
       ;; makes sense.
-      (insert
-       (if (or (bobp) (org-previous-line-empty-p)) "" "\n")
-       (if (org-in-src-block-p) ",* " "* "))
+      (cond ((and (bolp) (not respect-content)) (insert "* "))
+           ((not respect-content)
+            (unless may-split (end-of-line))
+            (insert "\n* "))
+           ((re-search-forward org-outline-regexp-bol nil t)
+            (beginning-of-line)
+            (insert "* \n")
+            (backward-char))
+           (t (goto-char (point-max))
+              (insert "\n* ")))
       (run-hooks 'org-insert-heading-hook))
 
-     ((and itemp (not (equal arg '(4))))
+     ((and itemp (not (member arg '((4) (16)))))
       ;; Insert an item
       (org-insert-item))
 
@@ -7614,11 +7635,12 @@ command."
                               nil))
               ;; Get a level string to fall back on
               (fix-level
-               (save-excursion
-                 (org-back-to-heading t)
-                 (if (org-previous-line-empty-p) (setq empty-line-p t))
-                 (looking-at org-outline-regexp)
-                 (make-string (1- (length (match-string 0))) ?*)))
+               (if (org-before-first-heading-p) "*"
+                 (save-excursion
+                   (org-back-to-heading t)
+                   (if (org-previous-line-empty-p) (setq empty-line-p t))
+                   (looking-at org-outline-regexp)
+                   (make-string (1- (length (match-string 0))) ?*))))
               (stars
                (save-excursion
                  (condition-case nil
@@ -7650,8 +7672,12 @@ command."
               pos hide-previous previous-pos)
 
          ;; If we insert after content, move there and clean up whitespace
-         (when (and respect-content (not (org-on-heading-p)))
-           (org-end-of-subtree nil t)
+         (when (and respect-content
+                    (not (org-looking-at-p org-outline-regexp-bol)))
+           (if (not (org-before-first-heading-p))
+               (org-end-of-subtree nil t)
+             (re-search-forward org-outline-regexp-bol)
+             (beginning-of-line 0))
            (skip-chars-backward " \r\n")
            (and (not (looking-back "^\*+"))
                 (looking-at "[ \t]+") (replace-match ""))
@@ -7680,10 +7706,9 @@ command."
                    (setq initial-content (org-trim initial-content)))
                  (goto-char pos))
              ;; a normal line
-             (unless (bolp)
-               (setq initial-content (buffer-substring (point) (point-at-eol)))
-               (delete-region (point) (point-at-eol))
-               (setq initial-content (org-trim initial-content)))))
+             (setq initial-content
+                   (org-trim (buffer-substring (point) (point-at-eol))))
+             (delete-region (point) (point-at-eol))))
 
          ;; If we are at the beginning of the line, insert before it.  Else after
          (cond
@@ -7708,13 +7733,12 @@ command."
   "Make the number of empty lines before current exactly N.
 So this will delete or add empty lines."
   (save-excursion
-    (goto-char (point-at-bol))
-    (if (looking-back "\\s-+" nil 'greedy)
-       (replace-match ""))
-    (or (bobp) (insert "\n"))
-    (while (> N 0)
-      (insert "\n")
-      (setq N (1- N)))))
+    (beginning-of-line)
+    (let ((p (point)))
+      (skip-chars-backward " \r\t\n")
+      (unless (bolp) (forward-line))
+      (delete-region (point) p))
+    (when (> N 0) (insert (make-string N ?\n)))))
 
 (defun org-get-heading (&optional no-tags no-todo)
   "Return the heading of the current entry, without the stars.
@@ -7783,17 +7807,15 @@ This is a list with the following elements:
   (org-move-subtree-down)
   (end-of-line 1))
 
-(defun org-insert-heading-respect-content (&optional arg invisible-ok)
+(defun org-insert-heading-respect-content (&optional invisible-ok)
   "Insert heading with `org-insert-heading-respect-content' set to t."
-  (interactive "P")
-  (let ((org-insert-heading-respect-content t))
-    (org-insert-heading '(4) invisible-ok)))
+  (interactive)
+  (org-insert-heading '(4) invisible-ok))
 
 (defun org-insert-todo-heading-respect-content (&optional force-state)
   "Insert TODO heading with `org-insert-heading-respect-content' set to t."
-  (interactive "P")
-  (let ((org-insert-heading-respect-content t))
-    (org-insert-todo-heading force-state '(4))))
+  (interactive)
+  (org-insert-todo-heading force-state '(4)))
 
 (defun org-insert-todo-heading (arg &optional force-heading)
   "Insert a new heading with the same level and TODO state as current heading.
@@ -8150,7 +8172,8 @@ case."
     (save-match-data
       (save-excursion (outline-end-of-heading)
                      (setq folded (outline-invisible-p)))
-      (outline-end-of-subtree))
+      (progn (org-end-of-subtree nil t)
+            (unless (eobp) (backward-char))))
     (outline-next-heading)
     (setq ne-end (org-back-over-empty-lines))
     (setq end (point))
@@ -8303,7 +8326,7 @@ the inserted text when done."
                                   (string-match
                                    "^\\*+$" (buffer-substring
                                              (point-at-bol) (point))))
-                             (- (match-end 1) (match-beginning 1)))
+                             (- (match-end 0) (match-beginning 0)))
                             ((and (bolp)
                                   (looking-at org-outline-regexp))
                              (- (match-end 0) (point) 1))))
@@ -10592,6 +10615,10 @@ application the system uses for this file type."
     (move-marker org-open-link-marker nil)
     (run-hook-with-args 'org-follow-link-hook)))
 
+(defsubst org-uniquify (list)
+  "Non-destructively remove duplicate elements from LIST."
+  (let ((res (copy-sequence list))) (delete-dups res)))
+
 (defun org-offer-links-in-entry (buffer marker &optional nth zero)
   "Offer links in the current entry and return the selected link.
 If there is only one link, return it.
@@ -13640,8 +13667,7 @@ How much context is shown depends upon the variables
                      (error nil))
                    (not (bobp)))
          (org-flag-heading nil)
-         (when siblings-p (org-show-siblings)))))
-    (unless (eq key 'agenda) (org-fix-ellipsis-at-bol))))
+         (when siblings-p (org-show-siblings)))))))
 
 (defvar org-reveal-start-hook nil
   "Hook run before revealing a location.")
@@ -13836,7 +13862,7 @@ a file becomes an N^2 operation - but with this variable set, it scales
 as N.")
 
 (defun org-scan-tags (action matcher todo-only &optional start-level)
-  "Sca headline tags with inheritance and produce output ACTION.
+  "Scan headline tags with inheritance and produce output ACTION.
 
 ACTION can be `sparse-tree' to produce a sparse tree in the current buffer,
 or `agenda' to produce an entry list for an agenda view.  It can also be
@@ -14744,8 +14770,8 @@ Returns the new tags string, or nil to not change the current settings."
       (if expert
          (set-buffer (get-buffer-create " *Org tags*"))
        (delete-other-windows)
-       (split-window-vertically)
-       (org-switch-to-buffer-other-window (get-buffer-create " *Org tags*")))
+       (set-window-buffer (split-window-vertically) (get-buffer-create " *Org tags*"))
+       (org-switch-to-buffer-other-window " *Org tags*"))
       (erase-buffer)
       (org-set-local 'org-done-keywords done-keywords)
       (org-fast-tag-insert "Inherited" inherited i-face "\n")
@@ -15269,7 +15295,10 @@ things up because then unnecessary parsing is avoided."
                             '("SCHEDULED" "DEADLINE" "CLOCK" "CLOSED"
                               "TIMESTAMP" "TIMESTAMP_IA")))
             (catch 'match
-              (while (re-search-forward org-maybe-keyword-time-regexp end t)
+              (while (and (re-search-forward org-maybe-keyword-time-regexp end t)
+                          (not (text-property-any 0 (length (match-string 0))
+                                                  'face 'font-lock-comment-face
+                                                  (match-string 0))))
                 (setq key (if (match-end 1)
                               (substring (org-match-string-no-properties 1)
                                          0 -1))
@@ -15397,7 +15426,7 @@ an empty drawer to delete."
        (if (and range
                 (goto-char (car range))
                 (re-search-forward
-                 (org-re-property property)
+                 (org-re-property property nil t)
                  (cdr range) t))
            (progn
              (delete-region (match-beginning 0) (1+ (point-at-eol)))
@@ -15562,7 +15591,7 @@ If it is not a string, an error is raised."
          (setq range (org-get-property-block beg end 'force))
          (goto-char (car range))
          (if (re-search-forward
-              (org-re-property property) (cdr range) t)
+              (org-re-property property nil t) (cdr range) t)
              (progn
                (delete-region (match-beginning 0) (match-end 0))
                (goto-char (match-beginning 0)))
@@ -15773,9 +15802,7 @@ This is computed according to `org-property-set-functions-alist'."
                  (funcall set-function prompt
                           (mapcar 'list (org-property-values property))
                           nil nil "" nil cur)))))
-    (if (equal val "")
-       cur
-      val)))
+    (org-trim val)))
 
 (defvar org-last-set-property nil)
 (defvar org-last-set-property-value nil)
@@ -15853,8 +15880,10 @@ an empty drawer to delete."
                    (org-icompleting-read "Property: " props nil t)
                  (caar props))))
      (list prop)))
-  (if (org-entry-delete nil property delete-empty-drawer)
-      (message "Property %s deleted" property)))
+  (if (not property)
+      (message "No property to delete in this entry")
+    (org-entry-delete nil property delete-empty-drawer)
+    (message "Property \"%s\" deleted" property)))
 
 (defun org-delete-property-globally (property)
   "Remove PROPERTY globally, from all entries."
@@ -17743,9 +17772,9 @@ This requires Emacs >= 24.1, build with imagemagick support."
 
 (defcustom org-agenda-inhibit-startup nil
   "Inhibit startup when preparing agenda buffers.
-When this variable is `t' (the default), the initialization of
-the Org agenda buffers is inhibited: e.g. the visibility state
-is not set, the tables are not re-aligned, etc."
+When this variable is `t', the initialization of the Org agenda
+buffers is inhibited: e.g. the visibility state is not set, the
+tables are not re-aligned, etc."
   :type 'boolean
   :version "24.3"
   :group 'org-agenda)
@@ -21819,9 +21848,7 @@ for the search purpose."
   "Return the reverse of STRING."
   (apply 'string (reverse (string-to-list string))))
 
-(defsubst org-uniquify (list)
-  "Non-destructively remove duplicate elements from LIST."
-  (let ((res (copy-sequence list))) (delete-dups res)))
+;; defsubst org-uniquify must be defined before first use
 
 (defun org-uniquify-alist (alist)
   "Merge elements of ALIST with the same key.
@@ -23273,14 +23300,6 @@ If there is no such heading, return nil."
                (forward-char -1))))))
   (point))
 
-(defadvice outline-end-of-subtree (around prefer-org-version activate compile)
-  "Use Org version in org-mode, for dramatic speed-up."
-  (if (derived-mode-p 'org-mode)
-      (progn
-       (org-end-of-subtree nil t)
-       (unless (eobp) (backward-char 1)))
-    ad-do-it))
-
 (defun org-end-of-meta-data-and-drawers ()
   "Jump to the first text after meta data and drawers in the current entry.
 This will move over empty lines, lines with planning time stamps,
@@ -23777,8 +23796,7 @@ Show the heading too, if it is currently invisible."
                   isearch-mode-end-hook-quit)
        ;; Only when the isearch was not quitted.
        (org-add-hook 'post-command-hook 'org-isearch-post-command
-                     'append 'local)))
-    (org-fix-ellipsis-at-bol)))
+                     'append 'local)))))
 
 (defun org-isearch-post-command ()
   "Remove self from hook, and show context."
index 6208cdbe0653756676553eae878e86493f453006..cd2a9af10acab9c55094cc6161e1a0969b5141fb 100644 (file)
@@ -192,8 +192,10 @@ original Org buffer at the same place."
 (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 number.  If it is the symbol `auto' preserve
-indentation from original document."
+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")
@@ -421,17 +423,17 @@ equivalent to `left'.  For a justification that doesn't also fill
 string, see `org-ascii--justify-string'.
 
 Return nil if S isn't a string."
-  ;; Don't fill paragraph when break should be preserved.
-  (cond ((not (stringp s)) nil)
-       ((plist-get info :preserve-breaks) s)
-       (t (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 s)
-                (fill-region (point-min) (point-max) justify))
-              (buffer-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-string (s text-width how)
   "Justify string S.
@@ -455,13 +457,13 @@ HOW determines the type of justification: it can be `left',
 Empty lines are not indented."
   (when (stringp s)
     (replace-regexp-in-string
-     "\\(^\\)\\(?:.*\\S-\\)" (make-string width ? ) s nil nil 1)))
+     "\\(^\\)[ \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 "â\95­â\94\80â\94\80â\94\80â\94\80\n%s\nâ\95°────" ",----\n%s\n`----")
+    (format (if utf8p "â\94\8câ\94\80â\94\80â\94\80â\94\80\n%s\nâ\94\94────" ",----\n%s\n`----")
            (replace-regexp-in-string
             "^" (if utf8p "│ " "| ")
             ;; Remove last newline character.
@@ -473,7 +475,7 @@ INFO is a plist used as a communication channel."
   (case (org-element-type element)
     ;; Elements with an absolute width: `headline' and `inlinetask'.
     (inlinetask org-ascii-inlinetask-width)
-    ('headline
+    (headline
      (- org-ascii-text-width
        (let ((low-level-rank (org-export-low-level-p element info)))
          (if low-level-rank (* low-level-rank 2) org-ascii-global-margin))))
@@ -1418,12 +1420,16 @@ INFO is a plist holding contextual information."
   "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."
-  (let ((contents (if (not (wholenump org-ascii-indented-line-width)) contents
-                   (concat
-                    (make-string org-ascii-indented-line-width ? )
-                    (replace-regexp-in-string "\\`[ \t]+" "" contents)))))
-    (org-ascii--fill-string
-     contents (org-ascii--current-text-width paragraph info) info)))
+  (org-ascii--fill-string
+   (if (not (wholenump org-ascii-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 org-ascii-indented-line-width ?\s))
+      (replace-regexp-in-string "\\`[ \t]+" "" contents)))
+   (org-ascii--current-text-width paragraph info) info))
 
 
 ;;;; Plain List
@@ -1591,8 +1597,8 @@ contextual information."
 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)))
+      (format "^{%s}" contents)
+    (format "^%s" contents)))
 
 
 ;;;; Strike-through
@@ -1659,20 +1665,25 @@ are ignored."
     (or (gethash key cache)
        (puthash
         key
-        (or (and (not org-ascii-table-widen-columns)
-                 (org-export-table-cell-width table-cell info))
-            (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))
+        (let ((cookie-width (org-export-table-cell-width table-cell info)))
+          (or (and (not org-ascii-table-widen-columns) 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)
+                      (org-ascii-table-widen-columns
+                       (max cookie-width contents-width))
+                      (t cookie-width)))))
         cache))))
 
 (defun org-ascii-table-cell (table-cell contents info)
index f3a79d7c86073c8f35bbd76ef5ec8b8bba517054..5ab805db271d73220303555fc8bf409f4b93cca0 100644 (file)
@@ -687,7 +687,7 @@ used as a communication channel."
     (cond
      ((equal type "radio")
       (let ((destination (org-export-resolve-radio-link link info)))
-       (when destination
+       (if (not destination) contents
          (format "\\hyperlink%s{%s}{%s}"
                  (or (org-beamer--element-has-overlay-p link) "")
                  (org-export-solidify-link-text
@@ -1092,6 +1092,7 @@ aid, but the tag does not have any semantic meaning."
                          envs)
                  '((:endgroup))
                  '(("BMCOL" . ?|))))
+        (org-tag-persistent-alist nil)
         (org-use-fast-tag-selection t)
         (org-fast-tag-selection-single-key t))
     (org-set-tags)
index 88e572084c8841d2993558b390122bc7938e6a51..23498b26924a95ab5013252db85a87f94c91096d 100644 (file)
@@ -2275,83 +2275,70 @@ holding contextual information."
   "Transcode a HEADLINE element from Org to HTML.
 CONTENTS holds the contents of the headline.  INFO is a plist
 holding contextual information."
-  ;; Empty contents?
-  (setq contents (or contents ""))
-  (let* ((numberedp (org-export-numbered-headline-p headline info))
-        (level (org-export-get-relative-level headline info))
-        (text (org-export-data (org-element-property :title headline) info))
-        (todo (and (plist-get info :with-todo-keywords)
-                   (let ((todo (org-element-property :todo-keyword headline)))
-                     (and todo (org-export-data todo info)))))
-        (todo-type (and todo (org-element-property :todo-type headline)))
-        (tags (and (plist-get info :with-tags)
-                   (org-export-get-tags headline info)))
-        (priority (and (plist-get info :with-priority)
-                       (org-element-property :priority headline)))
-        (section-number (and (org-export-numbered-headline-p headline info)
-                             (mapconcat 'number-to-string
-                                        (org-export-get-headline-number
-                                         headline info) ".")))
-        ;; Create the headline text.
-        (full-text (org-html-format-headline--wrap headline info)))
-    (cond
-     ;; Case 1: This is a footnote section: ignore it.
-     ((org-element-property :footnote-section-p headline) nil)
-     ;; Case 2. This is a deep sub-tree: export it as a list item.
-     ;;         Also export as items headlines for which no section
-     ;;         format has been found.
-     ((org-export-low-level-p headline info)
-      ;; Build the real contents of the sub-tree.
-      (let* ((type (if numberedp 'ordered 'unordered))
-            (itemized-body (org-html-format-list-item
-                            contents type nil info nil full-text)))
-       (concat
-        (and (org-export-first-sibling-p headline info)
-             (org-html-begin-plain-list type))
-        itemized-body
-        (and (org-export-last-sibling-p headline info)
-             (org-html-end-plain-list type)))))
-     ;; Case 3. Standard headline.  Export it as a section.
-     (t
-      (let* ((section-number (mapconcat 'number-to-string
-                                       (org-export-get-headline-number
-                                        headline info) "-"))
-            (ids (remove 'nil
-                         (list (org-element-property :CUSTOM_ID headline)
-                               (concat "sec-" section-number)
-                               (org-element-property :ID headline))))
-            (preferred-id (car ids))
-            (extra-ids (cdr ids))
-            (extra-class (org-element-property :HTML_CONTAINER_CLASS headline))
-            (level1 (+ level (1- org-html-toplevel-hlevel)))
-            (first-content (car (org-element-contents headline))))
-       (format "<%s id=\"%s\" class=\"%s\">%s%s</%s>\n"
-               (org-html--container headline info)
-               (format "outline-container-%s"
-                       (or (org-element-property :CUSTOM_ID headline)
-                           (concat "sec-" section-number)))
-               (concat (format "outline-%d" level1) (and extra-class " ")
-                       extra-class)
-               (format "\n<h%d id=\"%s\">%s%s</h%d>\n"
-                       level1
-                       preferred-id
-                       (mapconcat
-                        (lambda (x)
-                          (let ((id (org-export-solidify-link-text
-                                     (if (org-uuidgen-p x) (concat "ID-" x)
-                                       x))))
-                            (org-html--anchor id)))
-                        extra-ids "")
-                       full-text
-                       level1)
-               ;; When there is no section, pretend there is an empty
-               ;; one to get the correct <div class="outline- ...>
-               ;; which is needed by `org-info.js'.
-               (if (not (eq (org-element-type first-content) 'section))
-                   (concat (org-html-section first-content "" info)
-                           contents)
-                 contents)
-               (org-html--container headline info)))))))
+  (unless (org-element-property :footnote-section-p headline)
+    (let* ((contents (or contents ""))
+          (numberedp (org-export-numbered-headline-p headline info))
+          (level (org-export-get-relative-level headline info))
+          (text (org-export-data (org-element-property :title headline) info))
+          (todo (and (plist-get info :with-todo-keywords)
+                     (let ((todo (org-element-property :todo-keyword headline)))
+                       (and todo (org-export-data todo info)))))
+          (todo-type (and todo (org-element-property :todo-type headline)))
+          (tags (and (plist-get info :with-tags)
+                     (org-export-get-tags headline info)))
+          (priority (and (plist-get info :with-priority)
+                         (org-element-property :priority headline)))
+          (section-number (mapconcat #'number-to-string
+                                     (org-export-get-headline-number
+                                      headline info) "-"))
+          (ids (delq 'nil
+                     (list (org-element-property :CUSTOM_ID headline)
+                           (concat "sec-" section-number)
+                           (org-element-property :ID headline))))
+          (preferred-id (car ids))
+          (extra-ids (mapconcat
+                      (lambda (id)
+                        (org-html--anchor
+                         (org-export-solidify-link-text
+                          (if (org-uuidgen-p id) (concat "ID-" id) id))))
+                      (cdr ids) ""))
+          ;; Create the headline text.
+          (full-text (org-html-format-headline--wrap headline info)))
+      (if (org-export-low-level-p headline info)
+         ;; This is a deep sub-tree: export it as a list item.
+         (let* ((type (if numberedp 'ordered 'unordered))
+                (itemized-body
+                 (org-html-format-list-item
+                  contents type nil info nil
+                  (concat (org-html--anchor preferred-id) extra-ids
+                          full-text))))
+           (concat
+            (and (org-export-first-sibling-p headline info)
+                 (org-html-begin-plain-list type))
+            itemized-body
+            (and (org-export-last-sibling-p headline info)
+                 (org-html-end-plain-list type))))
+       ;; Standard headline.  Export it as a section.
+       (let ((extra-class (org-element-property :HTML_CONTAINER_CLASS headline))
+             (level1 (+ level (1- org-html-toplevel-hlevel)))
+             (first-content (car (org-element-contents headline))))
+         (format "<%s id=\"%s\" class=\"%s\">%s%s</%s>\n"
+                 (org-html--container headline info)
+                 (format "outline-container-%s"
+                         (or (org-element-property :CUSTOM_ID headline)
+                             (concat "sec-" section-number)))
+                 (concat (format "outline-%d" level1) (and extra-class " ")
+                         extra-class)
+                 (format "\n<h%d id=\"%s\">%s%s</h%d>\n"
+                         level1 preferred-id extra-ids full-text level1)
+                 ;; When there is no section, pretend there is an
+                 ;; empty one to get the correct <div class="outline-
+                 ;; ...> which is needed by `org-info.js'.
+                 (if (not (eq (org-element-type first-content) 'section))
+                     (concat (org-html-section first-content "" info)
+                             contents)
+                   contents)
+                 (org-html--container headline info)))))))
 
 (defun org-html--container (headline info)
   (or (org-element-property :HTML_CONTAINER headline)
@@ -2596,18 +2583,17 @@ if its description is a single link targeting an image file."
 
 (defvar org-html-standalone-image-predicate)
 (defun org-html-standalone-image-p (element info)
-  "Test if ELEMENT is a standalone image.
+  "Non-nil if ELEMENT is a standalone image.
 
 INFO is a plist holding contextual information.
 
-Return non-nil, if ELEMENT is of type paragraph and its sole
-content, save for white spaces, is a link that qualifies as an
-inline image.
+An element or object is a standalone image when
 
-Return non-nil, if ELEMENT is of type link and its containing
-paragraph has no other content save white spaces.
+  - its type is `paragraph' and its sole content, save for white
+    spaces, is a link that qualifies as an inline image;
 
-Return nil, otherwise.
+  - its type is `link' and its containing paragraph has no other
+    content save white spaces.
 
 Bind `org-html-standalone-image-predicate' to constrain paragraph
 further.  For example, to check for only captioned standalone
@@ -2618,19 +2604,21 @@ images, set it to:
                     (paragraph element)
                     (link (org-export-get-parent element)))))
     (and (eq (org-element-type paragraph) 'paragraph)
-        (or (not (and (boundp 'org-html-standalone-image-predicate)
-                      (functionp org-html-standalone-image-predicate)))
+        (or (not (fboundp 'org-html-standalone-image-predicate))
             (funcall org-html-standalone-image-predicate paragraph))
-        (not (let ((link-count 0))
-               (org-element-map (org-element-contents paragraph)
-                   (cons 'plain-text org-element-all-objects)
-                 (lambda (obj) (case (org-element-type obj)
-                            (plain-text (org-string-nw-p obj))
-                            (link
-                             (or (> (incf link-count) 1)
-                                 (not (org-html-inline-image-p obj info))))
-                            (otherwise t)))
-                 info 'first-match 'link))))))
+        (catch 'exit
+          (let ((link-count 0))
+            (org-element-map (org-element-contents paragraph)
+                (cons 'plain-text org-element-all-objects)
+              #'(lambda (obj)
+                  (when (case (org-element-type obj)
+                          (plain-text (org-string-nw-p obj))
+                          (link (or (> (incf link-count) 1)
+                                    (not (org-html-inline-image-p obj info))))
+                          (otherwise t))
+                    (throw 'exit nil)))
+              info nil 'link)
+            (= link-count 1))))))
 
 (defun org-html-link (link desc info)
   "Transcode a LINK object from Org to HTML.
@@ -2719,7 +2707,7 @@ INFO is a plist holding contextual information.  See
      ;; link's description.
      ((string= type "radio")
       (let ((destination (org-export-resolve-radio-link link info)))
-       (when destination
+       (if (not destination) desc
          (format "<a href=\"#%s\"%s>%s</a>"
                  (org-export-solidify-link-text
                   (org-element-property :value destination))
index a60c2f92f39616bca67ca6af37a4893d4911fbcf..cd48bbf9aef9d9df2fa1bd16dba5756d16f70fe0 100644 (file)
@@ -174,8 +174,7 @@ The anniversaries are defined in the BBDB database."
 
 (defcustom org-icalendar-include-sexps t
   "Non-nil means export to iCalendar files should also cover sexp entries.
-These are entries like in the diary, but directly in an Org mode
-file."
+These are entries like in the diary, but directly in an Org file."
   :group 'org-export-icalendar
   :type 'boolean)
 
@@ -302,14 +301,14 @@ which will be updated."
 
 INFO is a plist used as a communication channel.
 
-a headline is blocked when either:
+A headline is blocked when either
 
-  - It has children which are not all in a completed state.
+  - it has children which are not all in a completed state;
 
-  - It has a parent with the property :ORDERED:, and there are
-    siblings prior to it with incomplete status.
+  - it has a parent with the property :ORDERED:, and there are
+    siblings prior to it with incomplete status;
 
-  - Its parent is blocked because it has siblings that should be
+  - its parent is blocked because it has siblings that should be
     done first or is a child of a blocked grandparent entry."
   (or
    ;; Check if any child is not done.
@@ -478,10 +477,10 @@ or subject for the event."
 ;;; Filters
 
 (defun org-icalendar-clear-blank-lines (headline back-end info)
-  "Remove trailing blank lines in HEADLINE export.
+  "Remove blank lines in HEADLINE export.
 HEADLINE is a string representing a transcoded headline.
 BACK-END and INFO are ignored."
-  (replace-regexp-in-string "^\\(?:[ \t]*\n\\)*" "" headline))
+  (replace-regexp-in-string "^\\(?:[ \t]*\n\\)+" "" headline))
 
 
 \f
@@ -570,13 +569,19 @@ inlinetask within the section."
            ;; happen once ENTRY is one of them.
            (let ((counter 0))
              (mapconcat
-              'identity
+              #'identity
               (org-element-map (cons (org-element-property :title entry)
                                      (org-element-contents inside))
                   'timestamp
                 (lambda (ts)
-                  (let ((uid (format "TS%d-%s" (incf counter) uid)))
-                    (org-icalendar--vevent entry ts uid summary loc desc cat)))
+                  (when (let ((type (org-element-property :type ts)))
+                          (case (plist-get info :with-timestamps)
+                            (active (memq type '(active active-range)))
+                            (inactive (memq type '(inactive inactive-range)))
+                            ((t) t)))
+                    (let ((uid (format "TS%d-%s" (incf counter) uid)))
+                      (org-icalendar--vevent
+                       entry ts uid summary loc desc cat))))
                 info nil (and (eq type 'headline) 'inlinetask))
               ""))
            ;; Task: First check if it is appropriate to export it.
@@ -589,7 +594,7 @@ inlinetask within the section."
                          (and (eq type 'headline)
                               (not (org-icalendar-blocked-headline-p
                                     entry info))))
-                        ('t (eq todo-type 'todo))))
+                        ((t) (eq todo-type 'todo))))
              (org-icalendar--vtodo entry uid summary loc desc cat))
            ;; Diary-sexp: Collect every diary-sexp element within
            ;; ENTRY and its title, and transcode them.  If ENTRY is
@@ -597,7 +602,7 @@ inlinetask within the section."
            ;; separately.
            (when org-icalendar-include-sexps
              (let ((counter 0))
-               (mapconcat 'identity
+               (mapconcat #'identity
                           (org-element-map
                               (cons (org-element-property :title entry)
                                     (org-element-contents inside))
@@ -613,7 +618,7 @@ inlinetask within the section."
        ;; inlinetask within it.  In agenda export, this is independent
        ;; from the mark (or lack thereof) on the entry.
        (when (eq type 'headline)
-        (mapconcat 'identity
+        (mapconcat #'identity
                    (org-element-map inside 'inlinetask
                      (lambda (task) (org-icalendar-entry task nil info))
                      info) ""))
index 53cc54f00f77befc4e0132571b718379cd54902a..2c71f7d785a3f6296e772ce90932e5ddaca8f2cd 100644 (file)
@@ -524,7 +524,7 @@ When nil, no transformation is made."
   :package-version '(Org . "8.0")
   :type '(choice
          (string :tag "Format string")
-         (const :tag "No formatting")))
+         (const :tag "No formatting" nil)))
 
 
 ;;;; Text markup
@@ -689,9 +689,9 @@ These options are supplied as a comma-separated list to the
 a list containing two strings: the name of the option, and the
 value.  For example,
 
-  (setq org-latex-listings-options
+  \(setq org-latex-listings-options
     '((\"basicstyle\" \"\\\\small\")
-      (\"keywordstyle\" \"\\\\color{black}\\\\bfseries\\\\underbar\")))
+      \(\"keywordstyle\" \"\\\\color{black}\\\\bfseries\\\\underbar\")))
 
 will typeset the code in a small size font with underlined, bold
 black keywords.
@@ -1526,17 +1526,16 @@ holding contextual information."
               (when priority (format "\\framebox{\\#%c} " priority))
               title
               (when tags (format "\\hfill{}\\textsc{:%s:}"
-                                 (mapconcat 'identity tags ":"))))))
-        (format (concat "\\begin{center}\n"
-                        "\\fbox{\n"
-                        "\\begin{minipage}[c]{.6\\textwidth}\n"
-                        "%s\n\n"
-                        "\\rule[.8em]{\\textwidth}{2pt}\n\n"
-                        "%s"
-                        "\\end{minipage}\n"
-                        "}\n"
-                        "\\end{center}")
-                full-title contents))))))
+                                 (mapconcat #'identity tags ":"))))))
+        (concat "\\begin{center}\n"
+                "\\fbox{\n"
+                "\\begin{minipage}[c]{.6\\textwidth}\n"
+                full-title "\n\n"
+                (and (org-string-nw-p contents)
+                     (concat "\\rule[.8em]{\\textwidth}{2pt}\n\n" contents))
+                "\\end{minipage}\n"
+                "}\n"
+                "\\end{center}"))))))
 
 
 ;;;; Italic
@@ -1810,7 +1809,7 @@ INFO is a plist holding contextual information.  See
      ;; description.
      ((string= type "radio")
       (let ((destination (org-export-resolve-radio-link link info)))
-       (when destination
+       (if (not destination) desc
          (format "\\hyperref[%s]{%s}"
                  (org-export-solidify-link-text
                   (org-element-property :value destination))
@@ -1843,7 +1842,8 @@ INFO is a plist holding contextual information.  See
                           'number-to-string
                           (org-export-get-headline-number destination info)
                           "-"))))
-            (if (and (plist-get info :section-numbers) (not desc))
+            (if (and (not desc)
+                     (org-export-numbered-headline-p destination info))
                 (format "\\ref{%s}" label)
               (format "\\hyperref[%s]{%s}" label
                       (or desc
index 1f841c865fa8041977c8654fffbd680bedbda934..99a4ae01786cfe470ffee33dfb00fea3495b2b67 100644 (file)
@@ -102,21 +102,28 @@ This variable can be set to either `atx' or `setext'."
 TREE is the parse tree being exported.  BACKEND is the export
 back-end used.  INFO is a plist used as a communication channel.
 
-Make sure there's no blank line before a plain list, unless it is
-located right after a paragraph.  Otherwise, add a blank line
-between elements.  Blank lines between items are preserved.
+Enforce a blank line between elements.  There are three
+exceptions to this rule:
+
+  1. Preserve blank lines between sibling items in a plain list,
+
+  2. Outside of plain lists, preserve blank lines between
+     a paragraph and a plain list,
+
+  3. In an item, remove any blank line before the very first
+     paragraph and the next sub-list.
 
 Assume BACKEND is `md'."
   (org-element-map tree (remq 'item org-element-all-elements)
-    (lambda (elem)
-      (org-element-put-property
-       elem :post-blank
-       (if (and (eq (org-element-type (org-export-get-next-element elem info))
-                   'plain-list)
-               (not (and (eq (org-element-type elem) 'paragraph)
-                         (org-export-get-previous-element elem info))))
-          0
-        1))))
+    (lambda (e)
+      (cond
+       ((not (and (eq (org-element-type e) 'paragraph)
+                 (eq (org-element-type (org-export-get-next-element e info))
+                     'plain-list)))
+       (org-element-put-property e :post-blank 1))
+       ((not (eq (org-element-type (org-element-property :parent e)) 'item)))
+       (t (org-element-put-property
+          e :post-blank (if (org-export-get-previous-element e info) 1 0))))))
   ;; Return updated tree.
   tree)
 
@@ -182,6 +189,14 @@ a communication channel."
            (and (plist-get info :with-priority)
                 (let ((char (org-element-property :priority headline)))
                   (and char (format "[#%c] " char)))))
+          (anchor
+           (when (plist-get info :with-toc)
+             (org-html--anchor
+              (or (org-element-property :CUSTOM_ID headline)
+                  (concat "sec-"
+                          (mapconcat 'number-to-string
+                                     (org-export-get-headline-number
+                                      headline info) "-"))))))
           ;; Headline text without tags.
           (heading (concat todo priority title)))
       (cond
@@ -202,12 +217,12 @@ a communication channel."
                       (replace-regexp-in-string "^" "    " contents)))))
        ;; Use "Setext" style.
        ((eq org-md-headline-style 'setext)
-       (concat heading tags "\n"
+       (concat heading tags anchor "\n"
                (make-string (length heading) (if (= level 1) ?= ?-))
                "\n\n"
                contents))
        ;; Use "atx" style.
-       (t (concat (make-string level ?#) " " heading tags "\n\n" contents))))))
+       (t (concat (make-string level ?#) " " heading tags anchor "\n\n" contents))))))
 
 
 ;;;; Horizontal Rule
@@ -279,57 +294,65 @@ a communication channel."
                (concat (file-name-sans-extension raw-path) ".md")
              raw-path))))
        (type (org-element-property :type link)))
-    (cond ((member type '("custom-id" "id"))
-          (let ((destination (org-export-resolve-id-link link info)))
-            (if (stringp destination)  ; External file.
-                (let ((path (funcall link-org-files-as-md destination)))
-                  (if (not contents) (format "<%s>" path)
-                    (format "[%s](%s)" contents path)))
-              (concat
-               (and contents (concat contents " "))
-               (format "(%s)"
-                       (format (org-export-translate "See section %s" :html info)
-                               (mapconcat 'number-to-string
-                                          (org-export-get-headline-number
-                                           destination info)
-                                          ".")))))))
-         ((org-export-inline-image-p link org-html-inline-image-rules)
-          (let ((path (let ((raw-path (org-element-property :path link)))
-                        (if (not (file-name-absolute-p raw-path)) raw-path
-                          (expand-file-name raw-path))))
-                (caption (org-export-data
-                          (org-export-get-caption
-                           (org-export-get-parent-element link)) info)))
-            (format "![img](%s)"
-                    (if (not (org-string-nw-p caption)) path
-                      (format "%s \"%s\"" path caption)))))
-         ((string= type "coderef")
-          (let ((ref (org-element-property :path link)))
-            (format (org-export-get-coderef-format ref contents)
-                    (org-export-resolve-coderef ref info))))
-         ((equal type "radio") contents)
-         ((equal type "fuzzy")
-          (let ((destination (org-export-resolve-fuzzy-link link info)))
-            (if (org-string-nw-p contents) contents
-              (when destination
-                (let ((number (org-export-get-ordinal destination info)))
-                  (when number
-                    (if (atom number) (number-to-string number)
-                      (mapconcat 'number-to-string number "."))))))))
-         (t (let* ((raw-path (org-element-property :path link))
-                   (path
-                    (cond
-                     ((member type '("http" "https" "ftp"))
-                      (concat type ":" raw-path))
-                     ((string= type "file")
-                      (let ((path (funcall link-org-files-as-md raw-path)))
-                        (if (not (file-name-absolute-p path)) path
-                          ;; If file path is absolute, prepend it
-                          ;; with "file:" component.
-                          (concat "file:" path))))
-                     (t raw-path))))
-              (if (not contents) (format "<%s>" path)
-                (format "[%s](%s)" contents path)))))))
+    (cond
+     ((member type '("custom-id" "id"))
+      (let ((destination (org-export-resolve-id-link link info)))
+       (if (stringp destination)       ; External file.
+           (let ((path (funcall link-org-files-as-md destination)))
+             (if (not contents) (format "<%s>" path)
+               (format "[%s](%s)" contents path)))
+         (concat
+          (and contents (concat contents " "))
+          (format "(%s)"
+                  (format (org-export-translate "See section %s" :html info)
+                          (mapconcat 'number-to-string
+                                     (org-export-get-headline-number
+                                      destination info)
+                                     ".")))))))
+     ((org-export-inline-image-p link org-html-inline-image-rules)
+      (let ((path (let ((raw-path (org-element-property :path link)))
+                   (if (not (file-name-absolute-p raw-path)) raw-path
+                     (expand-file-name raw-path))))
+           (caption (org-export-data
+                     (org-export-get-caption
+                      (org-export-get-parent-element link)) info)))
+       (format "![img](%s)"
+               (if (not (org-string-nw-p caption)) path
+                 (format "%s \"%s\"" path caption)))))
+     ((string= type "coderef")
+      (let ((ref (org-element-property :path link)))
+       (format (org-export-get-coderef-format ref contents)
+               (org-export-resolve-coderef ref info))))
+     ((equal type "radio") contents)
+     ((equal type "fuzzy")
+      (let ((destination (org-export-resolve-fuzzy-link link info)))
+       (if (org-string-nw-p contents) contents
+         (when destination
+           (let ((number (org-export-get-ordinal destination info)))
+             (when number
+               (if (atom number) (number-to-string number)
+                 (mapconcat 'number-to-string number "."))))))))
+     ;; Link type is handled by a special function.
+     ((let ((protocol (nth 2 (assoc type org-link-protocols))))
+       (and (functionp protocol)
+            (funcall protocol
+                     (org-link-unescape (org-element-property :path link))
+                     contents
+                     'md))))
+     (t (let* ((raw-path (org-element-property :path link))
+              (path
+               (cond
+                ((member type '("http" "https" "ftp"))
+                 (concat type ":" raw-path))
+                ((string= type "file")
+                 (let ((path (funcall link-org-files-as-md raw-path)))
+                   (if (not (file-name-absolute-p path)) path
+                     ;; If file path is absolute, prepend it
+                     ;; with "file:" component.
+                     (concat "file:" path))))
+                (t raw-path))))
+         (if (not contents) (format "<%s>" path)
+           (format "[%s](%s)" contents path)))))))
 
 
 ;;;; Paragraph
index 772017cdd0c2073d79fe339cc249b1d05ed44d00..03b3214a469155aabe814577eb7c36ccfa093d74 100644 (file)
@@ -1741,7 +1741,8 @@ CONTENTS is nil.  INFO is a plist holding contextual information."
                               :transcoders
                               '((paragraph . (lambda (p c i)
                                                (org-odt--format-paragraph
-                                                p c "Footnote"
+                                                p c i
+                                                "Footnote"
                                                 "OrgFootnoteCenter"
                                                 "OrgFootnoteQuotations")))))
                              info))))
@@ -2732,7 +2733,7 @@ INFO is a plist holding contextual information.  See
      ;; link's description.
      ((string= type "radio")
       (let ((destination (org-export-resolve-radio-link link info)))
-       (when destination
+       (if (not destination) desc
          (format
           "<text:bookmark-ref text:reference-format=\"text\" text:ref-name=\"OrgXref.%s\">%s</text:bookmark-ref>"
           (org-export-solidify-link-text
@@ -2832,33 +2833,44 @@ INFO is a plist holding contextual information.  See
 
 ;;;; Paragraph
 
-(defun org-odt--format-paragraph (paragraph contents default center quote)
+(defun org-odt--paragraph-style (paragraph)
+  "Return style of PARAGRAPH.
+Style is a symbol among `quoted', `centered' and nil."
+  (let ((up paragraph))
+    (while (and (setq up (org-element-property :parent up))
+               (not (memq (org-element-type up)
+                          '(center-block quote-block section)))))
+    (case (org-element-type up)
+      (center-block 'centered)
+      (quote-block 'quoted))))
+
+(defun org-odt--format-paragraph (paragraph contents info default center quote)
   "Format paragraph according to given styles.
 PARAGRAPH is a paragraph type element.  CONTENTS is the
-transcoded contents of that paragraph, as a string.  DEFAULT,
-CENTER and QUOTE are, respectively, style to use when paragraph
-belongs to no special environment, a center block, or a quote
-block."
-  (let* ((parent (org-export-get-parent paragraph))
-        (parent-type (org-element-type parent))
-        (style (case parent-type
-                 (quote-block quote)
-                 (center-block center)
-                 (t default))))
-    ;; If this paragraph is a leading paragraph in an item and the
-    ;; item has a checkbox, splice the checkbox and paragraph contents
-    ;; together.
-    (when (and (eq (org-element-type parent) 'item)
-              (eq paragraph (car (org-element-contents parent))))
-      (setq contents (concat (org-odt--checkbox parent) contents)))
-    (format "\n<text:p text:style-name=\"%s\">%s</text:p>" style contents)))
+transcoded contents of that paragraph, as a string.  INFO is
+a plist used as a communication channel.  DEFAULT, CENTER and
+QUOTE are, respectively, style to use when paragraph belongs to
+no special environment, a center block, or a quote block."
+  (format "\n<text:p text:style-name=\"%s\">%s</text:p>"
+         (case (org-odt--paragraph-style paragraph)
+           (quoted quote)
+           (centered center)
+           (otherwise default))
+         ;; If PARAGRAPH is a leading paragraph in an item that has
+         ;; a checkbox, splice checkbox and paragraph contents
+         ;; together.
+         (concat (let ((parent (org-element-property :parent paragraph)))
+                   (and (eq (org-element-type parent) 'item)
+                        (not (org-export-get-previous-element paragraph info))
+                        (org-odt--checkbox parent)))
+                 contents)))
 
 (defun org-odt-paragraph (paragraph contents info)
   "Transcode a PARAGRAPH element from Org to ODT.
 CONTENTS is the contents of the paragraph, as a string.  INFO is
 the plist used as a communication channel."
   (org-odt--format-paragraph
-   paragraph contents
+   paragraph contents info
    (or (org-element-property :style paragraph) "Text_20_body")
    "OrgCenter"
    "Quotations"))
index 3b2e55e2d459a62f469a2d3d5882786b96f600c8..195b9d765872d984c73c3b1ba314f581db9c3804 100644 (file)
@@ -65,7 +65,7 @@ setting of `org-html-htmlize-output-type' is 'css."
     (entity . org-org-identity)
     (example-block . org-org-identity)
     (fixed-width . org-org-identity)
-    (footnote-definition . org-org-identity)
+    (footnote-definition . ignore)
     (footnote-reference . org-org-identity)
     (headline . org-org-headline)
     (horizontal-rule . org-org-identity)
@@ -87,7 +87,7 @@ setting of `org-html-htmlize-output-type' is 'css."
     (quote-block . org-org-identity)
     (quote-section . org-org-identity)
     (radio-target . org-org-identity)
-    (section . org-org-identity)
+    (section . org-org-section)
     (special-block . org-org-identity)
     (src-block . org-org-identity)
     (statistics-cookie . org-org-identity)
@@ -122,15 +122,16 @@ CONTENTS is its contents, as a string or nil.  INFO is ignored."
 (defun org-org-headline (headline contents info)
   "Transcode HEADLINE element back into Org syntax.
 CONTENTS is its contents, as a string or nil.  INFO is ignored."
-  (unless (plist-get info :with-todo-keywords)
-    (org-element-put-property headline :todo-keyword nil))
-  (unless (plist-get info :with-tags)
-    (org-element-put-property headline :tags nil))
-  (unless (plist-get info :with-priority)
-    (org-element-put-property headline :priority nil))
-  (org-element-put-property headline :level
-                           (org-export-get-relative-level headline info))
-  (org-element-headline-interpreter headline contents))
+  (unless (org-element-property :footnote-section-p headline)
+    (unless (plist-get info :with-todo-keywords)
+      (org-element-put-property headline :todo-keyword nil))
+    (unless (plist-get info :with-tags)
+      (org-element-put-property headline :tags nil))
+    (unless (plist-get info :with-priority)
+      (org-element-put-property headline :priority nil))
+    (org-element-put-property headline :level
+                             (org-export-get-relative-level headline info))
+    (org-element-headline-interpreter headline contents)))
 
 (defun org-org-keyword (keyword contents info)
   "Transcode KEYWORD element back into Org syntax.
@@ -144,6 +145,33 @@ keywords targeted at other export back-ends."
                   org-element-block-name-alist))
     (org-element-keyword-interpreter keyword nil)))
 
+(defun org-org-section (section contents info)
+  "Transcode SECTION element back into Org syntax.
+CONTENTS is the contents of the section.  INFO is a plist used as
+a communication channel."
+  (concat
+   (org-element-normalize-string contents)
+   ;; Insert footnote definitions appearing for the first time in this
+   ;; section.  Indeed, some of them may not be available to narrowing
+   ;; so we make sure all of them are included in the result.
+   (let ((footnotes-alist
+         (org-element-map section 'footnote-reference
+           (lambda (fn)
+             (and (eq (org-element-property :type fn) 'standard)
+                  (org-export-footnote-first-reference-p fn info)
+                  (cons (org-element-property :label fn)
+                        (org-export-get-footnote-definition fn info))))
+           info)))
+     (and footnotes-alist
+         (concat "\n"
+                 (mapconcat
+                  (lambda (d)
+                    (org-element-normalize-string
+                     (concat (format "[%s] "(car d))
+                             (org-export-data (cdr d) info))))
+                  footnotes-alist "\n"))))
+   (make-string (or (org-element-property :post-blank section) 0) ?\n)))
+
 ;;;###autoload
 (defun org-org-export-as-org (&optional async subtreep visible-only ext-plist)
   "Export current buffer to an Org buffer.
index b38fca9705913568f66c6bb358d85b2cf512058b..1dc790daf37dc0c7ba9843d1445e11a850d46f0f 100644 (file)
@@ -805,9 +805,14 @@ Default for SITEMAP-FILENAME is 'sitemap.org'."
          (visiting (find-buffer-visiting file))
          (buffer (or visiting (find-file-noselect file))))
      (with-current-buffer buffer
-       (org-mode)
        (let ((title
-             (let ((property (plist-get (org-export-get-environment) :title)))
+             (let ((property
+                    (plist-get
+                     ;; protect local variables in open buffers
+                     (if visiting
+                         (org-export-with-buffer-copy (org-export-get-environment))
+                       (org-export-get-environment))
+                     :title)))
                (if property
                    (org-no-properties (org-element-interpret-data property))
                  (file-name-nondirectory (file-name-sans-extension file))))))
@@ -822,12 +827,14 @@ If FILE is an Org file and provides a DATE keyword use it.  In
 any other case use the file system's modification time.  Return
 time in `current-time' format."
   (if (file-directory-p file) (nth 5 (file-attributes file))
-    (let* ((visiting (find-buffer-visiting file))
+    (let* ((org-inhibit-startup t)
+          (visiting (find-buffer-visiting file))
           (file-buf (or visiting (find-file-noselect file nil)))
           (date (plist-get
                  (with-current-buffer file-buf
-                   (let ((org-inhibit-startup t)) (org-mode))
-                   (org-export-get-environment))
+                   (if visiting
+                       (org-export-with-buffer-copy (org-export-get-environment))
+                     (org-export-get-environment)))
                  :date)))
       (unless visiting (kill-buffer file-buf))
       ;; DATE is either a timestamp object or a secondary string.  If it
index a961d7acdbc05282f3745cdde724dc29c6b86ceb..37841d776f4a20ea51efab2904e58a91f481e57c 100644 (file)
 
 ;;; Commentary:
 ;;
-;; This library implements a Texinfo back-end for Org generic
-;; exporter.
-;;
-;; To test it, run
-;;
-;;   M-: (org-export-to-buffer 'texinfo "*Test Texinfo*") RET
-;;
-;; in an Org mode buffer then switch to the buffer to see the Texinfo
-;; export.  See ox.el for more details on how this exporter works.
-;;
-
-;; It introduces nine new buffer keywords: "TEXINFO_CLASS",
-;; "TEXINFO_FILENAME", "TEXINFO_HEADER", "TEXINFO_POST_HEADER",
-;; "TEXINFO_DIR_CATEGORY", "TEXINFO_DIR_TITLE", "TEXINFO_DIR_DESC"
-;; "SUBTITLE" and "SUBAUTHOR".
-
-;;
-;; It introduces 1 new headline property keywords:
-;; "TEXINFO_MENU_TITLE" for optional menu titles.
-;;
-;; To include inline code snippets (for example for generating @kbd{}
-;; and @key{} commands), the following export-snippet keys are
-;; accepted:
-;;
-;;     texinfo
-;;     info
-;;
-;; You can add them for export snippets via any of the below:
-;;
-;;    (add-to-list 'org-export-snippet-translation-alist
-;;                 '("info" . "texinfo"))
-;;
+;; See Org manual for details.
 
 ;;; Code:
 
@@ -70,8 +39,8 @@
     (center-block . org-texinfo-center-block)
     (clock . org-texinfo-clock)
     (code . org-texinfo-code)
-    (comment . org-texinfo-comment)
-    (comment-block . org-texinfo-comment-block)
+    (comment . (lambda (&rest args) ""))
+    (comment-block . (lambda (&rest args) ""))
     (drawer . org-texinfo-drawer)
     (dynamic-block . org-texinfo-dynamic-block)
     (entity . org-texinfo-entity)
   :export-block "TEXINFO"
   :filters-alist
   '((:filter-headline . org-texinfo-filter-section-blank-lines)
+    (:filter-parse-tree . org-texinfo--normalize-headlines)
     (:filter-section . org-texinfo-filter-section-blank-lines))
   :menu-entry
   '(?i "Export to Texinfo"
        ((?t "As TEXI file" org-texinfo-export-to-texinfo)
        (?i "As INFO file" org-texinfo-export-to-info)))
   :options-alist
-  '((:texinfo-filename "TEXINFO_FILENAME" nil org-texinfo-filename t)
+  '((:texinfo-filename "TEXINFO_FILENAME" nil nil t)
     (:texinfo-class "TEXINFO_CLASS" nil org-texinfo-default-class t)
     (:texinfo-header "TEXINFO_HEADER" nil nil newline)
     (:texinfo-post-header "TEXINFO_POST_HEADER" nil nil newline)
     (:subauthor "SUBAUTHOR" nil nil newline)
     (:texinfo-dircat "TEXINFO_DIR_CATEGORY" nil nil t)
     (:texinfo-dirtitle "TEXINFO_DIR_TITLE" nil nil t)
-    (:texinfo-dirdesc "TEXINFO_DIR_DESC" nil nil t)))
+    (:texinfo-dirdesc "TEXINFO_DIR_DESC" nil nil t)
+    (:texinfo-printed-title "TEXINFO_PRINTED_TITLE" nil nil t)))
 
 
 \f
   :package-version '(Org . "8.0")
   :group 'org-export)
 
-;;; Preamble
-
-(defcustom org-texinfo-filename ""
-  "Default filename for Texinfo output."
-  :group 'org-export-texinfo
-  :type '(string :tag "Export Filename"))
+;;;; Preamble
 
 (defcustom org-texinfo-coding-system nil
   "Default document encoding for Texinfo output.
@@ -162,19 +128,42 @@ If `nil' it will default to `buffer-file-coding-system'."
 
 (defcustom org-texinfo-classes
   '(("info"
-     "\\input texinfo    @c -*- texinfo -*-"
+     "@documentencoding AUTO\n@documentlanguage AUTO"
      ("@chapter %s" . "@unnumbered %s")
      ("@section %s" . "@unnumberedsec %s")
      ("@subsection %s" . "@unnumberedsubsec %s")
      ("@subsubsection %s" . "@unnumberedsubsubsec %s")))
   "Alist of Texinfo classes and associated header and structure.
-If #+Texinfo_CLASS is set in the buffer, use its value and the
+If #+TEXINFO_CLASS is set in the buffer, use its value and the
 associated information.  Here is the structure of each cell:
 
   \(class-name
     header-string
-    \(numbered-section . unnumbered-section\)
-    ...\)
+    \(numbered-section . unnumbered-section)
+    ...)
+
+
+The header string
+-----------------
+
+The header string is inserted in the header of the generated
+document, right after \"@setfilename\" and \"@settitle\"
+commands.
+
+If it contains the special string
+
+  \"@documentencoding AUTO\"
+
+\"AUTO\" will be replaced with an appropriate coding system.  See
+`org-texinfo-coding-system' for more information.  Likewise, if
+the string contains the special string
+
+  \"@documentlanguage AUTO\"
+
+\"AUTO\" will be replaced with the language defined in the
+buffer, through #+LANGUAGE keyword, or globally, with
+`org-export-default-language', which see.
+
 
 The sectioning structure
 ------------------------
@@ -186,10 +175,12 @@ section string and will be replaced by the title of the section.
 
 Instead of a list of sectioning commands, you can also specify
 a function name.  That function will be called with two
-parameters, the \(reduced) level of the headline, and a predicate
+parameters, the reduced) level of the headline, and a predicate
 non-nil when the headline should be numbered.  It must return
 a format string in which the section title will be added."
   :group 'org-export-texinfo
+  :version "24.4"
+  :package-version '(Org . "8.2")
   :type '(repeat
          (list (string :tag "Texinfo class")
                (string :tag "Texinfo header")
@@ -200,7 +191,7 @@ a format string in which the section title will be added."
                               (string :tag "unnumbered"))
                         (function :tag "Hook computing sectioning"))))))
 
-;;; Headline
+;;;; Headline
 
 (defcustom org-texinfo-format-headline-function 'ignore
   "Function to format headline text.
@@ -230,22 +221,16 @@ order to reproduce the default set-up:
   :group 'org-export-texinfo
   :type 'function)
 
-;;; Node listing (menu)
+;;;; Node listing (menu)
 
 (defcustom org-texinfo-node-description-column 32
-  "Column at which to start the description in the node
-  listings.
-
+  "Column at which to start the description in the node listings.
 If a node title is greater than this length, the description will
 be placed after the end of the title."
   :group 'org-export-texinfo
   :type 'integer)
 
-;;; Footnotes
-;;
-;; Footnotes are inserted directly
-
-;;; Timestamps
+;;;; Timestamps
 
 (defcustom org-texinfo-active-timestamp-format "@emph{%s}"
   "A printf format string to be applied to active timestamps."
@@ -262,14 +247,14 @@ be placed after the end of the title."
   :group 'org-export-texinfo
   :type 'string)
 
-;;; Links
+;;;; Links
 
 (defcustom org-texinfo-link-with-unknown-path-format "@indicateurl{%s}"
   "Format string for links with unknown path type."
   :group 'org-export-texinfo
   :type 'string)
 
-;;; Tables
+;;;; Tables
 
 (defcustom org-texinfo-tables-verbatim nil
   "When non-nil, tables are exported verbatim."
@@ -285,14 +270,14 @@ When nil, no transformation is made."
   :group 'org-export-texinfo
   :type '(choice
          (string :tag "Format string")
-         (const :tag "No formatting")))
+         (const :tag "No formatting" nil)))
 
 (defcustom org-texinfo-def-table-markup "@samp"
   "Default setting for @table environments."
   :group 'org-export-texinfo
   :type 'string)
 
-;;; Text markup
+;;;; Text markup
 
 (defcustom org-texinfo-text-markup-alist '((bold . "@strong{%s}")
                                           (code . code)
@@ -316,7 +301,7 @@ returned as-is."
   :type 'alist
   :options '(bold code italic verbatim comment))
 
-;;; Drawers
+;;;; Drawers
 
 (defcustom org-texinfo-format-drawer-function
   (lambda (name contents) contents)
@@ -331,10 +316,10 @@ The function should return the string to be exported.
 The default function simply returns the value of CONTENTS."
   :group 'org-export-texinfo
   :version "24.4"
-  :package-version '(Org . "8.3")
+  :package-version '(Org . "8.2")
   :type 'function)
 
-;;; Inlinetasks
+;;;; Inlinetasks
 
 (defcustom org-texinfo-format-inlinetask-function 'ignore
   "Function called to format an inlinetask in Texinfo code.
@@ -370,18 +355,13 @@ in order to mimic default behavior:
   :group 'org-export-texinfo
   :type 'function)
 
-;;; Src blocks
-;;
-;; Src Blocks are example blocks, except for LISP
-
-;;; Compilation
+;;;; Compilation
 
-(defcustom org-texinfo-info-process
-  '("makeinfo %f")
+(defcustom org-texinfo-info-process '("makeinfo %f")
   "Commands to process a Texinfo file to an INFO file.
 This is list of strings, each of them will be given to the shell
 as a command.  %f in the command will be replaced by the full
-file name, %b by the file base name \(i.e without extension) and
+file name, %b by the file base name (i.e without extension) and
 %o by the base directory of the file."
   :group 'org-export-texinfo
   :type '(repeat :tag "Shell command sequence"
@@ -403,12 +383,13 @@ set `org-texinfo-logfiles-extensions'."
   :group 'org-export-latex
   :type 'boolean)
 
-
 ;;; Constants
+
 (defconst org-texinfo-max-toc-depth 4
-  "Maximum depth for creation of detailed menu listings.  Beyond
-  this depth Texinfo will not recognize the nodes and will cause
-  errors.  Left as a constant in case this value ever changes.")
+  "Maximum depth for creation of detailed menu listings.
+Beyond this depth, Texinfo will not recognize the nodes and will
+cause errors.  Left as a constant in case this value ever
+changes.")
 
 (defconst org-texinfo-supported-coding-systems
   '("US-ASCII" "UTF-8" "ISO-8859-15" "ISO-8859-1" "ISO-8859-2" "koi8-r" "koi8-u")
@@ -425,6 +406,31 @@ If two strings share the same prefix (e.g. \"ISO-8859-1\" and
   (let ((blanks (make-string 2 ?\n)))
     (replace-regexp-in-string "\n\\(?:\n[ \t]*\\)*\\'" blanks headline)))
 
+(defun org-texinfo--normalize-headlines (tree back-end info)
+  "Normalize headlines in TREE.
+
+BACK-END is the symbol specifying back-end used for export. INFO
+is a plist used as a communication channel.
+
+Make sure every headline in TREE contains a section, since those
+are required to install a menu.  Also put exactly one blank line
+at the end of each section.
+
+Return new tree."
+  (org-element-map tree 'headline
+    (lambda (hl)
+      (org-element-put-property hl :post-blank 1)
+      (let ((contents (org-element-contents hl)))
+       (when contents
+         (let ((first (org-element-map contents '(headline section)
+                        #'identity info t)))
+           (unless (eq (org-element-type first) 'section)
+             (apply #'org-element-set-contents
+                    hl
+                    (cons `(section (:parent ,hl)) contents)))))))
+    info)
+  tree)
+
 (defun org-texinfo--find-verb-separator (s)
   "Return a character not used in string S.
 This is used to choose a separator for constructs like \\verb."
@@ -433,18 +439,6 @@ This is used to choose a separator for constructs like \\verb."
          when (not (string-match (regexp-quote (char-to-string c)) s))
          return (char-to-string c))))
 
-(defun org-texinfo--make-option-string (options)
-  "Return a comma separated string of keywords and values.
-OPTIONS is an alist where the key is the options keyword as
-a string, and the value a list containing the keyword value, or
-nil."
-  (mapconcat (lambda (pair)
-              (concat (first pair)
-                      (when (> (length (second pair)) 0)
-                        (concat "=" (second pair)))))
-            options
-            ","))
-
 (defun org-texinfo--text-markup (text markup)
   "Format TEXT depending on MARKUP text markup.
 See `org-texinfo-text-markup-alist' for details."
@@ -472,207 +466,44 @@ See `org-texinfo-text-markup-alist' for details."
      ;; Else use format string.
      (t (format fmt text)))))
 
-(defun org-texinfo--get-node (headline info)
-  "Return node entry associated to HEADLINE.
-INFO is a plist used as a communication channel."
-  (let ((menu-title (org-export-get-alt-title headline info)))
-    (org-texinfo--sanitize-menu
-     (replace-regexp-in-string
-      "%" "%%"
-      (if menu-title (org-export-data menu-title info)
-       (org-texinfo--sanitize-headline
-        (org-element-property :title headline) info))))))
-
-;;; Headline sanitizing
-
-(defun org-texinfo--sanitize-headline (headline info)
-  "Remove all formatting from the text of a headline for use in
-  node and menu listing."
-  (mapconcat 'identity
-            (org-texinfo--sanitize-headline-contents headline info) " "))
-
-(defun org-texinfo--sanitize-headline-contents (headline info)
-  "Retrieve the content of the headline.
-
-Any content that can contain further formatting is checked
-recursively, to ensure that nested content is also properly
-retrieved."
-  (loop for contents in headline append
-       (cond
-        ;; already a string
-        ((stringp contents)
-         (list (replace-regexp-in-string " $" "" contents)))
-        ;; Is exported as-is (value)
-        ((org-element-map contents '(verbatim code)
-           (lambda (value) (org-element-property :value value)) info))
-        ;; Has content and recurse into the content
-        ((org-element-contents contents)
-         (org-texinfo--sanitize-headline-contents
-          (org-element-contents contents) info)))))
-
-;;; Menu sanitizing
-
-(defun org-texinfo--sanitize-menu (title)
-  "Remove invalid characters from TITLE for use in menus and
-nodes.
-
-Based on Texinfo specifications, the following must be removed:
-@ { } ( ) : . ,"
-  (replace-regexp-in-string "[@{}():,.]" "" title))
-
-;;; Content sanitizing
+(defun org-texinfo--get-node (blob info)
+  "Return node or anchor associated to BLOB.
+BLOB is an element or object.  INFO is a plist used as
+a communication channel.  The function guarantees the node or
+anchor name is unique."
+  (let ((cache (plist-get info :texinfo-node-cache)))
+    (or (cdr (assq blob cache))
+       (let ((name
+              (org-texinfo--sanitize-node
+               (case (org-element-type blob)
+                 (headline
+                  (org-export-data (org-export-get-alt-title blob info) info))
+                 ((radio-target target) (org-element-property :value blob))
+                 (otherwise (or (org-element-property :name blob) ""))))))
+         ;; Ensure NAME is unique.
+         (while (rassoc name cache) (setq name (concat name "x")))
+         (plist-put info :texinfo-node-cache (cons (cons blob name) cache))
+         name))))
+
+;;;; Menu sanitizing
+
+(defun org-texinfo--sanitize-node (title)
+  "Bend string TITLE to node line requirements.
+Trim string and collapse multiple whitespace characters as they
+are not significant.  Also remove the following characters: @
+{ } ( ) : . ,"
+  (replace-regexp-in-string
+   "[:,.]" ""
+   (replace-regexp-in-string
+    "\\`(\\(.*)\\)" "[\\1"
+    (org-trim (replace-regexp-in-string "[ \t]\\{2,\\}" " " title)))))
+
+;;;; Content sanitizing
 
 (defun org-texinfo--sanitize-content (text)
-  "Ensure characters are properly escaped when used in headlines or blocks.
-
-Escape characters are: @ { }"
-  (replace-regexp-in-string "\\\([@{}]\\\)" "@\\1" text))
-
-;;; Menu creation
-
-(defun org-texinfo--build-menu (tree level info &optional detailed)
-  "Create the @menu/@end menu information from TREE at headline
-level LEVEL.
-
-TREE contains the parse-tree to work with, either of the entire
-document or of a specific parent headline.  LEVEL indicates what
-level of headlines to look at when generating the menu.  INFO is
-a plist containing contextual information.
-
-Detailed determines whether to build a single level of menu, or
-recurse into all children as well."
-  (let ((menu (org-texinfo--generate-menu-list tree level info))
-       output text-menu)
-    (cond
-     (detailed
-      ;; Looping is done within the menu generation.
-      (setq text-menu (org-texinfo--generate-detailed menu level info)))
-     (t
-      (setq text-menu (org-texinfo--generate-menu-items menu info))))
-    (when text-menu
-      (setq output (org-texinfo--format-menu text-menu))
-      (mapconcat 'identity output "\n"))))
-
-(defun org-texinfo--generate-detailed (menu level info)
-  "Generate a detailed listing of all subheadings within MENU starting at LEVEL.
-
-MENU is the parse-tree to work with.  LEVEL is the starting level
-for the menu headlines and from which recursion occurs.  INFO is
-a plist containing contextual information."
-  (when level
-    (let ((max-depth (min org-texinfo-max-toc-depth
-                     (plist-get info :headline-levels))))
-      (when (> max-depth level)
-       (loop for headline in menu append
-             (let* ((title (org-texinfo--menu-headlines headline info))
-                    ;; Create list of menu entries for the next level
-                    (sublist (org-texinfo--generate-menu-list
-                              headline (1+ level) info))
-                    ;; Generate the menu items for that level.  If
-                    ;; there are none omit that heading completely,
-                    ;; otherwise join the title to it's related entries.
-                    (submenu (if (org-texinfo--generate-menu-items sublist info)
-                                 (append (list title)
-                                         (org-texinfo--generate-menu-items sublist info))
-                               'nil))
-                    ;; Start the process over the next level down.
-                    (recursion (org-texinfo--generate-detailed sublist (1+ level) info)))
-               (setq recursion (append submenu recursion))
-               recursion))))))
-
-(defun org-texinfo--generate-menu-list (tree level info)
-  "Generate the list of headlines that are within a given level
-of the tree for further formatting.
-
-TREE is the parse-tree containing the headlines.  LEVEL is the
-headline level to generate a list of.  INFO is a plist holding
-contextual information."
-  (org-element-map tree 'headline
-    (lambda (head)
-      (and (= (org-export-get-relative-level head info) level)
-          ;; Do not take note of footnotes or copying headlines.
-          (not (org-element-property :COPYING head))
-          (not (org-element-property :footnote-section-p head))
-          ;; Collect headline.
-          head))
-    info))
-
-(defun org-texinfo--generate-menu-items (items info)
-  "Generate a list of headline information from the listing ITEMS.
-
-ITEMS is a list of the headlines to be converted into entries.
-INFO is a plist containing contextual information.
-
-Returns a list containing the following information from each
-headline: length, title, description.  This is used to format the
-menu using `org-texinfo--format-menu'."
-  (loop for headline in items collect
-       (let* ((menu-title (org-texinfo--sanitize-menu
-                           (org-export-data
-                            (org-export-get-alt-title headline info)
-                            info)))
-              (title (org-texinfo--sanitize-menu
-                      (org-texinfo--sanitize-headline
-                       (org-element-property :title headline) info)))
-              (descr (org-export-data
-                      (org-element-property :DESCRIPTION headline)
-                      info))
-              (menu-entry (if (string= "" menu-title) title menu-title))
-              (len (length menu-entry))
-              (output (list len menu-entry descr)))
-         output)))
-
-(defun org-texinfo--menu-headlines (headline info)
-  "Retrieve the title from HEADLINE.
-
-INFO is a plist holding contextual information.
-
-Return the headline as a list of (length title description) with
-length of -1 and nil description.  This is used in
-`org-texinfo--format-menu' to identify headlines as opposed to
-entries."
-  (let ((title (org-export-data
-               (org-element-property :title headline) info)))
-    (list -1 title 'nil)))
-
-(defun org-texinfo--format-menu (text-menu)
-  "Format the TEXT-MENU items to be properly printed in the menu.
-
-Each entry in the menu should be provided as (length title
-description).
-
-Headlines in the detailed menu are given length -1 to ensure they
-are never confused with other entries.  They also have no
-description.
-
-Other menu items are output as:
-    Title::     description
-
-With the spacing between :: and description based on the length
-of the longest menu entry."
-
-  (let (output)
-    (setq output
-          (mapcar (lambda (name)
-                    (let* ((title   (nth 1 name))
-                           (desc    (nth 2 name))
-                           (length  (nth 0 name))
-                          (column  (max
-                                    ;;6 is "* " ":: " for inserted text
-                                    length
-                                    (-
-                                     org-texinfo-node-description-column
-                                     6)))
-                          (spacing (- column length)
-                                   ))
-                      (if (> length -1)
-                          (concat "* " title "::  "
-                                  (make-string spacing ?\s)
-                                  (if desc
-                                      (concat desc)))
-                        (concat "\n" title "\n"))))
-                 text-menu))
-    output))
+  "Escape special characters in string TEXT.
+Special characters are: @ { }"
+  (replace-regexp-in-string "[@{}]" "@\\&" text))
 
 ;;; Template
 
@@ -680,145 +511,127 @@ of the longest menu entry."
   "Return complete document string after Texinfo conversion.
 CONTENTS is the transcoded contents string.  INFO is a plist
 holding export options."
-  (let* ((title (org-export-data (plist-get info :title) info))
-        (info-filename (or (plist-get info :texinfo-filename)
-                           (file-name-nondirectory
-                            (org-export-output-file-name ".info"))))
-        (author (org-export-data (plist-get info :author) info))
-        (lang (org-export-data (plist-get info :language) info))
-        (texinfo-header (plist-get info :texinfo-header))
-        (texinfo-post-header (plist-get info :texinfo-post-header))
-        (subtitle (plist-get info :subtitle))
-        (subauthor (plist-get info :subauthor))
-        (class (plist-get info :texinfo-class))
-        (header (nth 1 (assoc class org-texinfo-classes)))
-        (copying
-         (org-element-map (plist-get info :parse-tree) 'headline
-           (lambda (hl) (and (org-element-property :COPYING hl) hl)) info t))
-        (dircat (plist-get info :texinfo-dircat))
-        (dirtitle (plist-get info :texinfo-dirtitle))
-        (dirdesc (plist-get info :texinfo-dirdesc))
-        ;; Spacing to align description (column 32 - 3 for `* ' and
-        ;; `.' in text.
-        (dirspacing (- 29 (length dirtitle)))
-        (menu (org-texinfo-make-menu info 'main))
-        (detail-menu (org-texinfo-make-menu info 'detailed)))
+  (let ((title (org-export-data (plist-get info :title) info))
+       ;; Copying data is the contents of the first headline in
+       ;; parse tree with a non-nil copying property.
+       (copying (org-element-map (plist-get info :parse-tree) 'headline
+                  (lambda (hl)
+                    (and (org-not-nil (org-element-property :COPYING hl))
+                         (org-element-contents hl)))
+                  info t)))
     (concat
-     ;; Header
-     header "\n"
+     "\\input texinfo    @c -*- texinfo -*-\n"
      "@c %**start of header\n"
-     ;; Filename and Title
-     "@setfilename " info-filename "\n"
-     "@settitle " title "\n"
-     ;; Coding system.
-     (format
-      "@documentencoding %s\n"
-      (catch 'coding-system
-       (let ((case-fold-search t)
-             (name (symbol-name (or org-texinfo-coding-system
-                                    buffer-file-coding-system))))
-         (dolist (system org-texinfo-supported-coding-systems "UTF-8")
-           (when (org-string-match-p (regexp-quote system) name)
-             (throw 'coding-system system))))))
-     "\n"
-     (format "@documentlanguage %s\n" lang)
-     "\n\n"
-     "@c Version and Contact Info\n"
-     "@set AUTHOR " author "\n"
-
-     ;; Additional Header Options set by `#+TEXINFO_HEADER
-     (if texinfo-header
-        (concat "\n"
-                texinfo-header
-                "\n"))
-
-     "@c %**end of header\n"
-     "@finalout\n"
-     "\n\n"
-
-     ;; Additional Header Options set by #+TEXINFO_POST_HEADER
-     (if texinfo-post-header
-        (concat "\n"
-                texinfo-post-header
-                "\n"))
-
-     ;; Copying
-     "@copying\n"
-     ;; Only export the content of the headline, do not need the
-     ;; initial headline.
-     (org-export-data (nth 2 copying) info)
-     "@end copying\n"
-     "\n\n"
-
-     ;; Info directory information
-     ;; Only supply if both title and category are provided
-     (if (and dircat dirtitle)
+     (let ((file (or (plist-get info :texinfo-filename)
+                    (let ((f (plist-get info :output-file)))
+                      (and f (concat (file-name-sans-extension f) ".info"))))))
+       (and file (format "@setfilename %s\n" file)))
+     (format "@settitle %s\n" title)
+     ;; Insert class-defined header.
+     (org-element-normalize-string
+      (let ((header (nth 1 (assoc (plist-get info :texinfo-class)
+                                 org-texinfo-classes)))
+           (coding
+            (catch 'coding-system
+              (let ((case-fold-search t)
+                    (name (symbol-name (or org-texinfo-coding-system
+                                           buffer-file-coding-system))))
+                (dolist (system org-texinfo-supported-coding-systems "UTF-8")
+                  (when (org-string-match-p (regexp-quote system) name)
+                    (throw 'coding-system system))))))
+           (language (plist-get info :language))
+           (case-fold-search nil))
+       ;; Auto coding system.
+       (replace-regexp-in-string
+        "^@documentencoding \\(AUTO\\)$"
+        coding
+        (replace-regexp-in-string
+         "^@documentlanguage \\(AUTO\\)$" language header t nil 1) t nil 1)))
+     ;; Additional header options set by #+TEXINFO_HEADER.
+     (let ((texinfo-header (plist-get info :texinfo-header)))
+       (and texinfo-header (org-element-normalize-string texinfo-header)))
+     "@c %**end of header\n\n"
+     ;; Additional options set by #+TEXINFO_POST_HEADER.
+     (let ((texinfo-post-header (plist-get info :texinfo-post-header)))
+       (and texinfo-post-header
+           (org-element-normalize-string texinfo-post-header)))
+     ;; Copying.
+     (and copying
+         (format "@copying\n%s@end copying\n\n"
+                 (org-element-normalize-string
+                  (org-export-data copying info))))
+     ;; Info directory information.  Only supply if both title and
+     ;; category are provided.
+     (let ((dircat (plist-get info :texinfo-dircat))
+          (dirtitle
+           (let ((title (plist-get info :texinfo-dirtitle)))
+             (and title
+                  (string-match "^\\(?:\\* \\)?\\(.*?\\)\\(\\.\\)?$" title)
+                  (format "* %s." (match-string 1 title))))))
+       (when (and dircat dirtitle)
         (concat "@dircategory " dircat "\n"
                 "@direntry\n"
-                "* " dirtitle "."
-                (make-string dirspacing ?\s)
-                dirdesc "\n"
-                "@end direntry\n"))
-     "\n\n"
-
+                (let ((dirdesc
+                       (let ((desc (plist-get info :texinfo-dirdesc)))
+                         (cond ((not desc) nil)
+                               ((org-string-match-p "\\.$" desc) desc)
+                               (t (concat desc "."))))))
+                  (if dirdesc (format "%-23s %s" dirtitle dirdesc) dirtitle))
+                "\n"
+                "@end direntry\n\n")))
      ;; Title
+     "@finalout\n"
      "@titlepage\n"
-     "@title " title "\n\n"
-     (if subtitle
-        (concat "@subtitle " subtitle "\n"))
-     "@author " author "\n"
-     (if subauthor
-        (concat subauthor "\n"))
-     "\n"
-     "@c The following two commands start the copyright page.\n"
-     "@page\n"
-     "@vskip 0pt plus 1filll\n"
-     "@insertcopying\n"
+     (format "@title %s\n" (or (plist-get info :texinfo-printed-title) title))
+     (let ((subtitle (plist-get info :subtitle)))
+       (and subtitle
+           (org-element-normalize-string
+            (replace-regexp-in-string "^" "@subtitle " subtitle))))
+     (when (plist-get info :with-author)
+       (concat
+       ;; Primary author.
+       (let ((author (org-string-nw-p
+                      (org-export-data (plist-get info :author) info)))
+             (email (and (plist-get info :with-email)
+                         (org-string-nw-p
+                          (org-export-data (plist-get info :email) info)))))
+         (cond ((and author email)
+                (format "@author %s (@email{%s})\n" author email))
+               (author (format "@author %s\n" author))
+               (email (format "@author @email{%s}\n" email))))
+       ;; Other authors.
+       (let ((subauthor (plist-get info :subauthor)))
+         (and subauthor
+              (org-element-normalize-string
+               (replace-regexp-in-string "^" "@author " subauthor))))))
+     (and copying "@page\n@vskip 0pt plus 1filll\n@insertcopying\n")
      "@end titlepage\n\n"
-     "@c Output the table of contents at the beginning.\n"
-     "@contents\n\n"
-
+     ;; Table of contents.
+     (and (plist-get info :with-toc) "@contents\n\n")
      ;; Configure Top Node when not for Tex
      "@ifnottex\n"
      "@node Top\n"
-     "@top " title " Manual\n"
-     "@insertcopying\n"
+     (format "@top %s\n" title)
+     (and copying "@insertcopying\n")
      "@end ifnottex\n\n"
-
-     ;; Do not output menus if they are empty
-     (if menu
-        ;; Menu
-        (concat "@menu\n"
-                menu
-                "\n\n"
-                ;; Detailed Menu
-                (if detail-menu
-                    (concat "@detailmenu\n"
-                            " --- The Detailed Node Listing ---\n"
-                            detail-menu
-                            "\n\n"
-                            "@end detailmenu\n"))
-                "@end menu\n"))
-     "\n\n"
-
-     ;; Document's body.
-     contents
+     ;; Menu.
+     (org-texinfo-make-menu (plist-get info :parse-tree) info 'master)
      "\n"
+     ;; Document's body.
+     contents "\n"
      ;; Creator.
-     (let ((creator-info (plist-get info :with-creator)))
-       (cond
-       ((not creator-info) "")
-       ((eq creator-info 'comment)
-        (format "@c %s\n" (plist-get info :creator)))
-       (t (concat (plist-get info :creator) "\n"))))
+     (case (plist-get info :with-creator)
+       ((nil) nil)
+       (comment (format "@c %s\n" (plist-get info :creator)))
+       (otherwise (concat (plist-get info :creator) "\n")))
      ;; Document end.
-     "\n@bye")))
+     "@bye")))
 
 
 \f
 ;;; Transcode Functions
 
-;;; Bold
+;;;; Bold
 
 (defun org-texinfo-bold (bold contents info)
   "Transcode BOLD from Org to Texinfo.
@@ -826,7 +639,7 @@ CONTENTS is the text with bold markup.  INFO is a plist holding
 contextual information."
   (org-texinfo--text-markup contents 'bold))
 
-;;; Center Block
+;;;; Center Block
 
 (defun org-texinfo-center-block (center-block contents info)
   "Transcode a CENTER-BLOCK element from Org to Texinfo.
@@ -834,7 +647,7 @@ CONTENTS holds the contents of the block.  INFO is a plist used
 as a communication channel."
   contents)
 
-;;; Clock
+;;;; Clock
 
 (defun org-texinfo-clock (clock contents info)
   "Transcode a CLOCK element from Org to Texinfo.
@@ -851,7 +664,7 @@ information."
                     (and time (format " (%s)" time)))))
    "@*"))
 
-;;; Code
+;;;; Code
 
 (defun org-texinfo-code (code contents info)
   "Transcode a CODE object from Org to Texinfo.
@@ -859,23 +672,7 @@ CONTENTS is nil.  INFO is a plist used as a communication
 channel."
   (org-texinfo--text-markup (org-element-property :value code) 'code))
 
-;;; Comment
-
-(defun org-texinfo-comment (comment contents info)
-  "Transcode a COMMENT object from Org to Texinfo.
-CONTENTS is the text in the comment.  INFO is a plist holding
-contextual information."
-  (org-texinfo--text-markup (org-element-property :value comment) 'comment))
-
-;;; Comment Block
-
-(defun org-texinfo-comment-block (comment-block contents info)
-  "Transcode a COMMENT-BLOCK object from Org to Texinfo.
-CONTENTS is the text within the block.  INFO is a plist holding
-contextual information."
-  (format "@ignore\n%s@end ignore" (org-element-property :value comment-block)))
-
-;;; Drawer
+;;;; Drawer
 
 (defun org-texinfo-drawer (drawer contents info)
   "Transcode a DRAWER element from Org to Texinfo.
@@ -886,15 +683,15 @@ holding contextual information."
                          name contents)))
     output))
 
-;;; Dynamic Block
+;;;; Dynamic Block
 
 (defun org-texinfo-dynamic-block (dynamic-block contents info)
   "Transcode a DYNAMIC-BLOCK element from Org to Texinfo.
 CONTENTS holds the contents of the block.  INFO is a plist
-holding contextual information.  See `org-export-data'."
+holding contextual information."
   contents)
 
-;;; Entity
+;;;; Entity
 
 (defun org-texinfo-entity (entity contents info)
   "Transcode an ENTITY object from Org to Texinfo.
@@ -903,7 +700,7 @@ contextual information."
   (let ((ent (org-element-property :latex entity)))
     (if (org-element-property :latex-math-p entity) (format "@math{%s}" ent) ent)))
 
-;;; Example Block
+;;;; Example Block
 
 (defun org-texinfo-example-block (example-block contents info)
   "Transcode an EXAMPLE-BLOCK element from Org to Texinfo.
@@ -912,7 +709,7 @@ information."
   (format "@verbatim\n%s@end verbatim"
          (org-export-format-code-default example-block info)))
 
-;;; Export Block
+;;;; Export Block
 
 (defun org-texinfo-export-block (export-block contents info)
   "Transcode a EXPORT-BLOCK element from Org to Texinfo.
@@ -920,7 +717,7 @@ CONTENTS is nil.  INFO is a plist holding contextual information."
   (when (string= (org-element-property :type export-block) "TEXINFO")
     (org-remove-indentation (org-element-property :value export-block))))
 
-;;; Export Snippet
+;;;; Export Snippet
 
 (defun org-texinfo-export-snippet (export-snippet contents info)
   "Transcode a EXPORT-SNIPPET object from Org to Texinfo.
@@ -928,7 +725,7 @@ CONTENTS is nil.  INFO is a plist holding contextual information."
   (when (eq (org-export-snippet-backend export-snippet) 'texinfo)
     (org-element-property :value export-snippet)))
 
-;;; Fixed Width
+;;;; Fixed Width
 
 (defun org-texinfo-fixed-width (fixed-width contents info)
   "Transcode a FIXED-WIDTH element from Org to Texinfo.
@@ -938,8 +735,7 @@ CONTENTS is nil.  INFO is a plist holding contextual information."
           (org-texinfo--sanitize-content
            (org-element-property :value fixed-width)))))
 
-;;; Footnote Reference
-;;
+;;;; Footnote Reference
 
 (defun org-texinfo-footnote-reference (footnote contents info)
   "Create a footnote reference for FOOTNOTE.
@@ -950,7 +746,7 @@ plist holding contextual information."
     (format "@footnote{%s}"
            (org-trim (org-export-data def info)))))
 
-;;; Headline
+;;;; Headline
 
 (defun org-texinfo-headline (headline contents info)
   "Transcode a HEADLINE element from Org to Texinfo.
@@ -960,66 +756,29 @@ holding contextual information."
         (level (org-export-get-relative-level headline info))
         (numberedp (org-export-numbered-headline-p headline info))
         (class-sectioning (assoc class org-texinfo-classes))
-        ;; Find the index type, if any
+        ;; Find the index type, if any.
         (index (org-element-property :INDEX headline))
-        ;; Check if it is an appendix
-        (appendix (org-element-property :APPENDIX headline))
-        ;; Retrieve headline text
-        (text (org-texinfo--sanitize-headline
-               (org-element-property :title headline) info))
         ;; Create node info, to insert it before section formatting.
-        ;; Use custom menu title if present
+        ;; Use custom menu title if present.
         (node (format "@node %s\n" (org-texinfo--get-node headline info)))
-        ;; Menus must be generated with first child, otherwise they
-        ;; will not nest properly
-        (menu (let* ((first (org-export-first-sibling-p headline info))
-                     (parent (org-export-get-parent-headline headline))
-                     (title (org-texinfo--sanitize-headline
-                             (org-element-property :title parent) info))
-                     heading listing
-                     (tree (plist-get info :parse-tree)))
-                (if first
-                    (org-element-map (plist-get info :parse-tree) 'headline
-                      (lambda (ref)
-                        (if (member title (org-element-property :title ref))
-                            (push ref heading)))
-                      info t))
-                (setq listing (org-texinfo--build-menu
-                               (car heading) level info))
-                (if listing
-                    (setq listing (replace-regexp-in-string
-                                   "%" "%%" listing)
-                          listing (format
-                                   "\n@menu\n%s\n@end menu\n\n" listing))
-                  'nil)))
         ;; Section formatting will set two placeholders: one for the
         ;; title and the other for the contents.
         (section-fmt
-         (let ((sec (if (and (symbolp (nth 2 class-sectioning))
-                             (fboundp (nth 2 class-sectioning)))
-                        (funcall (nth 2 class-sectioning) level numberedp)
-                      (nth (1+ level) class-sectioning))))
-           (cond
-            ;; No section available for that LEVEL.
-            ((not sec) nil)
-            ;; Section format directly returned by a function.
-            ((stringp sec) sec)
-            ;; (numbered-section . unnumbered-section)
-            ((not (consp (cdr sec)))
+         (if (org-not-nil (org-element-property :APPENDIX headline))
+             "@appendix %s\n%s"
+           (let ((sec (if (and (symbolp (nth 2 class-sectioning))
+                               (fboundp (nth 2 class-sectioning)))
+                          (funcall (nth 2 class-sectioning) level numberedp)
+                        (nth (1+ level) class-sectioning))))
              (cond
-              ;;If an index, always unnumbered
-              (index
-               (concat menu node (cdr sec) "\n%s"))
-              (appendix
-               (concat menu node (replace-regexp-in-string
-                                  "unnumbered"
-                                  "appendix"
-                                  (cdr sec)) "\n%s"))
-               ;; Otherwise number as needed.
-              (t
-               (concat menu node
-                       (funcall
-                        (if numberedp #'car #'cdr) sec) "\n%s")))))))
+              ;; No section available for that LEVEL.
+              ((not sec) nil)
+              ;; Section format directly returned by a function.
+              ((stringp sec) sec)
+              ;; (numbered-section . unnumbered-section)
+              ((not (consp (cdr sec)))
+               (concat (if (or index (not numberedp)) (cdr sec) (car sec))
+                       "\n%s"))))))
         (todo
          (and (plist-get info :with-todo-keywords)
               (let ((todo (org-element-property :todo-keyword headline)))
@@ -1029,100 +788,54 @@ holding contextual information."
                    (org-export-get-tags headline info)))
         (priority (and (plist-get info :with-priority)
                        (org-element-property :priority headline)))
-        ;; Create the headline text along with a no-tag version.  The
-        ;; latter is required to remove tags from table of contents.
-        (full-text (org-texinfo--sanitize-content
-                    (if (not (eq org-texinfo-format-headline-function 'ignore))
-                        ;; User-defined formatting function.
-                        (funcall org-texinfo-format-headline-function
-                                 todo todo-type priority text tags)
-                      ;; Default formatting.
-                      (concat
-                       (when todo
-                         (format "@strong{%s} " todo))
-                       (when priority (format "@emph{#%s} " priority))
-                       text
-                       (when tags
-                         (format " :%s:"
-                                 (mapconcat 'identity tags ":")))))))
-        (full-text-no-tag
-         (org-texinfo--sanitize-content
-          (if (not (eq org-texinfo-format-headline-function 'ignore))
-              ;; User-defined formatting function.
-              (funcall org-texinfo-format-headline-function
-                       todo todo-type priority text nil)
-            ;; Default formatting.
-            (concat
-             (when todo (format "@strong{%s} " todo))
-             (when priority (format "@emph{#%c} " priority))
-             text))))
-        (pre-blanks
-         (make-string (org-element-property :pre-blank headline) 10)))
+        (text (org-export-data (org-element-property :title headline) info))
+        (full-text (if (not (eq org-texinfo-format-headline-function 'ignore))
+                       ;; User-defined formatting function.
+                       (funcall org-texinfo-format-headline-function
+                                todo todo-type priority text tags)
+                     ;; Default formatting.
+                     (concat
+                      (when todo
+                        (format "@strong{%s} " todo))
+                      (when priority (format "@emph{#%s} " priority))
+                      text
+                      (when tags
+                        (format " :%s:"
+                                (mapconcat 'identity tags ":"))))))
+        (contents (if (org-string-nw-p contents) (concat "\n" contents) "")))
     (cond
      ;; Case 1: This is a footnote section: ignore it.
      ((org-element-property :footnote-section-p headline) nil)
      ;; Case 2: This is the `copying' section: ignore it
      ;;         This is used elsewhere.
-     ((org-element-property :COPYING headline) nil)
+     ((org-not-nil (org-element-property :COPYING headline)) nil)
      ;; Case 3: An index.  If it matches one of the known indexes,
      ;;         print it as such following the contents, otherwise
      ;;         print the contents and leave the index up to the user.
      (index
-      (format
-       section-fmt full-text
-       (concat pre-blanks contents "\n"
-              (if (member index '("cp" "fn" "ky" "pg" "tp" "vr"))
-                  (concat "@printindex " index)))))
+      (concat node
+             (format
+              section-fmt
+              full-text
+              (concat contents
+                      (and (member index '("cp" "fn" "ky" "pg" "tp" "vr"))
+                           (concat "\n@printindex " index))))))
      ;; Case 4: This is a deep sub-tree: export it as a list item.
      ;;         Also export as items headlines for which no section
      ;;         format has been found.
      ((or (not section-fmt) (org-export-low-level-p headline info))
       ;; Build the real contents of the sub-tree.
-      (let ((low-level-body
-            (concat
-             ;; If the headline is the first sibling, start a list.
-             (when (org-export-first-sibling-p headline info)
-               (format "@%s\n" (if numberedp 'enumerate 'itemize)))
-             ;; Itemize headline
-             "@item\n" full-text "\n" pre-blanks contents)))
-       ;; If headline is not the last sibling simply return
-       ;; LOW-LEVEL-BODY.  Otherwise, also close the list, before any
-       ;; blank line.
-       (if (not (org-export-last-sibling-p headline info)) low-level-body
-         (replace-regexp-in-string
-          "[ \t\n]*\\'"
-          (format "\n@end %s" (if numberedp 'enumerate 'itemize))
-          low-level-body))))
+      (concat (and (org-export-first-sibling-p headline info)
+                  (format "@%s\n" (if numberedp 'enumerate 'itemize)))
+             "@item\n" full-text "\n"
+             contents
+             (if (org-export-last-sibling-p headline info)
+                 (format "@end %s" (if numberedp 'enumerate 'itemize))
+               "\n")))
      ;; Case 5: Standard headline.  Export it as a section.
-     (t
-      (cond
-       ((not (and tags (eq (plist-get info :with-tags) 'not-in-toc)))
-       ;; Regular section.  Use specified format string.
-       (format (replace-regexp-in-string "%]" "%%]" section-fmt) full-text
-               (concat pre-blanks contents)))
-       ((string-match "\\`@\\(.*?\\){" section-fmt)
-       ;; If tags should be removed from table of contents, insert
-       ;; title without tags as an alternative heading in sectioning
-       ;; command.
-       (format (replace-match (concat (match-string 1 section-fmt) "[%s]")
-                              nil nil section-fmt 1)
-               ;; Replace square brackets with parenthesis since
-               ;; square brackets are not supported in optional
-               ;; arguments.
-               (replace-regexp-in-string
-                "\\[" "("
-                (replace-regexp-in-string
-                 "\\]" ")"
-                 full-text-no-tag))
-               full-text
-               (concat pre-blanks contents)))
-       (t
-       ;; Impossible to add an alternative heading.  Fallback to
-       ;; regular sectioning format string.
-       (format (replace-regexp-in-string "%]" "%%]" section-fmt) full-text
-               (concat pre-blanks contents))))))))
-
-;;; Inline Src Block
+     (t (concat node (format section-fmt full-text contents))))))
+
+;;;; Inline Src Block
 
 (defun org-texinfo-inline-src-block (inline-src-block contents info)
   "Transcode an INLINE-SRC-BLOCK element from Org to Texinfo.
@@ -1132,7 +845,7 @@ contextual information."
         (separator (org-texinfo--find-verb-separator code)))
     (concat "@verb{" separator code separator "}")))
 
-;;; Inlinetask
+;;;; Inlinetask
 
 (defun org-texinfo-inlinetask (inlinetask contents info)
   "Transcode an INLINETASK element from Org to Texinfo.
@@ -1165,7 +878,7 @@ holding contextual information."
                        "\n")
                full-title contents)))))
 
-;;; Italic
+;;;; Italic
 
 (defun org-texinfo-italic (italic contents info)
   "Transcode ITALIC from Org to Texinfo.
@@ -1173,18 +886,18 @@ CONTENTS is the text with italic markup.  INFO is a plist holding
 contextual information."
   (org-texinfo--text-markup contents 'italic))
 
-;;; Item
+;;;; Item
 
 (defun org-texinfo-item (item contents info)
   "Transcode an ITEM element from Org to Texinfo.
 CONTENTS holds the contents of the item.  INFO is a plist holding
 contextual information."
-  (let* ((tag (org-element-property :tag item))
-        (desc (org-export-data tag info)))
-    (concat "\n@item " (if tag desc) "\n"
-           (and contents (org-trim contents)) "\n")))
+  (format "@item%s\n%s"
+         (let ((tag (org-element-property :tag item)))
+           (if tag (concat " " (org-export-data tag info)) ""))
+         (or contents "")))
 
-;;; Keyword
+;;;; Keyword
 
 (defun org-texinfo-keyword (keyword contents info)
   "Transcode a KEYWORD element from Org to Texinfo.
@@ -1200,14 +913,14 @@ CONTENTS is nil.  INFO is a plist holding contextual information."
      ((string= key "TINDEX") (format "@tindex %s" value))
      ((string= key "VINDEX") (format "@vindex %s" value)))))
 
-;;; Line Break
+;;;; Line Break
 
 (defun org-texinfo-line-break (line-break contents info)
   "Transcode a LINE-BREAK object from Org to Texinfo.
 CONTENTS is nil.  INFO is a plist holding contextual information."
   "@*\n")
 
-;;; Link
+;;;; Link
 
 (defun org-texinfo-link (link desc info)
   "Transcode a LINK object from Org to Texinfo.
@@ -1225,55 +938,69 @@ INFO is a plist holding contextual information.  See
                ((and (string= type "file") (file-name-absolute-p raw-path))
                 (concat "file:" raw-path))
                (t raw-path)))
-        (email (if (string= type "mailto")
-                   (let ((text (replace-regexp-in-string
-                                "@" "@@" raw-path)))
-                     (concat text (if desc (concat "," desc))))))
         protocol)
     (cond
-     ;; Links pointing to a headline: Find destination and build
-     ;; appropriate referencing command.
-     ((member type '("custom-id" "id"))
-      (let ((destination (org-export-resolve-id-link link info)))
+     ((equal type "radio")
+      (let ((destination (org-export-resolve-radio-link link info)))
+       (if (not destination) desc
+         (format "@ref{%s,,%s}"
+                 (org-texinfo--get-node destination info)
+                 desc))))
+     ((member type '("custom-id" "id" "fuzzy"))
+      (let ((destination
+            (if (equal type "fuzzy")
+                (org-export-resolve-fuzzy-link link info)
+              (org-export-resolve-id-link link info))))
        (case (org-element-type destination)
+         ((nil)
+          (format org-texinfo-link-with-unknown-path-format
+                  (org-texinfo--sanitize-content path)))
          ;; Id link points to an external file.
          (plain-text
           (if desc (format "@uref{file://%s,%s}" destination desc)
             (format "@uref{file://%s}" destination)))
-         ;; LINK points to a headline.  Use the headline as the NODE target
          (headline
           (format "@ref{%s,%s}"
                   (org-texinfo--get-node destination info)
-                  (or desc "")))
+                  (cond
+                   (desc)
+                   ((org-export-numbered-headline-p destination info)
+                    (org-export-data
+                     (org-element-property :title destination) info))
+                   (t
+                    (mapconcat
+                     #'number-to-string
+                     (org-export-get-headline-number destination info) ".")))))
          (otherwise
-          (let ((path (org-export-solidify-link-text path)))
-            (if (not desc) (format "@ref{%s}" path)
-              (format "@ref{%s,,%s}" path desc)))))))
-     ((member type '("info"))
+          (let ((topic
+                 (or desc
+                     (if (and (eq (org-element-type destination) 'headline)
+                              (not (org-export-numbered-headline-p
+                                    destination info)))
+                         (org-export-data
+                          (org-element-property :title destination) info))
+                     (let ((n (org-export-get-ordinal destination info)))
+                       (cond
+                        ((not n) nil)
+                        ((integerp n) n)
+                        (t (mapconcat #'number-to-string n ".")))))))
+            (when topic
+              (format "@ref{%s,,%s}"
+                      (org-texinfo--get-node destination info)
+                      topic)))))))
+     ((equal type "info")
       (let* ((info-path (split-string path "[:#]"))
             (info-manual (car info-path))
             (info-node (or (cadr info-path) "top"))
             (title (or desc "")))
        (format "@ref{%s,%s,,%s,}" info-node title info-manual)))
-     ((member type '("fuzzy"))
-      (let ((destination (org-export-resolve-fuzzy-link link info)))
-       (case (org-element-type destination)
-         ;; Id link points to an external file.
-         (plain-text
-          (if desc (format "@uref{file://%s,%s}" destination desc)
-            (format "@uref{file://%s}" destination)))
-         ;; LINK points to a headline.  Use the headline as the NODE target
-         (headline
-          (format "@ref{%s,%s}"
-                  (org-texinfo--get-node destination info)
-                  (or desc "")))
-         (otherwise
-          (let ((path (org-export-solidify-link-text path)))
-            (if (not desc) (format "@ref{%s}" path)
-              (format "@ref{%s,,%s}" path desc)))))))
-     ;; Special case for email addresses
-     (email
-      (format "@email{%s}" email))
+     ((string= type "mailto")
+      (format "@email{%s}"
+             (concat (org-texinfo--sanitize-content path)
+                     (and desc (concat "," desc)))))
+     ((let ((protocol (nth 2 (assoc type org-link-protocols))))
+       (and (functionp protocol)
+            (funcall protocol (org-link-unescape path) desc 'texinfo))))
      ;; External link with a description part.
      ((and path desc) (format "@uref{%s,%s}" path desc))
      ;; External link without a description part.
@@ -1282,27 +1009,97 @@ INFO is a plist holding contextual information.  See
      (t (format org-texinfo-link-with-unknown-path-format desc)))))
 
 
-;;; Menu
-
-(defun org-texinfo-make-menu (info level)
-  "Create the menu for inclusion in the texifo document.
-
-INFO is the parsed buffer that contains the headlines.  LEVEL
-determines whether to make the main menu, or the detailed menu.
-
-This is only used for generating the primary menu.  In-Node menus
-are generated directly."
-  (let ((parse (plist-get info :parse-tree)))
-    (cond
-     ;; Generate the main menu
-     ((eq level 'main) (org-texinfo--build-menu parse 1 info))
-     ;; Generate the detailed (recursive) menu
-     ((eq level 'detailed)
-      ;; Requires recursion
-      ;;(org-texinfo--build-detailed-menu parse top info)
-      (org-texinfo--build-menu parse 1 info 'detailed)))))
-
-;;; Paragraph
+;;;; Menu
+
+(defun org-texinfo-make-menu (scope info &optional master)
+  "Create the menu for inclusion in the Texinfo document.
+
+SCOPE is a headline or a full parse tree.  INFO is the
+communication channel, as a plist.
+
+When optional argument MASTER is non-nil, generate a master menu,
+including detailed node listing."
+  (let ((menu (org-texinfo--build-menu scope info)))
+    (when (org-string-nw-p menu)
+      (org-element-normalize-string
+       (format
+       "@menu\n%s@end menu"
+       (concat menu
+               (when master
+                 (let ((detailmenu
+                        (org-texinfo--build-menu
+                         scope info
+                         (let ((toc-depth (plist-get info :with-toc)))
+                           (if (wholenump toc-depth) toc-depth
+                             org-texinfo-max-toc-depth)))))
+                   (when (org-string-nw-p detailmenu)
+                     (concat "\n@detailmenu\n"
+                             "--- The Detailed Node Listing ---\n\n"
+                             detailmenu
+                             "@end detailmenu\n"))))))))))
+
+(defun org-texinfo--build-menu (scope info &optional level)
+  "Build menu for entries within SCOPE.
+SCOPE is a headline or a full parse tree.  INFO is a plist
+containing contextual information.  When optional argument LEVEL
+is an integer, build the menu recursively, down to this depth."
+  (cond
+   ((not level)
+    (org-texinfo--format-entries (org-texinfo--menu-entries scope info) info))
+   ((zerop level) nil)
+   (t
+    (org-element-normalize-string
+     (mapconcat
+      (lambda (h)
+       (let ((entries (org-texinfo--menu-entries h info)))
+         (when entries
+           (concat
+            (format "%s\n\n%s\n"
+                    (org-export-data (org-export-get-alt-title h info) info)
+                    (org-texinfo--format-entries entries info))
+            (org-texinfo--build-menu h info (1- level))))))
+      (org-texinfo--menu-entries scope info) "")))))
+
+(defun org-texinfo--format-entries (entries info)
+  "Format all direct menu entries in SCOPE, as a string.
+SCOPE is either a headline or a full Org document.  INFO is
+a plist containing contextual information."
+  (org-element-normalize-string
+   (mapconcat
+    (lambda (h)
+      (let* ((title (org-export-data
+                    (org-export-get-alt-title h info) info))
+            (node (org-texinfo--get-node h info))
+            (entry (concat "* " title ":"
+                           (if (string= title node) ":"
+                             (concat " " node ". "))))
+            (desc (org-element-property :DESCRIPTION h)))
+       (if (not desc) entry
+         (format (format "%%-%ds %%s" org-texinfo-node-description-column)
+                 entry desc))))
+    entries "\n")))
+
+(defun org-texinfo--menu-entries (scope info)
+  "List direct children in SCOPE needing a menu entry.
+SCOPE is a headline or a full parse tree.  INFO is a plist
+holding contextual information."
+  (let* ((cache (or (plist-get info :texinfo-entries-cache)
+                   (plist-get (plist-put info :texinfo-entries-cache
+                                         (make-hash-table :test #'eq))
+                              :texinfo-entries-cache)))
+        (cached-entries (gethash scope cache 'no-cache)))
+    (if (not (eq cached-entries 'no-cache)) cached-entries
+      (puthash scope
+              (org-element-map (org-element-contents scope) 'headline
+                (lambda (h)
+                  (and (not (org-not-nil (org-element-property :COPYING h)))
+                       (not (org-element-property :footnote-section-p h))
+                       (not (org-export-low-level-p h info))
+                       h))
+                info nil 'headline)
+              cache))))
+
+;;;; Paragraph
 
 (defun org-texinfo-paragraph (paragraph contents info)
   "Transcode a PARAGRAPH element from Org to Texinfo.
@@ -1310,32 +1107,27 @@ CONTENTS is the contents of the paragraph, as a string.  INFO is
 the plist used as a communication channel."
   contents)
 
-;;; Plain List
+;;;; Plain List
 
 (defun org-texinfo-plain-list (plain-list contents info)
   "Transcode a PLAIN-LIST element from Org to Texinfo.
 CONTENTS is the contents of the list.  INFO is a plist holding
 contextual information."
   (let* ((attr (org-export-read-attribute :attr_texinfo plain-list))
-        (indic (or (plist-get attr :indic)
-                   org-texinfo-def-table-markup))
-        (type (org-element-property :type plain-list))
+        (indic (or (plist-get attr :indic) org-texinfo-def-table-markup))
         (table-type (plist-get attr :table-type))
-        ;; Ensure valid texinfo table type.
-        (table-type (if (member table-type '("ftable" "vtable")) table-type
-                      "table"))
+        (type (org-element-property :type plain-list))
         (list-type (cond
                     ((eq type 'ordered) "enumerate")
                     ((eq type 'unordered) "itemize")
-                    ((eq type 'descriptive) table-type))))
-    (format "@%s%s\n@end %s"
-           (if (eq type 'descriptive)
-               (concat list-type " " indic)
-             list-type)
+                    ((member table-type '("ftable" "vtable")) table-type)
+                    (t "table"))))
+    (format "@%s\n%s@end %s"
+           (if (eq type 'descriptive) (concat list-type " " indic) list-type)
            contents
            list-type)))
 
-;;; Plain Text
+;;;; Plain Text
 
 (defun org-texinfo-plain-text (text info)
   "Transcode a TEXT string from Org to Texinfo.
@@ -1366,7 +1158,7 @@ contextual information."
     ;; Return value.
     output))
 
-;;; Planning
+;;;; Planning
 
 (defun org-texinfo-planning (planning contents info)
   "Transcode a PLANNING element from Org to Texinfo.
@@ -1402,7 +1194,7 @@ information."
     " ")
    "@*"))
 
-;;; Property Drawer
+;;;; Property Drawer
 
 (defun org-texinfo-property-drawer (property-drawer contents info)
   "Transcode a PROPERTY-DRAWER element from Org to Texinfo.
@@ -1412,7 +1204,7 @@ information."
   ;; lines nonetheless.
   "")
 
-;;; Quote Block
+;;;; Quote Block
 
 (defun org-texinfo-quote-block (quote-block contents info)
   "Transcode a QUOTE-BLOCK element from Org to Texinfo.
@@ -1424,7 +1216,7 @@ holding contextual information."
                                  (format " %s" title)))))
     (format "%s\n%s@end quotation" start-quote contents)))
 
-;;; Quote Section
+;;;; Quote Section
 
 (defun org-texinfo-quote-section (quote-section contents info)
   "Transcode a QUOTE-SECTION element from Org to Texinfo.
@@ -1433,7 +1225,7 @@ CONTENTS is nil.  INFO is a plist holding contextual information."
                (org-element-property :value quote-section))))
     (when value (format "@verbatim\n%s@end verbatim" value))))
 
-;;; Radio Target
+;;;; Radio Target
 
 (defun org-texinfo-radio-target (radio-target text info)
   "Transcode a RADIO-TARGET object from Org to Texinfo.
@@ -1444,15 +1236,17 @@ contextual information."
           (org-element-property :value radio-target))
          text))
 
-;;; Section
+;;;; Section
 
 (defun org-texinfo-section (section contents info)
   "Transcode a SECTION element from Org to Texinfo.
 CONTENTS holds the contents of the section.  INFO is a plist
 holding contextual information."
-  contents)
+  (concat contents
+         (let ((parent (org-export-get-parent-headline section)))
+           (and parent (org-texinfo-make-menu parent info)))))
 
-;;; Special Block
+;;;; Special Block
 
 (defun org-texinfo-special-block (special-block contents info)
   "Transcode a SPECIAL-BLOCK element from Org to Texinfo.
@@ -1460,34 +1254,26 @@ CONTENTS holds the contents of the block.  INFO is a plist used
 as a communication channel."
   contents)
 
-;;; Src Block
+;;;; Src Block
 
 (defun org-texinfo-src-block (src-block contents info)
   "Transcode a SRC-BLOCK element from Org to Texinfo.
 CONTENTS holds the contents of the item.  INFO is a plist holding
 contextual information."
-  (let* ((lang (org-element-property :language src-block))
-        (lisp-p (string-match-p "lisp" lang))
-        (src-contents (org-texinfo--sanitize-content
-                  (org-export-format-code-default src-block info))))
-    (cond
-     ;; Case 1.  Lisp Block
-     (lisp-p
-      (format "@lisp\n%s@end lisp"
-             src-contents))
-     ;; Case 2.  Other blocks
-     (t
-      (format "@example\n%s@end example"
-             src-contents)))))
+  (let ((lispp (org-string-match-p "lisp"
+                                  (org-element-property :language src-block)))
+       (code (org-texinfo--sanitize-content
+              (org-export-format-code-default src-block info))))
+    (format (if lispp "@lisp\n%s@end lisp" "@example\n%s@end example") code)))
 
-;;; Statistics Cookie
+;;;; Statistics Cookie
 
 (defun org-texinfo-statistics-cookie (statistics-cookie contents info)
   "Transcode a STATISTICS-COOKIE object from Org to Texinfo.
 CONTENTS is nil.  INFO is a plist holding contextual information."
   (org-element-property :value statistics-cookie))
 
-;;; Subscript
+;;;; Subscript
 
 (defun org-texinfo-subscript (subscript contents info)
   "Transcode a SUBSCRIPT object from Org to Texinfo.
@@ -1495,7 +1281,7 @@ CONTENTS is the contents of the object.  INFO is a plist holding
 contextual information."
   (format "@math{_%s}" contents))
 
-;;; Superscript
+;;;; Superscript
 
 (defun org-texinfo-superscript (superscript contents info)
   "Transcode a SUPERSCRIPT object from Org to Texinfo.
@@ -1503,96 +1289,47 @@ CONTENTS is the contents of the object.  INFO is a plist holding
 contextual information."
   (format "@math{^%s}" contents))
 
-;;; Table
-;;
-;; `org-texinfo-table' is the entry point for table transcoding.  It
-;; takes care of tables with a "verbatim" attribute.  Otherwise, it
-;; delegates the job to either `org-texinfo-table--table.el-table' or
-;; `org-texinfo-table--org-table' functions, depending of the type of
-;; the table.
-;;
-;; `org-texinfo-table--align-string' is a subroutine used to build
-;; alignment string for Org tables.
+;;;; Table
 
 (defun org-texinfo-table (table contents info)
   "Transcode a TABLE element from Org to Texinfo.
 CONTENTS is the contents of the table.  INFO is a plist holding
 contextual information."
-  (cond
-   ;; Case 1: verbatim table.
-   ((or org-texinfo-tables-verbatim
-       (let ((attr (mapconcat 'identity
-                              (org-element-property :attr_latex table)
-                              " ")))
-         (and attr (string-match "\\<verbatim\\>" attr))))
-    (format "@verbatim \n%s\n@end verbatim"
-           ;; Re-create table, without affiliated keywords.
-           (org-trim
-            (org-element-interpret-data
-             `(table nil ,@(org-element-contents table))))))
-   ;; Case 2: table.el table.  Convert it using appropriate tools.
-   ((eq (org-element-property :type table) 'table.el)
-    (org-texinfo-table--table.el-table table contents info))
-   ;; Case 3: Standard table.
-   (t (org-texinfo-table--org-table table contents info))))
+  (if (eq (org-element-property :type table) 'table.el)
+      (format "@verbatim\n%s@end verbatim"
+             (org-element-normalize-string
+              (org-element-property :value table)))
+    (let* ((col-width (org-export-read-attribute :attr_texinfo table :columns))
+          (columns
+           (if col-width (format "@columnfractions %s" col-width)
+             (org-texinfo-table-column-widths table info))))
+      (format "@multitable %s\n%s@end multitable"
+             columns
+             contents))))
 
 (defun org-texinfo-table-column-widths (table info)
   "Determine the largest table cell in each column to process alignment.
-
 TABLE is the table element to transcode.  INFO is a plist used as
 a communication channel."
-  (let* ((rows (org-element-map table 'table-row 'identity info))
-        (collected (loop for row in rows collect
-                         (org-element-map row 'table-cell 'identity info)))
-        (number-cells (length (car collected)))
-        cells counts)
-    (loop for row in collected do
-         (push (mapcar (lambda (ref)
-                         (let* ((start (org-element-property :contents-begin ref))
-                                (end (org-element-property :contents-end ref))
-                                (length (- end start)))
-                           length)) row) cells))
-    (setq cells (org-remove-if 'null cells))
-    (push (loop for count from 0 to (- number-cells 1) collect
-               (loop for item in cells collect
-                     (nth count item))) counts)
-    (mapconcat (lambda (size)
-                (make-string size ?a)) (mapcar (lambda (ref)
-                                                 (apply 'max `(,@ref))) (car counts))
-                "} {")))
-
-(defun org-texinfo-table--org-table (table contents info)
-  "Return appropriate Texinfo code for an Org table.
-
-TABLE is the table type element to transcode.  CONTENTS is its
-contents, as a string.  INFO is a plist used as a communication
-channel.
-
-This function assumes TABLE has `org' as its `:type' attribute."
-  (let* ((attr (org-export-read-attribute :attr_texinfo table))
-        (col-width (plist-get attr :columns))
-        (columns (if col-width
-                     (format "@columnfractions %s"
-                             col-width)
-                   (format "{%s}"
-                           (org-texinfo-table-column-widths
-                            table info)))))
-    ;; Prepare the final format string for the table.
-    (cond
-     ;; Longtable.
-     ;; Others.
-     (t (concat
-        (format "@multitable %s\n%s@end multitable"
-                columns
-                contents))))))
-
-(defun org-texinfo-table--table.el-table (table contents info)
-  "Returns nothing.
-
-Rather than return an invalid table, nothing is returned."
-  'nil)
-
-;;; Table Cell
+  (let ((widths (make-vector (cdr (org-export-table-dimensions table info)) 0)))
+    (org-element-map table 'table-row
+      (lambda (row)
+       (let ((idx 0))
+         (org-element-map row 'table-cell
+           (lambda (cell)
+             ;; Length of the cell in the original buffer is only an
+             ;; approximation of the length of the cell in the
+             ;; output.  It can sometimes fail (e.g. it considers
+             ;; "/a/" being larger than "ab").
+             (let ((w (- (org-element-property :contents-end cell)
+                         (org-element-property :contents-begin cell))))
+               (aset widths idx (max w (aref widths idx))))
+             (incf idx))
+           info)))
+      info)
+    (format "{%s}" (mapconcat (lambda (w) (make-string w ?a)) widths "} {"))))
+
+;;;; Table Cell
 
 (defun org-texinfo-table-cell (table-cell contents info)
   "Transcode a TABLE-CELL element from Org to Texinfo.
@@ -1609,7 +1346,7 @@ a communication channel."
            contents)
          (when (org-export-get-next-element table-cell info) "\n@tab ")))
 
-;;; Table Row
+;;;; Table Row
 
 (defun org-texinfo-table-row (table-row contents info)
   "Transcode a TABLE-ROW element from Org to Texinfo.
@@ -1618,21 +1355,15 @@ a communication channel."
   ;; Rules are ignored since table separators are deduced from
   ;; borders of the current row.
   (when (eq (org-element-property :type table-row) 'standard)
-   (let ((rowgroup-tag
-         (cond
-          ;; Case 1: Belongs to second or subsequent rowgroup.
-          ((not (= 1 (org-export-table-row-group table-row info)))
-           "@item ")
-          ;; Case 2: Row is from first rowgroup.  Table has >=1 rowgroups.
-          ((org-export-table-has-header-p
-            (org-export-get-parent-table table-row) info)
-           "@headitem ")
-          ;; Case 3: Row is from first and only row group.
-          (t "@item "))))
-     (when (eq (org-element-property :type table-row) 'standard)
-       (concat rowgroup-tag contents "\n")))))
-
-;;; Target
+    (let ((rowgroup-tag
+          (if (and (= 1 (org-export-table-row-group table-row info))
+                   (org-export-table-has-header-p
+                    (org-export-get-parent-table table-row) info))
+              "@headitem "
+            "@item ")))
+      (concat rowgroup-tag contents "\n"))))
+
+;;;; Target
 
 (defun org-texinfo-target (target contents info)
   "Transcode a TARGET object from Org to Texinfo.
@@ -1641,7 +1372,7 @@ information."
   (format "@anchor{%s}"
          (org-export-solidify-link-text (org-element-property :value target))))
 
-;;; Timestamp
+;;;; Timestamp
 
 (defun org-texinfo-timestamp (timestamp contents info)
   "Transcode a TIMESTAMP object from Org to Texinfo.
@@ -1656,7 +1387,7 @@ information."
        (format org-texinfo-inactive-timestamp-format value))
       (t (format org-texinfo-diary-timestamp-format value)))))
 
-;;; Verbatim
+;;;; Verbatim
 
 (defun org-texinfo-verbatim (verbatim contents info)
   "Transcode a VERBATIM object from Org to Texinfo.
@@ -1664,26 +1395,13 @@ CONTENTS is nil.  INFO is a plist used as a communication
 channel."
   (org-texinfo--text-markup (org-element-property :value verbatim) 'verbatim))
 
-;;; Verse Block
+;;;; Verse Block
 
 (defun org-texinfo-verse-block (verse-block contents info)
   "Transcode a VERSE-BLOCK element from Org to Texinfo.
 CONTENTS is verse block contents. INFO is a plist holding
 contextual information."
-  ;; In a verse environment, add a line break to each newline
-  ;; character and change each white space at beginning of a line
-  ;; into a space of 1 em.  Also change each blank line with
-  ;; a vertical space of 1 em.
-  (progn
-    (setq contents (replace-regexp-in-string
-                   "^ *\\\\\\\\$" "\\\\vspace*{1em}"
-                   (replace-regexp-in-string
-                    "\\(\\\\\\\\\\)?[ \t]*\n" " \\\\\\\\\n" contents)))
-    (while (string-match "^[ \t]+" contents)
-      (let ((new-str (format "\\hspace*{%dem}"
-                            (length (match-string 0 contents)))))
-       (setq contents (replace-match new-str nil t contents))))
-    (format "\\begin{verse}\n%s\\end{verse}" contents)))
+  (format "@display\n%s@end display" contents))
 
 \f
 ;;; Interactive functions
@@ -1797,29 +1515,21 @@ Return INFO file name or an error if it couldn't be produced."
         errors)
     (message (format "Processing Texinfo file %s..." file))
     (save-window-excursion
-      (cond
-       ;; A function is provided: Apply it.
-       ((functionp org-texinfo-info-process)
-       (funcall org-texinfo-info-process (shell-quote-argument file)))
-       ;; A list is provided: Replace %b, %f and %o with appropriate
-       ;; values in each command before applying it.  Output is
-       ;; redirected to "*Org INFO Texinfo Output*" buffer.
-       ((consp org-texinfo-info-process)
-       (let ((outbuf (get-buffer-create "*Org INFO Texinfo Output*")))
-         (mapc
-          (lambda (command)
-            (shell-command
-             (replace-regexp-in-string
-              "%b" (shell-quote-argument base-name)
-              (replace-regexp-in-string
-               "%f" (shell-quote-argument full-name)
-               (replace-regexp-in-string
-                "%o" (shell-quote-argument out-dir) command t t) t t) t t)
-             outbuf))
-          org-texinfo-info-process)
-         ;; Collect standard errors from output buffer.
-         (setq errors (org-texinfo-collect-errors outbuf))))
-       (t (error "No valid command to process to Info")))
+      ;; Replace %b, %f and %o with appropriate values in each command
+      ;; before applying it.  Output is redirected to "*Org INFO
+      ;; Texinfo Output*" buffer.
+      (let ((outbuf (get-buffer-create "*Org INFO Texinfo Output*")))
+       (dolist (command org-texinfo-info-process)
+         (shell-command
+          (replace-regexp-in-string
+           "%b" (shell-quote-argument base-name)
+           (replace-regexp-in-string
+            "%f" (shell-quote-argument full-name)
+            (replace-regexp-in-string
+             "%o" (shell-quote-argument out-dir) command t t) t t) t t)
+          outbuf))
+       ;; Collect standard errors from output buffer.
+       (setq errors (org-texinfo-collect-errors outbuf)))
       (let ((infofile (concat out-dir base-name ".info")))
        ;; Check for process failure.  Provide collected errors if
        ;; possible.
index faa2e0541b436a3b61077fa8f5f117c3723e0e88..dd81ad13d1dd8021b94bf89b053f33a1c3b78b86 100644 (file)
@@ -814,7 +814,7 @@ This variable can be either set to `buffer' or `subtree'."
 
 (defcustom org-export-show-temporary-export-buffer t
   "Non-nil means show buffer after exporting to temp buffer.
-When Org exports to a file, the buffer visiting that file is ever
+When Org exports to a file, the buffer visiting that file is never
 shown, but remains buried.  However, when exporting to
 a temporary buffer, that buffer is popped up in a second window.
 When this variable is nil, the buffer remains buried also in
@@ -1317,6 +1317,10 @@ The back-end could then be called with, for example:
 ;;   - category :: tree
 ;;   - type :: list of elements and objects
 ;;
+;; + `:input-buffer' :: Name of input buffer.
+;;   - category :: option
+;;   - type :: string
+;;
 ;; + `:input-file' :: Full path to input file, if any.
 ;;   - category :: option
 ;;   - type :: string or nil
@@ -1329,6 +1333,10 @@ The back-end could then be called with, for example:
 ;;   - category :: option
 ;;   - type :: string
 ;;
+;; + `:output-file' :: Full path to output file, if any.
+;;   - category :: option
+;;   - type :: string or nil
+;;
 ;; + `:parse-tree' :: Whole parse tree, available at any time during
 ;;      transcoding.
 ;;   - category :: option
@@ -1765,17 +1773,19 @@ Assume buffer is in Org mode.  Narrowing, if any, is ignored."
          (when (stringp value)
            (setq plist
                  (plist-put plist property
-                            (org-element-parse-secondary-string
-                             value (org-element-restriction 'keyword))))))))))
+                            (or (org-element-parse-secondary-string
+                                 value (org-element-restriction 'keyword))
+                                ;; When TITLE keyword sets an empty
+                                ;; string, make sure it doesn't
+                                ;; appear as nil in the plist.
+                                (and (eq property :title) ""))))))))))
 
 (defun org-export--get-buffer-attributes ()
   "Return properties related to buffer attributes, as a plist."
   ;; Store full path of input file name, or nil.  For internal use.
   (let ((visited-file (buffer-file-name (buffer-base-buffer))))
     (list :input-file visited-file
-         :title (if (not visited-file) (buffer-name (buffer-base-buffer))
-                  (file-name-sans-extension
-                   (file-name-nondirectory visited-file))))))
+         :input-buffer (buffer-name (buffer-base-buffer)))))
 
 (defun org-export--get-global-options (&optional backend)
   "Return global export options as a plist.
@@ -1788,23 +1798,22 @@ process."
        (all (append (and backend (org-export-get-all-options backend))
                     org-export-options-alist)))
     (dolist (cell all plist)
-      (let ((prop (car cell))
-           (default-value (nth 3 cell)))
-       (unless (or (not default-value) (plist-member plist prop))
+      (let ((prop (car cell)))
+       (unless (plist-member plist prop)
          (setq plist
                (plist-put
                 plist
                 prop
-                ;; Eval default value provided.  If keyword is
+                ;; Evaluate default value provided.  If keyword is
                 ;; a member of `org-element-document-properties',
                 ;; parse it as a secondary string before storing it.
                 (let ((value (eval (nth 3 cell))))
-                  (if (not (stringp value)) value
-                    (let ((keyword (nth 1 cell)))
-                      (if (member keyword org-element-document-properties)
-                          (org-element-parse-secondary-string
-                           value (org-element-restriction 'keyword))
-                        value)))))))))))
+                  (if (and (stringp value)
+                           (member (nth 1 cell)
+                                   org-element-document-properties))
+                      (org-element-parse-secondary-string
+                       value (org-element-restriction 'keyword))
+                    value)))))))))
 
 (defun org-export--list-bound-variables ()
   "Return variables bound from BIND keywords in current buffer.
@@ -1843,6 +1852,13 @@ an alist where associations are (VARIABLE-NAME VALUE)."
       ;; Return value in appropriate order of appearance.
       (nreverse (funcall collect-bind nil nil)))))
 
+;; defsubst org-export-get-parent must be defined before first use,
+;; was originally defined in the topology section
+
+(defsubst org-export-get-parent (blob)
+  "Return BLOB parent or nil.
+BLOB is the element or object considered."
+  (org-element-property :parent blob))
 
 ;;;; Tree Properties
 ;;
@@ -2146,9 +2162,8 @@ INFO is a plist containing export directives."
 DATA is a parse tree, an element or an object or a secondary
 string.  INFO is a plist holding export options.
 
-Return transcoded string."
-  (let ((memo (gethash data (plist-get info :exported-data) 'no-memo)))
-    (if (not (eq memo 'no-memo)) memo
+Return a string."
+  (or (gethash data (plist-get info :exported-data))
       (let* ((type (org-element-type data))
             (results
              (cond
@@ -2174,9 +2189,9 @@ Return transcoded string."
               ;; Secondary string.
               ((not type)
                (mapconcat (lambda (obj) (org-export-data obj info)) data ""))
-              ;; Element/Object without contents or, as a special case,
-              ;; headline with archive tag and archived trees restricted
-              ;; to title only.
+              ;; Element/Object without contents or, as a special
+              ;; case, headline with archive tag and archived trees
+              ;; restricted to title only.
               ((or (not (org-element-contents data))
                    (and (eq type 'headline)
                         (eq (plist-get info :with-archived-trees) 'headline)
@@ -2201,16 +2216,16 @@ Return transcoded string."
                             (lambda (element) (org-export-data element info))
                             (org-element-contents
                              (if (or greaterp objectp) data
-                               ;; Elements directly containing objects
-                               ;; must have their indentation normalized
-                               ;; first.
+                               ;; Elements directly containing
+                               ;; objects must have their indentation
+                               ;; normalized first.
                                (org-element-normalize-contents
                                 data
-                                ;; When normalizing contents of the first
-                                ;; paragraph in an item or a footnote
-                                ;; definition, ignore first line's
-                                ;; indentation: there is none and it
-                                ;; might be misleading.
+                                ;; When normalizing contents of the
+                                ;; first paragraph in an item or
+                                ;; a footnote definition, ignore
+                                ;; first line's indentation: there is
+                                ;; none and it might be misleading.
                                 (when (eq type 'paragraph)
                                   (let ((parent (org-export-get-parent data)))
                                     (and
@@ -2227,10 +2242,10 @@ Return transcoded string."
        (puthash
         data
         (cond
-         ((not results) nil)
+         ((not results) "")
          ((memq type '(org-data plain-text nil)) results)
-         ;; Append the same white space between elements or objects as in
-         ;; the original buffer, and call appropriate filters.
+         ;; Append the same white space between elements or objects
+         ;; as in the original buffer, and call appropriate filters.
          (t
           (let ((results
                  (org-export-filter-apply-functions
@@ -2240,10 +2255,10 @@ Return transcoded string."
                     (if (memq type org-element-all-elements)
                         (concat (org-element-normalize-string results)
                                 (make-string post-blank ?\n))
-                      (concat results (make-string post-blank ? ))))
+                      (concat results (make-string post-blank ?\s))))
                   info)))
             results)))
-        (plist-get info :exported-data))))))
+        (plist-get info :exported-data)))))
 
 (defun org-export-data-with-backend (data backend info)
   "Convert DATA into BACKEND format.
@@ -3011,6 +3026,14 @@ Return code as a string."
               (org-export-install-filters
                (org-combine-plists
                 info (org-export-get-environment backend subtreep ext-plist))))
+        ;; Special case: provide original file name or buffer name as
+        ;; default value for :title property.
+        (unless (plist-get info :title)
+          (plist-put
+           info :title
+           (let ((file (plist-get info :input-file)))
+             (if file (file-name-sans-extension (file-name-nondirectory file))
+               (plist-get info :input-buffer)))))
         ;; Expand export-specific set of macros: {{{author}}},
         ;; {{{date}}}, {{{email}}} and {{{title}}}.  It must be done
         ;; once regular macros have been expanded, since document
@@ -5106,11 +5129,7 @@ Return the new string."
 ;; `org-export-get-genealogy' returns the full genealogy of a given
 ;; element or object, from closest parent to full parse tree.
 
-(defsubst org-export-get-parent (blob)
-  "Return BLOB parent or nil.
-BLOB is the element or object considered."
-  (org-element-property :parent blob))
-
+;; defsubst org-export-get-parent must be defined before first use
 (defun org-export-get-genealogy (blob)
   "Return full genealogy relative to a given element or object.
 
@@ -5638,7 +5657,8 @@ The function returns either a file name returned by POST-PROCESS,
 or FILE."
   (declare (indent 2))
   (if (not (file-writable-p file)) (error "Output file not writable")
-    (let ((encoding (or org-export-coding-system buffer-file-coding-system)))
+    (let ((ext-plist (org-combine-plists `(:output-file ,file) ext-plist))
+         (encoding (or org-export-coding-system buffer-file-coding-system)))
       (if async
           (org-export-async-start
              `(lambda (file)