diff --git a/STATUS.md b/docs/STATUS.md similarity index 100% rename from STATUS.md rename to docs/STATUS.md diff --git a/docs/SYNTAX.md b/docs/SYNTAX.md new file mode 100644 index 0000000..ddbee32 --- /dev/null +++ b/docs/SYNTAX.md @@ -0,0 +1,962 @@ +# Table of Contents + +1. [Headlines and Sections](#Headlines_and_Sections) +2. [Affiliated Keywords](#Affiliated_keywords) +3. [Greater Elements](#Greater_Elements) + 1. [Greater Blocks](#Greater_Blocks) + 2. [Drawers and Property Drawers](#Drawers) + 3. [Dynamic Blocks](#Dynamic_Blocks) + 4. [Footnote Definitions](#Footnote_Definitions) + 5. [Inlinetasks](#Inlinetasks) + 6. [Plain Lists and Items](#Plain_Lists_and_Items) + 7. [Property Drawers](#Property_Drawers) + 8. [Tables](#Tables) +4. [Elements](#Elements) + 1. [Babel Call](#Babel_Call) + 2. [Blocks](#Blocks) + 3. [Clock, Diary Sexp and Planning](#Clock,_Diary_Sexp_and_Planning) + 4. [Comments](#Comments) + 5. [Fixed Width Areas](#Fixed_Width_Areas) + 6. [Horizontal Rules](#Horizontal_Rules) + 7. [Keywords](#Keywords) + 8. [LaTeX Environments](#LaTeX_Environments) + 9. [Node Properties](#Node_Properties) + 10. [Paragraphs](#Paragraphs) + 11. [Table Rows](#Table_Rows) +5. [Objects](#Objects) + 1. [Entities and LaTeX Fragments](#Entities_and_LaTeX_Fragments) + 2. [Export Snippets](#Export_Snippets) + 3. [Footnote References](#Footnote_References) + 4. [Inline Babel Calls and Source Blocks](#Inline_Babel_Calls_and_Source_Blocks) + 5. [Line Breaks](#Line_Breaks) + 6. [Links](#Links) + 7. [Macros](#Macros) + 8. [Targets and Radio Targets](#Targets_and_Radio_Targets) + 9. [Statistics Cookies](#Statistics_Cookies) + 10. [Subscript and Superscript](#Subscript_and_Superscript) + 11. [Table Cells](#Table_Cells) + 12. [Timestamps](#Timestamp) + 13. [Text Markup](#Emphasis_Markers) + +This document describes and comments Org syntax as it is currently +read by its parser (Org Elements) and, therefore, by the export +framework. It also includes a few comments on that syntax. + +A core concept in this syntax is that only headlines, sections, +planning lines and property drawers are context-free1, 2. +Every other syntactical part only exists within specific environments. + +Three categories are used to classify these environments: “Greater +elements”, “elements”, and “objects”, from the broadest scope to the +narrowest. The word “element” is used for both Greater and non-Greater +elements, the context should make that clear. + +The paragraph is the unit of measurement. An element defines +syntactical parts that are at the same level as a paragraph, +i.e. which cannot contain or be included in a paragraph. An object is +a part that could be included in an element. Greater elements are all +parts that can contain an element. + +Empty lines belong to the largest element ending before them. For +example, in a list, empty lines between items belong are part of the +item before them, but empty lines at the end of a list belong to the +plain list element. + +Unless specified otherwise, case is not significant. + + + +# Headlines and Sections + +A headline is defined as: + + STARS KEYWORD PRIORITY TITLE TAGS + +STARS is a string starting at column 0, containing at least one +asterisk (and up to `org-inlinetask-min-level` if `org-inlinetask` +library is loaded) and ended by a space character. The number of +asterisks is used to define the level of the headline. It’s the +sole compulsory part of a headline. + +KEYWORD is a TODO keyword, which has to belong to the list defined +in `org-todo-keywords-1`. Case is significant. + +PRIORITY is a priority cookie, i.e. a single letter preceded by +a hash sign # and enclosed within square brackets. + +TITLE can be made of any character but a new line. Though, it will +match after every other part have been matched. + +TAGS is made of words containing any alpha-numeric character, +underscore, at sign, hash sign or percent sign, and separated with +colons. + +Examples of valid headlines include: + + * + + ** DONE + + *** Some e-mail + + **** TODO [#A] COMMENT Title :tag:a2%: + +If the first word appearing in the title is “COMMENT”, the headline +will be considered as “commented”. Case is significant. + +If its title is `org-footnote-section`, it will be considered as +a “footnote section”. Case is significant. + +If “ARCHIVE” is one of its tags, it will be considered as +“archived”. Case is significant. + +A headline contains directly one section (optionally), followed by +any number of deeper level headlines. + +A section contains directly any greater element or element. Only +a headline can contain a section. As an exception, text before the +first headline in the document also belongs to a section. + +As an example, consider the following document: + + An introduction. + + * A Headline + + Some text. + + ** Sub-Topic 1 + + ** Sub-Topic 2 + + *** Additional entry + +Its internal structure could be summarized as: + + (document + (section) + (headline + (section) + (headline) + (headline + (headline)))) + + + +# Affiliated Keywords + +With the exception of [inlinetasks](#Inlinetasks), [items](#Plain_Lists_and_Items), [planning](#Clock,_Diary_Sexp_and_Planning), [clocks](#Clock,_Diary_Sexp_and_Planning), [node +properties](#Node_Properties) and [table rows](#Table_Rows), every other element type can be assigned +attributes. + +This is done by adding specific keywords, named “affiliated +keywords”, just above the element considered, no blank line +allowed. + +Affiliated keywords are built upon one of the following patterns: +“#+KEY: VALUE”, “#+KEY[OPTIONAL]: VALUE” or “#+ATTRBACKEND: VALUE”. + +KEY is either “CAPTION”, “HEADER”, “NAME”, “PLOT” or “RESULTS” +string. + +BACKEND is a string constituted of alpha-numeric characters, hyphens +or underscores. + +OPTIONAL and VALUE can contain any character but a new line. Only +“CAPTION” and “RESULTS” keywords can have an optional value. + +An affiliated keyword can appear more than once if KEY is either +“CAPTION” or “HEADER” or if its pattern is “#+ATTRBACKEND: VALUE”. + +“CAPTION”, “AUTHOR”, “DATE” and “TITLE” keywords can contain objects +in their value and their optional value, if applicable. + + + +# Greater Elements + +Unless specified otherwise, greater elements can contain directly +any other element or greater element excepted: + +- elements of their own type, +- [node properties](#Node_Properties), which can only be found in [property drawers](#Property_Drawers), +- [items](#Plain_Lists_and_Items), which can only be found in [plain lists](#Plain_Lists_and_Items). + + + +## Greater Blocks + +Greater blocks consist in the following pattern: + + #+BEGIN_NAME PARAMETERS + CONTENTS + #+END_NAME + +NAME can contain any non-whitespace character. + +PARAMETERS can contain any character other than new line, and can +be omitted. + +If NAME is “CENTER”, it will be a “center block”. If it is +“QUOTE”, it will be a “quote block”. + +If the block is neither a center block, a quote block or a [block +element](#Blocks), it will be a “special block”. + +CONTENTS can contain any element, except : a line `#+END_NAME` on +its own. Also lines beginning with STARS must be quoted by +a comma. + + + +## Drawers and Property Drawers + +Pattern for drawers is: + + :NAME: + CONTENTS + :END: + +NAME can contain word-constituent characters, hyphens and +underscores. + +CONTENTS can contain any element but another drawer. + + + +## Dynamic Blocks + +Pattern for dynamic blocks is: + + #+BEGIN: NAME PARAMETERS + CONTENTS + #+END: + +NAME cannot contain any whitespace character. + +PARAMETERS can contain any character and can be omitted. + + + +## Footnote Definitions + +Pattern for footnote definitions is: + + [fn:LABEL] CONTENTS + +It must start at column 0. + +LABEL is either a number or follows the pattern “fn:WORD”, where +word can contain any word-constituent character, hyphens and +underscore characters. + +CONTENTS can contain any element excepted another footnote +definition. It ends at the next footnote definition, the next +headline, two consecutive empty lines or the end of buffer. + + + +## Inlinetasks + +Inlinetasks are defined by `org-inlinetask-min-level` contiguous +asterisk characters starting at column 0, followed by a whitespace +character. + +Optionally, inlinetasks can be ended with a string constituted of +`org-inlinetask-min-level` contiguous asterisk characters starting +at column 0, followed by a space and the “END” string. + +Inlinetasks are recognized only after `org-inlinetask` library is +loaded. + + + +## Plain Lists and Items + +Items are defined by a line starting with the following pattern: +“BULLET COUNTER-SET CHECK-BOX TAG”, in which only BULLET is +mandatory. + +BULLET is either an asterisk, a hyphen, a plus sign character or +follows either the pattern “COUNTER.” or “COUNTER)”. In any case, +BULLET is follwed by a whitespace character or line ending. + +COUNTER can be a number or a single letter. + +COUNTER-SET follows the pattern [@COUNTER]. + +CHECK-BOX is either a single whitespace character, a “X” character +or a hyphen, enclosed within square brackets. + +TAG follows “TAG-TEXT ::” pattern, where TAG-TEXT can contain any +character but a new line. + +An item ends before the next item, the first line less or equally +indented than its starting line, or two consecutive empty lines. +Indentation of lines within other greater elements do not count, +neither do inlinetasks boundaries. + +A plain list is a set of consecutive items of the same indentation. +It can only directly contain items. + +If first item in a plain list has a counter in its bullet, the +plain list will be an “ordered plain-list”. If it contains a tag, +it will be a “descriptive list”. Otherwise, it will be an +“unordered list”. List types are mutually exclusive. + +For example, consider the following excerpt of an Org document: + + 1. item 1 + 2. [X] item 2 + - some tag :: item 2.1 + +Its internal structure is as follows: + + (ordered-plain-list + (item) + (item + (descriptive-plain-list + (item)))) + + + +## Property Drawers + +Property drawers are a special type of drawer containing properties +attached to a headline. They are located right after a [headline](#Headlines_and_Sections) +and its [planning](#Clock,_Diary_Sexp_and_Planning) information. + + HEADLINE + PROPERTYDRAWER + + HEADLINE + PLANNING + PROPERTYDRAWER + +PROPERTYDRAWER follows the pattern + + :PROPERTIES: + CONTENTS + :END: + +where CONTENTS consists of zero or more [node properties](#Node_Properties). + + + +## Tables + +Tables start at lines beginning with either a vertical bar or the +“+-” string followed by plus or minus signs only, assuming they are +not preceded with lines of the same type. These lines can be +indented. + +A table starting with a vertical bar has “org” type. Otherwise it +has “table.el” type. + +Org tables end at the first line not starting with a vertical bar. +Table.el tables end at the first line not starting with either +a vertical line or a plus sign. Such lines can be indented. + +An org table can only contain table rows. A table.el table does +not contain anything. + +One or more “#+TBLFM: FORMULAS” lines, where “FORMULAS” can contain +any character, can follow an org table. + + + +# Elements + +Elements cannot contain any other element. + +Only [keywords](#Keywords) whose name belongs to +`org-element-document-properties`, [verse blocks](#Blocks) , [paragraphs](#Paragraphs) and +[table rows](#Table_Rows) can contain objects. + + + +## Babel Call + +Pattern for babel calls is: + + #+CALL: VALUE + +VALUE is optional. It can contain any character but a new line. + + + +## Blocks + +Like [greater blocks](#Greater_Blocks), pattern for blocks is: + + #+BEGIN_NAME DATA + CONTENTS + #+END_NAME + +NAME cannot contain any whitespace character. + +If NAME is “COMMENT”, it will be a “comment block”. If it is +“EXAMPLE”, it will be an “example block”. If it is “EXPORT”, it +will be an “export block”. If it is “SRC”, it will be a “source +block”. If it is “VERSE”, it will be a “verse block”. + +DATA can contain any character but a new line. It can be ommitted, +unless the block is either a “source block” or an “export block”. + +In the latter case, it should be constituted of a single word. + +In the former case, it must follow the pattern “LANGUAGE SWITCHES +ARGUMENTS”, where SWITCHES and ARGUMENTS are optional. + +LANGUAGE cannot contain any whitespace character. + +SWITCHES is made of any number of “SWITCH” patterns, separated by +blank lines. + +A SWITCH pattern is either “-l ”FORMAT“”, where FORMAT can contain +any character but a double quote and a new line, “-S” or “+S”, +where S stands for a single letter. + +ARGUMENTS can contain any character but a new line. + +CONTENTS can contain any character, including new lines. Though it +will only contain Org objects if the block is a verse block. +Otherwise, CONTENTS will not be parsed. + + + +## Clock, Diary Sexp and Planning + +A clock follows either of the patterns below: + + CLOCK: INACTIVE-TIMESTAMP + CLOCK: INACTIVE-TIMESTAMP-RANGE DURATION + +INACTIVE-TIMESTAMP, resp. INACTIVE-TIMESTAMP-RANGE, is an inactive, +resp. inactive range, [timestamp](#Timestamp) object. + +DURATION follows the pattern: + + => HH:MM + +HH is a number containing any number of digits. MM is a two digit +numbers. + +A diary sexp is a line starting at column 0 with “%%(” string. It +can then contain any character besides a new line. + +A planning is an element with the following pattern: + + HEADLINE + PLANNING + +where HEADLINE is a [headline](#Headlines_and_Sections) element and PLANNING is a line filled +with INFO parts, where each of them follows the pattern: + + KEYWORD: TIMESTAMP + +KEYWORD is either “DEADLINE”, “SCHEDULED” or “CLOSED”. TIMESTAMP +is a [timestamp](#Timestamp) object. + +In particular, no blank line is allowed between PLANNING and +HEADLINE. + + + +## Comments + +A “comment line” starts with a hash signe and a whitespace +character or an end of line. + +Comments can contain any number of consecutive comment lines. + + + +## Fixed Width Areas + +A “fixed-width line” start with a colon character and a whitespace +or an end of line. + +Fixed width areas can contain any number of consecutive fixed-width +lines. + + + +## Horizontal Rules + +A horizontal rule is a line made of at least 5 consecutive hyphens. +It can be indented. + + + +## Keywords + +Keywords follow the syntax: + + #+KEY: VALUE + +KEY can contain any non-whitespace character, but it cannot be +equal to “CALL” or any affiliated keyword. + +VALUE can contain any character excepted a new line. + +If KEY belongs to `org-element-document-properties`, VALUE can +contain objects. + + + +## LaTeX Environments + +Pattern for LaTeX environments is: + + \begin{NAME} CONTENTS \end{NAME} + +NAME is constituted of alpha-numeric or asterisk characters. + +CONTENTS can contain anything but the “\end{NAME}” string. + + + +## Node Properties + +Node properties can only exist in [property drawers](#Property_Drawers). Their pattern +is any of the following + + :NAME: VALUE + + :NAME+: VALUE + + :NAME: + + :NAME+: + +NAME can contain any non-whitespace character but cannot end with +a plus sign. It cannot be the empty string. + +VALUE can contain anything but a newline character. + + + +## Paragraphs + +Paragraphs are the default element, which means that any +unrecognized context is a paragraph. + +Empty lines and other elements end paragraphs. + +Paragraphs can contain every type of object. + + + +## Table Rows + +A table rows is either constituted of a vertical bar and any number +of [table cells](#Table_Cells) or a vertical bar followed by a hyphen. + +In the first case the table row has the “standard” type. In the +second case, it has the “rule” type. + +Table rows can only exist in [tables](#Tables). + + + +# Objects + +Objects can only be found in the following locations: + +- [affiliated keywords](#Affiliated_keywords) defined in `org-element-parsed-keywords`, +- [document properties](#Keywords), +- [headline](#Headlines_and_Sections) titles, +- [inlinetask](#Inlinetasks) titles, +- [item](#Plain_Lists_and_Items) tags, +- [paragraphs](#Paragraphs), +- [table cells](#Table_Cells), +- [table rows](#Table_Rows), which can only contain table cell + objects, +- [verse blocks](#Blocks). + +Most objects cannot contain objects. Those which can will be +specified. + + + +## Entities and LaTeX Fragments + +An entity follows the pattern: + + \NAME POST + +where NAME has a valid association in either `org-entities` or +`org-entities-user`. + +POST is the end of line, “{}” string, or a non-alphabetical +character. It isn’t separated from NAME by a whitespace character. + +A LaTeX fragment can follow multiple patterns: + + \NAME BRACKETS + \(CONTENTS\) + \[CONTENTS\] + $$CONTENTS$$ + PRE$CHAR$POST + PRE$BORDER1 BODY BORDER2$POST + +NAME contains alphabetical characters only and must not have an +association in either `org-entities` or `org-entities-user`. + +BRACKETS is optional, and is not separated from NAME with white +spaces. It may contain any number of the following patterns: + + [CONTENTS1] + {CONTENTS2} + +where CONTENTS1 can contain any characters excepted “{” “}”, “[” +“]” and newline and CONTENTS2 can contain any character excepted +“{”, “}” and newline. + +CONTENTS can contain any character but cannot contain “\\)” in the +second template or “\\]” in the third one. + +PRE is either the beginning of line or a character different from +`$`. + +CHAR is a non-whitespace character different from `.`, `,`, `?`, +`;`, `'` or a double quote. + +POST is any punctuation (including parentheses and quotes) or space +character, or the end of line. + +BORDER1 is a non-whitespace character different from `.`, `,`, `;` +and `$`. + +BODY can contain any character excepted `$`, and may not span over +more than 3 lines. + +BORDER2 is any non-whitespace character different from `,`, `.` and +`$`. + +--- + +> It would introduce incompatibilities with previous Org versions, +> but support for `$...$` (and for symmetry, `$$...$$`) constructs +> ought to be removed. +> +> They are slow to parse, fragile, redundant and imply false +> positives. — ngz + + + +## Export Snippets + +Patter for export snippets is: + + @@NAME:VALUE@@ + +NAME can contain any alpha-numeric character and hyphens. + +VALUE can contain anything but “@@” string. + + + +## Footnote References + +There are four patterns for footnote references: + + [fn:LABEL] + [fn:LABEL:DEFINITION] + [fn::DEFINITION] + +LABEL can contain any word constituent character, hyphens and +underscores. + +DEFINITION can contain any character. Though opening and closing +square brackets must be balanced in it. It can contain any object +encountered in a paragraph, even other footnote references. + +If the reference follows the second pattern, it is called an +“inline footnote”. If it follows the third one, i.e. if LABEL is +omitted, it is an “anonymous footnote”. + + + +## Inline Babel Calls and Source Blocks + +Inline Babel calls follow any of the following patterns: + + call_NAME(ARGUMENTS) + call_NAME[HEADER](ARGUMENTS)[HEADER] + +NAME can contain any character besides `(`, `)` and “\n”. + +HEADER can contain any character besides `]` and “\n”. + +ARGUMENTS can contain any character besides `)` and “\n”. + +Inline source blocks follow any of the following patterns: + + src_LANG{BODY} + src_LANG[OPTIONS]{BODY} + +LANG can contain any non-whitespace character. + +OPTIONS and BODY can contain any character but “\n”. + + + +## Line Breaks + +A line break consists in “\\\SPACE” pattern at the end of an +otherwise non-empty line. + +SPACE can contain any number of tabs and spaces, including 0. + + + +## Links + +There are 4 major types of links: + + PRE1 RADIO POST1 ("radio" link) + ("angle" link) + PRE2 PROTOCOL:PATH2 POST2 ("plain" link) + [[PATH3]DESCRIPTION] ("regular" link) + +PRE1 and POST1, when they exist, are non alphanumeric characters. + +RADIO is a string matched by some [radio target](#Targets_and_Radio_Targets). It may contain +[entities](#Entities_and_LaTeX_Fragments), [latex fragments](#Entities_and_LaTeX_Fragments), [subscript](#Subscript_and_Superscript) and [superscript](#Subscript_and_Superscript). + +PROTOCOL is a string among `org-link-types`. + +PATH can contain any character but `]`, `<`, `>` and `\n`. + +PRE2 and POST2, when they exist, are non word constituent +characters. + +PATH2 can contain any non-whitespace character excepted `(`, `)`, +`<` and `>`. It must end with a word-constituent character, or any +non-whitespace non-punctuation character followed by `/`. + +DESCRIPTION must be enclosed within square brackets. It can +contain any character but square brackets. It can contain any +object found in a paragraph excepted a [footnote reference](#Footnote_References), a [radio +target](#Targets_and_Radio_Targets) and a [line break](#Line_Breaks). It cannot contain another link either, +unless it is a plain or angular link. + +DESCRIPTION is optional. + +PATH3 is built according to the following patterns: + + FILENAME ("file" type) + PROTOCOL:PATH4 ("PROTOCOL" type) + PROTOCOL://PATH4 ("PROTOCOL" type) + id:ID ("id" type) + #CUSTOM-ID ("custom-id" type) + (CODEREF) ("coderef" type) + FUZZY ("fuzzy" type) + +FILENAME is a file name, either absolute or relative. + +PATH4 can contain any character besides square brackets. + +ID is constituted of hexadecimal numbers separated with hyphens. + +PATH4, CUSTOM-ID, CODEREF and FUZZY can contain any character +besides square brackets. + + + +## Macros + +Macros follow the pattern: + + {{{NAME(ARGUMENTS)}}} + +NAME must start with a letter and can be followed by any number of +alpha-numeric characters, hyphens and underscores. + +ARGUMENTS can contain anything but “}}}” string. Values within +ARGUMENTS are separated by commas. Non-separating commas have to +be escaped with a backslash character. + + + +## Targets and Radio Targets + +Radio targets follow the pattern: + + <<>> + +CONTENTS can be any character besides `<`, `>` and “\n”. It cannot +start or end with a whitespace character. As far as objects go, it +can contain [text markup](#Emphasis_Markers), [entities](#Entities_and_LaTeX_Fragments), [latex fragments](#Entities_and_LaTeX_Fragments), [subscript](#Subscript_and_Superscript) and +[superscript](#Subscript_and_Superscript) only. + +Targets follow the pattern: + + <> + +TARGET can contain any character besides `<`, `>` and “\n”. It +cannot start or end with a whitespace character. It cannot contain +any object. + + + +## Statistics Cookies + +Statistics cookies follow either pattern: + + [PERCENT%] + [NUM1/NUM2] + +PERCENT, NUM1 and NUM2 are numbers or the empty string. + + + +## Subscript and Superscript + +Pattern for subscript is: + + CHAR_SCRIPT + +Pattern for superscript is: + + CHAR^SCRIPT + +CHAR is any non-whitespace character. + +SCRIPT can be `*` or an expression enclosed in parenthesis +(respectively curly brackets), possibly containing balanced +parenthesis (respectively curly brackets). + +SCRIPT can also follow the pattern: + + SIGN CHARS FINAL + +SIGN is either a plus sign, a minus sign, or an empty string. + +CHARS is any number of alpha-numeric characters, commas, +backslashes and dots, or an empty string. + +FINAL is an alpha-numeric character. + +There is no white space between SIGN, CHARS and FINAL. + + + +## Table Cells + +Table cells follow the pattern: + + CONTENTS SPACES| + +CONTENTS can contain any character excepted a vertical bar. + +SPACES contains any number of space characters, including zero. It +can be used to align properly the table. + +The final bar may be replaced with a newline character for the last +cell in row. + + + +## Timestamps + +There are seven possible patterns for timestamps: + + <%%(SEXP)> (diary) + (active) + [DATE TIME REPEATER-OR-DELAY] (inactive) + -- (active range) + (active range) + [DATE TIME REPEATER-OR-DELAY]--[DATE TIME REPEATER-OR-DELAY] (inactive range) + [DATE TIME-TIME REPEATER-OR-DELAY] (inactive range) + +SEXP can contain any character excepted `>` and `\n`. + +DATE follows the pattern: + + YYYY-MM-DD DAYNAME + +`Y`, `M` and `D` are digits. DAYNAME can contain any non +whitespace-character besides `+`, `-`, `]`, `>`, a digit or `\n`. + +TIME follows the pattern `H:MM`. `H` can be one or two digit long +and can start with 0. + +REPEATER-OR-DELAY follows the pattern: + + MARK VALUE UNIT + +MARK is `+` (cumulate type), `++` (catch-up type) or `.+` (restart +type) for a repeater, and `-` (all type) or `--` (first type) for +warning delays. + +VALUE is a number. + +UNIT is a character among `h` (hour), `d` (day), `w` (week), `m` +(month), `y` (year). + +MARK, VALUE and UNIT are not separated by whitespace characters. + +There can be two REPEATER-OR-DELAY in the timestamp: one as +a repeater and one as a warning delay. + + + +## Text Markup + +Text markup follows the pattern: + + PRE MARKER CONTENTS MARKER POST + +PRE is a whitespace character, `(`, `{` `'` or a double quote. It +can also be a beginning of line. + +MARKER is a character among `*` (bold), `=` (verbatim), `/` +(italic), `+` (strike-through), `_` (underline), `~` (code). + +CONTENTS is a string following the pattern: + + BORDER BODY BORDER + +BORDER can be any non-whitespace character excepted `,`, `'` or +a double quote. + +BODY can contain contain any character but may not span over more +than 3 lines. + +BORDER and BODY are not separated by whitespaces. + +CONTENTS can contain any object encountered in a paragraph when +markup is “bold”, “italic”, “strike-through” or “underline”. + +POST is a whitespace character, `-`, `.`, `,`, `:`, `!`, `?`, `'`, +`)`, `}` or a double quote. It can also be an end of line. + +PRE, MARKER, CONTENTS, MARKER and POST are not separated by +whitespace characters. + +--- + +> All of this is wrong if `org-emphasis-regexp-components` or +> `org-emphasis-alist` are modified. +> +> This should really be simplified. +> +> Also, CONTENTS should be anything within code and verbatim +> emphasis, by definition. — ngz + +# Footnotes + +1 In particular, the parser requires stars at column 0 to be +quoted by a comma when they do not define a headline. + +2 It also means that only headlines and sections can be +recognized just by looking at the beginning of the line. Planning +lines and property drawers can be recognized by looking at one or two +lines above. + +As a consequence, using `org-element-at-point` or +`org-element-context` will move up to the parent headline, and parse +top-down from there until context around original location is found.