diff --git a/autotests/folding/asciidoc.adoc.fold b/autotests/folding/asciidoc.adoc.fold new file mode 100644 index 0000000..2c72705 --- /dev/null +++ b/autotests/folding/asciidoc.adoc.fold @@ -0,0 +1,2800 @@ += AsciiDoc Syntax Highlighting +// There are multiple level 0 sections, so use book instead of article. +:doctype: book +// For nice admonition and callout icons. +:icons: font +:toc: left + +Testing the syntax highlighting support in KDE Frameworks. + +The first of the following sections lists the things that are known not to work. +Further sections are intended for testing the supported features of AsciiDoc. + + += Known Not to Work + +There are a couple of things that are known not to work. + + +== Block + +* Highlighting of attributes inside a block title. + +* Highlighting of formatted text inside a block title other than ... +** #marked# +** `monospaced` + +* Code folding for contiguous blocks. ++ +This has an advantage too, though. +It enables the user to decide on having code folding or not. +For short blocks without empty lines where no code folding is desired, use contiguous blocks. +For longer blocks which should support code folding, use delimited blocks. + +* Multiple lines of meta data. ++ +.For delimited blocks, Asciidoctor supports something like this: +----- +[source] +[, options="nowrap"] +---- +puts 'hello' +---- +----- ++ +Syntax highlighting does not recognize the additional meta data lines and will rather interpret this as a contiguous block. + +* https://asciidoctor.org/docs/user-manual/#discrete-headings[Discrete headings] inside block. ++ +----- +**** +Some text. + +[discrete] +=== Discrete Heading + +Some more text. +**** +----- ++ +Syntax highlighting does not recognize discrete headings inside a block. +If a normal section title is marked as being discrete, highlighting works. + + +== Custom Styles + +* Highlighting of formatted text within the phrase to be styled. ++ + Some [big]#big and *strong*# text. + +* Highlighting of styles with a phrase that spans multiple lines. ++ +---- +[big]#this +is +not +highlighted# +---- + + +== Formatted/Quoted Text + +* Highlighting of formatted/quoted text (e.g. monospaced) that spans multiple lines. + +* Highlighting combinations besides those of emphasized, strong and monospaced. +** Attributes inside other formatting. ++ + `{attribute-id} inside monospaced` + +** Passthrough inside other formatting. ++ + `+passthrough+ inside monospaced` + +** Marked text inside other formatting. ++ + `#marked# inside monospaced` + +** Subscript inside other formatting. ++ + `~sub~script inside monospaced` + +** Superscript inside other formatting. ++ + `^super^script inside monospaced` + +And even more complex combinations. + + +== List + +* Inside a list, indented lines without leading asterisks or hyphen start highlighting for a verbatim paragraph. +Asciidoctor renders this as normal text. + + +== Macro + +* Highlighting of macros with a text argument that spans multiple lines. ++ +---- +xref:id[this works just fine] + +xref:id[ +highlighting a macro with +a text that spans multiples +does not work +] +---- + + +== Quote, Verse + +* Highlighting for single quote symbol `"`. ++ +Highlighting for air quotes `""` is supported. + +* Highlighting for Markdown style quotes. + + +== Replacement + +Highlighting for replacements is limited to those listed in the https://asciidoctor.org/docs/user-manual/#replacements[Asciidoctor Manual] and numerical character references. + +Highlighting for other https://en.wikipedia.org/wiki/List_of_XML_and_HTML_character_entity_references[HTML/XML character references] is not supported. + +.Examples of supported references +* `+(C)+` resulting in (C) +* `+=>+` resulting in => +* `+¼+` resulting in ¼ + +.Examples of references that are not supported +* `+¼+` resulting in ¼ +* `+φ+` resulting in φ + + +== Section + +* Setext style for section titles. ++ +Only Atx style is supported. ++ +NOTE: Asciidoctor's https://asciidoctor.org/docs/asciidoc-recommended-practices/[recommended practices] states _not_ to use Setext style for section titles. + +* Highlighting of formatted/quoted text inside section title other than ... +** #marked# +** `monospaced` + +* Code folding. ++ +Attempts made so far delivered unsatisfactory results. + + +== Table + +* Highlighting of tables with custom separator. +** The custom separator will _not_ be highlighted. +** All `|` inside the table _will be falsly_ highlighted. + +* Highlighting of delimiter-separated tables. +** Table delimiters in shorthand notation and the value separator will _not_ be highlighted. +** All `|` inside the table _will be falsly_ highlighted. + +* Applying styles on table contents. ++ +When defining a table, individual columns or cells can be defined to be highlighted *strong* etc.. +Corresponding highlighting of these cells does not work. + + + += Admonition + +== Simple Format + +NOTE: A simple note. + +//// +FIXME: In the paragraph below is no note as it is started in the middle of the paragraph. +This is problematic as we would need to know that the note line is not the first line in the paragraph. +//// +Some text. +NOTE: This is not a separate note as it is part of the paragraph started with the line above. + +NOTE:This is not a note as there is no space after the `:`. + + NOTE: This is not a note as it is indented. + +NOTE : This is not a note as there are spaces between `NOTE` and `:`. + +NOTE: +This is not a note as it is not using block format and the text is not starting on the same line as the label. + +NOTE: This is a lengthy note in simple format. +Second line. +One more line. +And another one. +This is the last line. + +This line is not part of the simple note anymore. + +CAUTION: This is a CAUTION. + +IMPORTANT: This is IMPORTANT. + +TIP: This is a TIP. + +This second line is rendered as a line on its own because of the trailing `+` in the first line. + +WARNING: This is a WARNING. + + +== Block Format + +.Contiguous +[NOTE] +[[contiguous-note-id]] +This is a contiguous *note* block. +Second line. +And one more line. +// comment inside block +This is the final line. + +This line is not part of the contiguous note block anymore. + +.Delimited +[NOTE] +[[delimited-note-id]] +==== +This is a *note* in block format. +As a block, the note may have a title +// comment inside block + +In block format, multiple lines, paragraphs etc. are possible. +==== + +There is no delimited admonition block without block name. +Using `====` delimiter without a block name results in an example block. + +.Using open block +[NOTE] +-- +Inside the open block note. +-- + + += [[main-1]]An[[main-2]]chor[[main-3]] and Cross Reference + +== [[section-1]][[section-2]] An[[section-3]][[section-4]]chor[[section-5]] + +[[isolated-anchor]] +Isolated anchor. + +[[isolated-anchor-with-label,Isolated Anchor With Label]] +Isolated anchor with label. + +This line has an [[inline-anchor, Inline Anchor]]anchor placed inside the text. + +[#isolated-shorthand] +Isolated anchor using shorthand definition. + +[#isolated-shorthand, Isolated Shorthand Anchor] +Isolated anchor with label using shorthand definition. + +This line has an [ #inline-shorthand ]#anchor placed inside the text# #. + +.Inside [[block-anchor]]block title +Works too. + +.Macro form +There is also a maanchor:anchor-id[Macro Anchor]cro form for anchor definition. + +NOTE: There is no space needed before the `anchor` macro name. +Also not after the closing `]`. + + +=== Not an anchor + +[[ not-an-anchor]] +because of the space after the opening brackets. + +[[not-an-anchor ]] +because of the space before the closing brackets. + + [[not-an-anchor]] because of line starting with spaces. + + [#not-an-anchor]#because# of line starting with spaces. + +[#not-an-anchor] because of trailing text. + +Not an anchor because of leading text [#not-an-anchor] + +Also[#not-an-anchor]#some text# because of missing space before `[`. + +Also [#not-an-anchor] #some text# because of space after `]`. + +Also [#not-an-anchor]# some text# because of space after the leading `#`. + +Also [#not-an-anchor]because of missing referred text (e.g. `#some text#`). + + +=== Escaped + +This is an escaped \[[anchor-id, some #anchor# label]] anchor. + +This is just some \normal text. + +Some\[[anchor-id]]anchor. + +\[[anchor-id]] + +//// +FIXME: highlighting differs +Asciidoctor seems to just pass through the anchor when escaping it. +This behaviour is rather unexpected, as in other cases the escaped contents is subject to further highlighting. + +We currently only consume the opening bracket. +//// +This is an escaped \[#shorthand-id]#anchor in shorthand form#. + +Some \[#shorthand-id]. + +\[#shorthand-id] + +\[#shorthand-id]# + + +== Cross References + +<> + +<> + +<> + +<> + +This is a reference to <>. + +<> some text >> some more text + +some << text <<>> + +<> + +<> + +<> + +<> + +<> + +<>. + +<> + + +=== Escaped + +This is not a reference \<>. + + += Attribute + +== No Value + +:some-attribute: +This line should not be highlighted. + + :not-an-attribute: as the line is indented. + + +== Single Line Value + +Attributes with values that are rendered as a single line, even if their definition spans multiple lines. + +.Single line definition +:single-line: only one line +This line is not part of the attribute value anymore. + +##before##{single-line}##after## + +:attr-in-attr-value: in multi line definition + +.Multi line definition +:single-line-continued: First line {attr-in-attr-value}. \ +Second line. \ +Another line. +This line is not part of the attribute value anymore. + +##before##{single-line-continued}##after## + +IMPORTANT: At least one space is needed before the continuation `\`. + +.Line continuation is only highlighted when inside an attribute definition +some \ +text + + +== Multi Line Value + +Attributes with values including hard line breaks. + +IMPORTANT: At least one space is needed before the continuation `+` and between the `+` and the `\`. + +:multi-line: First line. + \ +Second line. + \ +Third line. +This line is not part of the attribute value anymore. + +##before##{multi-line}##after## + + +== Inline Definition + +Inline attribute definitions {set:inline-attribute:just fine} works {inline-attribute}. + +.Surplus `:` is part of the value +{set:attr::some value} +{attr} + +{set:attr} +{attr} + +.Not an inline definition as leading `set:` is missing +{single-line:some value} + + +== Unsetting + +:!_custom_2-: +:_custom_2-!: + +.Adding a value when unsetting doesn't make sense, but doesn't hurt either +:some-attribute: some value +Attribute is set to `{some-attribute}`. + +:!some-attribute: some value +{some-attribute} is not set anymore. + + +== Not an Attribute + +:not-an-attribute:as there is no space after the terminating column of the identifier + + :not-an-attribute: as it is indented + + +== Combination with Other Highlighting + +**** +:inside-a-block: inside a block +Using an attribute {inside-a-block} works too. +**** + +:inside-formatting: inside formatting +An attribute used `{inside-formatting}` is not highlighting as attribute. + + +== Escaped + +\:attr-1: escaped attribute definition + \ +second line of escaped attribute definition + +\:!attr-1: escaped unset attribute + +\:-attr-1: this is not highlighted as escaped attribute definition as it has an invalid attribute id. + +This \:attr-1: is not highlighted as escaped attribute definition as it is not used at line start. + +:attr-1: some attribute +This is not rendered as \{attr-1}. + +This is not an inline attribute definition \{set:attr-2:some other attribute}. + +{attr-2} is not set. + +**** +:inside-a-block: inside a block +Escaping an attribute \{inside-a-block} works too. +**** + + += Bibliography + +== Using References + +The first reference has no label, so its id <> is rendered. + +The second reference has number <> as label. + +The third reference has <> as label. + +A reference defintion inside the text instead of the bibliography section yields some strange result: [[[ref-o,outside bibliography]]]]. +Not sure what to do with this. + +This is trying to use the escaped reference <>. + +This is trying to use reference <>. + + +[bibliography] +== References + +- [[[ref-1]]] This is reference 1. +- [[[r2,2]]]This is reference 2. +- [[[r3,Some Text]]] +This is reference 3. +- [\[[r4, escaped]]] This is #escaped#. +- [[[r5,5]]] This is reference 5. +* [[[r6,strange]]] Using an asterisk yields a strange result. + + += Block + +[abstract] +.Abstract - contiguous block +This document is used for testing syntax highlighting regarding various types of blocks. +E.g. this contiguous abstract block. + +Using block form for the abstract seems to be rendered differently than the section form (see `section.adoc`). + +[abstract] +.Abstract - delimited open block +-- +Using the delimited block form ... + +enables having empty lines in the abstract. +-- + + +== General + +NOTE: Starting and ending delimiter must be balanced, meaning they must have the same length. + +.Block title #before# block meta data +[literal] +.... +Inside the block. +.... + +[literal] +.Block title `after` block meta data +.... +Inside the block. +.... + +.Invalid block name +[ literal] +.... +This block has invalid meta data as there is a space between the opening square bracket and the block name. +.... + +.Block with attributes +[literal, some, attributes] +.... +Inside the block. +.... + +.Anchor before block name for contiguous block +[[contiguous_block_id_before_name]] +[literal] +Inside the block. + +.Anchor after block name for contiguous block +[literal] +[[contiguous_block_id_after_name]] +Inside the block. + +.Anchor after block name for delimited block +[literal] +[#delimited_block_id] +.... +Inside the block. +.... + +.Option definition +[literal%some-option, some, attributes] +Inside the block. + +.Shorthand anchor definition +// TODO Would be nice if we could highligth the shorthand ID definition as such. +[literal#shorthand-id, some, attributes] +Inside the block. + +Link to <>. + +Link to <>. + +Link to <>. + + +== Admonition + +See `admonition.adoc`. + + +== Comment + +See `comment.adoc`. + + +== Example + +.Contiguous +[example] +[[example-block-id]] +A countiguous *example* block. +// some comment +Second line of the example block. + +This line is not part of the contiguous example block anymore. + +.Delimited with block name +[example] +// some comment +[[example-block-id]] +// some comment +==== +// some comment +Inside the delimited example block. +==== + +.Delimited without block name +[[example-block-id]] +==== +Inside the delimited example block. +==== + +.Using an open block +[example] +[[example-block-id]] +-- +Inside the open block example. +-- + + +== Fenced + +NOTE: According to the https://asciidoctor.org/docs/user-manual/#built-in-blocks-summary[Asciidoctor manual], fenced blocks do not support block names. + +.Delimited without block name +[#fenced-block-id] +``` +Inside the fenced block. +The block contents is rendered verbatim. +So there is *no* text formatting. +``` + +.This is not a fenced block +`````` +A fenced block's delimiter length is _exactly_ 3. +`````` + + +== Listing + +.Contiguous +[listing] +[[listing-block-id]] +A countiguous *listing* block. +Last line of the listing. + +.Delimited with block name +[listing] +[[listing-block-id]] +// comment before the opening block delimiter +//// +block comment +//// +---- +First line inside the *listing* block. +Last line inside the block. +---- + +.Delimited without block name +[[listing-block-id]] +---- +Inside the delimited listing block. +---- + +.Using an open block +[listing] +[[listing-block-id]] +-- +Inside the open block listing. +-- + + +== Literal + +.Contiguous +[literal] +// some comment +[[literal-block-id]] +// some comment +Inside the contiguous literal block. +// this should not be highlighted as comment +.this should not be highlighted as title +The block contents is rendered verbatim. +So there is *no* text formatting. +// this should not be highlighted as comment + +.Delimited with block name +[literal] +// some comment +[#literal-block-id] +// some comment +.......... +Inside the delimited literal block. +// this should not be highlighted as comment +.this should not be highlighted as title +.......... + +.Delimited without block name +[[literal-block-id]] +// some comment +.......... +Inside the delimited literal block. +.......... + +.Using an open block +[literal] +// some comment +[[literal-block-id]] +// some comment +-- +// this should not be highlighted as comment +Inside the open block listing. +-- + +.Using leading spaces for first line + When using some leading spaces, the whole paragraph is treated as literal. +Only the first line needs to have leading spaces. + +This line is not part of the literal paragraph anymore. + + +== Open + +NOTE: The open block does not have a contiguous form. + +.Delimited +[#open-block-id] +-- +An open block's delimiter length is _exactly_ 2. + +Last line of the #open# block. +-- + + +== Passthrough + +.Contiguous +[pass] +[[contiguous-passthrough-id]] +Inside the contiguous passthrough block. +Second line to pass trhough. + +This line is not part of the contiguous passthrough block anymore. + +.Delimited with block name +[pass] +[[delimited-passthrough-id]] +++++++ +Inside the delimited passthrough block with block name. +++++++ + +.Delimited without block name +[[delimited-passthrough-id]] +++++ +Inside the delimited passthrough block without block name. +++++ + +According to the https://asciidoctor.org/docs/user-manual/#built-in-blocks-summary[Asciidoctor Manual], passthrough using an open block is not supported. + + +== Quote + +See `quote_verse.adoc`. + + +== Sidebar + +.Contiguous +[sidebar] +[[sidebar-block-id]] +Inside the *sidebar* block. +Second line of the sidebar block. + +This line is not part of the sidbar block anymore. + +.Delimited with block name +[sidebar] +[[sidebar-block-id]] +********** +Inside the *sidebar* block. +********** + +.Delimited without block name +[[sidebar-block-id]] +**** +Inside the sidebar block. +**** + +.Using an open block +[sidebar] +[[sidebar-block-id]] +-- +Inside the sidebar block. +-- + + +== Source + +.Contiguous +[source,ruby] +[[source-block-id]] +#This is Ruby source code. +#NOTE: If there is a space after the `#`, Asciidoctor interprets this as a section title. +#Seems in contiguous source blocks, Asciidoctor still interprets the block contents, which is rather unexpected. +import 'needed' +IO.puts "hello" + +.Contiguous using option syntax +[source%mixed,php] +

+ +

+ +.Delimited with block name +[source , ruby ] +[[source-block-id]] +---- +# This is Ruby source code. +# NOTE: in delimited source blocks, having a space after the `#` in the comment is OK. +import 'needed' + +IO.puts "hello" +---- + +.Delimited with block name using option syntax +[source%mixed,php] +---- +

+ +

+---- + +.Delimited without block name +[[source-block-id]] +---- +# This is Ruby source code. +# NOTE: in delimited source blocks, having a space after the `#` in the comment is OK. +import 'needed' + +IO.puts "hello" +---- + +.Using an open block +[source,ruby] +[[source-block-id]] +-- +import 'needed' + +IO.puts "hello" +-- + + +== Stem + +.Contiguous +[stem] +[[stem-block-id]] +Inside the contiguous stem block. +Second line to pass. + +This line is not part of the contiguous Passthrough block anymore. + +.Delimited with block name +[stem] +[[stem-block-id]] +++++++ +Inside the delimited stem block with block name. +++++++ + +.Delimited without block name +[[stem-block-id]] +++++ +Inside the delimited stem block without block name. +++++ + + +== Table + +See `table.adoc`. + + +== Verse + +.Contiguous +[verse] +[[verse-block-id]] +Inside the *verse* block. +Second line of the verse block. + +This line is not part of the contiguous verse block anymore. + +.Delimited with block name +[verse] +[[verse-block-id]] +____ +Inside the *verse* block. +____ + +.Delimited without block name +This would be rendered as a quote block as the same delimiters are used. + +.Using an open block +[verse] +[[verse-block-id]] +-- +Inside the *verse* block. +-- + + +== Nested Blocks + +[NOTE] +Some note text. + +==== +Start of outer example block. + +.Nested example block +===== +Inside the inner example block. +// some comment + +.Nested literal block +[literal] +// some comment +---- +Inside the literal block within the inner example block. +-- +Trying to use a block within a verbatim block results in verbatim text, of course. +-- +---- +===== +Line in outer block. +[listing] +---- +Inside the inner listing block. +---- +End of outer block. +==== + +.Admonition inside some other block +==== +Some text. + +NOTE: This is a note in simple format inside a block. + +Some more text. +==== + + += Callout +// Add `:icons: font` for nice callout icons. + +Callouts are usually used with listing/source blocks, but Asciidoctor renders them also without a listing block. + +<1> This is a callout. +<.> This is a callout too. + + <2> This is not rendered as a callout as it is indented. + +The line below is not rendered as a callout as it has no text in the same line. + +<3> + +//// +FIXME This should not be highlighted as callout. +As it depends on the kind of line before, this is problematic. +//// +The line below is not rendered as callout as it is part of this paragraph. +<4> This should _not_ be highlighted as callout. + +.Callouts with manual numbering +[source,sh] +---- +ls -l <2> +ls -la <1> +---- +<1> Explanation for callout number 1. +<2> Explanation for callout number 2. +\<3> This is not a callout as it is escaped. + +.Callouts with automatic numbering +[source,sh] +---- +ls -l <.> +ls -la <.> +---- +<.> Explanation for callout number 1. +<.> Explanation for callout number 2. + + += Comment + +TIP: Comment highlighting supports the standard https://cgit.kde.org/syntax-highlighting.git/tree/data/syntax/alert.xml[KDE alerts] (TODO, FIXME, ...) in both single-line and multi-line comments. + + +== Single Line + +Single-line comments start with exactly `//`. +If there are any characters - including spaces - before the `//`, the line will be rendered. +If there are more than two consecutive `/`, the line will be rendered. + +This line // will be rendered completely. + + // This line will be rendered as verbatim text as it is indented. + +/// This line will be rendered as it starts with 3 `/`. + +// This line will be invisible. + +//This line will be invisible. + +// + +\// Escaped comment. + +\// TODO Of course there is no alert highlighting in escaped comments. + +.Alerts +// NOTE testing alerts +// TEST: testing alerts +// TODO: testing alerts +// TASK testing alerts +// WARNING: testing alerts +// ALERT: testing alerts +// DANGER: testing alerts + + +== Multi Line + +.Contiguous block +[comment] +Some comment. +Alerts: +NOTE testing alerts +TEST: testing alerts +TODO: testing alerts +TASK testing alerts +WARNING: testing alerts +ALERT: testing alerts +DANGER: testing alerts +Last line of contiguous block comment. + +This line is not part of the contiguous block comment anymore. + +.Delimited block without name +////// +This is a multi-line comment. +It spans multiple lines. + +Alerts: +NOTE testing alerts +TEST: testing alerts +TODO: testing alerts +TASK testing alerts +WARNING: testing alerts +ALERT: testing alerts +DANGER: testing alerts + +This is the comment's last line. +////// + +[comment] +.Delimited block with name +//// +This is a multi-line comment. +It spans multiple lines. + +Alerts: +NOTE testing alerts +TEST: testing alerts +TODO: testing alerts +TASK testing alerts +WARNING: testing alerts +ALERT: testing alerts +DANGER: testing alerts + +This is the comment's last line. +//// + +.Using open block +[comment] +-- +Inside the open block comment. +-- + + += Counter + +== Use and Render + +.Start with 1 and render value +New value for `c1` is {counter:c1}. + +.Increment and render +And now it is {counter:c1}. + +.Render the current value without changing it +Current value is {c1}. + + +== Use Without Rendering + +.Define the new counter +No new value to be {counter2:c2}seen. + +.Let's see the current value +Current value is {c2}. + +.Increment +No incremented value to be {counter2:c2}seen. + +.Let's see the current value +Current value is {c2}. + + +== Using a Start Value + +.Start with 3 and render value +New value for `c3` is {counter:c3:99}. + +.Increment and render +And now it is {counter:c3}. + +.Works with characters too +New value for `c4` is {counter:c4:X} + +.Increment character counter and render +And now it is {counter:c4}. + + +== About using Spaces + +CAUTION: If you leave spaces after the `:` or before the closing `}`, Asciidoctor will make them part of the counter attribute name. + +So it's probably wise to avoid spaces here. + +.Define a counter +New value is {counter:c5}. + +.This is actually a new counter +New value is {counter: c5}. + +.But you can't access that attribute +Can't just show the current value { c5} + +.Only if we increment it +Incremented value is {counter: c5}. + +.This is again a new counter +New value is {counter: c5}. + +.This is also a new counter +New value is {counter:c5 }. + +CAUTION: Similar problems occur when using spaces around starting values. + +*Just don't use spaces*. + +.New counter with start value +New value is {counter:c6: 9 } + +.But when trying to increment +Incremented value is {counter:c6} + + + += Text Formatting + +TIP: Asciidoctor uses also the term _quoted text_. + +== Custom Styles + +[big]#big text# + +Some [.big]#big text#. + +Some [big]#big and *strong* text#. + +Some text with [foo]#custom style#. + +[foo bar]#foo bar text# + +before![big]#big text# + +[big]#big text#!after + +[big]##*text*## + +//// +FIXME Highlighting differs. +The phrase is rendered as marked. +Thetrailing hash is therefore not visible. +//// +[big]###text### + +[fo[o]#some text# + + +[underline]_emphasized and underlined_ + +[underline]__emphasized and underlined_ + + +[underline]`monospaced and underlined` + +[underline]``monospaced and underlined`` + + +[underline]*strong and underlined* + +[underline]**strong and underlined** + + +=== Not rendered as custom style + +[fo]o]#not a custom style# because of surplus `]`. + +[big]not a phrase because of missing phrase markers. + +[big]# # because only spaces used as phrase. + +[big]# the phrase# because of leading space in phrase. + +[big]#the phrase # because of trailing space in phrase. + +Before[foo]#the phrase# because of missing non-word character before clause. + +Before [foo]#the phrase#after because of missing non-word character after clause. + + +=== Escaped + +This is not \[underline]#underlined text#. + + +== Emphasized + +=== Rendered formatted + +This line contains a _sequence_ of _multiple emphasized_ words. + +This line contains a single _emphasized_ word. + +This line contains a single __emphasized_ word. + +This line contains a single _emphasized__ word. + +The text within the brackets should be (_emphasized_), but the brackets themselves not. + +(_emphasized_ [_emphasized_ {_emphasized_ |_emphasized_ ._emphasized_ ,_emphasized_ !_emphasized_ ?_emphasized_ _emphasized_? + +_emphasized_) _emphasized_] _emphasized_} _emphasized_| _emphasized_. _emphasized_; _emphasized_, + +_emphasized_( _emphasized_( _emphasized_[ _emphasized_{ + +_emphasized_) + +_emphasized_ + +__aa__bb + +aa__bb__ + +aa__bb _cc__dd + +aa__bb cc___dd + +aa__ bb __cc + + +=== Rendered as-is + +This line does _not_ contain _some emphasized _ text as there is a surplus space. + +This line does _not_ contain_some emphasized_ text as there is a space missing. + +This line does _not_ contain _some emphasized_text as there is a space missing. + +foo ;_emphasized_ :_emphasized_ }_emphasized_ + +;_emphasized_ +:_emphasized_ +}_emphasized_ + +// FIXME Highlighting differs. +In this line, there is some ___very emphasized___ text. +Asciidoctor renders it as normal text, just ignoring all the underscores. +That is a bit strange. + + +=== Escaped + +Not \_emphasized_ as it is escaped. + +Still \__emphasized__ as only the outermost level is escaped. + + +== Marked + +=== Rendered formatted + +Some # marked # text. + +Works #also for multiple words#. + +Some ##marked# text. + +Some #marked## text. + +Some ##marked## text. + +Some[big]#marked# text. +Not rendered big but marked, because of missing space before `[big]`. + +Works also for p##art##s of a word. + +p##art#!s + +!#marked#! + +#marked# + +##marked## + + +=== Rendered as-is + +Not rendered # marked# because of space after the leading hash. + +Not rendered #marked # because of space before the trailing hash. + +Not rendered#marked# as there is a space missing. + +Not rendered #marked#as there is a space missing. + + This is #rendered# as a verbatim block as it is indented. + +Some [big]#big marked# text. + +Some [big]##big marked## text. + + +=== Escaped + +Not \#marked# as it is escaped. + +Still \##marked## as only the outermost level is escaped. + + +== Monospaced + +=== Rendered formatted + +This line contains a `sequence of ` multiple monospaced` words. + +This line contains a single `monospaced` word. + +This line contains a single ``monospaced` word. + +This line contains a single `monospaced`` word. + +The text within the brackets should be (`monospaced`), but the brackets themselves not. + +before``monospaced``after. + +`monospaced` + +(`mono` [`mono` {`mono` |`mono` .`mono` ,`mono` !`mono` ?`mono` + +`mono`) `mono`) `mono`] `mono`} `mono`| `mono`. `mono`; `mono`, `mono`? + +`mono`( `mono`( `mono`[ `mono`{ + +``aa``bb + +aa``bb`` + +aa``bb `cc``dd + +aa``bb cc```dd + +aa`` bb ``cc + + +=== Rendered as-is + +Not rendered ` monospaced` because of leading space. + +Not rendered `monospaced ` because of trailing space. + +Not rendered`monospaced` as there is a space missing. + +Not rendered `monospaced`as there is a space missing. + + +=== Escaped + +Not \`monospaced` as it is escaped. + +Still \``monospaced`` as only the outermost level is escaped. + + +== Passthrough + +=== Rendered passed through + +This text is +passed _as_ is+ with no further formatting. + +Matching +is _lazy_+, so this + is rendered. + +This +_is_ passthrough`+` as passthrough has higher priority as monospaced. + ++passthrough+ at line start. + +Passthrough at +line end.+ + +Minimal passthrough +a+. + + +This text is ++passed _as_ is++ with no further formatting. + +This text is +++passed _as_ is+++ with no further formatting. + + +=== Rendered as-is + +No+passthrough+ as there is no space before the leading `+`. + +No +passthrough+as there is no space after the trailing plus. + +No + passthrough+ as there is a space after the leading `+`. + +No +passthrough + as there is a space after the trailing plus. + + +=== Escaped + +This text \+is _not_ passed through+ because of escaping. + +This text \++is _still_ passed through++ as only the outermost level is escaped. + +This text \+++is _still_ passed through+++ as only the outermost level is escaped. + + +== Strong + +=== Rendered formatted + +This line contains a *sequence of * multiple strong* words. + +This line contains a single **strong* word. + +This line contains a single**strong* word. + +This line contains a single *strong** word. + +The text within the brackets should be (*strong*), but the brackets themselves not. + +(*strong* [*strong* {*strong* |*strong* .*strong* ,*strong* !*strong* ?*strong* + +*strong*) *strong*] *strong*} *strong*| *strong*. *strong*; *strong*, *strong*? + +*strong*( *strong*( *strong*[ *strong*{ + +*strong*) + +*strong* + +aa**bb** + +**aa**bb + +aa**bb**cc + +aa**bb *cc**dd + +aa**bb cc***dd + +aa** bb **cc + + +=== Rendered as-is + +This line does _not_ contain *some strong * text as there is a space before the trailing asterisk. + +This line does _not_ contain*some strong* text as there is a space missing before the leading asterisk. + +This line does _not_ contain *some strong*text as there is a space missing after the trailing asterisk. + +some text ;*strong* :*strong* _*strong* }*strong* + +some text _*strong*_ + +;*strong* +:*strong* +}*strong* + + Not *strong* as there is a leading space in the line, making it verbatim. + +// FIXME Highlighting differs. +In this line, there is some ***very strong*** text. +It is rendered just ignoring the asterisks. +That is a bit strange. + + +=== Escaped + +Not \*strong* as it is escaped. + +Still \**strong** as only the outermost level is escaped. + + +== Subscript + +=== Rendered formatted + +H~2~O + + +=== Rendered as-is + +Not rendered sub~sc ript~ as there is a space within. + + +=== Escaped + +Not \~subscript~ as it is escaped. + + +== Superscript + +=== Rendered formatted + +E = m c^2^ + + +=== Rendered as-is + +Not rendered super^sc ript^ as there is a space within. + + +=== Escaped + +Not \^superscript^ as it is escaped. + + +== Combinations + +IMPORTANT: Combinations are supported by Asciidoctor, as long as the markup sets are entered in the right order. +The monospace markup must be the outermost set, then the strong set, and the emphasized markup must always be the innermost set. + + +=== Rendered formatted + +This is *_strong emphasized_* text. + +This is *__strong _ * emphasized_* text. + +This is**_strong emphasized_**text. + +This is**__ strong emphasized_**text. + +*_strong emphasized_* + + +This is `*strong monospaced*` text. + +This is `**strong ` * monospaced*` text. + +This is``*strong monospaced*``text. + +This is``** strong monospaced*``text. + +`*strong monospaced*` + + +This is `_emphasized monospaced_` text. + +This is `__emphasized ` _ monospaced_` text. + +This is``_emphasized monospaced_``text. + +This is``__ emphasized monospaced_``text. + +`_emphasized monospaced_` + + +This is `*_strong emphasized monospaced_*` text. + +This is `*__strong emphasized * ` _ monospaced_*` text. + +This is``*_strong emphasized monospaced_*``text. + +This is``*__ strong emphasized monospaced_*``text. + +`*_strong emphasized monospaced_*` + + +=== Unsupported + +Highlighting for other combinations is currently not supported, as there would be a large number of rules and styles necessary. + +* _emphasized #marked#_ +* #marked *strong*# +* *strong #marked#* +* *strong _emphasized #marked#_* + +* subscript _with~in~ emphasized_ +* subscript within marked: #H~2~O# +* subscript `with~in~ monospaced` +* subscript *with~in~ strong* + +* superscript _with^in^ emphasized_ +* superscript within marked: #E = m c^2^# +* superscript `with^in^ monospaced` +* superscript *with^in^ strong* + +And even more complex ones. + + +=== Rendered as-is + +This is no *_ strong emphasized_* text, it's *strong* only. + +This is no *_strong emphasized _* text, it's *strong* only. + +This is no _*strong emphasized*_ text, it's _emphasized_ only. + +This is no _`emphasized monospaced`_ text, it's _emphasized_ only. + + +=== Escaped + +This is not rendered \`_emphasized monospaced_`. + +But it is rendered emphasized. + +This is not rendered \*_emphasized strong_*. + +But it is rendered emphasized. + +This is not rendered \`*monospaced strong*`. + +But it is rendered strong. + +This is not rendered \`*_emphasized monospaced strong_*`. + +But it is rendered emphasized strong. + + += Horizontal Rules + +== Simple patterns + +''' +--- +*** + + +== Patterns with spaces + +- - - +* * * + +.Not a horizontal rule +' ' ' + + +== Arbitrary length + +NOTE: Although the https://asciidoctor.org/docs/user-manual/#markdown-style-horizontal-rules[Asciidoctor Manual] states that horizontal rule patterns are only supporting up to three characters (ignoring the optional spaces), some longer patterns work too. + +''''''' + +//// +These patterns don't work, as they start delimited blocks, item lists etc.. +-------- +****** +- - - - - - +* * * * * * * * * +//// + + +== Inside blocks + +**** +Horizontal rules work also inside blocks. +They eventually need an empty line before them, though. + +''' +After the horizontal rule. +**** + + += Include +:includedir: include + +== Included Contents Rendered + +NOTE: Using file names with spaces works. + +include::{includedir}/demo.adoc[] + +.Partial include +include::{includedir}/demo.adoc[lines=2..3] + +.Inside contiguous block +[source,ruby] +IO.puts 'hello' +""" +include::{includedir}/demo.adoc[lines=2..3] +""" +IO.puts 'bye' + +.Inside delimited block with name +[literal] +---- +This line shall be highlighted as verbatim. +include::{includedir}/demo.adoc[lines=2..3] +This line shall be highlighted as verbatim. +---- + +.Inside delimited block without name +.... +This line shall be highlighted as verbatim. +include::{includedir}/demo.adoc[lines=2..3] +This line shall be highlighted as verbatim. +.... + +.Inside table +|=== +|row 1 col 1|row 2 col 2 +| +// the include directive must have its own line with nothing else +include::{includedir}/demo.adoc[lines=1..1] +|row 2 col2 + +|row 3 col 1 +|row 3 col 2 +|=== + + +== Rendered as-is + +.Inside verbatim paragraph + This line shall be highlighted as verbatim. +include::{includedir}/demo.adoc[lines=2..3] +This line shall be highlighted as verbatim. + + += Index + +== Rendered as Index Term + +This is a ((flow)) index term. + +This is a indexterm2:[flow] index term. + +This is a (((concealed, index, term))) concealed index term. + +This is a indexterm:[concealed, index, term] concealed index term. + +This is rendered as a ((flow index term))). + +This is rendered as a (((flow index term)). + +This is ((())) empty but rendered as index term nevertheless. + +Some (((index term))). + +Some ((((index term)))). + + +== Rendered as-is + +This is (()) not an index term as it is empty. + +This is (not an index term)) as there is a `(` missing. + +This is ((not an index term) as there is a `)` missing. + + +== Escaped + +This is \((not an indexterm)) as it is escaped. + +This is \(((not a concealed index term))), but still a flow index term as only the outer brackets are escaped. + +This is \(\((not an indexterm))) as it is fully escaped. + +This is not a \indexterm2:[flow] index term. + +This is not a \indexterm:[concealed, index, term] concealed index term. + +[index] +== Index Catalog + +WARNING: HTML output currently does not support the creation of the index catalog. + + += Link + +== ftp, irc + +* ftp://some.org/some/where/file.extension +* irc://some.org/some/where/file.extension + + +== http(s) + +* http://some.org/some/where/file.extension +* https://some.org/some/where/file.extension + +// . , ; : followed by a space terminate the link +* https://some.org/some/where/file.extension. some text +* https://some.org/some/where/file.extension.some text +* https://some.org/some/where/file.extension, some text +* https://some.org/some/where/file.extension,some text +* https://some.org/some/where/file.extension; some text +* https://some.org/some/where/file.extension;some text +* https://some.org/some/where/file.extension: some text +* https://some.org/some/where/file.extension some text +* https://some.org/some/where/file.extension:some text + +// unbalanced square brackets always terminate the link +* https://some.org/some/where/file.extension[some text +* https://some.org/some/where/file.extension[ some text +* https://some.org/some/where/file.extension]some text +* https://some.org/some/where/file.extension] some text + +* https://some.org/some/where/file.extension[] +* https://some.org/some/where/file.extension[some text]trailing text +* https://some.org/some/where/file.extension[some text]. trailing text +* https://some.org/some/where/file.extension[some text], trailing text +* https://some.org/some/where/file.extension[some text]; trailing text +* https://some.org/some/where/file.extension[some text]: trailing text +* https://some.org/some/where/file.extension[some]text] trailing text +* https://some.org/some/where/file.extension[some ]text] trailing text +* https://some.org/some/where/file.extension[some \]text] - with escaped `]` + +// TODO: highlighting of text within [] ? +* some text https://some.org/some/where/file.extension[*some text*] trailing text. + +// some characters may be placed before the `http` +* (https://some.org +* )https://some.org +* [https://some.org +* ]https://some.org +* ;https://some.org +* https://some.org + + +=== Not rendered as Link + +* {https://some.org +* }https://some.org +* ,https://some.org +* .https://some.org +* :https://some.org + + +== link + +* link:relative/path - not rendered as link as `[]` are misssing +* link:relative/path[] +* ##before##link:relative/path[]##after## - no spaces needed +* link:relative/path/file.extension[local file] +* link:relative/path/file.extension[local ]file] +* link:relative/path/file.extension[local \]file] - with escaped `]` +* link:relative/path with spaces/[] - not rendered as link because of spaces +* link:++relative/path with spaces/++[] - but this is rendered as link with spaces +* link:external.html#anchor[to anchor of local HTML file] +* link:url[optional link text, optional target attribute, optional role attribute] + + +== E-Mail + +* some.person@org.com +* some.person@org.com[some one] - brackets supported only with leading `mailto:` +* :some.person@org.com - not rendered as link because of leading `:` +* /some.person@org.com - not rendered as link because of leading `/` + +* mailto:some.person@org.com - not rendered as link as `[]` are misssing +* mailto:some.person@org.com[] +* ##before##mailto:some.person@org.com[]##after## - no spaces needed +* mailto:some.person@org.com[some one] +* mailto::some.person@org.com[] - not rendered as link because of double `:` +* mailto: some.person@org.com[] - not rendered as mailto because of space after `:`, but still as inline email +* mailto:[some one] - not rendered as link because of missing address + + +== Escaped + +* \ftp://some.org/some/where/file.extension +* \irc://some.org/some/where/file.extension +* \https://some.org/some/where/file.extension +* \link:relative/path[] +* \link:relative/path[] +* \some.person@org.com +* \:some.person@org.com +* \/some.person@org.com +* \mailto:some.person@org.com[] + + += List + +== Bulleted List + +//// +FIXME The *** without text in the list below should not be highlighted as a horizontal line. +This is going to be problematic, as we would need to know that we are currently inside a list. +//// +.using asterisks +* item 1 + * * item 2 +Has some text. +** item 2.1 +Also has some text. ++ +And an additional paragraph. +** item 2.2 +*** item 2.2.1 ++ +Markers without a text are _no_ item. +*** +** item 2.3 +*** item 2.3.1 +**** item 2.3.1.1 +* item 3 + + * item 4 +** item 4.1 +**not an item as there is no space + ** item 4.2 + +.using hyphens +- item 1 + - item 2 + -- item 2.1 is not an item as using hyphens is only supported for flat lists + +//// +FIXME: The line above should not be highlighted as literal. +This is going to be problematic, as we would need to know that we are currently inside a list. +//// + +.inside a block +**** +* item 1 +** item 1.1 +**** + + +== Checklist + +//// +FIXME The invalid checklist items below should not be highlighted as bulleted list items. +This is going to be problematic, as we would need to know that we are currently inside a checklist. +//// + +.using asterisks +* [*] checked +** [x] also checked +*** [x] also checked +* [X] _invalid_ check (capital X), normal list item +* [o] _invalid_ check (invalid character), normal list item +* [] _invalid_ check (no space), normal list item +* [ ] not checked +* normal list item + +.using hyphens +- [*] checked +- [*] also checked +-- [*] _not a list item_ as hyphens are only supported for flat lists + -- [*] _not a list item_ as hyphens are only supported for flat lists + +//// +FIXME: the line above should not be highlighted as literal. +This is going to be problematic, as we would need to know that we are currently inside a list. +//// + + +== Description List + +.Normal format +Term normal:: This is a description. + Term indented:: This works too. + +Term multi line:: +This one has multiple lines. +Two lines to be exact. +Term L2::: This term is on level 2. +Term L3:::: This term is on level 3. +Term L4::::: This term is on level 4. +Term L5:::::: This term is on level 5. +Term with empty definition:: +Term with separated colons :: This one has spaces before the `::`. +Term no space::This is _not a description item_ as there is no space after the `::`. +Term with unnumbered list:: +* list item 1 +* list item 2 +Term with multiple colons:: in the term:: +Having multiple `::` in one line is OK too. +.;Strange Term = !?*:: This one has a strange term. +Term 9 : : A space between the double `:` does _not_ work. + +//// +FIXME The line with the "Strange Term" abvoe should not be highlighted as title in this case. +This is going to be problematic, as we would need to know that we are currently inside a list. +//// + +.Term and description on the same line +[horizontal] +Term 1:: first level. +Term 2::: second level. +Term 3:: first level again. + + +== Numbered List + +.using numbers +1. item 1 +2. item 2 + 3. item 3 +4 Is not an item. +Numbers without a trailing dot do _not_ result in an item. +123. This is an item with an out-of-sequence number. +It will be fixed in the rendered output. + +.using dots +. item 1 + . item 2 +..not an item as there is no space + .. item 2.1 + .. item 2.2 +... item 2.2.1 +.... item 2.2.1.1 + . item 3 + +//// +FIXME The line above starting with "..not an item" should not be highlighted as title in this case. +This is going to be problematic, as we would need to know that we are currently inside a list. +//// + + +== Question and Answer List + +//// +FIXME Indented answer is highlighted as verbatim block, messing up further question. +This is going to be problematic, as we would need to know that we are currently inside a list. +//// + +[qanda] +What is Asciidoctor?:: +An implementation of the AsciiDoc processor in Ruby. +& answer pairs. +Must the answer be indented?:: + It's not necessary, but possibly. +What is the answer to the Ultimate Question?:: 42 + + += Macro +// for `btn:`, `kbd:`, `menu:` +:experimental: +// for icon:tags[] etc. +:imagesdir: media +// needed to use macro `toc::[]` +:toc: macro + +== General Information + +NOTE: There is no space needed before the macro name or after the closing `]`. + + +== Anchor + +There is a macro form anchor:anchor-id[Macro Anchor] for anchor definition. + +See `anchor.adoc` for other forms. + + +== Cross Reference + +xref:anchor-id[macro xref] + +WARNING: Highlighting for cross references with text spanning multiple lines is not supported. + +xref:id[ +Line 1 in cross reference text. +Line 2 in cross reference text. +] + +\xref:anchor-id[macro xref] escaped + + +== Footnote + +This text has a foonotefootnote:[A simple footnote.]. + +This text has a foonote with idfootnoteref:[fn-1, A footnote reference.]. + + +== Icon + +This is a tag icon:tags[] icon with no color set. + +This is a blue icon:tags[role="blue"] tag. + +This is a big green icon:tags[role="green", size="2x"] tag. + + +== Image + +An imageimage:logo-outline-color.svg[Logo,25]within some text. + + +== Keyboard Shortcut + +kbd:[Ctrl+M] + + +== Menu Selection + +menu:File[Save] + +menu:View[Zoom > 1:1] + + +== Pass + +Some pass:[passthrough] HTML. + +Some pass:quotes[passthrough with *quoted* text] HTML. + +Some pass:q[passthrough with *quoted* text] HTML. + + +== Table of Contents + +toc::[] + + +== UI Buttons + +Press the btn:[OK] button when you are finished. + + +== Escaped + +This is no anchor \anchor:macro-anchor[Macro Anchor]. + +This is no button \btn:[Cancel]. + +This is no foonote\footnote:[A simple footnote.]. + +This is no foonote with id\footnoteref:[fn-1, A footnote reference.]. + +This is no image\image:logo-outline-color.svg[Tree, 25]. + +This is no icon \icon:tags[]. + +This is no keyboard shortcut \kbd:[Ctrl+M]. + +This is no menu \menu:File[Save]. + +This is no passthrough \pass:[passthrough]. + + += Media +// The name `imagesdir` is a bit misleading as audio and video use also this prefix. +:imagesdir: media + +== Audio + +audio::test.mp3[] + +audio::test.mp3[options="loop"] + +.Escaped +\audio::test.mp3[] + + +== Image + +=== Block Format + +.Test SVG +[#logo] +[link=https://github.com/asciidoctor/brand] +image::test.svg[Asciidoctor Logo, 100] + + +==== Not highlighted + +.leading spaces, literal paragraph + image::test.svg[Test, 100] + +.trailing characters +image::test.svg[Test, 100] trailing + + +==== Escaped + +\image::test.svg[Asciidoctor Logo, 100] + + +=== Inline Format + +Withinimage:logo-outline-color.svg[Tree, 25]some text. + +NOTE: There is no space needed before `image` and none after the closing `]`. + +image:logo-outline-color.svg[Tree, 25] at line start. + +At line end image:logo-outline-color.svg[Tree, 25] + +(image:logo-outline-color.svg[Tree, 25]) wrapped in non-space characters. + + +==== Not highlighted + +image + +image: + +someimage: + +some:image + +some image:[] + + +==== Escaped + +Within\image:logo-outline-color.svg[Tree, 25]some text. + + +== Video + +video::test.mp4[width=300] + + +video::test.mp4[width=200, options=loop] + +.Escaped +\video::test.mp4[] + + += Page break + +== Rendered as page break + +<<< + + +== Not rendered as page break + +.Not a page break as it is indented + <<< + +.Not a page break as it has trailing non-space characters +<<< extra characters + +.Escaped +\<<< + + += Preprocessor + +== If Defined + +:!attr-1: +ifdef::attr-1[] +This line is _not_ rendered as the attribute is not defined. +endif::[] + +:attr-1: +ifdef::attr-1[] +This line _is_ rendered as the attribute is now defined. +endif::[] + +.Short form avoiding `endif` +ifdef::attr-1[The attribute `attr-1` is defined] + + +== If Not Defined + +:!attr-1: +ifndef::some-attribute[] +This line _is_ rendered as it is inside a 'if-not-defined' statement and `some-attribute` is not defined. +endif::some-attribute[] + +.Short form avoiding `endif` +ifndef::some-attribute[The attribute `attr-1` is _not_ defined] + + +== Any (or) + +:!attr-1: +:!attr-2: +:attr-3: +ifdef::attr-1,attr-2,attr-3[] +This line is rendered as at least one of the attributes is defined. +endif::[] + +:!attr-1: +:!attr-2: +:!attr-3: +ifdef::attr-1,attr-2,attr-3[] +This line is not rendered as none of the attributes is defined. +endif::[] + + +== None (nor) + +:!attr-1: +:!attr-2: +:!attr-3: +ifndef::attr-1,attr-2,attr-3[] +This line is rendered as none of the attributes is defined. +endif::[] + +:!attr-1: +:!attr-2: +:attr-3: +ifndef::attr-1,attr-2,attr-3[] +This line is not rendered as at least one of the attributes is defined. +endif::[] + + +== All (and) + +:attr-1: +:attr-2: +:attr-3: +ifdef::attr-1+attr-2+attr-3[] +This line is rendered as all the attributes are defined. +endif::[] + +:attr-1: +:attr-2: +:!attr-3: +ifndef::attr-1+attr-2+attr-3[] +This line is not rendered as at least one of the attributes is not defined. +endif::[] + + +== Not All (nand) + +:attr-1: +:attr-2: +:!attr-3: +ifndef::attr-1+attr-2+attr-3[] +This line is rendered as at least one of the attributes is defined. +endif::[] + +:attr-1: +:attr-2: +:attr-3: +ifndef::attr-1+attr-2+attr-3[] +This line is not rendered as all the attributes are not defined. +endif::[] + + +== If Eval + +:two: 2 +ifeval::[{two} > 1] +This line is rendered as the expression evaluates to true. +endif::[] + +:not-true: false +ifeval::[{not-true} == true] +This line is not rendered as the expression evaluates to false. +endif::[] + + +== Escaped + +:!attr-1: +\ifdef::attr-1[] +This line is rendered as the `ifdef`-statement is escaped. +\endif::[] + +:!attr-1: +\ifndef::some-attribute[Only if the attribute is not defined] +This line is rendered as the `ifndef`-statement is escaped. +\endif::some-attribute[] + +:not-true: false +\ifeval::[{not-true} == true] +This line is rendered as the `ifeval`-statement is escaped. +\endif::[] + + += Quote and Verse + +== Quote + +.Contiguous block / paragraph +[quote, attribution, citation title and information] +[[quote-block-id]] +Inside the *contiguous block quote*. +Last line of the quote block. + +This line is not part of the contiguous block quote anymore. + +.Delimited with block name +[quote, attribution, citation title and information] +[[quote-block-id]] +____ +Inside the *delimited block quote*. + +May contain emtpy lines. +____ + +.Delimited without block name +[[quote-block-id]] +____ +Inside the *delimited block quote*. + +May contain emtpy lines. +____ + +.Using an open block +[quote] +[[quote-block-id]] +-- +Inside the *open block quote*. +-- + +.Nested block quote +[quote, outer attribution, outer citation title and information] +[[quote-block-id]] +____ +First line of outer quote. +[quote, inner attribution, inner citation title and information] +[[quote-block-id]] +______ +Inside the inner quote. +______ +Last line of outer quote. +____ + +// Currently no specific highlighting supported. +.Quoted paragraph +"Inside the *quoted paragraph*. +As being a paragraph, no empty lines are supported." +-- attribution, citation title and information + + +.Air quote +[,attribution, citation title and information] +"" +Inside the *air quote*. + +Supports empty lines. +"" + +// Currently no specific highlighting supported. +.Markdown style +> Inside the *markdown quote*. +> +> May contain emtpy lines. +> -- attribution, citation title and information + +// Currently no specific highlighting supported. +.Nested markdown style +> Start of outer quote. +> +> > Some inner quote. +> +> * can use AsciiDoc ... +> * inside markdown block +> +> > Another inner quote. +> +> End of outer quote. + + +== Verse + +.Contiguous block / paragraph +[verse, attribution, citation title and information] +[[verse-block-id]] +Inside the *contiguous block verse*. +Second line of the verse block. + +This line is not part of the contiguous verse block anymore. + +.Delimited block with name +[verse, attribution, citation title and information] +[[verse-block-id]] +____ +Inside the *delimited block verse*. + +Supports empty lines. +____ + +.Delimited block without name +This would be rendered as a quote block as the same delimiters are used. + +.Using an open block +[verse, attribution, citation title and information] +[[verse-block-id]] +-- +Inside the *open block verse*. +-- + + += Replacement + +TIP: See also the https://asciidoctor.org/docs/user-manual/#replacements[corresponding section] in the Asciidoctor manual. + + +== Textual symbol replacements + +|=== +|Name |Syntax |Escaped + +|copyright |(C) |\(C) +|registered |(R) |\(R) +|trademark |(TM) |\(TM) + +|apostrophe |KDE's |KDE\'s +|ellipses |... |\... footnote:[Escaping has no effect] +|m dash |-- |\-- footnote:[Escaping yields another different dash] + +|left single arrow |<- |\<- +|right single arrow |-> |\-> +|left double arrow |<= |\<= +|right double arrow |=> |\=> +|=== + + +=== Not replaced + +// Single apostrophe must be surrounded by alphabetic characters. +* a' +* 'a +* .'. +* a'. +* .'a + + +== Numerical Character Reference + +=== Decimal + +§ + +##before##§##after## + +§ + + +=== Hexadecimal + +§ + +##before##§##after## + +§ + + +=== Escaped + +\§ +\§ +\§ +\§ + + +== HTML/XML Character Entity References + +See e.g. https://en.wikipedia.org/wiki/List_of_XML_and_HTML_character_entity_references[Wikipedia]. + +IMPORTANT: Highlighting of HTML/XML character entity references is _not_ supported. +There are just too many of them. + +// some examples +==== +≠ +≡ +==== + + += Section L0 + +[abstract] +== Abstract + +This document is used for testing various aspects of syntax highlighting regarding sections. + +:title-attribute: with attribute + +== Section L1 + +=== Section L2 + +==== Section L3 + +===== Section L4 + +====== Section L5 + +======= This is not a new section + +The level would be too deep. +Only sections up to level 5 (having 6 leading `=`) are supported. + + +#### Section L3 + +Using Markdown section syntax works too. + +=#=# This is not a section. +Use either `=` or `#`, but not mixed. + + +===== [[id-1]] [[id-2]] Section L4 + +This section has leading additional achors. + + +==== Section L3 [[id-1]][[id-2]] + +This section has trailing additional anchors. + +==== [[id-1]][[id-2]]Section L3[[id-3]][[id-4]] + +This section has both leading and trailing additional anchors. + +==== Section L3 {title-attribute} in Title + +.Title {title-attribute} +This section has an attribute in its title. + +[discrete] +== Discrete Section + +This section will not be shown in the table of contents. + +//// +== Section with _emphasized_ text + +=== Section with escaped \_emphasized_ text +//// + + +== Section with #marked# text + +=== Section with escaped \#marked# text + + +== Section with `monospaced` text + +=== Section with escaped \`monospaced` text + +//// +== Section with *strong* text + +=== Section with escaped \*strong* text +//// + += Another Section at Level 0 + + += Table + +== Default Separator + +.PSV +// some comment +[[table-1]] +[.some-role] +[#table-shorthand] +// some comment +|=== +// some comment +| header col 1 | header col 2 | header col 3 +// some comment + +// with escaped cell separator +| row 1 \| col 1 | row 1 col 2 | row 1 col 3 +// no spaces needed around `|` +| *row* 2 col 1|row 2 col 2|row 2 col 3 + +|row 3 col 1 +// using attribute +| row 3 col 2 {vbar} +|ro3 3 col 3 + +| row 4 col 1 a|some AsciiDoc in col 2 row 4 + +* item 1 +* item 2 +|row 4 col 3 + +2*| row 5 has same contents in first 2 columns +|row 5 col 3 + +|row 6 col 1 2+| span row 6 in col 2 and 3 + +.2+|span col 1 in row 6 and 7|row 6 col 2|row 6 col 3 +|row 7 col 2|row 7 col 3 + +2.2+^.^|span col 1 and 2 in row 8 and 9|row 8 col 3 +|row 9 col 3 + +e|row 10 col 1 is emphasized (italic) +s|row 10 col 2 is strong (bold) +m|row 10 col 3 is monospaced +|=== + + +== Custom Separator + +IMPORTANT: Highlighting of tables with custom separator is not supported. +All `|` inside the table will be falsly highlighted. + +[separator=!] +|=== +// the `|` in the line below should not be highlighted. +!row 1 | col 1 !row 1 col 2 +s!row 2 col 1 !row 2 col 2 +|=== + +[separator=a] +|=== +arow 1 col 1 arow 1 col 2 +sarow 2 col 1 arow 2 col 2 +|=== + + +== Delimiter-Separated Values + +IMPORTANT: Highlighting for tables with delimiter-separated values is not supported. +All `|` inside the table will be falsly highlighted. + +[format=csv] +|=== +Col 1 ,Col 2 ,Col 3 + +// the `|` in the line below should not be highlighted. +row 1 | col 1 ,row 1 col 2 ,row 1 col 3 +row 2 col 2,row 2 col 2,row 2 col 3 + +row 3 col 3 , "row ""3"", col 2" , row 3 col 3 +|=== + + +=== Shorthand Notation for Data Tables + +.CSV +,=== +Col 1 ,Col 2 ,Col 3 + +row 1 col 1 ,row 1 col 2 ,row 1 col 3 +row 2 col 2,row 2 col 2,row 2 col 3 + +row 3 col 3 , "row ""3"", col 2" , row 3 col 3 +,=== + +.DSV +:=== +Col 1 :Col 2 :Col 3 + +row 1 col 1 :row 1 col 2 :row 1 col 3 +row 2 col 2:row 2 col 2:row 2 col 3 +row 3 col 3 : row 3 col 2 : row 3 col 3 +:=== + + diff --git a/autotests/html/asciidoc.adoc.html b/autotests/html/asciidoc.adoc.html new file mode 100644 index 0000000..d819c48 --- /dev/null +++ b/autotests/html/asciidoc.adoc.html @@ -0,0 +1,2807 @@ + + + +asciidoc.adoc + +
+= AsciiDoc Syntax Highlighting
+// There are multiple level 0 sections, so use book instead of article.
+:doctype: book
+// For nice admonition and callout icons.
+:icons: font
+:toc: left
+
+Testing the syntax highlighting support in KDE Frameworks.
+
+The first of the following sections lists the things that are known not to work.
+Further sections are intended for testing the supported features of AsciiDoc.
+
+
+= Known Not to Work
+
+There are a couple of things that are known not to work.
+
+
+== Block
+
+* Highlighting of attributes inside a block title.
+
+* Highlighting of formatted text inside a block title other than ...
+** #marked#
+** `monospaced`
+
+* Code folding for contiguous blocks.
++
+This has an advantage too, though.
+It enables the user to decide on having code folding or not.
+For short blocks without empty lines where no code folding is desired, use contiguous blocks.
+For longer blocks which should support code folding, use delimited blocks.
+
+* Multiple lines of meta data.
++
+.For delimited blocks, Asciidoctor supports something like this:
+-----
+[source]
+[, options="nowrap"]
+----
+puts 'hello'
+----
+-----
++
+Syntax highlighting does not recognize the additional meta data lines and will rather interpret this as a contiguous block.
+
+* https://asciidoctor.org/docs/user-manual/#discrete-headings[Discrete headings]  inside block.
++
+-----
+****
+Some text.
+
+[discrete]
+=== Discrete Heading
+
+Some more text.
+****
+-----
++
+Syntax highlighting does not recognize discrete headings inside a block.
+If a normal section title is marked as being discrete, highlighting works.
+
+
+== Custom Styles
+
+* Highlighting of formatted text within the phrase to be styled.
++
+  Some [big]#big and *strong*# text.
+
+* Highlighting of styles with a phrase that spans multiple lines.
++
+----
+[big]#this
+is
+not
+highlighted#
+----
+
+
+== Formatted/Quoted Text
+
+* Highlighting of formatted/quoted text (e.g. monospaced) that spans multiple lines.
+
+* Highlighting combinations besides those of emphasized, strong and monospaced.
+** Attributes inside other formatting.
++
+  `{attribute-id} inside monospaced`
+
+** Passthrough inside other formatting.
++
+  `+passthrough+ inside monospaced`
+
+** Marked text inside other formatting.
++
+  `#marked# inside monospaced`
+
+** Subscript inside other formatting.
++
+  `~sub~script inside monospaced`
+
+** Superscript inside other formatting.
++
+  `^super^script inside monospaced`
+
+And even more complex combinations.
+
+
+== List
+
+* Inside a list, indented lines without leading asterisks or hyphen start highlighting for a verbatim paragraph.
+Asciidoctor renders this as normal text.
+
+
+== Macro
+
+* Highlighting of macros with a text argument that spans multiple lines.
++
+----
+xref:id[this works just fine]
+
+xref:id[
+highlighting a macro with
+a text that spans multiples
+does not work
+]
+----
+
+
+== Quote, Verse
+
+* Highlighting for single quote symbol `"`.
++
+Highlighting for air quotes `""` is supported.
+
+* Highlighting for Markdown style quotes.
+
+
+== Replacement
+
+Highlighting for replacements is limited to those listed in the https://asciidoctor.org/docs/user-manual/#replacements[Asciidoctor Manual] and numerical character references.
+
+Highlighting for other https://en.wikipedia.org/wiki/List_of_XML_and_HTML_character_entity_references[HTML/XML character references] is not supported.
+
+.Examples of supported references
+* `+(C)+` resulting in (C)
+* `+=>+` resulting in =>
+* `+&#188;+` resulting in &#188;
+
+.Examples of references that are not supported
+* `+&frac14;+` resulting in &frac14;
+* `+&phi;+` resulting in &phi;
+
+
+== Section
+
+* Setext style for section titles.
++
+Only Atx style is supported.
++
+NOTE: Asciidoctor's https://asciidoctor.org/docs/asciidoc-recommended-practices/[recommended practices] states _not_ to use Setext style for section titles.
+
+* Highlighting of formatted/quoted text inside section title other than ...
+** #marked#
+** `monospaced`
+
+* Code folding.
++
+Attempts made so far delivered unsatisfactory results.
+
+
+== Table
+
+* Highlighting of tables with custom separator.
+** The custom separator will _not_ be highlighted.
+** All `|` inside the table _will be falsly_ highlighted.
+
+* Highlighting of delimiter-separated tables.
+** Table delimiters in shorthand notation and the value separator will _not_ be highlighted.
+** All `|` inside the table _will be falsly_ highlighted.
+
+* Applying styles on table contents.
++
+When defining a table, individual columns or cells can be defined to be highlighted *strong* etc..
+Corresponding highlighting of these cells does not work.
+
+
+
+= Admonition
+
+== Simple Format
+
+NOTE: A simple note.
+
+////
+FIXME: In the paragraph below is no note as it is started in the middle of the paragraph.
+This is problematic as we would need to know that the note line is not the first line in the paragraph.
+////
+Some text.
+NOTE: This is not a separate note as it is part of the paragraph started with the line above.
+
+NOTE:This is not a note as there is no space after the `:`.
+
+  NOTE: This is not a note as it is indented.
+
+NOTE : This is not a note as there are spaces between `NOTE` and `:`.
+
+NOTE:
+This is not a note as it is not using block format and the text is not starting on the same line as the label.
+
+NOTE: This is a lengthy note in simple format.
+Second line.
+One more line.
+And another one.
+This is the last line.
+
+This line is not part of the simple note anymore.
+
+CAUTION: This is a CAUTION.
+
+IMPORTANT: This is IMPORTANT.
+
+TIP: This is a TIP. +
+This second line is rendered as a line on its own because of the trailing `+` in the first line.
+
+WARNING: This is a WARNING.
+
+
+== Block Format
+
+.Contiguous
+[NOTE]
+[[contiguous-note-id]]
+This is a contiguous *note* block.
+Second line.
+And one more line.
+// comment inside block
+This is the final line.
+
+This line is not part of the contiguous note block anymore.
+
+.Delimited
+[NOTE]
+[[delimited-note-id]]
+====
+This is a *note* in block format.
+As a block, the note may have a title
+// comment inside block
+
+In block format, multiple lines, paragraphs etc. are possible.
+====
+
+There is no delimited admonition block without block name.
+Using `====` delimiter without a block name results in an example block.
+
+.Using open block
+[NOTE]
+--
+Inside the open block note.
+--
+
+
+= [[main-1]]An[[main-2]]chor[[main-3]] and Cross Reference
+
+== [[section-1]][[section-2]] An[[section-3]][[section-4]]chor[[section-5]]
+
+[[isolated-anchor]]
+Isolated anchor.
+
+[[isolated-anchor-with-label,Isolated Anchor With Label]]
+Isolated anchor with label.
+
+This line has an [[inline-anchor, Inline Anchor]]anchor placed inside the text.
+
+[#isolated-shorthand]
+Isolated anchor using shorthand definition.
+
+[#isolated-shorthand, Isolated Shorthand Anchor]
+Isolated anchor with label using shorthand definition.
+
+This line has an   [    #inline-shorthand    ]#anchor placed inside the text#  #.
+
+.Inside [[block-anchor]]block title
+Works too.
+
+.Macro form
+There is also a maanchor:anchor-id[Macro Anchor]cro form for anchor definition.
+
+NOTE: There is no space needed before the `anchor` macro name.
+Also not after the closing `]`.
+
+
+=== Not an anchor
+
+[[ not-an-anchor]]
+because of the space after the opening brackets.
+
+[[not-an-anchor ]]
+because of the space before the closing brackets.
+
+ [[not-an-anchor]] because of line starting with spaces.
+
+ [#not-an-anchor]#because# of line starting with spaces.
+
+[#not-an-anchor] because of trailing text.
+
+Not an anchor because of leading text [#not-an-anchor]
+
+Also[#not-an-anchor]#some text# because of missing space before `[`.
+
+Also [#not-an-anchor] #some text# because of space after `]`.
+
+Also [#not-an-anchor]# some text# because of space after the leading `#`.
+
+Also [#not-an-anchor]because of missing referred text (e.g. `#some text#`).
+
+
+=== Escaped
+
+This is an escaped \[[anchor-id, some #anchor# label]] anchor.
+
+This is just some \normal text.
+
+Some\[[anchor-id]]anchor.
+
+\[[anchor-id]]
+
+////
+FIXME: highlighting differs
+Asciidoctor seems to just pass through the anchor when escaping it.
+This behaviour is rather unexpected, as in other cases the escaped contents is subject to further highlighting.
+
+We currently only consume the opening bracket.
+////
+This is an escaped \[#shorthand-id]#anchor in shorthand form#.
+
+Some \[#shorthand-id].
+
+\[#shorthand-id]
+
+\[#shorthand-id]#
+
+
+== Cross References
+
+<<main-1>>
+
+<<main-2>>
+
+<<main-3>>
+
+<<section-1>>
+
+This is a reference to <<section-2>>.
+
+<<section-3>> some text >> some more text
+
+some << text <<<section-4>>>
+
+<<section-5>>
+
+<<isolated-anchor>>
+
+<<isolated-anchor-with-label>>
+
+<<inline-anchor>>
+
+<<isolated-shorthand>>
+
+<<inline-shorthand>>.
+
+<<block-anchor>>
+
+
+=== Escaped
+
+This is not a reference \<<section-1>>.
+
+
+= Attribute
+
+== No Value
+
+:some-attribute:
+This line should not be highlighted.
+
+  :not-an-attribute: as the line is indented.
+
+
+== Single Line Value
+
+Attributes with values that are rendered as a single line, even if their definition spans multiple lines.
+
+.Single line definition
+:single-line: only one line
+This line is not part of the attribute value anymore.
+
+##before##{single-line}##after##
+
+:attr-in-attr-value: in multi line definition
+
+.Multi line definition
+:single-line-continued: First line {attr-in-attr-value}. \
+Second line. \
+Another line.
+This line is not part of the attribute value anymore.
+
+##before##{single-line-continued}##after##
+
+IMPORTANT: At least one space is needed before the continuation `\`.
+
+.Line continuation is only highlighted when inside an attribute definition
+some \
+text
+
+
+== Multi Line Value
+
+Attributes with values including hard line breaks.
+
+IMPORTANT: At least one space is needed before the continuation `+` and between the `+` and the `\`.
+
+:multi-line: First line. + \
+Second line.   +    \
+Third line.
+This line is not part of the attribute value anymore.
+
+##before##{multi-line}##after##
+
+
+== Inline Definition
+
+Inline attribute definitions {set:inline-attribute:just fine} works {inline-attribute}.
+
+.Surplus `:` is part of the value
+{set:attr::some value}
+{attr}
+
+{set:attr}
+{attr}
+
+.Not an inline definition as leading `set:` is missing
+{single-line:some value}
+
+
+== Unsetting
+
+:!_custom_2-:
+:_custom_2-!:
+
+.Adding a value when unsetting doesn't make sense, but doesn't hurt either
+:some-attribute: some value
+Attribute is set to `{some-attribute}`.
+
+:!some-attribute: some value
+{some-attribute} is not set anymore.
+
+
+== Not an Attribute
+
+:not-an-attribute:as there is no space after the terminating column of the identifier
+
+  :not-an-attribute: as it is indented
+
+
+== Combination with Other Highlighting
+
+****
+:inside-a-block: inside a block
+Using an attribute {inside-a-block} works too.
+****
+
+:inside-formatting: inside formatting
+An attribute used `{inside-formatting}` is not highlighting as attribute.
+
+
+== Escaped
+
+\:attr-1: escaped attribute definition + \
+second line of escaped attribute definition
+
+\:!attr-1: escaped unset attribute
+
+\:-attr-1: this is not highlighted as escaped attribute definition as it has an invalid attribute id.
+
+This \:attr-1: is not highlighted as escaped attribute definition as it is not used at line start.
+
+:attr-1: some attribute
+This is not rendered as \{attr-1}.
+
+This is not an inline attribute definition \{set:attr-2:some other attribute}. +
+{attr-2} is not set.
+
+****
+:inside-a-block: inside a block
+Escaping an attribute \{inside-a-block} works too.
+****
+
+
+= Bibliography
+
+== Using References
+
+The first reference has no label, so its id <<ref-1>> is rendered.
+
+The second reference has number <<r2>> as label.
+
+The third reference has <<r3>> as label.
+
+A reference defintion inside the text instead of the bibliography section yields some strange result: [[[ref-o,outside bibliography]]]].
+Not sure what to do with this.
+
+This is trying to use the escaped reference <<r4>>.
+
+This is trying to use reference <<r6>>.
+
+
+[bibliography]
+== References
+
+- [[[ref-1]]] This is reference 1.
+- [[[r2,2]]]This is reference 2.
+- [[[r3,Some Text]]]
+This is reference 3.
+- [\[[r4, escaped]]] This is #escaped#.
+- [[[r5,5]]] This is reference 5.
+* [[[r6,strange]]] Using an asterisk yields a strange result.
+
+
+= Block
+
+[abstract]
+.Abstract - contiguous block
+This document is used for testing syntax highlighting regarding various types of blocks.
+E.g. this contiguous abstract block. +
+Using block form for the abstract seems to be rendered differently than the section form (see `section.adoc`).
+
+[abstract]
+.Abstract - delimited open block
+--
+Using the delimited block form ...
+
+enables having empty lines in the abstract.
+--
+
+
+== General
+
+NOTE: Starting and ending delimiter must be balanced, meaning they must have the same length.
+
+.Block title #before# block meta data
+[literal]
+....
+Inside the block.
+....
+
+[literal]
+.Block title `after` block meta data
+....
+Inside the block.
+....
+
+.Invalid block name
+[ literal]
+....
+This block has invalid meta data as there is a space between the opening square bracket and the block name.
+....
+
+.Block with attributes
+[literal, some, attributes]
+....
+Inside the block.
+....
+
+.Anchor before block name for contiguous block
+[[contiguous_block_id_before_name]]
+[literal]
+Inside the block.
+
+.Anchor after block name for contiguous block
+[literal]
+[[contiguous_block_id_after_name]]
+Inside the block.
+
+.Anchor after block name for delimited block
+[literal]
+[#delimited_block_id]
+....
+Inside the block.
+....
+
+.Option definition
+[literal%some-option, some, attributes]
+Inside the block.
+
+.Shorthand anchor definition
+// TODO Would be nice if we could highligth the shorthand ID definition as such.
+[literal#shorthand-id, some, attributes]
+Inside the block.
+
+Link to <<contiguous_block_id_before_name>>.
+
+Link to <<contiguous_block_id_after_name>>.
+
+Link to <<shorthand-id>>.
+
+
+== Admonition
+
+See `admonition.adoc`.
+
+
+== Comment
+
+See `comment.adoc`.
+
+
+== Example
+
+.Contiguous
+[example]
+[[example-block-id]]
+A countiguous *example* block.
+// some comment
+Second line of the example block.
+
+This line is not part of the contiguous example block anymore.
+
+.Delimited with block name
+[example]
+// some comment
+[[example-block-id]]
+// some comment
+====
+// some comment
+Inside the delimited example block.
+====
+
+.Delimited without block name
+[[example-block-id]]
+====
+Inside the delimited example block.
+====
+
+.Using an open block
+[example]
+[[example-block-id]]
+--
+Inside the open block example.
+--
+
+
+== Fenced
+
+NOTE: According to the https://asciidoctor.org/docs/user-manual/#built-in-blocks-summary[Asciidoctor manual], fenced blocks do not support block names.
+
+.Delimited without block name
+[#fenced-block-id]
+```
+Inside the fenced block.
+The block contents is rendered verbatim.
+So there is *no* text formatting.
+```
+
+.This is not a fenced block
+``````
+A fenced block's delimiter length is _exactly_ 3.
+``````
+
+
+== Listing
+
+.Contiguous
+[listing]
+[[listing-block-id]]
+A countiguous *listing* block.
+Last line of the listing.
+
+.Delimited with block name
+[listing]
+[[listing-block-id]]
+// comment before the opening block delimiter
+////
+block comment
+////
+----
+First line inside the *listing* block.
+Last line inside the block.
+----
+
+.Delimited without block name
+[[listing-block-id]]
+----
+Inside the delimited listing block.
+----
+
+.Using an open block
+[listing]
+[[listing-block-id]]
+--
+Inside the open block listing.
+--
+
+
+== Literal
+
+.Contiguous
+[literal]
+// some comment
+[[literal-block-id]]
+// some comment
+Inside the contiguous literal block.
+// this should not be highlighted as comment
+.this should not be highlighted as title
+The block contents is rendered verbatim.
+So there is *no* text formatting.
+// this should not be highlighted as comment
+
+.Delimited with block name
+[literal]
+// some comment
+[#literal-block-id]
+// some comment
+..........
+Inside the delimited literal block.
+// this should not be highlighted as comment
+.this should not be highlighted as title
+..........
+
+.Delimited without block name
+[[literal-block-id]]
+// some comment
+..........
+Inside the delimited literal block.
+..........
+
+.Using an open block
+[literal]
+// some comment
+[[literal-block-id]]
+// some comment
+--
+// this should not be highlighted as comment
+Inside the open block listing.
+--
+
+.Using leading spaces for first line
+    When using some leading spaces, the whole paragraph is treated as literal.
+Only the first line needs to have leading spaces.
+
+This line is not part of the literal paragraph anymore.
+
+
+== Open
+
+NOTE: The open block does not have a contiguous form.
+
+.Delimited
+[#open-block-id]
+--
+An open block's delimiter length is _exactly_ 2.
+
+Last line of the #open# block.
+--
+
+
+== Passthrough
+
+.Contiguous
+[pass]
+[[contiguous-passthrough-id]]
+Inside the contiguous passthrough block.
+Second line to pass trhough.
+
+This line is not part of the contiguous passthrough block anymore.
+
+.Delimited with block name
+[pass]
+[[delimited-passthrough-id]]
+++++++
+Inside the delimited passthrough block with block name.
+++++++
+
+.Delimited without block name
+[[delimited-passthrough-id]]
+++++
+Inside the delimited passthrough block without block name.
+++++
+
+According to the https://asciidoctor.org/docs/user-manual/#built-in-blocks-summary[Asciidoctor Manual], passthrough using an open block is not supported.
+
+
+== Quote
+
+See `quote_verse.adoc`.
+
+
+== Sidebar
+
+.Contiguous
+[sidebar]
+[[sidebar-block-id]]
+Inside the *sidebar* block.
+Second line of the sidebar block.
+
+This line is not part of the sidbar block anymore.
+
+.Delimited with block name
+[sidebar]
+[[sidebar-block-id]]
+**********
+Inside the *sidebar* block.
+**********
+
+.Delimited without block name
+[[sidebar-block-id]]
+****
+Inside the sidebar block.
+****
+
+.Using an open block
+[sidebar]
+[[sidebar-block-id]]
+--
+Inside the sidebar block.
+--
+
+
+== Source
+
+.Contiguous
+[source,ruby]
+[[source-block-id]]
+#This is Ruby source code.
+#NOTE: If there is a space after the `#`, Asciidoctor interprets this as a section title.
+#Seems in contiguous source blocks, Asciidoctor still interprets the block contents, which is rather unexpected.
+import 'needed'
+IO.puts "hello"
+
+.Contiguous using option syntax
+[source%mixed,php]
+<p>
+<?php echo "Hello, World!"; ?>
+</p>
+
+.Delimited with block name
+[source , ruby ]
+[[source-block-id]]
+----
+# This is Ruby source code.
+# NOTE: in delimited source blocks, having a space after the `#` in the comment is OK.
+import 'needed'
+
+IO.puts "hello"
+----
+
+.Delimited with block name using option syntax
+[source%mixed,php]
+----
+<p>
+<?php echo "Hello, World!"; ?>
+</p>
+----
+
+.Delimited without block name
+[[source-block-id]]
+----
+# This is Ruby source code.
+# NOTE: in delimited source blocks, having a space after the `#` in the comment is OK.
+import 'needed'
+
+IO.puts "hello"
+----
+
+.Using an open block
+[source,ruby]
+[[source-block-id]]
+--
+import 'needed'
+
+IO.puts "hello"
+--
+
+
+== Stem
+
+.Contiguous
+[stem]
+[[stem-block-id]]
+Inside the contiguous stem block.
+Second line to pass.
+
+This line is not part of the contiguous Passthrough block anymore.
+
+.Delimited with block name
+[stem]
+[[stem-block-id]]
+++++++
+Inside the delimited stem block with block name.
+++++++
+
+.Delimited without block name
+[[stem-block-id]]
+++++
+Inside the delimited stem block without block name.
+++++
+
+
+== Table
+
+See `table.adoc`.
+
+
+== Verse
+
+.Contiguous
+[verse]
+[[verse-block-id]]
+Inside the *verse* block.
+Second line of the verse block.
+
+This line is not part of the contiguous verse block anymore.
+
+.Delimited with block name
+[verse]
+[[verse-block-id]]
+____
+Inside the *verse* block.
+____
+
+.Delimited without block name
+This would be rendered as a quote block as the same delimiters are used.
+
+.Using an open block
+[verse]
+[[verse-block-id]]
+--
+Inside the *verse* block.
+--
+
+
+== Nested Blocks
+
+[NOTE]
+Some note text.
+
+====
+Start of outer example block.
+
+.Nested example block
+=====
+Inside the inner example block.
+// some comment
+
+.Nested literal block
+[literal]
+// some comment
+----
+Inside the literal block within the inner example block.
+--
+Trying to use a block within a verbatim block results in verbatim text, of course.
+--
+----
+=====
+Line in outer block.
+[listing]
+----
+Inside the inner listing block.
+----
+End of outer block.
+====
+
+.Admonition inside some other block
+====
+Some text.
+
+NOTE: This is a note in simple format inside a block.
+
+Some more text.
+====
+
+
+= Callout
+// Add `:icons: font` for nice callout icons.
+
+Callouts are usually used with listing/source blocks, but Asciidoctor renders them also without a listing block.
+
+<1>   This is a callout.
+<.> This is a callout too.
+
+ <2> This is not rendered as a callout as it is indented.
+
+The line below is not rendered as a callout as it has no text in the same line.
+
+<3>
+
+////
+FIXME This should not be highlighted as callout.
+As it depends on the kind of line before, this is problematic.
+////
+The line below is not rendered as callout as it is part of this paragraph.
+<4> This should _not_ be highlighted as callout.
+
+.Callouts with manual numbering
+[source,sh]
+----
+ls -l  <2>
+ls -la  <1>
+----
+<1> Explanation for callout number 1.
+<2>   Explanation for callout number 2.
+\<3> This is not a callout as it is escaped.
+
+.Callouts with automatic numbering
+[source,sh]
+----
+ls -l  <.>
+ls -la  <.>
+----
+<.> Explanation for callout number 1.
+<.> Explanation for callout number 2.
+
+
+= Comment
+
+TIP: Comment highlighting supports the standard https://cgit.kde.org/syntax-highlighting.git/tree/data/syntax/alert.xml[KDE alerts] (TODO, FIXME, ...) in both single-line and multi-line comments.
+
+
+== Single Line
+
+Single-line comments start with exactly `//`.
+If there are any characters - including spaces - before the `//`, the line will be rendered.
+If there are more than two consecutive `/`, the line will be rendered.
+
+This line // will be rendered completely.
+
+  // This line will be rendered as verbatim text as it is indented.
+
+/// This line will be rendered as it starts with 3 `/`.
+
+// This line will be invisible.
+
+//This line will be invisible.
+
+//
+
+\// Escaped comment.
+
+\// TODO Of course there is no alert highlighting in escaped comments.
+
+.Alerts
+// NOTE testing alerts
+// TEST: testing alerts
+// TODO: testing alerts
+// TASK testing alerts
+// WARNING: testing alerts
+// ALERT: testing alerts
+// DANGER: testing alerts
+
+
+== Multi Line
+
+.Contiguous block
+[comment]
+Some comment.
+Alerts:
+NOTE testing alerts
+TEST: testing alerts
+TODO: testing alerts
+TASK testing alerts
+WARNING: testing alerts
+ALERT: testing alerts
+DANGER: testing alerts
+Last line of contiguous block comment.
+
+This line is not part of the contiguous block comment anymore.
+
+.Delimited block without name
+//////
+This is a multi-line comment.
+It spans multiple lines.
+
+Alerts:
+NOTE testing alerts
+TEST: testing alerts
+TODO: testing alerts
+TASK testing alerts
+WARNING: testing alerts
+ALERT: testing alerts
+DANGER: testing alerts
+
+This is the comment's last line.
+//////
+
+[comment]
+.Delimited block with name
+////
+This is a multi-line comment.
+It spans multiple lines.
+
+Alerts:
+NOTE testing alerts
+TEST: testing alerts
+TODO: testing alerts
+TASK testing alerts
+WARNING: testing alerts
+ALERT: testing alerts
+DANGER: testing alerts
+
+This is the comment's last line.
+////
+
+.Using open block
+[comment]
+--
+Inside the open block comment.
+--
+
+
+= Counter
+
+== Use and Render
+
+.Start with 1 and render value
+New value for `c1` is {counter:c1}.
+
+.Increment and render
+And now it is {counter:c1}.
+
+.Render the current value without changing it
+Current value is {c1}.
+
+
+== Use Without Rendering
+
+.Define the new counter
+No new value to be {counter2:c2}seen.
+
+.Let's see the current value
+Current value is {c2}.
+
+.Increment
+No incremented value to be {counter2:c2}seen.
+
+.Let's see the current value
+Current value is {c2}.
+
+
+== Using a Start Value
+
+.Start with 3 and render value
+New value for `c3` is {counter:c3:99}.
+
+.Increment and render
+And now it is {counter:c3}.
+
+.Works with characters too
+New value for `c4` is {counter:c4:X}
+
+.Increment character counter and render
+And now it is {counter:c4}.
+
+
+== About using Spaces
+
+CAUTION: If you leave spaces after the `:` or before the closing `}`, Asciidoctor will make them part of the counter attribute name. +
+So it's probably wise to avoid spaces here.
+
+.Define a counter
+New value is {counter:c5}.
+
+.This is actually a new counter
+New value is {counter: c5}.
+
+.But you can't access that attribute
+Can't just show the current value { c5}
+
+.Only if we increment it
+Incremented value is {counter: c5}.
+
+.This is again a new counter
+New value is {counter:  c5}.
+
+.This is also a new counter
+New value is {counter:c5 }.
+
+CAUTION: Similar problems occur when using spaces around starting values. +
+*Just don't use spaces*.
+
+.New counter with start value
+New value is {counter:c6: 9 }
+
+.But when trying to increment
+Incremented value is {counter:c6}
+
+
+
+= Text Formatting
+
+TIP: Asciidoctor uses also the term _quoted text_.
+
+== Custom Styles
+
+[big]#big text#
+
+Some [.big]#big text#.
+
+Some [big]#big and *strong* text#.
+
+Some text with [foo]#custom style#.
+
+[foo bar]#foo bar text#
+
+before![big]#big text#
+
+[big]#big text#!after
+
+[big]##*text*##
+
+////
+FIXME Highlighting differs.
+The phrase is rendered as marked.
+Thetrailing hash is therefore not visible.
+////
+[big]###text###
+
+[fo[o]#some text#
+
+
+[underline]_emphasized and underlined_
+
+[underline]__emphasized and underlined_
+
+
+[underline]`monospaced and underlined`
+
+[underline]``monospaced and underlined``
+
+
+[underline]*strong and underlined*
+
+[underline]**strong and underlined**
+
+
+=== Not rendered as custom style
+
+[fo]o]#not a custom style# because of surplus `]`.
+
+[big]not a phrase because of missing phrase markers.
+
+[big]# # because only spaces used as phrase.
+
+[big]# the phrase# because of leading space in phrase.
+
+[big]#the phrase # because of trailing space in phrase.
+
+Before[foo]#the phrase# because of missing non-word character before clause.
+
+Before [foo]#the phrase#after because of missing non-word character after clause.
+
+
+=== Escaped
+
+This is not \[underline]#underlined text#.
+
+
+== Emphasized
+
+=== Rendered formatted
+
+This line contains a _sequence_ of _multiple emphasized_ words.
+
+This line contains a single _emphasized_ word.
+
+This line contains a single __emphasized_ word.
+
+This line contains a single _emphasized__ word.
+
+The text within the brackets should be (_emphasized_), but the brackets themselves not.
+
+(_emphasized_  [_emphasized_  {_emphasized_  |_emphasized_  ._emphasized_  ,_emphasized_  !_emphasized_  ?_emphasized_  _emphasized_?
+
+_emphasized_) _emphasized_] _emphasized_} _emphasized_| _emphasized_. _emphasized_; _emphasized_,
+
+_emphasized_( _emphasized_( _emphasized_[ _emphasized_{
+
+_emphasized_)
+
+_emphasized_
+
+__aa__bb
+
+aa__bb__
+
+aa__bb _cc__dd
+
+aa__bb cc___dd
+
+aa__ bb __cc
+
+
+=== Rendered as-is
+
+This line does _not_ contain _some emphasized _ text as there is a surplus space.
+
+This line does _not_ contain_some emphasized_ text as there is a space missing.
+
+This line does _not_ contain _some emphasized_text as there is a space missing.
+
+foo ;_emphasized_ :_emphasized_ }_emphasized_
+
+;_emphasized_
+:_emphasized_
+}_emphasized_
+
+// FIXME Highlighting differs.
+In this line, there is some ___very emphasized___ text.
+Asciidoctor renders it as normal text, just ignoring all the underscores.
+That is a bit strange.
+
+
+=== Escaped
+
+Not \_emphasized_ as it is escaped.
+
+Still \__emphasized__ as only the outermost level is escaped.
+
+
+== Marked
+
+=== Rendered formatted
+
+Some # marked # text.
+
+Works #also for multiple words#.
+
+Some ##marked# text.
+
+Some #marked## text.
+
+Some ##marked## text.
+
+Some[big]#marked# text.
+Not rendered big but marked, because of missing space before `[big]`.
+
+Works also for p##art##s of a word.
+
+p##art#!s
+
+!#marked#!
+
+#marked#
+
+##marked##
+
+
+=== Rendered as-is
+
+Not rendered # marked# because of space after the leading hash.
+
+Not rendered #marked # because of space before the trailing hash.
+
+Not rendered#marked# as there is a space missing.
+
+Not rendered #marked#as there is a space missing.
+
+  This is #rendered# as a verbatim block as it is indented.
+
+Some [big]#big marked# text.
+
+Some [big]##big marked## text.
+
+
+=== Escaped
+
+Not \#marked# as it is escaped.
+
+Still \##marked## as only the outermost level is escaped.
+
+
+== Monospaced
+
+=== Rendered formatted
+
+This line contains a `sequence of ` multiple monospaced` words.
+
+This line contains a single `monospaced` word.
+
+This line contains a single ``monospaced` word.
+
+This line contains a single `monospaced`` word.
+
+The text within the brackets should be (`monospaced`), but the brackets themselves not.
+
+before``monospaced``after.
+
+`monospaced`
+
+(`mono` [`mono` {`mono` |`mono` .`mono` ,`mono` !`mono` ?`mono`
+
+`mono`) `mono`) `mono`] `mono`} `mono`| `mono`. `mono`; `mono`, `mono`?
+
+`mono`( `mono`( `mono`[ `mono`{
+
+``aa``bb
+
+aa``bb``
+
+aa``bb `cc``dd
+
+aa``bb cc```dd
+
+aa`` bb ``cc
+
+
+=== Rendered as-is
+
+Not rendered ` monospaced` because of leading space.
+
+Not rendered `monospaced ` because of trailing space.
+
+Not rendered`monospaced` as there is a space missing.
+
+Not rendered `monospaced`as there is a space missing.
+
+
+=== Escaped
+
+Not \`monospaced` as it is escaped.
+
+Still \``monospaced`` as only the outermost level is escaped.
+
+
+== Passthrough
+
+=== Rendered passed through
+
+This text is +passed _as_ is+ with no further formatting.
+
+Matching +is _lazy_+, so this + is rendered.
+
+This +_is_ passthrough`+` as passthrough has higher priority as monospaced.
+
++passthrough+ at line start.
+
+Passthrough at +line end.+
+
+Minimal passthrough +a+.
+
+
+This text is ++passed _as_ is++ with no further formatting.
+
+This text is +++passed _as_ is+++ with no further formatting.
+
+
+=== Rendered as-is
+
+No+passthrough+ as there is no space before the leading `+`.
+
+No +passthrough+as there is no space after the trailing plus.
+
+No + passthrough+ as there is a space after the leading `+`.
+
+No +passthrough + as there is a space after the trailing plus.
+
+
+=== Escaped
+
+This text \+is _not_ passed through+ because of escaping.
+
+This text \++is _still_ passed through++ as only the outermost level is escaped.
+
+This text \+++is _still_ passed through+++ as only the outermost level is escaped.
+
+
+== Strong
+
+=== Rendered formatted
+
+This line contains a *sequence of * multiple strong* words.
+
+This line contains a single **strong* word.
+
+This line contains a single**strong* word.
+
+This line contains a single *strong** word.
+
+The text within the brackets should be (*strong*), but the brackets themselves not.
+
+(*strong* [*strong* {*strong* |*strong* .*strong* ,*strong* !*strong* ?*strong*
+
+*strong*) *strong*] *strong*} *strong*| *strong*. *strong*; *strong*, *strong*?
+
+*strong*( *strong*( *strong*[ *strong*{
+
+*strong*)
+
+*strong*
+
+aa**bb**
+
+**aa**bb
+
+aa**bb**cc
+
+aa**bb *cc**dd
+
+aa**bb cc***dd
+
+aa** bb **cc
+
+
+=== Rendered as-is
+
+This line does _not_ contain *some strong * text as there is a space before the trailing asterisk.
+
+This line does _not_ contain*some strong* text as there is a space missing before the leading asterisk.
+
+This line does _not_ contain *some strong*text as there is a space missing after the trailing asterisk.
+
+some text ;*strong* :*strong* _*strong* }*strong*
+
+some text _*strong*_
+
+;*strong*
+:*strong*
+}*strong*
+
+ Not *strong* as there is a leading space in the line, making it verbatim.
+
+// FIXME Highlighting differs.
+In this line, there is some ***very strong*** text.
+It is rendered just ignoring the asterisks.
+That is a bit strange.
+
+
+=== Escaped
+
+Not \*strong* as it is escaped.
+
+Still \**strong** as only the outermost level is escaped.
+
+
+== Subscript
+
+=== Rendered formatted
+
+H~2~O
+
+
+=== Rendered as-is
+
+Not rendered sub~sc ript~ as there is a space within.
+
+
+=== Escaped
+
+Not \~subscript~ as it is escaped.
+
+
+== Superscript
+
+=== Rendered formatted
+
+E = m c^2^
+
+
+=== Rendered as-is
+
+Not rendered super^sc ript^ as there is a space within.
+
+
+=== Escaped
+
+Not \^superscript^ as it is escaped.
+
+
+== Combinations
+
+IMPORTANT: Combinations are supported by Asciidoctor, as long as the markup sets are entered in the right order.
+The monospace markup must be the outermost set, then the strong set, and the emphasized markup must always be the innermost set.
+
+
+=== Rendered formatted
+
+This is *_strong emphasized_* text.
+
+This is *__strong _ * emphasized_* text.
+
+This is**_strong emphasized_**text.
+
+This is**__ strong emphasized_**text.
+
+*_strong emphasized_*
+
+
+This is `*strong monospaced*` text.
+
+This is `**strong ` * monospaced*` text.
+
+This is``*strong monospaced*``text.
+
+This is``** strong monospaced*``text.
+
+`*strong monospaced*`
+
+
+This is `_emphasized monospaced_` text.
+
+This is `__emphasized ` _ monospaced_` text.
+
+This is``_emphasized monospaced_``text.
+
+This is``__ emphasized monospaced_``text.
+
+`_emphasized monospaced_`
+
+
+This is `*_strong emphasized monospaced_*` text.
+
+This is `*__strong emphasized * ` _ monospaced_*` text.
+
+This is``*_strong emphasized monospaced_*``text.
+
+This is``*__ strong emphasized monospaced_*``text.
+
+`*_strong emphasized monospaced_*`
+
+
+=== Unsupported
+
+Highlighting for other combinations is currently not supported, as there would be a large number of rules and styles necessary.
+
+* _emphasized #marked#_
+* #marked *strong*#
+* *strong #marked#*
+* *strong _emphasized #marked#_*
+
+* subscript _with~in~ emphasized_
+* subscript within marked: #H~2~O#
+* subscript `with~in~ monospaced`
+* subscript *with~in~ strong*
+
+* superscript _with^in^ emphasized_
+* superscript within marked: #E = m c^2^#
+* superscript `with^in^ monospaced`
+* superscript *with^in^ strong*
+
+And even more complex ones.
+
+
+=== Rendered as-is
+
+This is no *_ strong emphasized_* text, it's *strong* only.
+
+This is no *_strong emphasized _* text, it's *strong* only.
+
+This is no _*strong emphasized*_ text, it's _emphasized_ only.
+
+This is no _`emphasized monospaced`_ text, it's _emphasized_ only.
+
+
+=== Escaped
+
+This is not rendered \`_emphasized monospaced_`. +
+But it is rendered emphasized.
+
+This is not rendered \*_emphasized strong_*. +
+But it is rendered emphasized.
+
+This is not rendered \`*monospaced strong*`. +
+But it is rendered strong.
+
+This is not rendered \`*_emphasized monospaced strong_*`. +
+But it is rendered emphasized strong.
+
+
+= Horizontal Rules
+
+== Simple patterns
+
+'''
+---
+***
+
+
+== Patterns with spaces
+
+- - -
+* * *
+
+.Not a horizontal rule
+' ' '
+
+
+== Arbitrary length
+
+NOTE: Although the https://asciidoctor.org/docs/user-manual/#markdown-style-horizontal-rules[Asciidoctor Manual] states that horizontal rule patterns are only supporting up to three characters (ignoring the optional spaces), some longer patterns work too.
+
+'''''''
+
+////
+These patterns don't work, as they start delimited blocks, item lists etc..
+--------
+******
+- - - - - -
+* * * * * * * * * 
+////
+
+
+== Inside blocks
+
+****
+Horizontal rules work also inside blocks.
+They eventually need an empty line before them, though.
+
+'''
+After the horizontal rule.
+****
+
+
+= Include
+:includedir: include
+
+== Included Contents Rendered
+
+NOTE: Using file names with spaces works.
+
+include::{includedir}/demo.adoc[]
+
+.Partial include
+include::{includedir}/demo.adoc[lines=2..3]
+
+.Inside contiguous block
+[source,ruby]
+IO.puts 'hello'
+"""
+include::{includedir}/demo.adoc[lines=2..3]
+"""
+IO.puts 'bye'
+
+.Inside delimited block with name
+[literal]
+----
+This line shall be highlighted as verbatim.
+include::{includedir}/demo.adoc[lines=2..3]
+This line shall be highlighted as verbatim.
+----
+
+.Inside delimited block without name
+....
+This line shall be highlighted as verbatim.
+include::{includedir}/demo.adoc[lines=2..3]
+This line shall be highlighted as verbatim.
+....
+
+.Inside table
+|===
+|row 1 col 1|row 2 col 2
+|
+// the include directive must have its own line with nothing else
+include::{includedir}/demo.adoc[lines=1..1]
+|row 2 col2
+
+|row 3 col 1
+|row 3 col 2
+|===
+
+
+== Rendered as-is
+
+.Inside verbatim paragraph
+ This line shall be highlighted as verbatim.
+include::{includedir}/demo.adoc[lines=2..3]
+This line shall be highlighted as verbatim.
+
+
+= Index
+
+== Rendered as Index Term
+
+This is a ((flow)) index term.
+
+This is a indexterm2:[flow] index term.
+
+This is a (((concealed, index, term))) concealed index term.
+
+This is a indexterm:[concealed, index, term] concealed index term.
+
+This is rendered as a ((flow index term))).
+
+This is rendered as a (((flow index term)).
+
+This is ((())) empty but rendered as index term nevertheless.
+
+Some (((index term))).
+
+Some ((((index term)))).
+
+
+== Rendered as-is
+
+This is (()) not an index term as it is empty.
+
+This is (not an index term)) as there is a `(` missing.
+
+This is ((not an index term) as there is a `)` missing.
+
+
+== Escaped
+
+This is \((not an indexterm)) as it is escaped.
+
+This is \(((not a concealed index term))), but still a flow index term as only the outer brackets are escaped.
+
+This is \(\((not an indexterm))) as it is fully escaped.
+
+This is not a \indexterm2:[flow] index term.
+
+This is not a \indexterm:[concealed, index, term] concealed index term.
+
+[index]
+== Index Catalog
+
+WARNING: HTML output currently does not support the creation of the index catalog.
+
+
+= Link
+
+== ftp, irc
+
+* ftp://some.org/some/where/file.extension
+* irc://some.org/some/where/file.extension
+
+
+== http(s)
+
+* http://some.org/some/where/file.extension
+* https://some.org/some/where/file.extension
+
+// . , ; : followed by a space terminate the link
+* https://some.org/some/where/file.extension. some text
+* https://some.org/some/where/file.extension.some text
+* https://some.org/some/where/file.extension, some text
+* https://some.org/some/where/file.extension,some text
+* https://some.org/some/where/file.extension; some text
+* https://some.org/some/where/file.extension;some text
+* https://some.org/some/where/file.extension: some text
+* https://some.org/some/where/file.extension some text
+* https://some.org/some/where/file.extension:some text
+
+// unbalanced square brackets always terminate the link
+* https://some.org/some/where/file.extension[some text
+* https://some.org/some/where/file.extension[ some text
+* https://some.org/some/where/file.extension]some text
+* https://some.org/some/where/file.extension] some text
+
+* https://some.org/some/where/file.extension[]
+* https://some.org/some/where/file.extension[some text]trailing text
+* https://some.org/some/where/file.extension[some text]. trailing text
+* https://some.org/some/where/file.extension[some text], trailing text
+* https://some.org/some/where/file.extension[some text]; trailing text
+* https://some.org/some/where/file.extension[some text]: trailing text
+* https://some.org/some/where/file.extension[some]text] trailing text
+* https://some.org/some/where/file.extension[some ]text] trailing text
+* https://some.org/some/where/file.extension[some \]text] - with escaped `]`
+
+// TODO: highlighting of text within [] ?
+* some text https://some.org/some/where/file.extension[*some text*] trailing text.
+
+// some characters may be placed before the `http`
+* (https://some.org
+* )https://some.org
+* [https://some.org
+* ]https://some.org
+* ;https://some.org
+* <https://some.org
+* >https://some.org
+
+
+=== Not rendered as Link
+
+* {https://some.org
+* }https://some.org
+* ,https://some.org
+* .https://some.org
+* :https://some.org
+
+
+== link
+
+* link:relative/path - not rendered as link as `[]` are misssing
+* link:relative/path[]
+* ##before##link:relative/path[]##after## - no spaces needed
+* link:relative/path/file.extension[local file]
+* link:relative/path/file.extension[local ]file]
+* link:relative/path/file.extension[local \]file] - with escaped `]`
+* link:relative/path with spaces/[] - not rendered as link because of spaces
+* link:++relative/path with spaces/++[] - but this is rendered as link with spaces
+* link:external.html#anchor[to anchor of local HTML file]
+* link:url[optional link text, optional target attribute, optional role attribute]
+
+
+== E-Mail
+
+* some.person@org.com
+* some.person@org.com[some one] - brackets supported only with leading `mailto:`
+* :some.person@org.com - not rendered as link because of leading `:`
+* /some.person@org.com - not rendered as link because of leading `/`
+
+* mailto:some.person@org.com - not rendered as link as `[]` are misssing
+* mailto:some.person@org.com[]
+* ##before##mailto:some.person@org.com[]##after## - no spaces needed
+* mailto:some.person@org.com[some one]
+* mailto::some.person@org.com[] - not rendered as link because of double `:`
+* mailto: some.person@org.com[] - not rendered as mailto because of space after `:`, but still as inline email
+* mailto:[some one] - not rendered as link because of missing address
+
+
+== Escaped
+
+* \ftp://some.org/some/where/file.extension
+* \irc://some.org/some/where/file.extension
+* \https://some.org/some/where/file.extension
+* \link:relative/path[]
+* \link:relative/path[]
+* \some.person@org.com
+* \:some.person@org.com
+* \/some.person@org.com
+* \mailto:some.person@org.com[]
+
+
+= List
+
+== Bulleted List
+
+////
+FIXME The *** without text in the list below should not be highlighted as a horizontal line.
+This is going to be problematic, as we would need to know that we are currently inside a list.
+////
+.using asterisks
+* item 1
+  * * item 2
+Has some text.
+** item 2.1
+Also has some text.
++
+And an additional paragraph.
+** item 2.2
+*** item 2.2.1
++
+Markers without a text are _no_ item.
+***
+** item 2.3
+*** item 2.3.1
+**** item 2.3.1.1
+* item 3
+
+ * item 4
+**    item 4.1
+**not an item as there is no space
+     ** item 4.2
+
+.using hyphens
+- item 1
+   - item 2
+   -- item 2.1 is not an item as using hyphens is only supported for flat lists
+
+////
+FIXME: The line above should not be highlighted as literal.
+This is going to be problematic, as we would need to know that we are currently inside a list.
+////
+
+.inside a block
+****
+* item 1
+** item 1.1
+****
+
+
+== Checklist
+
+////
+FIXME The invalid checklist items below should not be highlighted as bulleted list items.
+This is going to be problematic, as we would need to know that we are currently inside a checklist.
+////
+
+.using asterisks
+* [*] checked
+**  [x]  also checked
+*** [x] also checked
+* [X]  _invalid_ check (capital X), normal list item
+* [o] _invalid_ check (invalid character), normal list item
+* [] _invalid_ check (no space), normal list item
+* [ ] not checked
+*     normal list item
+
+.using hyphens
+- [*] checked
+- [*] also checked
+-- [*] _not a list item_ as hyphens are only supported for flat lists
+   -- [*] _not a list item_ as hyphens are only supported for flat lists
+
+////
+FIXME: the line above should not be highlighted as literal.
+This is going to be problematic, as we would need to know that we are currently inside a list.
+////
+
+
+== Description List
+
+.Normal format
+Term normal:: This is a description.
+  Term indented:: This works too.
+
+Term multi line::
+This one has multiple lines.
+Two lines to be exact.
+Term L2::: This term is on level 2.
+Term L3:::: This term is on level 3.
+Term L4::::: This term is on level 4.
+Term L5:::::: This term is on level 5.
+Term with empty definition::
+Term with separated colons   :: This one has spaces before the `::`.
+Term no space::This is _not a description item_ as there is no space after the `::`.
+Term with unnumbered list::
+* list item 1
+* list item 2
+Term with multiple colons:: in the term:: 
+Having multiple `::` in one line is OK too.
+.;Strange Term = !?*:: This one has a strange term.
+Term 9   : : A space between the double `:` does _not_ work.
+
+////
+FIXME The line with the "Strange Term" abvoe should not be highlighted as title in this case.
+This is going to be problematic, as we would need to know that we are currently inside a list.
+////
+
+.Term and description on the same line
+[horizontal]
+Term 1:: first level.
+Term 2::: second level.
+Term 3:: first level again.
+
+
+== Numbered List
+
+.using numbers
+1. item 1
+2. item 2
+  3. item 3
+4 Is not an item.
+Numbers without a trailing dot do _not_ result in an item.
+123. This is an item with an out-of-sequence number.
+It will be fixed in the rendered output.
+
+.using dots
+. item 1
+   . item 2
+..not an item as there is no space
+ .. item 2.1
+   .. item 2.2
+... item 2.2.1
+.... item 2.2.1.1
+ . item 3
+
+////
+FIXME The line above starting with "..not an item" should not be highlighted as title in this case.
+This is going to be problematic, as we would need to know that we are currently inside a list.
+////
+
+
+== Question and Answer List
+
+////
+FIXME Indented answer is highlighted as verbatim block, messing up further question.
+This is going to be problematic, as we would need to know that we are currently inside a list.
+////
+
+[qanda]
+What is Asciidoctor?::
+An implementation of the AsciiDoc processor in Ruby.
+& answer pairs.
+Must the answer be indented?::
+  It's not necessary, but possibly.
+What is the answer to the Ultimate Question?:: 42
+
+
+= Macro
+// for `btn:`, `kbd:`, `menu:`
+:experimental:
+// for icon:tags[] etc.
+:imagesdir: media
+// needed to use macro `toc::[]`
+:toc: macro
+
+== General Information
+
+NOTE: There is no space needed before the macro name or after the closing `]`.
+
+
+== Anchor
+
+There is a macro form anchor:anchor-id[Macro Anchor] for anchor definition.
+
+See `anchor.adoc` for other forms.
+
+
+== Cross Reference
+
+xref:anchor-id[macro xref]
+
+WARNING: Highlighting for cross references with text spanning multiple lines is not supported.
+
+xref:id[
+Line 1 in cross reference text.
+Line 2 in cross reference text.
+]
+
+\xref:anchor-id[macro xref] escaped
+
+
+== Footnote
+
+This text has a foonotefootnote:[A simple footnote.].
+
+This text has a foonote with idfootnoteref:[fn-1, A footnote reference.].
+
+
+== Icon
+
+This is a tag icon:tags[] icon with no color set.
+
+This is a blue icon:tags[role="blue"] tag.
+
+This is a big green icon:tags[role="green", size="2x"] tag.
+
+
+== Image
+
+An imageimage:logo-outline-color.svg[Logo,25]within some text.
+
+
+== Keyboard Shortcut
+
+kbd:[Ctrl+M]
+
+
+== Menu Selection
+
+menu:File[Save]
+
+menu:View[Zoom > 1:1]
+
+
+== Pass
+
+Some pass:[<u>passthrough</u>] HTML.
+
+Some pass:quotes[<u>passthrough with *quoted* text</u>] HTML.
+
+Some pass:q[<u>passthrough with *quoted* text</u>] HTML.
+
+
+== Table of Contents
+
+toc::[]
+
+
+== UI Buttons
+
+Press the btn:[OK] button when you are finished.
+
+
+== Escaped
+
+This is no anchor \anchor:macro-anchor[Macro Anchor].
+
+This is no button \btn:[Cancel].
+
+This is no foonote\footnote:[A simple footnote.].
+
+This is no foonote with id\footnoteref:[fn-1, A footnote reference.].
+
+This is no image\image:logo-outline-color.svg[Tree, 25].
+
+This is no icon \icon:tags[].
+
+This is no keyboard shortcut \kbd:[Ctrl+M].
+
+This is no menu \menu:File[Save].
+
+This is no passthrough \pass:[<u>passthrough</u>].
+
+
+= Media
+// The name `imagesdir` is a bit misleading as audio and video use also this prefix.
+:imagesdir: media
+
+== Audio
+
+audio::test.mp3[]
+
+audio::test.mp3[options="loop"]
+
+.Escaped
+\audio::test.mp3[]
+
+
+== Image
+
+=== Block Format
+
+.Test SVG
+[#logo]
+[link=https://github.com/asciidoctor/brand]
+image::test.svg[Asciidoctor Logo, 100]
+
+
+==== Not highlighted
+
+.leading spaces, literal paragraph
+ image::test.svg[Test, 100]
+
+.trailing characters
+image::test.svg[Test, 100] trailing
+
+
+==== Escaped
+
+\image::test.svg[Asciidoctor Logo, 100]
+
+
+=== Inline Format
+
+Withinimage:logo-outline-color.svg[Tree, 25]some text.
+
+NOTE: There is no space needed before `image` and none after the closing `]`.
+
+image:logo-outline-color.svg[Tree, 25] at line start.
+
+At line end image:logo-outline-color.svg[Tree, 25]
+
+(image:logo-outline-color.svg[Tree, 25]) wrapped in non-space characters.
+
+
+==== Not highlighted
+
+image
+
+image:
+
+someimage:
+
+some:image
+
+some image:[]
+
+
+==== Escaped
+
+Within\image:logo-outline-color.svg[Tree, 25]some text.
+
+
+== Video
+
+video::test.mp4[width=300]
+
+
+video::test.mp4[width=200, options=loop]
+
+.Escaped
+\video::test.mp4[]
+
+
+= Page break
+
+== Rendered as page break
+
+<<<
+
+
+== Not rendered as page break
+
+.Not a page break as it is indented
+ <<<
+
+.Not a page break as it has trailing non-space characters
+<<< extra characters
+
+.Escaped
+\<<<
+
+
+= Preprocessor
+
+== If Defined
+
+:!attr-1:
+ifdef::attr-1[]
+This line is _not_ rendered as the attribute is not defined.
+endif::[]
+
+:attr-1:
+ifdef::attr-1[]
+This line _is_ rendered as the attribute is now defined.
+endif::[]
+
+.Short form avoiding `endif`
+ifdef::attr-1[The attribute `attr-1` is defined]
+
+
+== If Not Defined
+
+:!attr-1:
+ifndef::some-attribute[]
+This line _is_ rendered as it is inside a 'if-not-defined' statement and `some-attribute` is not defined.
+endif::some-attribute[]
+
+.Short form avoiding `endif`
+ifndef::some-attribute[The attribute `attr-1` is _not_ defined]
+
+
+== Any (or)
+
+:!attr-1:
+:!attr-2:
+:attr-3:
+ifdef::attr-1,attr-2,attr-3[]
+This line is rendered as at least one of the attributes is defined.
+endif::[]
+
+:!attr-1:
+:!attr-2:
+:!attr-3:
+ifdef::attr-1,attr-2,attr-3[]
+This line is not rendered as none of the attributes is defined.
+endif::[]
+
+
+== None (nor)
+
+:!attr-1:
+:!attr-2:
+:!attr-3:
+ifndef::attr-1,attr-2,attr-3[]
+This line is rendered as none of the attributes is defined.
+endif::[]
+
+:!attr-1:
+:!attr-2:
+:attr-3:
+ifndef::attr-1,attr-2,attr-3[]
+This line is not rendered as at least one of the attributes is defined.
+endif::[]
+
+
+== All (and)
+
+:attr-1:
+:attr-2:
+:attr-3:
+ifdef::attr-1+attr-2+attr-3[]
+This line is rendered as all the attributes are defined.
+endif::[]
+
+:attr-1:
+:attr-2:
+:!attr-3:
+ifndef::attr-1+attr-2+attr-3[]
+This line is not rendered as at least one of the attributes is not defined.
+endif::[]
+
+
+== Not All (nand)
+
+:attr-1:
+:attr-2:
+:!attr-3:
+ifndef::attr-1+attr-2+attr-3[]
+This line is rendered as at least one of the attributes is defined.
+endif::[]
+
+:attr-1:
+:attr-2:
+:attr-3:
+ifndef::attr-1+attr-2+attr-3[]
+This line is not rendered as all the attributes are not defined.
+endif::[]
+
+
+== If Eval
+
+:two: 2
+ifeval::[{two} > 1]
+This line is rendered as the expression evaluates to true.
+endif::[]
+
+:not-true: false
+ifeval::[{not-true} == true]
+This line is not rendered as the expression evaluates to false.
+endif::[]
+
+
+== Escaped
+
+:!attr-1:
+\ifdef::attr-1[]
+This line is rendered as the `ifdef`-statement is escaped.
+\endif::[]
+
+:!attr-1:
+\ifndef::some-attribute[Only if the attribute is not defined]
+This line is rendered as the `ifndef`-statement is escaped.
+\endif::some-attribute[]
+
+:not-true: false
+\ifeval::[{not-true} == true]
+This line is rendered as the `ifeval`-statement is escaped.
+\endif::[]
+
+
+= Quote and Verse
+
+== Quote
+
+.Contiguous block / paragraph
+[quote, attribution, citation title and information]
+[[quote-block-id]]
+Inside the *contiguous block quote*.
+Last line of the quote block.
+
+This line is not part of the contiguous block quote anymore.
+
+.Delimited with block name
+[quote, attribution, citation title and information]
+[[quote-block-id]]
+____
+Inside the *delimited block quote*.
+
+May contain emtpy lines.
+____
+
+.Delimited without block name
+[[quote-block-id]]
+____
+Inside the *delimited block quote*.
+
+May contain emtpy lines.
+____
+
+.Using an open block
+[quote]
+[[quote-block-id]]
+--
+Inside the *open block quote*.
+--
+
+.Nested block quote
+[quote, outer attribution, outer citation title and information]
+[[quote-block-id]]
+____
+First line of outer quote.
+[quote, inner attribution, inner citation title and information]
+[[quote-block-id]]
+______
+Inside the inner quote.
+______
+Last line of outer quote.
+____
+
+// Currently no specific highlighting supported.
+.Quoted paragraph
+"Inside the *quoted paragraph*.
+As being a paragraph, no empty lines are supported."
+-- attribution, citation title and information
+
+
+.Air quote
+[,attribution, citation title and information]
+"" 
+Inside the *air quote*.
+
+Supports empty lines.
+""
+ 
+// Currently no specific highlighting supported.
+.Markdown style
+> Inside the *markdown quote*.
+> 
+> May contain emtpy lines.
+> -- attribution, citation title and information
+
+// Currently no specific highlighting supported.
+.Nested markdown style
+> Start of outer quote.
+>
+> > Some inner quote.
+>
+> * can use AsciiDoc ...
+> * inside markdown block
+>
+> > Another inner quote.
+>
+> End of outer quote.
+
+
+== Verse
+
+.Contiguous block / paragraph
+[verse, attribution, citation title and information]
+[[verse-block-id]]
+Inside the *contiguous block verse*.
+Second line of the verse block.
+
+This line is not part of the contiguous verse block anymore.
+
+.Delimited block with name
+[verse, attribution, citation title and information]
+[[verse-block-id]]
+____
+Inside the *delimited block verse*.
+
+Supports empty lines.
+____
+
+.Delimited block without name
+This would be rendered as a quote block as the same delimiters are used.
+
+.Using an open block
+[verse, attribution, citation title and information]
+[[verse-block-id]]
+--
+Inside the *open block verse*.
+--
+
+
+= Replacement
+
+TIP: See also the https://asciidoctor.org/docs/user-manual/#replacements[corresponding section] in the Asciidoctor manual.
+
+
+== Textual symbol replacements
+
+|===
+|Name |Syntax |Escaped
+
+|copyright |(C) |\(C)
+|registered |(R) |\(R)
+|trademark |(TM) |\(TM)
+
+|apostrophe |KDE's |KDE\'s
+|ellipses |... |\... footnote:[Escaping has no effect]
+|m dash |-- |\-- footnote:[Escaping yields another different dash]
+
+|left single arrow |<- |\<-
+|right single arrow |-> |\->
+|left double arrow |<= |\<=
+|right double arrow |=> |\=>
+|===
+
+
+=== Not replaced
+
+// Single apostrophe must be surrounded by alphabetic characters.
+* a'
+* 'a
+* .'.
+* a'.
+* .'a
+
+
+== Numerical Character Reference
+
+=== Decimal
+
+&#0167;
+
+##before##&#0167;##after##
+
+&#167;
+
+
+=== Hexadecimal
+
+&#x00A7;
+
+##before##&#x00A7;##after##
+
+&#xA7;
+
+
+=== Escaped
+
+\&#0167;
+\&#167;
+\&#x00A7;
+\&#xA7;
+
+
+== HTML/XML Character Entity References
+
+See e.g. https://en.wikipedia.org/wiki/List_of_XML_and_HTML_character_entity_references[Wikipedia].
+
+IMPORTANT: Highlighting of HTML/XML character entity references is _not_ supported.
+There are just too many of them.
+
+// some examples
+====
+&ne;
+&equiv;
+====
+
+
+= Section L0
+
+[abstract]
+== Abstract
+
+This document is used for testing various aspects of syntax highlighting regarding sections.
+
+:title-attribute: with attribute
+
+== Section L1
+
+=== Section L2
+
+==== Section L3
+
+===== Section L4
+
+====== Section L5
+
+======= This is not a new section
+
+The level would be too deep.
+Only sections up to level 5 (having 6 leading `=`) are supported.
+
+
+#### Section L3
+
+Using Markdown section syntax works too.
+
+=#=# This is not a section.
+Use either `=` or `#`, but not mixed.
+
+
+===== [[id-1]] [[id-2]] Section L4
+
+This section has leading additional achors.
+
+
+==== Section L3 [[id-1]][[id-2]]
+
+This section has trailing additional anchors.
+
+==== [[id-1]][[id-2]]Section L3[[id-3]][[id-4]]
+
+This section has both leading and trailing additional anchors.
+
+==== Section L3 {title-attribute} in Title
+
+.Title {title-attribute}
+This section has an attribute in its title.
+
+[discrete]
+== Discrete Section
+
+This section will not be shown in the table of contents.
+
+////
+== Section with _emphasized_ text
+
+=== Section with escaped \_emphasized_ text
+////
+
+
+== Section with #marked# text
+
+=== Section with escaped \#marked# text
+
+
+== Section with `monospaced` text
+
+=== Section with escaped \`monospaced` text
+
+////
+== Section with *strong* text
+
+=== Section with escaped \*strong* text
+////
+
+= Another Section at Level 0
+
+
+= Table
+
+== Default Separator
+
+.PSV
+// some comment
+[[table-1]]
+[.some-role]
+[#table-shorthand]
+// some comment
+|===
+// some comment
+| header col 1           |      header col 2   | header col 3
+// some comment
+
+// with escaped cell separator
+| row 1 \| col 1 | row 1 col 2 | row 1 col 3
+// no spaces needed around `|`
+| *row* 2 col 1|row 2 col 2|row 2 col 3
+
+|row 3 col 1
+// using attribute
+| row 3 col 2 {vbar}
+|ro3 3 col 3
+
+| row 4 col 1 a|some AsciiDoc in col 2 row 4
+
+* item 1
+* item 2
+|row 4 col 3
+
+2*| row 5 has same contents in first 2 columns
+|row 5 col 3
+
+|row 6 col 1 2+| span row 6 in col 2 and 3
+
+.2+|span col 1 in row 6 and 7|row 6 col 2|row 6 col 3
+|row 7 col 2|row 7 col 3
+
+2.2+^.^|span col 1 and 2 in row 8 and 9|row 8 col 3
+|row 9 col 3
+
+e|row 10 col 1 is emphasized (italic)
+s|row 10 col 2 is strong (bold)
+m|row 10 col 3 is monospaced
+|===
+
+
+== Custom Separator
+
+IMPORTANT: Highlighting of tables with custom separator is not supported.
+All `|` inside the table will be falsly highlighted.
+
+[separator=!]
+|===
+// the `|` in the line below should not be highlighted.
+!row 1 | col 1 !row 1 col 2
+s!row 2 col 1 !row 2 col 2
+|===
+
+[separator=a]
+|===
+arow 1 col 1 arow 1 col 2
+sarow 2 col 1 arow 2 col 2
+|===
+
+
+== Delimiter-Separated Values
+
+IMPORTANT: Highlighting for tables with delimiter-separated values is not supported.
+All `|` inside the table will be falsly highlighted.
+
+[format=csv]
+|===
+Col 1 ,Col 2 ,Col 3
+
+// the `|` in the line below should not be highlighted.
+row 1 | col 1 ,row 1 col 2 ,row 1 col 3
+row 2 col 2,row 2 col 2,row 2 col 3
+
+row 3 col 3 ,  "row ""3"",    col 2" , row 3 col 3
+|===
+
+
+=== Shorthand Notation for Data Tables
+
+.CSV
+,===
+Col 1 ,Col 2 ,Col 3
+
+row 1 col 1 ,row 1 col 2 ,row 1 col 3
+row 2 col 2,row 2 col 2,row 2 col 3
+
+row 3 col 3 ,  "row ""3"",    col 2" , row 3 col 3
+,===
+
+.DSV
+:===
+Col 1 :Col 2 :Col 3
+
+row 1 col 1 :row 1 col 2 :row 1 col 3
+row 2 col 2:row 2 col 2:row 2 col 3
+row 3 col 3 :  row 3 col 2 : row 3 col 3
+:===
+
+
+
diff --git a/autotests/input/asciidoc.adoc b/autotests/input/asciidoc.adoc new file mode 100644 index 0000000..5def3fd --- /dev/null +++ b/autotests/input/asciidoc.adoc @@ -0,0 +1,2800 @@ += AsciiDoc Syntax Highlighting +// There are multiple level 0 sections, so use book instead of article. +:doctype: book +// For nice admonition and callout icons. +:icons: font +:toc: left + +Testing the syntax highlighting support in KDE Frameworks. + +The first of the following sections lists the things that are known not to work. +Further sections are intended for testing the supported features of AsciiDoc. + + += Known Not to Work + +There are a couple of things that are known not to work. + + +== Block + +* Highlighting of attributes inside a block title. + +* Highlighting of formatted text inside a block title other than ... +** #marked# +** `monospaced` + +* Code folding for contiguous blocks. ++ +This has an advantage too, though. +It enables the user to decide on having code folding or not. +For short blocks without empty lines where no code folding is desired, use contiguous blocks. +For longer blocks which should support code folding, use delimited blocks. + +* Multiple lines of meta data. ++ +.For delimited blocks, Asciidoctor supports something like this: +----- +[source] +[, options="nowrap"] +---- +puts 'hello' +---- +----- ++ +Syntax highlighting does not recognize the additional meta data lines and will rather interpret this as a contiguous block. + +* https://asciidoctor.org/docs/user-manual/#discrete-headings[Discrete headings] inside block. ++ +----- +**** +Some text. + +[discrete] +=== Discrete Heading + +Some more text. +**** +----- ++ +Syntax highlighting does not recognize discrete headings inside a block. +If a normal section title is marked as being discrete, highlighting works. + + +== Custom Styles + +* Highlighting of formatted text within the phrase to be styled. ++ + Some [big]#big and *strong*# text. + +* Highlighting of styles with a phrase that spans multiple lines. ++ +---- +[big]#this +is +not +highlighted# +---- + + +== Formatted/Quoted Text + +* Highlighting of formatted/quoted text (e.g. monospaced) that spans multiple lines. + +* Highlighting combinations besides those of emphasized, strong and monospaced. +** Attributes inside other formatting. ++ + `{attribute-id} inside monospaced` + +** Passthrough inside other formatting. ++ + `+passthrough+ inside monospaced` + +** Marked text inside other formatting. ++ + `#marked# inside monospaced` + +** Subscript inside other formatting. ++ + `~sub~script inside monospaced` + +** Superscript inside other formatting. ++ + `^super^script inside monospaced` + +And even more complex combinations. + + +== List + +* Inside a list, indented lines without leading asterisks or hyphen start highlighting for a verbatim paragraph. +Asciidoctor renders this as normal text. + + +== Macro + +* Highlighting of macros with a text argument that spans multiple lines. ++ +---- +xref:id[this works just fine] + +xref:id[ +highlighting a macro with +a text that spans multiples +does not work +] +---- + + +== Quote, Verse + +* Highlighting for single quote symbol `"`. ++ +Highlighting for air quotes `""` is supported. + +* Highlighting for Markdown style quotes. + + +== Replacement + +Highlighting for replacements is limited to those listed in the https://asciidoctor.org/docs/user-manual/#replacements[Asciidoctor Manual] and numerical character references. + +Highlighting for other https://en.wikipedia.org/wiki/List_of_XML_and_HTML_character_entity_references[HTML/XML character references] is not supported. + +.Examples of supported references +* `+(C)+` resulting in (C) +* `+=>+` resulting in => +* `+¼+` resulting in ¼ + +.Examples of references that are not supported +* `+¼+` resulting in ¼ +* `+φ+` resulting in φ + + +== Section + +* Setext style for section titles. ++ +Only Atx style is supported. ++ +NOTE: Asciidoctor's https://asciidoctor.org/docs/asciidoc-recommended-practices/[recommended practices] states _not_ to use Setext style for section titles. + +* Highlighting of formatted/quoted text inside section title other than ... +** #marked# +** `monospaced` + +* Code folding. ++ +Attempts made so far delivered unsatisfactory results. + + +== Table + +* Highlighting of tables with custom separator. +** The custom separator will _not_ be highlighted. +** All `|` inside the table _will be falsly_ highlighted. + +* Highlighting of delimiter-separated tables. +** Table delimiters in shorthand notation and the value separator will _not_ be highlighted. +** All `|` inside the table _will be falsly_ highlighted. + +* Applying styles on table contents. ++ +When defining a table, individual columns or cells can be defined to be highlighted *strong* etc.. +Corresponding highlighting of these cells does not work. + + + += Admonition + +== Simple Format + +NOTE: A simple note. + +//// +FIXME: In the paragraph below is no note as it is started in the middle of the paragraph. +This is problematic as we would need to know that the note line is not the first line in the paragraph. +//// +Some text. +NOTE: This is not a separate note as it is part of the paragraph started with the line above. + +NOTE:This is not a note as there is no space after the `:`. + + NOTE: This is not a note as it is indented. + +NOTE : This is not a note as there are spaces between `NOTE` and `:`. + +NOTE: +This is not a note as it is not using block format and the text is not starting on the same line as the label. + +NOTE: This is a lengthy note in simple format. +Second line. +One more line. +And another one. +This is the last line. + +This line is not part of the simple note anymore. + +CAUTION: This is a CAUTION. + +IMPORTANT: This is IMPORTANT. + +TIP: This is a TIP. + +This second line is rendered as a line on its own because of the trailing `+` in the first line. + +WARNING: This is a WARNING. + + +== Block Format + +.Contiguous +[NOTE] +[[contiguous-note-id]] +This is a contiguous *note* block. +Second line. +And one more line. +// comment inside block +This is the final line. + +This line is not part of the contiguous note block anymore. + +.Delimited +[NOTE] +[[delimited-note-id]] +==== +This is a *note* in block format. +As a block, the note may have a title +// comment inside block + +In block format, multiple lines, paragraphs etc. are possible. +==== + +There is no delimited admonition block without block name. +Using `====` delimiter without a block name results in an example block. + +.Using open block +[NOTE] +-- +Inside the open block note. +-- + + += [[main-1]]An[[main-2]]chor[[main-3]] and Cross Reference + +== [[section-1]][[section-2]] An[[section-3]][[section-4]]chor[[section-5]] + +[[isolated-anchor]] +Isolated anchor. + +[[isolated-anchor-with-label,Isolated Anchor With Label]] +Isolated anchor with label. + +This line has an [[inline-anchor, Inline Anchor]]anchor placed inside the text. + +[#isolated-shorthand] +Isolated anchor using shorthand definition. + +[#isolated-shorthand, Isolated Shorthand Anchor] +Isolated anchor with label using shorthand definition. + +This line has an [ #inline-shorthand ]#anchor placed inside the text# #. + +.Inside [[block-anchor]]block title +Works too. + +.Macro form +There is also a maanchor:anchor-id[Macro Anchor]cro form for anchor definition. + +NOTE: There is no space needed before the `anchor` macro name. +Also not after the closing `]`. + + +=== Not an anchor + +[[ not-an-anchor]] +because of the space after the opening brackets. + +[[not-an-anchor ]] +because of the space before the closing brackets. + + [[not-an-anchor]] because of line starting with spaces. + + [#not-an-anchor]#because# of line starting with spaces. + +[#not-an-anchor] because of trailing text. + +Not an anchor because of leading text [#not-an-anchor] + +Also[#not-an-anchor]#some text# because of missing space before `[`. + +Also [#not-an-anchor] #some text# because of space after `]`. + +Also [#not-an-anchor]# some text# because of space after the leading `#`. + +Also [#not-an-anchor]because of missing referred text (e.g. `#some text#`). + + +=== Escaped + +This is an escaped \[[anchor-id, some #anchor# label]] anchor. + +This is just some \normal text. + +Some\[[anchor-id]]anchor. + +\[[anchor-id]] + +//// +FIXME: highlighting differs +Asciidoctor seems to just pass through the anchor when escaping it. +This behaviour is rather unexpected, as in other cases the escaped contents is subject to further highlighting. + +We currently only consume the opening bracket. +//// +This is an escaped \[#shorthand-id]#anchor in shorthand form#. + +Some \[#shorthand-id]. + +\[#shorthand-id] + +\[#shorthand-id]# + + +== Cross References + +<> + +<> + +<> + +<> + +This is a reference to <>. + +<> some text >> some more text + +some << text <<>> + +<> + +<> + +<> + +<> + +<> + +<>. + +<> + + +=== Escaped + +This is not a reference \<>. + + += Attribute + +== No Value + +:some-attribute: +This line should not be highlighted. + + :not-an-attribute: as the line is indented. + + +== Single Line Value + +Attributes with values that are rendered as a single line, even if their definition spans multiple lines. + +.Single line definition +:single-line: only one line +This line is not part of the attribute value anymore. + +##before##{single-line}##after## + +:attr-in-attr-value: in multi line definition + +.Multi line definition +:single-line-continued: First line {attr-in-attr-value}. \ +Second line. \ +Another line. +This line is not part of the attribute value anymore. + +##before##{single-line-continued}##after## + +IMPORTANT: At least one space is needed before the continuation `\`. + +.Line continuation is only highlighted when inside an attribute definition +some \ +text + + +== Multi Line Value + +Attributes with values including hard line breaks. + +IMPORTANT: At least one space is needed before the continuation `+` and between the `+` and the `\`. + +:multi-line: First line. + \ +Second line. + \ +Third line. +This line is not part of the attribute value anymore. + +##before##{multi-line}##after## + + +== Inline Definition + +Inline attribute definitions {set:inline-attribute:just fine} works {inline-attribute}. + +.Surplus `:` is part of the value +{set:attr::some value} +{attr} + +{set:attr} +{attr} + +.Not an inline definition as leading `set:` is missing +{single-line:some value} + + +== Unsetting + +:!_custom_2-: +:_custom_2-!: + +.Adding a value when unsetting doesn't make sense, but doesn't hurt either +:some-attribute: some value +Attribute is set to `{some-attribute}`. + +:!some-attribute: some value +{some-attribute} is not set anymore. + + +== Not an Attribute + +:not-an-attribute:as there is no space after the terminating column of the identifier + + :not-an-attribute: as it is indented + + +== Combination with Other Highlighting + +**** +:inside-a-block: inside a block +Using an attribute {inside-a-block} works too. +**** + +:inside-formatting: inside formatting +An attribute used `{inside-formatting}` is not highlighting as attribute. + + +== Escaped + +\:attr-1: escaped attribute definition + \ +second line of escaped attribute definition + +\:!attr-1: escaped unset attribute + +\:-attr-1: this is not highlighted as escaped attribute definition as it has an invalid attribute id. + +This \:attr-1: is not highlighted as escaped attribute definition as it is not used at line start. + +:attr-1: some attribute +This is not rendered as \{attr-1}. + +This is not an inline attribute definition \{set:attr-2:some other attribute}. + +{attr-2} is not set. + +**** +:inside-a-block: inside a block +Escaping an attribute \{inside-a-block} works too. +**** + + += Bibliography + +== Using References + +The first reference has no label, so its id <> is rendered. + +The second reference has number <> as label. + +The third reference has <> as label. + +A reference defintion inside the text instead of the bibliography section yields some strange result: [[[ref-o,outside bibliography]]]]. +Not sure what to do with this. + +This is trying to use the escaped reference <>. + +This is trying to use reference <>. + + +[bibliography] +== References + +- [[[ref-1]]] This is reference 1. +- [[[r2,2]]]This is reference 2. +- [[[r3,Some Text]]] +This is reference 3. +- [\[[r4, escaped]]] This is #escaped#. +- [[[r5,5]]] This is reference 5. +* [[[r6,strange]]] Using an asterisk yields a strange result. + + += Block + +[abstract] +.Abstract - contiguous block +This document is used for testing syntax highlighting regarding various types of blocks. +E.g. this contiguous abstract block. + +Using block form for the abstract seems to be rendered differently than the section form (see `section.adoc`). + +[abstract] +.Abstract - delimited open block +-- +Using the delimited block form ... + +enables having empty lines in the abstract. +-- + + +== General + +NOTE: Starting and ending delimiter must be balanced, meaning they must have the same length. + +.Block title #before# block meta data +[literal] +.... +Inside the block. +.... + +[literal] +.Block title `after` block meta data +.... +Inside the block. +.... + +.Invalid block name +[ literal] +.... +This block has invalid meta data as there is a space between the opening square bracket and the block name. +.... + +.Block with attributes +[literal, some, attributes] +.... +Inside the block. +.... + +.Anchor before block name for contiguous block +[[contiguous_block_id_before_name]] +[literal] +Inside the block. + +.Anchor after block name for contiguous block +[literal] +[[contiguous_block_id_after_name]] +Inside the block. + +.Anchor after block name for delimited block +[literal] +[#delimited_block_id] +.... +Inside the block. +.... + +.Option definition +[literal%some-option, some, attributes] +Inside the block. + +.Shorthand anchor definition +// TODO Would be nice if we could highligth the shorthand ID definition as such. +[literal#shorthand-id, some, attributes] +Inside the block. + +Link to <>. + +Link to <>. + +Link to <>. + + +== Admonition + +See `admonition.adoc`. + + +== Comment + +See `comment.adoc`. + + +== Example + +.Contiguous +[example] +[[example-block-id]] +A countiguous *example* block. +// some comment +Second line of the example block. + +This line is not part of the contiguous example block anymore. + +.Delimited with block name +[example] +// some comment +[[example-block-id]] +// some comment +==== +// some comment +Inside the delimited example block. +==== + +.Delimited without block name +[[example-block-id]] +==== +Inside the delimited example block. +==== + +.Using an open block +[example] +[[example-block-id]] +-- +Inside the open block example. +-- + + +== Fenced + +NOTE: According to the https://asciidoctor.org/docs/user-manual/#built-in-blocks-summary[Asciidoctor manual], fenced blocks do not support block names. + +.Delimited without block name +[#fenced-block-id] +``` +Inside the fenced block. +The block contents is rendered verbatim. +So there is *no* text formatting. +``` + +.This is not a fenced block +`````` +A fenced block's delimiter length is _exactly_ 3. +`````` + + +== Listing + +.Contiguous +[listing] +[[listing-block-id]] +A countiguous *listing* block. +Last line of the listing. + +.Delimited with block name +[listing] +[[listing-block-id]] +// comment before the opening block delimiter +//// +block comment +//// +---- +First line inside the *listing* block. +Last line inside the block. +---- + +.Delimited without block name +[[listing-block-id]] +---- +Inside the delimited listing block. +---- + +.Using an open block +[listing] +[[listing-block-id]] +-- +Inside the open block listing. +-- + + +== Literal + +.Contiguous +[literal] +// some comment +[[literal-block-id]] +// some comment +Inside the contiguous literal block. +// this should not be highlighted as comment +.this should not be highlighted as title +The block contents is rendered verbatim. +So there is *no* text formatting. +// this should not be highlighted as comment + +.Delimited with block name +[literal] +// some comment +[#literal-block-id] +// some comment +.......... +Inside the delimited literal block. +// this should not be highlighted as comment +.this should not be highlighted as title +.......... + +.Delimited without block name +[[literal-block-id]] +// some comment +.......... +Inside the delimited literal block. +.......... + +.Using an open block +[literal] +// some comment +[[literal-block-id]] +// some comment +-- +// this should not be highlighted as comment +Inside the open block listing. +-- + +.Using leading spaces for first line + When using some leading spaces, the whole paragraph is treated as literal. +Only the first line needs to have leading spaces. + +This line is not part of the literal paragraph anymore. + + +== Open + +NOTE: The open block does not have a contiguous form. + +.Delimited +[#open-block-id] +-- +An open block's delimiter length is _exactly_ 2. + +Last line of the #open# block. +-- + + +== Passthrough + +.Contiguous +[pass] +[[contiguous-passthrough-id]] +Inside the contiguous passthrough block. +Second line to pass trhough. + +This line is not part of the contiguous passthrough block anymore. + +.Delimited with block name +[pass] +[[delimited-passthrough-id]] +++++++ +Inside the delimited passthrough block with block name. +++++++ + +.Delimited without block name +[[delimited-passthrough-id]] +++++ +Inside the delimited passthrough block without block name. +++++ + +According to the https://asciidoctor.org/docs/user-manual/#built-in-blocks-summary[Asciidoctor Manual], passthrough using an open block is not supported. + + +== Quote + +See `quote_verse.adoc`. + + +== Sidebar + +.Contiguous +[sidebar] +[[sidebar-block-id]] +Inside the *sidebar* block. +Second line of the sidebar block. + +This line is not part of the sidbar block anymore. + +.Delimited with block name +[sidebar] +[[sidebar-block-id]] +********** +Inside the *sidebar* block. +********** + +.Delimited without block name +[[sidebar-block-id]] +**** +Inside the sidebar block. +**** + +.Using an open block +[sidebar] +[[sidebar-block-id]] +-- +Inside the sidebar block. +-- + + +== Source + +.Contiguous +[source,ruby] +[[source-block-id]] +#This is Ruby source code. +#NOTE: If there is a space after the `#`, Asciidoctor interprets this as a section title. +#Seems in contiguous source blocks, Asciidoctor still interprets the block contents, which is rather unexpected. +import 'needed' +IO.puts "hello" + +.Contiguous using option syntax +[source%mixed,php] +

+ +

+ +.Delimited with block name +[source , ruby ] +[[source-block-id]] +---- +# This is Ruby source code. +# NOTE: in delimited source blocks, having a space after the `#` in the comment is OK. +import 'needed' + +IO.puts "hello" +---- + +.Delimited with block name using option syntax +[source%mixed,php] +---- +

+ +

+---- + +.Delimited without block name +[[source-block-id]] +---- +# This is Ruby source code. +# NOTE: in delimited source blocks, having a space after the `#` in the comment is OK. +import 'needed' + +IO.puts "hello" +---- + +.Using an open block +[source,ruby] +[[source-block-id]] +-- +import 'needed' + +IO.puts "hello" +-- + + +== Stem + +.Contiguous +[stem] +[[stem-block-id]] +Inside the contiguous stem block. +Second line to pass. + +This line is not part of the contiguous Passthrough block anymore. + +.Delimited with block name +[stem] +[[stem-block-id]] +++++++ +Inside the delimited stem block with block name. +++++++ + +.Delimited without block name +[[stem-block-id]] +++++ +Inside the delimited stem block without block name. +++++ + + +== Table + +See `table.adoc`. + + +== Verse + +.Contiguous +[verse] +[[verse-block-id]] +Inside the *verse* block. +Second line of the verse block. + +This line is not part of the contiguous verse block anymore. + +.Delimited with block name +[verse] +[[verse-block-id]] +____ +Inside the *verse* block. +____ + +.Delimited without block name +This would be rendered as a quote block as the same delimiters are used. + +.Using an open block +[verse] +[[verse-block-id]] +-- +Inside the *verse* block. +-- + + +== Nested Blocks + +[NOTE] +Some note text. + +==== +Start of outer example block. + +.Nested example block +===== +Inside the inner example block. +// some comment + +.Nested literal block +[literal] +// some comment +---- +Inside the literal block within the inner example block. +-- +Trying to use a block within a verbatim block results in verbatim text, of course. +-- +---- +===== +Line in outer block. +[listing] +---- +Inside the inner listing block. +---- +End of outer block. +==== + +.Admonition inside some other block +==== +Some text. + +NOTE: This is a note in simple format inside a block. + +Some more text. +==== + + += Callout +// Add `:icons: font` for nice callout icons. + +Callouts are usually used with listing/source blocks, but Asciidoctor renders them also without a listing block. + +<1> This is a callout. +<.> This is a callout too. + + <2> This is not rendered as a callout as it is indented. + +The line below is not rendered as a callout as it has no text in the same line. + +<3> + +//// +FIXME This should not be highlighted as callout. +As it depends on the kind of line before, this is problematic. +//// +The line below is not rendered as callout as it is part of this paragraph. +<4> This should _not_ be highlighted as callout. + +.Callouts with manual numbering +[source,sh] +---- +ls -l <2> +ls -la <1> +---- +<1> Explanation for callout number 1. +<2> Explanation for callout number 2. +\<3> This is not a callout as it is escaped. + +.Callouts with automatic numbering +[source,sh] +---- +ls -l <.> +ls -la <.> +---- +<.> Explanation for callout number 1. +<.> Explanation for callout number 2. + + += Comment + +TIP: Comment highlighting supports the standard https://cgit.kde.org/syntax-highlighting.git/tree/data/syntax/alert.xml[KDE alerts] (TODO, FIXME, ...) in both single-line and multi-line comments. + + +== Single Line + +Single-line comments start with exactly `//`. +If there are any characters - including spaces - before the `//`, the line will be rendered. +If there are more than two consecutive `/`, the line will be rendered. + +This line // will be rendered completely. + + // This line will be rendered as verbatim text as it is indented. + +/// This line will be rendered as it starts with 3 `/`. + +// This line will be invisible. + +//This line will be invisible. + +// + +\// Escaped comment. + +\// TODO Of course there is no alert highlighting in escaped comments. + +.Alerts +// NOTE testing alerts +// TEST: testing alerts +// TODO: testing alerts +// TASK testing alerts +// WARNING: testing alerts +// ALERT: testing alerts +// DANGER: testing alerts + + +== Multi Line + +.Contiguous block +[comment] +Some comment. +Alerts: +NOTE testing alerts +TEST: testing alerts +TODO: testing alerts +TASK testing alerts +WARNING: testing alerts +ALERT: testing alerts +DANGER: testing alerts +Last line of contiguous block comment. + +This line is not part of the contiguous block comment anymore. + +.Delimited block without name +////// +This is a multi-line comment. +It spans multiple lines. + +Alerts: +NOTE testing alerts +TEST: testing alerts +TODO: testing alerts +TASK testing alerts +WARNING: testing alerts +ALERT: testing alerts +DANGER: testing alerts + +This is the comment's last line. +////// + +[comment] +.Delimited block with name +//// +This is a multi-line comment. +It spans multiple lines. + +Alerts: +NOTE testing alerts +TEST: testing alerts +TODO: testing alerts +TASK testing alerts +WARNING: testing alerts +ALERT: testing alerts +DANGER: testing alerts + +This is the comment's last line. +//// + +.Using open block +[comment] +-- +Inside the open block comment. +-- + + += Counter + +== Use and Render + +.Start with 1 and render value +New value for `c1` is {counter:c1}. + +.Increment and render +And now it is {counter:c1}. + +.Render the current value without changing it +Current value is {c1}. + + +== Use Without Rendering + +.Define the new counter +No new value to be {counter2:c2}seen. + +.Let's see the current value +Current value is {c2}. + +.Increment +No incremented value to be {counter2:c2}seen. + +.Let's see the current value +Current value is {c2}. + + +== Using a Start Value + +.Start with 3 and render value +New value for `c3` is {counter:c3:99}. + +.Increment and render +And now it is {counter:c3}. + +.Works with characters too +New value for `c4` is {counter:c4:X} + +.Increment character counter and render +And now it is {counter:c4}. + + +== About using Spaces + +CAUTION: If you leave spaces after the `:` or before the closing `}`, Asciidoctor will make them part of the counter attribute name. + +So it's probably wise to avoid spaces here. + +.Define a counter +New value is {counter:c5}. + +.This is actually a new counter +New value is {counter: c5}. + +.But you can't access that attribute +Can't just show the current value { c5} + +.Only if we increment it +Incremented value is {counter: c5}. + +.This is again a new counter +New value is {counter: c5}. + +.This is also a new counter +New value is {counter:c5 }. + +CAUTION: Similar problems occur when using spaces around starting values. + +*Just don't use spaces*. + +.New counter with start value +New value is {counter:c6: 9 } + +.But when trying to increment +Incremented value is {counter:c6} + + + += Text Formatting + +TIP: Asciidoctor uses also the term _quoted text_. + +== Custom Styles + +[big]#big text# + +Some [.big]#big text#. + +Some [big]#big and *strong* text#. + +Some text with [foo]#custom style#. + +[foo bar]#foo bar text# + +before![big]#big text# + +[big]#big text#!after + +[big]##*text*## + +//// +FIXME Highlighting differs. +The phrase is rendered as marked. +Thetrailing hash is therefore not visible. +//// +[big]###text### + +[fo[o]#some text# + + +[underline]_emphasized and underlined_ + +[underline]__emphasized and underlined_ + + +[underline]`monospaced and underlined` + +[underline]``monospaced and underlined`` + + +[underline]*strong and underlined* + +[underline]**strong and underlined** + + +=== Not rendered as custom style + +[fo]o]#not a custom style# because of surplus `]`. + +[big]not a phrase because of missing phrase markers. + +[big]# # because only spaces used as phrase. + +[big]# the phrase# because of leading space in phrase. + +[big]#the phrase # because of trailing space in phrase. + +Before[foo]#the phrase# because of missing non-word character before clause. + +Before [foo]#the phrase#after because of missing non-word character after clause. + + +=== Escaped + +This is not \[underline]#underlined text#. + + +== Emphasized + +=== Rendered formatted + +This line contains a _sequence_ of _multiple emphasized_ words. + +This line contains a single _emphasized_ word. + +This line contains a single __emphasized_ word. + +This line contains a single _emphasized__ word. + +The text within the brackets should be (_emphasized_), but the brackets themselves not. + +(_emphasized_ [_emphasized_ {_emphasized_ |_emphasized_ ._emphasized_ ,_emphasized_ !_emphasized_ ?_emphasized_ _emphasized_? + +_emphasized_) _emphasized_] _emphasized_} _emphasized_| _emphasized_. _emphasized_; _emphasized_, + +_emphasized_( _emphasized_( _emphasized_[ _emphasized_{ + +_emphasized_) + +_emphasized_ + +__aa__bb + +aa__bb__ + +aa__bb _cc__dd + +aa__bb cc___dd + +aa__ bb __cc + + +=== Rendered as-is + +This line does _not_ contain _some emphasized _ text as there is a surplus space. + +This line does _not_ contain_some emphasized_ text as there is a space missing. + +This line does _not_ contain _some emphasized_text as there is a space missing. + +foo ;_emphasized_ :_emphasized_ }_emphasized_ + +;_emphasized_ +:_emphasized_ +}_emphasized_ + +// FIXME Highlighting differs. +In this line, there is some ___very emphasized___ text. +Asciidoctor renders it as normal text, just ignoring all the underscores. +That is a bit strange. + + +=== Escaped + +Not \_emphasized_ as it is escaped. + +Still \__emphasized__ as only the outermost level is escaped. + + +== Marked + +=== Rendered formatted + +Some # marked # text. + +Works #also for multiple words#. + +Some ##marked# text. + +Some #marked## text. + +Some ##marked## text. + +Some[big]#marked# text. +Not rendered big but marked, because of missing space before `[big]`. + +Works also for p##art##s of a word. + +p##art#!s + +!#marked#! + +#marked# + +##marked## + + +=== Rendered as-is + +Not rendered # marked# because of space after the leading hash. + +Not rendered #marked # because of space before the trailing hash. + +Not rendered#marked# as there is a space missing. + +Not rendered #marked#as there is a space missing. + + This is #rendered# as a verbatim block as it is indented. + +Some [big]#big marked# text. + +Some [big]##big marked## text. + + +=== Escaped + +Not \#marked# as it is escaped. + +Still \##marked## as only the outermost level is escaped. + + +== Monospaced + +=== Rendered formatted + +This line contains a `sequence of ` multiple monospaced` words. + +This line contains a single `monospaced` word. + +This line contains a single ``monospaced` word. + +This line contains a single `monospaced`` word. + +The text within the brackets should be (`monospaced`), but the brackets themselves not. + +before``monospaced``after. + +`monospaced` + +(`mono` [`mono` {`mono` |`mono` .`mono` ,`mono` !`mono` ?`mono` + +`mono`) `mono`) `mono`] `mono`} `mono`| `mono`. `mono`; `mono`, `mono`? + +`mono`( `mono`( `mono`[ `mono`{ + +``aa``bb + +aa``bb`` + +aa``bb `cc``dd + +aa``bb cc```dd + +aa`` bb ``cc + + +=== Rendered as-is + +Not rendered ` monospaced` because of leading space. + +Not rendered `monospaced ` because of trailing space. + +Not rendered`monospaced` as there is a space missing. + +Not rendered `monospaced`as there is a space missing. + + +=== Escaped + +Not \`monospaced` as it is escaped. + +Still \``monospaced`` as only the outermost level is escaped. + + +== Passthrough + +=== Rendered passed through + +This text is +passed _as_ is+ with no further formatting. + +Matching +is _lazy_+, so this + is rendered. + +This +_is_ passthrough`+` as passthrough has higher priority as monospaced. + ++passthrough+ at line start. + +Passthrough at +line end.+ + +Minimal passthrough +a+. + + +This text is ++passed _as_ is++ with no further formatting. + +This text is +++passed _as_ is+++ with no further formatting. + + +=== Rendered as-is + +No+passthrough+ as there is no space before the leading `+`. + +No +passthrough+as there is no space after the trailing plus. + +No + passthrough+ as there is a space after the leading `+`. + +No +passthrough + as there is a space after the trailing plus. + + +=== Escaped + +This text \+is _not_ passed through+ because of escaping. + +This text \++is _still_ passed through++ as only the outermost level is escaped. + +This text \+++is _still_ passed through+++ as only the outermost level is escaped. + + +== Strong + +=== Rendered formatted + +This line contains a *sequence of * multiple strong* words. + +This line contains a single **strong* word. + +This line contains a single**strong* word. + +This line contains a single *strong** word. + +The text within the brackets should be (*strong*), but the brackets themselves not. + +(*strong* [*strong* {*strong* |*strong* .*strong* ,*strong* !*strong* ?*strong* + +*strong*) *strong*] *strong*} *strong*| *strong*. *strong*; *strong*, *strong*? + +*strong*( *strong*( *strong*[ *strong*{ + +*strong*) + +*strong* + +aa**bb** + +**aa**bb + +aa**bb**cc + +aa**bb *cc**dd + +aa**bb cc***dd + +aa** bb **cc + + +=== Rendered as-is + +This line does _not_ contain *some strong * text as there is a space before the trailing asterisk. + +This line does _not_ contain*some strong* text as there is a space missing before the leading asterisk. + +This line does _not_ contain *some strong*text as there is a space missing after the trailing asterisk. + +some text ;*strong* :*strong* _*strong* }*strong* + +some text _*strong*_ + +;*strong* +:*strong* +}*strong* + + Not *strong* as there is a leading space in the line, making it verbatim. + +// FIXME Highlighting differs. +In this line, there is some ***very strong*** text. +It is rendered just ignoring the asterisks. +That is a bit strange. + + +=== Escaped + +Not \*strong* as it is escaped. + +Still \**strong** as only the outermost level is escaped. + + +== Subscript + +=== Rendered formatted + +H~2~O + + +=== Rendered as-is + +Not rendered sub~sc ript~ as there is a space within. + + +=== Escaped + +Not \~subscript~ as it is escaped. + + +== Superscript + +=== Rendered formatted + +E = m c^2^ + + +=== Rendered as-is + +Not rendered super^sc ript^ as there is a space within. + + +=== Escaped + +Not \^superscript^ as it is escaped. + + +== Combinations + +IMPORTANT: Combinations are supported by Asciidoctor, as long as the markup sets are entered in the right order. +The monospace markup must be the outermost set, then the strong set, and the emphasized markup must always be the innermost set. + + +=== Rendered formatted + +This is *_strong emphasized_* text. + +This is *__strong _ * emphasized_* text. + +This is**_strong emphasized_**text. + +This is**__ strong emphasized_**text. + +*_strong emphasized_* + + +This is `*strong monospaced*` text. + +This is `**strong ` * monospaced*` text. + +This is``*strong monospaced*``text. + +This is``** strong monospaced*``text. + +`*strong monospaced*` + + +This is `_emphasized monospaced_` text. + +This is `__emphasized ` _ monospaced_` text. + +This is``_emphasized monospaced_``text. + +This is``__ emphasized monospaced_``text. + +`_emphasized monospaced_` + + +This is `*_strong emphasized monospaced_*` text. + +This is `*__strong emphasized * ` _ monospaced_*` text. + +This is``*_strong emphasized monospaced_*``text. + +This is``*__ strong emphasized monospaced_*``text. + +`*_strong emphasized monospaced_*` + + +=== Unsupported + +Highlighting for other combinations is currently not supported, as there would be a large number of rules and styles necessary. + +* _emphasized #marked#_ +* #marked *strong*# +* *strong #marked#* +* *strong _emphasized #marked#_* + +* subscript _with~in~ emphasized_ +* subscript within marked: #H~2~O# +* subscript `with~in~ monospaced` +* subscript *with~in~ strong* + +* superscript _with^in^ emphasized_ +* superscript within marked: #E = m c^2^# +* superscript `with^in^ monospaced` +* superscript *with^in^ strong* + +And even more complex ones. + + +=== Rendered as-is + +This is no *_ strong emphasized_* text, it's *strong* only. + +This is no *_strong emphasized _* text, it's *strong* only. + +This is no _*strong emphasized*_ text, it's _emphasized_ only. + +This is no _`emphasized monospaced`_ text, it's _emphasized_ only. + + +=== Escaped + +This is not rendered \`_emphasized monospaced_`. + +But it is rendered emphasized. + +This is not rendered \*_emphasized strong_*. + +But it is rendered emphasized. + +This is not rendered \`*monospaced strong*`. + +But it is rendered strong. + +This is not rendered \`*_emphasized monospaced strong_*`. + +But it is rendered emphasized strong. + + += Horizontal Rules + +== Simple patterns + +''' +--- +*** + + +== Patterns with spaces + +- - - +* * * + +.Not a horizontal rule +' ' ' + + +== Arbitrary length + +NOTE: Although the https://asciidoctor.org/docs/user-manual/#markdown-style-horizontal-rules[Asciidoctor Manual] states that horizontal rule patterns are only supporting up to three characters (ignoring the optional spaces), some longer patterns work too. + +''''''' + +//// +These patterns don't work, as they start delimited blocks, item lists etc.. +-------- +****** +- - - - - - +* * * * * * * * * +//// + + +== Inside blocks + +**** +Horizontal rules work also inside blocks. +They eventually need an empty line before them, though. + +''' +After the horizontal rule. +**** + + += Include +:includedir: include + +== Included Contents Rendered + +NOTE: Using file names with spaces works. + +include::{includedir}/demo.adoc[] + +.Partial include +include::{includedir}/demo.adoc[lines=2..3] + +.Inside contiguous block +[source,ruby] +IO.puts 'hello' +""" +include::{includedir}/demo.adoc[lines=2..3] +""" +IO.puts 'bye' + +.Inside delimited block with name +[literal] +---- +This line shall be highlighted as verbatim. +include::{includedir}/demo.adoc[lines=2..3] +This line shall be highlighted as verbatim. +---- + +.Inside delimited block without name +.... +This line shall be highlighted as verbatim. +include::{includedir}/demo.adoc[lines=2..3] +This line shall be highlighted as verbatim. +.... + +.Inside table +|=== +|row 1 col 1|row 2 col 2 +| +// the include directive must have its own line with nothing else +include::{includedir}/demo.adoc[lines=1..1] +|row 2 col2 + +|row 3 col 1 +|row 3 col 2 +|=== + + +== Rendered as-is + +.Inside verbatim paragraph + This line shall be highlighted as verbatim. +include::{includedir}/demo.adoc[lines=2..3] +This line shall be highlighted as verbatim. + + += Index + +== Rendered as Index Term + +This is a ((flow)) index term. + +This is a indexterm2:[flow] index term. + +This is a (((concealed, index, term))) concealed index term. + +This is a indexterm:[concealed, index, term] concealed index term. + +This is rendered as a ((flow index term))). + +This is rendered as a (((flow index term)). + +This is ((())) empty but rendered as index term nevertheless. + +Some (((index term))). + +Some ((((index term)))). + + +== Rendered as-is + +This is (()) not an index term as it is empty. + +This is (not an index term)) as there is a `(` missing. + +This is ((not an index term) as there is a `)` missing. + + +== Escaped + +This is \((not an indexterm)) as it is escaped. + +This is \(((not a concealed index term))), but still a flow index term as only the outer brackets are escaped. + +This is \(\((not an indexterm))) as it is fully escaped. + +This is not a \indexterm2:[flow] index term. + +This is not a \indexterm:[concealed, index, term] concealed index term. + +[index] +== Index Catalog + +WARNING: HTML output currently does not support the creation of the index catalog. + + += Link + +== ftp, irc + +* ftp://some.org/some/where/file.extension +* irc://some.org/some/where/file.extension + + +== http(s) + +* http://some.org/some/where/file.extension +* https://some.org/some/where/file.extension + +// . , ; : followed by a space terminate the link +* https://some.org/some/where/file.extension. some text +* https://some.org/some/where/file.extension.some text +* https://some.org/some/where/file.extension, some text +* https://some.org/some/where/file.extension,some text +* https://some.org/some/where/file.extension; some text +* https://some.org/some/where/file.extension;some text +* https://some.org/some/where/file.extension: some text +* https://some.org/some/where/file.extension some text +* https://some.org/some/where/file.extension:some text + +// unbalanced square brackets always terminate the link +* https://some.org/some/where/file.extension[some text +* https://some.org/some/where/file.extension[ some text +* https://some.org/some/where/file.extension]some text +* https://some.org/some/where/file.extension] some text + +* https://some.org/some/where/file.extension[] +* https://some.org/some/where/file.extension[some text]trailing text +* https://some.org/some/where/file.extension[some text]. trailing text +* https://some.org/some/where/file.extension[some text], trailing text +* https://some.org/some/where/file.extension[some text]; trailing text +* https://some.org/some/where/file.extension[some text]: trailing text +* https://some.org/some/where/file.extension[some]text] trailing text +* https://some.org/some/where/file.extension[some ]text] trailing text +* https://some.org/some/where/file.extension[some \]text] - with escaped `]` + +// TODO: highlighting of text within [] ? +* some text https://some.org/some/where/file.extension[*some text*] trailing text. + +// some characters may be placed before the `http` +* (https://some.org +* )https://some.org +* [https://some.org +* ]https://some.org +* ;https://some.org +* https://some.org + + +=== Not rendered as Link + +* {https://some.org +* }https://some.org +* ,https://some.org +* .https://some.org +* :https://some.org + + +== link + +* link:relative/path - not rendered as link as `[]` are misssing +* link:relative/path[] +* ##before##link:relative/path[]##after## - no spaces needed +* link:relative/path/file.extension[local file] +* link:relative/path/file.extension[local ]file] +* link:relative/path/file.extension[local \]file] - with escaped `]` +* link:relative/path with spaces/[] - not rendered as link because of spaces +* link:++relative/path with spaces/++[] - but this is rendered as link with spaces +* link:external.html#anchor[to anchor of local HTML file] +* link:url[optional link text, optional target attribute, optional role attribute] + + +== E-Mail + +* some.person@org.com +* some.person@org.com[some one] - brackets supported only with leading `mailto:` +* :some.person@org.com - not rendered as link because of leading `:` +* /some.person@org.com - not rendered as link because of leading `/` + +* mailto:some.person@org.com - not rendered as link as `[]` are misssing +* mailto:some.person@org.com[] +* ##before##mailto:some.person@org.com[]##after## - no spaces needed +* mailto:some.person@org.com[some one] +* mailto::some.person@org.com[] - not rendered as link because of double `:` +* mailto: some.person@org.com[] - not rendered as mailto because of space after `:`, but still as inline email +* mailto:[some one] - not rendered as link because of missing address + + +== Escaped + +* \ftp://some.org/some/where/file.extension +* \irc://some.org/some/where/file.extension +* \https://some.org/some/where/file.extension +* \link:relative/path[] +* \link:relative/path[] +* \some.person@org.com +* \:some.person@org.com +* \/some.person@org.com +* \mailto:some.person@org.com[] + + += List + +== Bulleted List + +//// +FIXME The *** without text in the list below should not be highlighted as a horizontal line. +This is going to be problematic, as we would need to know that we are currently inside a list. +//// +.using asterisks +* item 1 + * * item 2 +Has some text. +** item 2.1 +Also has some text. ++ +And an additional paragraph. +** item 2.2 +*** item 2.2.1 ++ +Markers without a text are _no_ item. +*** +** item 2.3 +*** item 2.3.1 +**** item 2.3.1.1 +* item 3 + + * item 4 +** item 4.1 +**not an item as there is no space + ** item 4.2 + +.using hyphens +- item 1 + - item 2 + -- item 2.1 is not an item as using hyphens is only supported for flat lists + +//// +FIXME: The line above should not be highlighted as literal. +This is going to be problematic, as we would need to know that we are currently inside a list. +//// + +.inside a block +**** +* item 1 +** item 1.1 +**** + + +== Checklist + +//// +FIXME The invalid checklist items below should not be highlighted as bulleted list items. +This is going to be problematic, as we would need to know that we are currently inside a checklist. +//// + +.using asterisks +* [*] checked +** [x] also checked +*** [x] also checked +* [X] _invalid_ check (capital X), normal list item +* [o] _invalid_ check (invalid character), normal list item +* [] _invalid_ check (no space), normal list item +* [ ] not checked +* normal list item + +.using hyphens +- [*] checked +- [*] also checked +-- [*] _not a list item_ as hyphens are only supported for flat lists + -- [*] _not a list item_ as hyphens are only supported for flat lists + +//// +FIXME: the line above should not be highlighted as literal. +This is going to be problematic, as we would need to know that we are currently inside a list. +//// + + +== Description List + +.Normal format +Term normal:: This is a description. + Term indented:: This works too. + +Term multi line:: +This one has multiple lines. +Two lines to be exact. +Term L2::: This term is on level 2. +Term L3:::: This term is on level 3. +Term L4::::: This term is on level 4. +Term L5:::::: This term is on level 5. +Term with empty definition:: +Term with separated colons :: This one has spaces before the `::`. +Term no space::This is _not a description item_ as there is no space after the `::`. +Term with unnumbered list:: +* list item 1 +* list item 2 +Term with multiple colons:: in the term:: +Having multiple `::` in one line is OK too. +.;Strange Term = !?*:: This one has a strange term. +Term 9 : : A space between the double `:` does _not_ work. + +//// +FIXME The line with the "Strange Term" abvoe should not be highlighted as title in this case. +This is going to be problematic, as we would need to know that we are currently inside a list. +//// + +.Term and description on the same line +[horizontal] +Term 1:: first level. +Term 2::: second level. +Term 3:: first level again. + + +== Numbered List + +.using numbers +1. item 1 +2. item 2 + 3. item 3 +4 Is not an item. +Numbers without a trailing dot do _not_ result in an item. +123. This is an item with an out-of-sequence number. +It will be fixed in the rendered output. + +.using dots +. item 1 + . item 2 +..not an item as there is no space + .. item 2.1 + .. item 2.2 +... item 2.2.1 +.... item 2.2.1.1 + . item 3 + +//// +FIXME The line above starting with "..not an item" should not be highlighted as title in this case. +This is going to be problematic, as we would need to know that we are currently inside a list. +//// + + +== Question and Answer List + +//// +FIXME Indented answer is highlighted as verbatim block, messing up further question. +This is going to be problematic, as we would need to know that we are currently inside a list. +//// + +[qanda] +What is Asciidoctor?:: +An implementation of the AsciiDoc processor in Ruby. +& answer pairs. +Must the answer be indented?:: + It's not necessary, but possibly. +What is the answer to the Ultimate Question?:: 42 + + += Macro +// for `btn:`, `kbd:`, `menu:` +:experimental: +// for icon:tags[] etc. +:imagesdir: media +// needed to use macro `toc::[]` +:toc: macro + +== General Information + +NOTE: There is no space needed before the macro name or after the closing `]`. + + +== Anchor + +There is a macro form anchor:anchor-id[Macro Anchor] for anchor definition. + +See `anchor.adoc` for other forms. + + +== Cross Reference + +xref:anchor-id[macro xref] + +WARNING: Highlighting for cross references with text spanning multiple lines is not supported. + +xref:id[ +Line 1 in cross reference text. +Line 2 in cross reference text. +] + +\xref:anchor-id[macro xref] escaped + + +== Footnote + +This text has a foonotefootnote:[A simple footnote.]. + +This text has a foonote with idfootnoteref:[fn-1, A footnote reference.]. + + +== Icon + +This is a tag icon:tags[] icon with no color set. + +This is a blue icon:tags[role="blue"] tag. + +This is a big green icon:tags[role="green", size="2x"] tag. + + +== Image + +An imageimage:logo-outline-color.svg[Logo,25]within some text. + + +== Keyboard Shortcut + +kbd:[Ctrl+M] + + +== Menu Selection + +menu:File[Save] + +menu:View[Zoom > 1:1] + + +== Pass + +Some pass:[passthrough] HTML. + +Some pass:quotes[passthrough with *quoted* text] HTML. + +Some pass:q[passthrough with *quoted* text] HTML. + + +== Table of Contents + +toc::[] + + +== UI Buttons + +Press the btn:[OK] button when you are finished. + + +== Escaped + +This is no anchor \anchor:macro-anchor[Macro Anchor]. + +This is no button \btn:[Cancel]. + +This is no foonote\footnote:[A simple footnote.]. + +This is no foonote with id\footnoteref:[fn-1, A footnote reference.]. + +This is no image\image:logo-outline-color.svg[Tree, 25]. + +This is no icon \icon:tags[]. + +This is no keyboard shortcut \kbd:[Ctrl+M]. + +This is no menu \menu:File[Save]. + +This is no passthrough \pass:[passthrough]. + + += Media +// The name `imagesdir` is a bit misleading as audio and video use also this prefix. +:imagesdir: media + +== Audio + +audio::test.mp3[] + +audio::test.mp3[options="loop"] + +.Escaped +\audio::test.mp3[] + + +== Image + +=== Block Format + +.Test SVG +[#logo] +[link=https://github.com/asciidoctor/brand] +image::test.svg[Asciidoctor Logo, 100] + + +==== Not highlighted + +.leading spaces, literal paragraph + image::test.svg[Test, 100] + +.trailing characters +image::test.svg[Test, 100] trailing + + +==== Escaped + +\image::test.svg[Asciidoctor Logo, 100] + + +=== Inline Format + +Withinimage:logo-outline-color.svg[Tree, 25]some text. + +NOTE: There is no space needed before `image` and none after the closing `]`. + +image:logo-outline-color.svg[Tree, 25] at line start. + +At line end image:logo-outline-color.svg[Tree, 25] + +(image:logo-outline-color.svg[Tree, 25]) wrapped in non-space characters. + + +==== Not highlighted + +image + +image: + +someimage: + +some:image + +some image:[] + + +==== Escaped + +Within\image:logo-outline-color.svg[Tree, 25]some text. + + +== Video + +video::test.mp4[width=300] + + +video::test.mp4[width=200, options=loop] + +.Escaped +\video::test.mp4[] + + += Page break + +== Rendered as page break + +<<< + + +== Not rendered as page break + +.Not a page break as it is indented + <<< + +.Not a page break as it has trailing non-space characters +<<< extra characters + +.Escaped +\<<< + + += Preprocessor + +== If Defined + +:!attr-1: +ifdef::attr-1[] +This line is _not_ rendered as the attribute is not defined. +endif::[] + +:attr-1: +ifdef::attr-1[] +This line _is_ rendered as the attribute is now defined. +endif::[] + +.Short form avoiding `endif` +ifdef::attr-1[The attribute `attr-1` is defined] + + +== If Not Defined + +:!attr-1: +ifndef::some-attribute[] +This line _is_ rendered as it is inside a 'if-not-defined' statement and `some-attribute` is not defined. +endif::some-attribute[] + +.Short form avoiding `endif` +ifndef::some-attribute[The attribute `attr-1` is _not_ defined] + + +== Any (or) + +:!attr-1: +:!attr-2: +:attr-3: +ifdef::attr-1,attr-2,attr-3[] +This line is rendered as at least one of the attributes is defined. +endif::[] + +:!attr-1: +:!attr-2: +:!attr-3: +ifdef::attr-1,attr-2,attr-3[] +This line is not rendered as none of the attributes is defined. +endif::[] + + +== None (nor) + +:!attr-1: +:!attr-2: +:!attr-3: +ifndef::attr-1,attr-2,attr-3[] +This line is rendered as none of the attributes is defined. +endif::[] + +:!attr-1: +:!attr-2: +:attr-3: +ifndef::attr-1,attr-2,attr-3[] +This line is not rendered as at least one of the attributes is defined. +endif::[] + + +== All (and) + +:attr-1: +:attr-2: +:attr-3: +ifdef::attr-1+attr-2+attr-3[] +This line is rendered as all the attributes are defined. +endif::[] + +:attr-1: +:attr-2: +:!attr-3: +ifndef::attr-1+attr-2+attr-3[] +This line is not rendered as at least one of the attributes is not defined. +endif::[] + + +== Not All (nand) + +:attr-1: +:attr-2: +:!attr-3: +ifndef::attr-1+attr-2+attr-3[] +This line is rendered as at least one of the attributes is defined. +endif::[] + +:attr-1: +:attr-2: +:attr-3: +ifndef::attr-1+attr-2+attr-3[] +This line is not rendered as all the attributes are not defined. +endif::[] + + +== If Eval + +:two: 2 +ifeval::[{two} > 1] +This line is rendered as the expression evaluates to true. +endif::[] + +:not-true: false +ifeval::[{not-true} == true] +This line is not rendered as the expression evaluates to false. +endif::[] + + +== Escaped + +:!attr-1: +\ifdef::attr-1[] +This line is rendered as the `ifdef`-statement is escaped. +\endif::[] + +:!attr-1: +\ifndef::some-attribute[Only if the attribute is not defined] +This line is rendered as the `ifndef`-statement is escaped. +\endif::some-attribute[] + +:not-true: false +\ifeval::[{not-true} == true] +This line is rendered as the `ifeval`-statement is escaped. +\endif::[] + + += Quote and Verse + +== Quote + +.Contiguous block / paragraph +[quote, attribution, citation title and information] +[[quote-block-id]] +Inside the *contiguous block quote*. +Last line of the quote block. + +This line is not part of the contiguous block quote anymore. + +.Delimited with block name +[quote, attribution, citation title and information] +[[quote-block-id]] +____ +Inside the *delimited block quote*. + +May contain emtpy lines. +____ + +.Delimited without block name +[[quote-block-id]] +____ +Inside the *delimited block quote*. + +May contain emtpy lines. +____ + +.Using an open block +[quote] +[[quote-block-id]] +-- +Inside the *open block quote*. +-- + +.Nested block quote +[quote, outer attribution, outer citation title and information] +[[quote-block-id]] +____ +First line of outer quote. +[quote, inner attribution, inner citation title and information] +[[quote-block-id]] +______ +Inside the inner quote. +______ +Last line of outer quote. +____ + +// Currently no specific highlighting supported. +.Quoted paragraph +"Inside the *quoted paragraph*. +As being a paragraph, no empty lines are supported." +-- attribution, citation title and information + + +.Air quote +[,attribution, citation title and information] +"" +Inside the *air quote*. + +Supports empty lines. +"" + +// Currently no specific highlighting supported. +.Markdown style +> Inside the *markdown quote*. +> +> May contain emtpy lines. +> -- attribution, citation title and information + +// Currently no specific highlighting supported. +.Nested markdown style +> Start of outer quote. +> +> > Some inner quote. +> +> * can use AsciiDoc ... +> * inside markdown block +> +> > Another inner quote. +> +> End of outer quote. + + +== Verse + +.Contiguous block / paragraph +[verse, attribution, citation title and information] +[[verse-block-id]] +Inside the *contiguous block verse*. +Second line of the verse block. + +This line is not part of the contiguous verse block anymore. + +.Delimited block with name +[verse, attribution, citation title and information] +[[verse-block-id]] +____ +Inside the *delimited block verse*. + +Supports empty lines. +____ + +.Delimited block without name +This would be rendered as a quote block as the same delimiters are used. + +.Using an open block +[verse, attribution, citation title and information] +[[verse-block-id]] +-- +Inside the *open block verse*. +-- + + += Replacement + +TIP: See also the https://asciidoctor.org/docs/user-manual/#replacements[corresponding section] in the Asciidoctor manual. + + +== Textual symbol replacements + +|=== +|Name |Syntax |Escaped + +|copyright |(C) |\(C) +|registered |(R) |\(R) +|trademark |(TM) |\(TM) + +|apostrophe |KDE's |KDE\'s +|ellipses |... |\... footnote:[Escaping has no effect] +|m dash |-- |\-- footnote:[Escaping yields another different dash] + +|left single arrow |<- |\<- +|right single arrow |-> |\-> +|left double arrow |<= |\<= +|right double arrow |=> |\=> +|=== + + +=== Not replaced + +// Single apostrophe must be surrounded by alphabetic characters. +* a' +* 'a +* .'. +* a'. +* .'a + + +== Numerical Character Reference + +=== Decimal + +§ + +##before##§##after## + +§ + + +=== Hexadecimal + +§ + +##before##§##after## + +§ + + +=== Escaped + +\§ +\§ +\§ +\§ + + +== HTML/XML Character Entity References + +See e.g. https://en.wikipedia.org/wiki/List_of_XML_and_HTML_character_entity_references[Wikipedia]. + +IMPORTANT: Highlighting of HTML/XML character entity references is _not_ supported. +There are just too many of them. + +// some examples +==== +≠ +≡ +==== + + += Section L0 + +[abstract] +== Abstract + +This document is used for testing various aspects of syntax highlighting regarding sections. + +:title-attribute: with attribute + +== Section L1 + +=== Section L2 + +==== Section L3 + +===== Section L4 + +====== Section L5 + +======= This is not a new section + +The level would be too deep. +Only sections up to level 5 (having 6 leading `=`) are supported. + + +#### Section L3 + +Using Markdown section syntax works too. + +=#=# This is not a section. +Use either `=` or `#`, but not mixed. + + +===== [[id-1]] [[id-2]] Section L4 + +This section has leading additional achors. + + +==== Section L3 [[id-1]][[id-2]] + +This section has trailing additional anchors. + +==== [[id-1]][[id-2]]Section L3[[id-3]][[id-4]] + +This section has both leading and trailing additional anchors. + +==== Section L3 {title-attribute} in Title + +.Title {title-attribute} +This section has an attribute in its title. + +[discrete] +== Discrete Section + +This section will not be shown in the table of contents. + +//// +== Section with _emphasized_ text + +=== Section with escaped \_emphasized_ text +//// + + +== Section with #marked# text + +=== Section with escaped \#marked# text + + +== Section with `monospaced` text + +=== Section with escaped \`monospaced` text + +//// +== Section with *strong* text + +=== Section with escaped \*strong* text +//// + += Another Section at Level 0 + + += Table + +== Default Separator + +.PSV +// some comment +[[table-1]] +[.some-role] +[#table-shorthand] +// some comment +|=== +// some comment +| header col 1 | header col 2 | header col 3 +// some comment + +// with escaped cell separator +| row 1 \| col 1 | row 1 col 2 | row 1 col 3 +// no spaces needed around `|` +| *row* 2 col 1|row 2 col 2|row 2 col 3 + +|row 3 col 1 +// using attribute +| row 3 col 2 {vbar} +|ro3 3 col 3 + +| row 4 col 1 a|some AsciiDoc in col 2 row 4 + +* item 1 +* item 2 +|row 4 col 3 + +2*| row 5 has same contents in first 2 columns +|row 5 col 3 + +|row 6 col 1 2+| span row 6 in col 2 and 3 + +.2+|span col 1 in row 6 and 7|row 6 col 2|row 6 col 3 +|row 7 col 2|row 7 col 3 + +2.2+^.^|span col 1 and 2 in row 8 and 9|row 8 col 3 +|row 9 col 3 + +e|row 10 col 1 is emphasized (italic) +s|row 10 col 2 is strong (bold) +m|row 10 col 3 is monospaced +|=== + + +== Custom Separator + +IMPORTANT: Highlighting of tables with custom separator is not supported. +All `|` inside the table will be falsly highlighted. + +[separator=!] +|=== +// the `|` in the line below should not be highlighted. +!row 1 | col 1 !row 1 col 2 +s!row 2 col 1 !row 2 col 2 +|=== + +[separator=a] +|=== +arow 1 col 1 arow 1 col 2 +sarow 2 col 1 arow 2 col 2 +|=== + + +== Delimiter-Separated Values + +IMPORTANT: Highlighting for tables with delimiter-separated values is not supported. +All `|` inside the table will be falsly highlighted. + +[format=csv] +|=== +Col 1 ,Col 2 ,Col 3 + +// the `|` in the line below should not be highlighted. +row 1 | col 1 ,row 1 col 2 ,row 1 col 3 +row 2 col 2,row 2 col 2,row 2 col 3 + +row 3 col 3 , "row ""3"", col 2" , row 3 col 3 +|=== + + +=== Shorthand Notation for Data Tables + +.CSV +,=== +Col 1 ,Col 2 ,Col 3 + +row 1 col 1 ,row 1 col 2 ,row 1 col 3 +row 2 col 2,row 2 col 2,row 2 col 3 + +row 3 col 3 , "row ""3"", col 2" , row 3 col 3 +,=== + +.DSV +:=== +Col 1 :Col 2 :Col 3 + +row 1 col 1 :row 1 col 2 :row 1 col 3 +row 2 col 2:row 2 col 2:row 2 col 3 +row 3 col 3 : row 3 col 2 : row 3 col 3 +:=== + + diff --git a/autotests/reference/asciidoc.adoc.ref b/autotests/reference/asciidoc.adoc.ref new file mode 100644 index 0000000..d79c146 --- /dev/null +++ b/autotests/reference/asciidoc.adoc.ref @@ -0,0 +1,2800 @@ +
= AsciiDoc Syntax Highlighting

+// There are multiple level 0 sections, so use book instead of article.
+:doctype: book
+// For nice admonition and callout icons.
+:icons: font
+:toc: left
+
+Testing the syntax highlighting support in KDE Frameworks.
+
+The first of the following sections lists the things that are known not to work.
+Further sections are intended for testing the supported features of AsciiDoc.
+
+
+
= Known Not to Work

+
+There are a couple of things that are known not to work.
+
+
+
== Block

+
+* Highlighting of attributes inside a block title.
+
+* Highlighting of formatted text inside a block title other than ...
+** #marked#
+** `monospaced`
+
+* Code folding for contiguous blocks.
++
+This has an advantage too, though.
+It enables the user to decide on having code folding or not.
+For short blocks without empty lines where no code folding is desired, use contiguous blocks.
+For longer blocks which should support code folding, use delimited blocks.
+
+* Multiple lines of meta data.
++
+.For delimited blocks, Asciidoctor supports something like this:
+-----
+[source]
+[, options="nowrap"]
+----
+puts 'hello'
+----
+-----
++
+Syntax highlighting does not recognize the additional meta data lines and will rather interpret this as a contiguous block.
+
+* https://asciidoctor.org/docs/user-manual/#discrete-headings[Discrete headings] inside block.
++
+-----
+****
+Some text.
+
+[discrete]
+=== Discrete Heading
+
+Some more text.
+****
+-----
++
+Syntax highlighting does not recognize discrete headings inside a block.
+If a normal section title is marked as being discrete, highlighting works.
+
+
+
== Custom Styles

+
+* Highlighting of formatted text within the phrase to be styled.
++
+ Some [big]#big and *strong*# text.
+
+* Highlighting of styles with a phrase that spans multiple lines.
++
+----
+[big]#this
+is
+not
+highlighted#
+----
+
+
+
== Formatted/Quoted Text

+
+* Highlighting of formatted/quoted text (e.g. monospaced) that spans multiple lines.
+
+* Highlighting combinations besides those of emphasized, strong and monospaced.
+** Attributes inside other formatting.
++
+ `{attribute-id} inside monospaced`
+
+** Passthrough inside other formatting.
++
+ `+passthrough+ inside monospaced`
+
+** Marked text inside other formatting.
++
+ `#marked# inside monospaced`
+
+** Subscript inside other formatting.
++
+ `~sub~script inside monospaced`
+
+** Superscript inside other formatting.
++
+ `^super^script inside monospaced`
+
+And even more complex combinations.
+
+
+
== List

+
+* Inside a list, indented lines without leading asterisks or hyphen start highlighting for a verbatim paragraph.
+Asciidoctor renders this as normal text.
+
+
+
== Macro

+
+* Highlighting of macros with a text argument that spans multiple lines.
++
+----
+xref:id[this works just fine]
+
+xref:id[
+highlighting a macro with
+a text that spans multiples
+does not work
+]
+----
+
+
+
== Quote, Verse

+
+* Highlighting for single quote symbol `"`.
++
+Highlighting for air quotes `""` is supported.
+
+* Highlighting for Markdown style quotes.
+
+
+
== Replacement

+
+Highlighting for replacements is limited to those listed in the https://asciidoctor.org/docs/user-manual/#replacements[Asciidoctor Manual] and numerical character references.
+
+Highlighting for other https://en.wikipedia.org/wiki/List_of_XML_and_HTML_character_entity_references[HTML/XML character references] is not supported.
+
+.Examples of supported references
+* `+(C)+` resulting in (C)
+* `+=>+` resulting in =>
+* `+¼+` resulting in ¼
+
+.Examples of references that are not supported
+* `+¼+` resulting in ¼
+* `+φ+` resulting in φ
+
+
+
== Section

+
+* Setext style for section titles.
++
+Only Atx style is supported.
++
+NOTE: Asciidoctor's https://asciidoctor.org/docs/asciidoc-recommended-practices/[recommended practices] states _not_ to use Setext style for section titles.
+
+* Highlighting of formatted/quoted text inside section title other than ...
+** #marked#
+** `monospaced`
+
+* Code folding.
++
+Attempts made so far delivered unsatisfactory results.
+
+
+
== Table

+
+* Highlighting of tables with custom separator.
+** The custom separator will _not_ be highlighted.
+** All `|` inside the table _will be falsly_ highlighted.
+
+* Highlighting of delimiter-separated tables.
+** Table delimiters in shorthand notation and the value separator will _not_ be highlighted.
+** All `|` inside the table _will be falsly_ highlighted.
+
+* Applying styles on table contents.
++
+When defining a table, individual columns or cells can be defined to be highlighted *strong* etc..
+Corresponding highlighting of these cells does not work.
+
+
+
+
= Admonition

+
+
== Simple Format

+
+NOTE: A simple note.
+
+////
+FIXME: In the paragraph below is no note as it is started in the middle of the paragraph.
+This is problematic as we would need to know that the note line is not the first line in the paragraph.
+////
+Some text.
+NOTE: This is not a separate note as it is part of the paragraph started with the line above.
+
+NOTE:This is not a note as there is no space after the `:`.
+
+ NOTE: This is not a note as it is indented.
+
+NOTE : This is not a note as there are spaces between `NOTE` and `:`.
+
+NOTE:
+This is not a note as it is not using block format and the text is not starting on the same line as the label.
+
+NOTE: This is a lengthy note in simple format.
+Second line.
+One more line.
+And another one.
+This is the last line.
+
+This line is not part of the simple note anymore.
+
+CAUTION: This is a CAUTION.
+
+IMPORTANT: This is IMPORTANT.
+
+TIP: This is a TIP. +
+This second line is rendered as a line on its own because of the trailing `+` in the first line.
+
+WARNING: This is a WARNING.
+
+
+
== Block Format

+
+.Contiguous
+[NOTE]
+[[contiguous-note-id]]
+This is a contiguous *note* block.
+Second line.
+And one more line.
+// comment inside block
+This is the final line.
+
+This line is not part of the contiguous note block anymore.
+
+.Delimited
+[NOTE]
+[[delimited-note-id]]
+====
+This is a *note* in block format.
+As a block, the note may have a title
+// comment inside block
+
+In block format, multiple lines, paragraphs etc. are possible.
+====
+
+There is no delimited admonition block without block name.
+Using `====` delimiter without a block name results in an example block.
+
+.Using open block
+[NOTE]
+--
+Inside the open block note.
+--
+
+
+
=
[[main-1]]
An
[[main-2]]
chor
[[main-3]]
and Cross Reference

+
+
==
[[section-1]][[section-2]]
An
[[section-3]][[section-4]]
chor
[[section-5]]
+
+[[isolated-anchor]]
+Isolated anchor.
+
+[[isolated-anchor-with-label,Isolated Anchor With Label]]
+Isolated anchor with label.
+
+This line has an [[inline-anchor, Inline Anchor]]anchor placed inside the text.
+
+[#isolated-shorthand]
+Isolated anchor using shorthand definition.
+
+[#isolated-shorthand, Isolated Shorthand Anchor]
+Isolated anchor with label using shorthand definition.
+
+This line has an [ #inline-shorthand ]#anchor placed inside the text# #.
+
+.Inside [[block-anchor]]block title
+Works too.
+
+.Macro form
+There is also a maanchor:anchor-id[Macro Anchor]cro form for anchor definition.
+
+NOTE: There is no space needed before the `anchor` macro name.
+Also not after the closing `]`.
+
+
+
=== Not an anchor

+
+[[ not-an-anchor]]
+because of the space after the opening brackets.
+
+[[not-an-anchor ]]
+because of the space before the closing brackets.
+
+ [[not-an-anchor]] because of line starting with spaces.
+
+ [#not-an-anchor]#because# of line starting with spaces.
+
+[#not-an-anchor] because of trailing text.
+
+Not an anchor because of leading text [#not-an-anchor]
+
+Also[#not-an-anchor]#some text# because of missing space before `[`.
+
+Also [#not-an-anchor] #some text# because of space after `]`.
+
+Also [#not-an-anchor]# some text# because of space after the leading `#`.
+
+Also [#not-an-anchor]because of missing referred text (e.g. `#some text#`).
+
+
+
=== Escaped

+
+This is an escaped \[[anchor-id, some #anchor# label]] anchor.
+
+This is just some \normal text.
+
+Some\[[anchor-id]]anchor.
+
+\[[anchor-id]]
+
+////
+FIXME: highlighting differs
+Asciidoctor seems to just pass through the anchor when escaping it.
+This behaviour is rather unexpected, as in other cases the escaped contents is subject to further highlighting.
+
+We currently only consume the opening bracket.
+////
+This is an escaped \[#shorthand-id]#anchor in shorthand form#.
+
+Some \[#shorthand-id].
+
+\[#shorthand-id]
+
+\[#shorthand-id]#
+
+
+
== Cross References

+
+<>
+
+<>
+
+<>
+
+<>
+
+This is a reference to <>.
+
+<> some text >> some more text
+
+some << text <<>>
+
+<>
+
+<>
+
+<>
+
+<>
+
+<>
+
+<>.
+
+<>
+
+
+
=== Escaped

+
+This is not a reference \<>.
+
+
+
= Attribute

+
+
== No Value

+
+:some-attribute:
+This line should not be highlighted.
+
+ :not-an-attribute: as the line is indented.
+
+
+
== Single Line Value

+
+Attributes with values that are rendered as a single line, even if their definition spans multiple lines.
+
+.Single line definition
+:single-line: only one line
+This line is not part of the attribute value anymore.
+
+##before##{single-line}##after##
+
+:attr-in-attr-value: in multi line definition
+
+.Multi line definition
+:single-line-continued: First line {attr-in-attr-value}. \
+Second line. \
+Another line.
+This line is not part of the attribute value anymore.
+
+##before##{single-line-continued}##after##
+
+IMPORTANT: At least one space is needed before the continuation `\`.
+
+.Line continuation is only highlighted when inside an attribute definition
+some \
+text
+
+
+
== Multi Line Value

+
+Attributes with values including hard line breaks.
+
+IMPORTANT: At least one space is needed before the continuation `+` and between the `+` and the `\`.
+
+:multi-line: First line. + \
+Second line. + \
+Third line.
+This line is not part of the attribute value anymore.
+
+##before##{multi-line}##after##
+
+
+
== Inline Definition

+
+Inline attribute definitions {set:inline-attribute:just fine} works {inline-attribute}.
+
+.Surplus `:` is part of the value
+{set:attr::some value}
+{attr}
+
+{set:attr}
+{attr}
+
+.Not an inline definition as leading `set:` is missing
+{single-line:some value}
+
+
+
== Unsetting

+
+:!_custom_2-:
+:_custom_2-!:
+
+.Adding a value when unsetting doesn't make sense, but doesn't hurt either
+:some-attribute: some value
+Attribute is set to `{some-attribute}`.
+
+:!some-attribute: some value
+{some-attribute} is not set anymore.
+
+
+
== Not an Attribute

+
+:not-an-attribute:as there is no space after the terminating column of the identifier
+
+ :not-an-attribute: as it is indented
+
+
+
== Combination with Other Highlighting

+
+****
+:inside-a-block: inside a block
+Using an attribute {inside-a-block} works too.
+****
+
+:inside-formatting: inside formatting
+An attribute used `{inside-formatting}` is not highlighting as attribute.
+
+
+
== Escaped

+
+\:attr-1: escaped attribute definition + \
+second line of escaped attribute definition
+
+\:!attr-1: escaped unset attribute
+
+\:-attr-1: this is not highlighted as escaped attribute definition as it has an invalid attribute id.
+
+This \:attr-1: is not highlighted as escaped attribute definition as it is not used at line start.
+
+:attr-1: some attribute
+This is not rendered as \{attr-1}.
+
+This is not an inline attribute definition \{set:attr-2:some other attribute}. +
+{attr-2} is not set.
+
+****
+:inside-a-block: inside a block
+Escaping an attribute \{inside-a-block} works too.
+****
+
+
+
= Bibliography

+
+
== Using References

+
+The first reference has no label, so its id <> is rendered.
+
+The second reference has number <> as label.
+
+The third reference has <> as label.
+
+A reference defintion inside the text instead of the bibliography section yields some strange result: [[[ref-o,outside bibliography]]]].
+Not sure what to do with this.
+
+This is trying to use the escaped reference <>.
+
+This is trying to use reference <>.
+
+
+[bibliography]
+
== References

+
+- [[[ref-1]]] This is reference 1.
+- [[[r2,2]]]This is reference 2.
+- [[[r3,Some Text]]]
+This is reference 3.
+- [\[[r4, escaped]]] This is #escaped#.
+- [[[r5,5]]] This is reference 5.
+* [[[r6,strange]]] Using an asterisk yields a strange result.
+
+
+
= Block

+
+[abstract]
+.Abstract - contiguous block
+This document is used for testing syntax highlighting regarding various types of blocks.
+E.g. this contiguous abstract block. +
+Using block form for the abstract seems to be rendered differently than the section form (see `section.adoc`).
+
+[abstract]
+.Abstract - delimited open block
+--
+Using the delimited block form ...
+
+enables having empty lines in the abstract.
+--
+
+
+
== General

+
+NOTE: Starting and ending delimiter must be balanced, meaning they must have the same length.
+
+.Block title #before# block meta data
+[literal]
+....
+Inside the block.
+....
+
+[literal]
+.Block title `after` block meta data
+....
+Inside the block.
+....
+
+.Invalid block name
+[ literal]
+....
+This block has invalid meta data as there is a space between the opening square bracket and the block name.
+....
+
+.Block with attributes
+[literal, some, attributes]
+....
+Inside the block.
+....
+
+.Anchor before block name for contiguous block
+[[contiguous_block_id_before_name]]
+[literal]
+Inside the block.
+
+.Anchor after block name for contiguous block
+[literal]
+[[contiguous_block_id_after_name]]
+Inside the block.
+
+.Anchor after block name for delimited block
+[literal]
+[#delimited_block_id]
+....
+Inside the block.
+....
+
+.Option definition
+[literal%some-option, some, attributes]
+Inside the block.
+
+.Shorthand anchor definition
+// TODO Would be nice if we could highligth the shorthand ID definition as such.
+[literal#shorthand-id, some, attributes]
+Inside the block.
+
+Link to <>.
+
+Link to <>.
+
+Link to <>.
+
+
+
== Admonition

+
+See `admonition.adoc`.
+
+
+
== Comment

+
+See `comment.adoc`.
+
+
+
== Example

+
+.Contiguous
+[example]
+[[example-block-id]]
+A countiguous *example* block.
+// some comment
+Second line of the example block.
+
+This line is not part of the contiguous example block anymore.
+
+.Delimited with block name
+[example]
+// some comment
+[[example-block-id]]
+// some comment
+====
+// some comment
+Inside the delimited example block.
+====
+
+.Delimited without block name
+[[example-block-id]]
+====
+Inside the delimited example block.
+====
+
+.Using an open block
+[example]
+[[example-block-id]]
+--
+Inside the open block example.
+--
+
+
+
== Fenced

+
+NOTE: According to the https://asciidoctor.org/docs/user-manual/#built-in-blocks-summary[Asciidoctor manual], fenced blocks do not support block names.
+
+.Delimited without block name
+[#fenced-block-id]
+```
+Inside the fenced block.
+The block contents is rendered verbatim.
+So there is *no* text formatting.
+```
+
+.This is not a fenced block
+``````
+A fenced block's delimiter length is _exactly_ 3.
+``````
+
+
+
== Listing

+
+.Contiguous
+[listing]
+[[listing-block-id]]
+A countiguous *listing* block.
+Last line of the listing.
+
+.Delimited with block name
+[listing]
+[[listing-block-id]]
+// comment before the opening block delimiter
+////
+block comment
+////
+----
+First line inside the *listing* block.
+Last line inside the block.
+----
+
+.Delimited without block name
+[[listing-block-id]]
+----
+Inside the delimited listing block.
+----
+
+.Using an open block
+[listing]
+[[listing-block-id]]
+--
+Inside the open block listing.
+--
+
+
+
== Literal

+
+.Contiguous
+[literal]
+// some comment
+[[literal-block-id]]
+// some comment
+Inside the contiguous literal block.
+// this should not be highlighted as comment
+.this should not be highlighted as title
+The block contents is rendered verbatim.
+So there is *no* text formatting.
+// this should not be highlighted as comment
+
+.Delimited with block name
+[literal]
+// some comment
+[#literal-block-id]
+// some comment
+..........
+Inside the delimited literal block.
+// this should not be highlighted as comment
+.this should not be highlighted as title
+..........
+
+.Delimited without block name
+[[literal-block-id]]
+// some comment
+..........
+Inside the delimited literal block.
+..........
+
+.Using an open block
+[literal]
+// some comment
+[[literal-block-id]]
+// some comment
+--
+// this should not be highlighted as comment
+Inside the open block listing.
+--
+
+.Using leading spaces for first line
+ When using some leading spaces, the whole paragraph is treated as literal.
+Only the first line needs to have leading spaces.
+
+This line is not part of the literal paragraph anymore.
+
+
+
== Open

+
+NOTE: The open block does not have a contiguous form.
+
+.Delimited
+[#open-block-id]
+--
+An open block's delimiter length is _exactly_ 2.
+
+Last line of the #open# block.
+--
+
+
+
== Passthrough

+
+.Contiguous
+[pass]
+[[contiguous-passthrough-id]]
+Inside the contiguous passthrough block.
+Second line to pass trhough.
+
+This line is not part of the contiguous passthrough block anymore.
+
+.Delimited with block name
+[pass]
+[[delimited-passthrough-id]]
+++++++
+Inside the delimited passthrough block with block name.
+++++++
+
+.Delimited without block name
+[[delimited-passthrough-id]]
+++++
+Inside the delimited passthrough block without block name.
+++++
+
+According to the https://asciidoctor.org/docs/user-manual/#built-in-blocks-summary[Asciidoctor Manual], passthrough using an open block is not supported.
+
+
+
== Quote

+
+See `quote_verse.adoc`.
+
+
+
== Sidebar

+
+.Contiguous
+[sidebar]
+[[sidebar-block-id]]
+Inside the *sidebar* block.
+Second line of the sidebar block.
+
+This line is not part of the sidbar block anymore.
+
+.Delimited with block name
+[sidebar]
+[[sidebar-block-id]]
+**********
+Inside the *sidebar* block.
+**********
+
+.Delimited without block name
+[[sidebar-block-id]]
+****
+Inside the sidebar block.
+****
+
+.Using an open block
+[sidebar]
+[[sidebar-block-id]]
+--
+Inside the sidebar block.
+--
+
+
+
== Source

+
+.Contiguous
+[source,ruby]
+[[source-block-id]]
+#This is Ruby source code.
+#NOTE: If there is a space after the `#`, Asciidoctor interprets this as a section title.
+#Seems in contiguous source blocks, Asciidoctor still interprets the block contents, which is rather unexpected.
+import 'needed'
+IO.puts "hello"
+
+.Contiguous using option syntax
+[source%mixed,php]
+


+
+


+
+.Delimited with block name
+[source , ruby ]
+[[source-block-id]]
+----
+# This is Ruby source code.
+# NOTE: in delimited source blocks, having a space after the `#` in the comment is OK.
+import 'needed'
+
+IO.puts "hello"
+----
+
+.Delimited with block name using option syntax
+[source%mixed,php]
+----
+


+
+


+----
+
+.Delimited without block name
+[[source-block-id]]
+----
+# This is Ruby source code.
+# NOTE: in delimited source blocks, having a space after the `#` in the comment is OK.
+import 'needed'
+
+IO.puts "hello"
+----
+
+.Using an open block
+[source,ruby]
+[[source-block-id]]
+--
+import 'needed'
+
+IO.puts "hello"
+--
+
+
+
== Stem

+
+.Contiguous
+[stem]
+[[stem-block-id]]
+Inside the contiguous stem block.
+Second line to pass.
+
+This line is not part of the contiguous Passthrough block anymore.
+
+.Delimited with block name
+[stem]
+[[stem-block-id]]
+++++++
+Inside the delimited stem block with block name.
+++++++
+
+.Delimited without block name
+[[stem-block-id]]
+++++
+Inside the delimited stem block without block name.
+++++
+
+
+
== Table

+
+See `table.adoc`.
+
+
+
== Verse

+
+.Contiguous
+[verse]
+[[verse-block-id]]
+Inside the *verse* block.
+Second line of the verse block.
+
+This line is not part of the contiguous verse block anymore.
+
+.Delimited with block name
+[verse]
+[[verse-block-id]]
+____
+Inside the *verse* block.
+____
+
+.Delimited without block name
+This would be rendered as a quote block as the same delimiters are used.
+
+.Using an open block
+[verse]
+[[verse-block-id]]
+--
+Inside the *verse* block.
+--
+
+
+
== Nested Blocks

+
+[NOTE]
+Some note text.
+
+====
+Start of outer example block.
+
+.Nested example block
+=====
+Inside the inner example block.
+// some comment
+
+.Nested literal block
+[literal]
+// some comment
+----
+Inside the literal block within the inner example block.
+--
+Trying to use a block within a verbatim block results in verbatim text, of course.
+--
+----
+=====
+Line in outer block.
+[listing]
+----
+Inside the inner listing block.
+----
+End of outer block.
+====
+
+.Admonition inside some other block
+====
+Some text.
+
+NOTE: This is a note in simple format inside a block.
+
+Some more text.
+====
+
+
+
= Callout

+// Add `:icons: font` for nice callout icons.
+
+Callouts are usually used with listing/source blocks, but Asciidoctor renders them also without a listing block.
+
+<1> This is a callout.
+<.> This is a callout too.
+
+ <2> This is not rendered as a callout as it is indented.
+
+The line below is not rendered as a callout as it has no text in the same line.
+
+<3>
+
+////
+FIXME This should not be highlighted as callout.
+As it depends on the kind of line before, this is problematic.
+////
+The line below is not rendered as callout as it is part of this paragraph.
+<4> This should _not_ be highlighted as callout.
+
+.Callouts with manual numbering
+[source,sh]
+----
+ls -l <2>
+ls -la <1>
+----
+<1> Explanation for callout number 1.
+<2> Explanation for callout number 2.
+\<3> This is not a callout as it is escaped.
+
+.Callouts with automatic numbering
+[source,sh]
+----
+ls -l <.>
+ls -la <.>
+----
+<.> Explanation for callout number 1.
+<.> Explanation for callout number 2.
+
+
+
= Comment

+
+TIP: Comment highlighting supports the standard https://cgit.kde.org/syntax-highlighting.git/tree/data/syntax/alert.xml[KDE alerts] (TODO, FIXME, ...) in both single-line and multi-line comments.
+
+
+
== Single Line

+
+Single-line comments start with exactly `//`.
+If there are any characters - including spaces - before the `//`, the line will be rendered.
+If there are more than two consecutive `/`, the line will be rendered.
+
+This line // will be rendered completely.
+
+ // This line will be rendered as verbatim text as it is indented.
+
+/// This line will be rendered as it starts with 3 `/`.
+
+// This line will be invisible.
+
+//This line will be invisible.
+
+//
+
+\// Escaped comment.
+
+\// TODO Of course there is no alert highlighting in escaped comments.
+
+.Alerts
+// NOTE testing alerts
+// TEST: testing alerts
+// TODO: testing alerts
+// TASK testing alerts
+// WARNING: testing alerts
+// ALERT: testing alerts
+// DANGER: testing alerts
+
+
+
== Multi Line

+
+.Contiguous block
+[comment]
+Some comment.
+Alerts:
+NOTE testing alerts
+TEST: testing alerts
+TODO: testing alerts
+TASK testing alerts
+WARNING: testing alerts
+ALERT: testing alerts
+DANGER: testing alerts
+Last line of contiguous block comment.
+
+This line is not part of the contiguous block comment anymore.
+
+.Delimited block without name
+//////
+This is a multi-line comment.
+It spans multiple lines.
+
+Alerts:
+NOTE testing alerts
+TEST: testing alerts
+TODO: testing alerts
+TASK testing alerts
+WARNING: testing alerts
+ALERT: testing alerts
+DANGER: testing alerts
+
+This is the comment's last line.
+//////
+
+[comment]
+.Delimited block with name
+////
+This is a multi-line comment.
+It spans multiple lines.
+
+Alerts:
+NOTE testing alerts
+TEST: testing alerts
+TODO: testing alerts
+TASK testing alerts
+WARNING: testing alerts
+ALERT: testing alerts
+DANGER: testing alerts
+
+This is the comment's last line.
+////
+
+.Using open block
+[comment]
+--
+Inside the open block comment.
+--
+
+
+
= Counter

+
+
== Use and Render

+
+.Start with 1 and render value
+New value for `c1` is {counter:c1}.
+
+.Increment and render
+And now it is {counter:c1}.
+
+.Render the current value without changing it
+Current value is {c1}.
+
+
+
== Use Without Rendering

+
+.Define the new counter
+No new value to be {counter2:c2}seen.
+
+.Let's see the current value
+Current value is {c2}.
+
+.Increment
+No incremented value to be {counter2:c2}seen.
+
+.Let's see the current value
+Current value is {c2}.
+
+
+
== Using a Start Value

+
+.Start with 3 and render value
+New value for `c3` is {counter:c3:99}.
+
+.Increment and render
+And now it is {counter:c3}.
+
+.Works with characters too
+New value for `c4` is {counter:c4:X}
+
+.Increment character counter and render
+And now it is {counter:c4}.
+
+
+
== About using Spaces

+
+CAUTION: If you leave spaces after the `:` or before the closing `}`, Asciidoctor will make them part of the counter attribute name. +
+So it's probably wise to avoid spaces here.
+
+.Define a counter
+New value is {counter:c5}.
+
+.This is actually a new counter
+New value is {counter: c5}.
+
+.But you can't access that attribute
+Can't just show the current value { c5}
+
+.Only if we increment it
+Incremented value is {counter: c5}.
+
+.This is again a new counter
+New value is {counter: c5}.
+
+.This is also a new counter
+New value is {counter:c5 }.
+
+CAUTION: Similar problems occur when using spaces around starting values. +
+*Just don't use spaces*.
+
+.New counter with start value
+New value is {counter:c6: 9 }
+
+.But when trying to increment
+Incremented value is {counter:c6}
+
+
+
+
= Text Formatting

+
+TIP: Asciidoctor uses also the term _quoted text_.
+
+
== Custom Styles

+
+[big]#big text#
+
+Some [.big]#big text#.
+
+Some [big]#big and *strong* text#.
+
+Some text with [foo]#custom style#.
+
+[foo bar]#foo bar text#
+
+before![big]#big text#
+
+[big]#big text#!after
+
+[big]##*text*##
+
+////
+FIXME Highlighting differs.
+The phrase is rendered as marked.
+Thetrailing hash is therefore not visible.
+////
+[big]###text###
+
+[fo[o]#some text#
+
+
+[underline]_emphasized and underlined_
+
+[underline]__emphasized and underlined_
+
+
+[underline]`monospaced and underlined`
+
+[underline]``monospaced and underlined``
+
+
+[underline]*strong and underlined*
+
+[underline]**strong and underlined**
+
+
+
=== Not rendered as custom style

+
+[fo]o]#not a custom style# because of surplus `]`.
+
+[big]not a phrase because of missing phrase markers.
+
+[big]# # because only spaces used as phrase.
+
+[big]# the phrase# because of leading space in phrase.
+
+[big]#the phrase # because of trailing space in phrase.
+
+Before[foo]#the phrase# because of missing non-word character before clause.
+
+Before [foo]#the phrase#after because of missing non-word character after clause.
+
+
+
=== Escaped

+
+This is not \[underline]#underlined text#.
+
+
+
== Emphasized

+
+
=== Rendered formatted

+
+This line contains a _sequence_ of _multiple emphasized_ words.
+
+This line contains a single _emphasized_ word.
+
+This line contains a single __emphasized_ word.
+
+This line contains a single _emphasized__ word.
+
+The text within the brackets should be (_emphasized_), but the brackets themselves not.
+
+(_emphasized_ [_emphasized_ {_emphasized_ |_emphasized_ ._emphasized_ ,_emphasized_ !_emphasized_ ?_emphasized_ _emphasized_?
+
+_emphasized_) _emphasized_] _emphasized_} _emphasized_| _emphasized_. _emphasized_; _emphasized_,
+
+_emphasized_( _emphasized_( _emphasized_[ _emphasized_{
+
+_emphasized_)
+
+_emphasized_
+
+__aa__bb
+
+aa__bb__
+
+aa__bb _cc__dd
+
+aa__bb cc___dd
+
+aa__ bb __cc
+
+
+
=== Rendered as-is

+
+This line does _not_ contain _some emphasized _ text as there is a surplus space.
+
+This line does _not_ contain_some emphasized_ text as there is a space missing.
+
+This line does _not_ contain _some emphasized_text as there is a space missing.
+
+foo ;_emphasized_ :_emphasized_ }_emphasized_
+
+;_emphasized_
+:_emphasized_
+}_emphasized_
+
+// FIXME Highlighting differs.
+In this line, there is some ___very emphasized___ text.
+Asciidoctor renders it as normal text, just ignoring all the underscores.
+That is a bit strange.
+
+
+
=== Escaped

+
+Not \_emphasized_ as it is escaped.
+
+Still \__emphasized__ as only the outermost level is escaped.
+
+
+
== Marked

+
+
=== Rendered formatted

+
+Some # marked # text.
+
+Works #also for multiple words#.
+
+Some ##marked# text.
+
+Some #marked## text.
+
+Some ##marked## text.
+
+Some[big]#marked# text.
+Not rendered big but marked, because of missing space before `[big]`.
+
+Works also for p##art##s of a word.
+
+p##art#!s
+
+!#marked#!
+
+#marked#
+
+##marked##
+
+
+
=== Rendered as-is

+
+Not rendered # marked# because of space after the leading hash.
+
+Not rendered #marked # because of space before the trailing hash.
+
+Not rendered#marked# as there is a space missing.
+
+Not rendered #marked#as there is a space missing.
+
+ This is #rendered# as a verbatim block as it is indented.
+
+Some [big]#big marked# text.
+
+Some [big]##big marked## text.
+
+
+
=== Escaped

+
+Not \#marked# as it is escaped.
+
+Still \##marked## as only the outermost level is escaped.
+
+
+
== Monospaced

+
+
=== Rendered formatted

+
+This line contains a `sequence of ` multiple monospaced` words.
+
+This line contains a single `monospaced` word.
+
+This line contains a single ``monospaced` word.
+
+This line contains a single `monospaced`` word.
+
+The text within the brackets should be (`monospaced`), but the brackets themselves not.
+
+before``monospaced``after.
+
+`monospaced`
+
+(`mono` [`mono` {`mono` |`mono` .`mono` ,`mono` !`mono` ?`mono`
+
+`mono`) `mono`) `mono`] `mono`} `mono`| `mono`. `mono`; `mono`, `mono`?
+
+`mono`( `mono`( `mono`[ `mono`{
+
+``aa``bb
+
+aa``bb``
+
+aa``bb `cc``dd
+
+aa``bb cc```dd
+
+aa`` bb ``cc
+
+
+
=== Rendered as-is

+
+Not rendered ` monospaced` because of leading space.
+
+Not rendered `monospaced ` because of trailing space.
+
+Not rendered`monospaced` as there is a space missing.
+
+Not rendered `monospaced`as there is a space missing.
+
+
+
=== Escaped

+
+Not \`monospaced` as it is escaped.
+
+Still \``monospaced`` as only the outermost level is escaped.
+
+
+
== Passthrough

+
+
=== Rendered passed through

+
+This text is +passed _as_ is+ with no further formatting.
+
+Matching +is _lazy_+, so this + is rendered.
+
+This +_is_ passthrough`+` as passthrough has higher priority as monospaced.
+
++passthrough+ at line start.
+
+Passthrough at +line end.+
+
+Minimal passthrough +a+.
+
+
+This text is ++passed _as_ is++ with no further formatting.
+
+This text is +++passed _as_ is+++ with no further formatting.
+
+
+
=== Rendered as-is

+
+No+passthrough+ as there is no space before the leading `+`.
+
+No +passthrough+as there is no space after the trailing plus.
+
+No + passthrough+ as there is a space after the leading `+`.
+
+No +passthrough + as there is a space after the trailing plus.
+
+
+
=== Escaped

+
+This text \+is _not_ passed through+ because of escaping.
+
+This text \++is _still_ passed through++ as only the outermost level is escaped.
+
+This text \+++is _still_ passed through+++ as only the outermost level is escaped.
+
+
+
== Strong

+
+
=== Rendered formatted

+
+This line contains a *sequence of * multiple strong* words.
+
+This line contains a single **strong* word.
+
+This line contains a single**strong* word.
+
+This line contains a single *strong** word.
+
+The text within the brackets should be (*strong*), but the brackets themselves not.
+
+(*strong* [*strong* {*strong* |*strong* .*strong* ,*strong* !*strong* ?*strong*
+
+*strong*) *strong*] *strong*} *strong*| *strong*. *strong*; *strong*, *strong*?
+
+*strong*( *strong*( *strong*[ *strong*{
+
+*strong*)
+
+*strong*
+
+aa**bb**
+
+**aa**bb
+
+aa**bb**cc
+
+aa**bb *cc**dd
+
+aa**bb cc***dd
+
+aa** bb **cc
+
+
+
=== Rendered as-is

+
+This line does _not_ contain *some strong * text as there is a space before the trailing asterisk.
+
+This line does _not_ contain*some strong* text as there is a space missing before the leading asterisk.
+
+This line does _not_ contain *some strong*text as there is a space missing after the trailing asterisk.
+
+some text ;*strong* :*strong* _*strong* }*strong*
+
+some text _*strong*_
+
+;*strong*
+:*strong*
+}*strong*
+
+ Not *strong* as there is a leading space in the line, making it verbatim.
+
+// FIXME Highlighting differs.
+In this line, there is some ***very strong*** text.
+It is rendered just ignoring the asterisks.
+That is a bit strange.
+
+
+
=== Escaped

+
+Not \*strong* as it is escaped.
+
+Still \**strong** as only the outermost level is escaped.
+
+
+
== Subscript

+
+
=== Rendered formatted

+
+H~2~O
+
+
+
=== Rendered as-is

+
+Not rendered sub~sc ript~ as there is a space within.
+
+
+
=== Escaped

+
+Not \~subscript~ as it is escaped.
+
+
+
== Superscript

+
+
=== Rendered formatted

+
+E = m c^2^
+
+
+
=== Rendered as-is

+
+Not rendered super^sc ript^ as there is a space within.
+
+
+
=== Escaped

+
+Not \^superscript^ as it is escaped.
+
+
+
== Combinations

+
+IMPORTANT: Combinations are supported by Asciidoctor, as long as the markup sets are entered in the right order.
+The monospace markup must be the outermost set, then the strong set, and the emphasized markup must always be the innermost set.
+
+
+
=== Rendered formatted

+
+This is *_strong emphasized_* text.
+
+This is *__strong _ * emphasized_* text.
+
+This is**_strong emphasized_**text.
+
+This is**__ strong emphasized_**text.
+
+*_strong emphasized_*
+
+
+This is `*strong monospaced*` text.
+
+This is `**strong ` * monospaced*` text.
+
+This is``*strong monospaced*``text.
+
+This is``** strong monospaced*``text.
+
+`*strong monospaced*`
+
+
+This is `_emphasized monospaced_` text.
+
+This is `__emphasized ` _ monospaced_` text.
+
+This is``_emphasized monospaced_``text.
+
+This is``__ emphasized monospaced_``text.
+
+`_emphasized monospaced_`
+
+
+This is `*_strong emphasized monospaced_*` text.
+
+This is `*__strong emphasized * ` _ monospaced_*` text.
+
+This is``*_strong emphasized monospaced_*``text.
+
+This is``*__ strong emphasized monospaced_*``text.
+
+`*_strong emphasized monospaced_*`
+
+
+
=== Unsupported

+
+Highlighting for other combinations is currently not supported, as there would be a large number of rules and styles necessary.
+
+* _emphasized #marked#_
+* #marked *strong*#
+* *strong #marked#*
+* *strong _emphasized #marked#_*
+
+* subscript _with~in~ emphasized_
+* subscript within marked: #H~2~O#
+* subscript `with~in~ monospaced`
+* subscript *with~in~ strong*
+
+* superscript _with^in^ emphasized_
+* superscript within marked: #E = m c^2^#
+* superscript `with^in^ monospaced`
+* superscript *with^in^ strong*
+
+And even more complex ones.
+
+
+
=== Rendered as-is

+
+This is no *_ strong emphasized_* text, it's *strong* only.
+
+This is no *_strong emphasized _* text, it's *strong* only.
+
+This is no _*strong emphasized*_ text, it's _emphasized_ only.
+
+This is no _`emphasized monospaced`_ text, it's _emphasized_ only.
+
+
+
=== Escaped

+
+This is not rendered \`_emphasized monospaced_`. +
+But it is rendered emphasized.
+
+This is not rendered \*_emphasized strong_*. +
+But it is rendered emphasized.
+
+This is not rendered \`*monospaced strong*`. +
+But it is rendered strong.
+
+This is not rendered \`*_emphasized monospaced strong_*`. +
+But it is rendered emphasized strong.
+
+
+
= Horizontal Rules

+
+
== Simple patterns

+
+'''
+---
+***
+
+
+
== Patterns with spaces

+
+- - -
+* * *
+
+.Not a horizontal rule
+' ' '
+
+
+
== Arbitrary length

+
+NOTE: Although the https://asciidoctor.org/docs/user-manual/#markdown-style-horizontal-rules[Asciidoctor Manual] states that horizontal rule patterns are only supporting up to three characters (ignoring the optional spaces), some longer patterns work too.
+
+'''''''
+
+////
+These patterns don't work, as they start delimited blocks, item lists etc..
+--------
+******
+- - - - - -
+* * * * * * * * *
+////
+
+
+
== Inside blocks

+
+****
+Horizontal rules work also inside blocks.
+They eventually need an empty line before them, though.
+
+'''
+After the horizontal rule.
+****
+
+
+
= Include

+:includedir: include
+
+
== Included Contents Rendered

+
+NOTE: Using file names with spaces works.
+
+include::{includedir}/demo.adoc[]
+
+.Partial include
+include::{includedir}/demo.adoc[lines=2..3]
+
+.Inside contiguous block
+[source,ruby]
+IO.puts 'hello'
+"""
+include::{includedir}/demo.adoc[lines=2..3]
+"""
+IO.puts 'bye'
+
+.Inside delimited block with name
+[literal]
+----
+This line shall be highlighted as verbatim.
+include::{includedir}/demo.adoc[lines=2..3]
+This line shall be highlighted as verbatim.
+----
+
+.Inside delimited block without name
+....
+This line shall be highlighted as verbatim.
+include::{includedir}/demo.adoc[lines=2..3]
+This line shall be highlighted as verbatim.
+....
+
+.Inside table
+|===
+|row 1 col 1|row 2 col 2
+|
+// the include directive must have its own line with nothing else
+include::{includedir}/demo.adoc[lines=1..1]
+|row 2 col2
+
+|row 3 col 1
+|row 3 col 2
+|===
+
+
+
== Rendered as-is

+
+.Inside verbatim paragraph
+ This line shall be highlighted as verbatim.
+include::{includedir}/demo.adoc[lines=2..3]
+This line shall be highlighted as verbatim.
+
+
+
= Index

+
+
== Rendered as Index Term

+
+This is a ((flow)) index term.
+
+This is a indexterm2:[flow] index term.
+
+This is a (((concealed, index, term))) concealed index term.
+
+This is a indexterm:[concealed, index, term] concealed index term.
+
+This is rendered as a ((flow index term))).
+
+This is rendered as a (((flow index term)).
+
+This is ((())) empty but rendered as index term nevertheless.
+
+Some (((index term))).
+
+Some ((((index term)))).
+
+
+
== Rendered as-is

+
+This is (()) not an index term as it is empty.
+
+This is (not an index term)) as there is a `(` missing.
+
+This is ((not an index term) as there is a `)` missing.
+
+
+
== Escaped

+
+This is \((not an indexterm)) as it is escaped.
+
+This is \(((not a concealed index term))), but still a flow index term as only the outer brackets are escaped.
+
+This is \(\((not an indexterm))) as it is fully escaped.
+
+This is not a \indexterm2:[flow] index term.
+
+This is not a \indexterm:[concealed, index, term] concealed index term.
+
+[index]
+
== Index Catalog

+
+WARNING: HTML output currently does not support the creation of the index catalog.
+
+
+
= Link

+
+
== ftp, irc

+
+* ftp://some.org/some/where/file.extension
+* irc://some.org/some/where/file.extension
+
+
+
== http(s)

+
+* http://some.org/some/where/file.extension
+* https://some.org/some/where/file.extension
+
+// . , ; : followed by a space terminate the link
+* https://some.org/some/where/file.extension. some text
+* https://some.org/some/where/file.extension.some text
+* https://some.org/some/where/file.extension, some text
+* https://some.org/some/where/file.extension,some text
+* https://some.org/some/where/file.extension; some text
+* https://some.org/some/where/file.extension;some text
+* https://some.org/some/where/file.extension: some text
+* https://some.org/some/where/file.extension some text
+* https://some.org/some/where/file.extension:some text
+
+// unbalanced square brackets always terminate the link
+* https://some.org/some/where/file.extension[some text
+* https://some.org/some/where/file.extension[ some text
+* https://some.org/some/where/file.extension]some text
+* https://some.org/some/where/file.extension] some text
+
+* https://some.org/some/where/file.extension[]
+* https://some.org/some/where/file.extension[some text]trailing text
+* https://some.org/some/where/file.extension[some text]. trailing text
+* https://some.org/some/where/file.extension[some text], trailing text
+* https://some.org/some/where/file.extension[some text]; trailing text
+* https://some.org/some/where/file.extension[some text]: trailing text
+* https://some.org/some/where/file.extension[some]text] trailing text
+* https://some.org/some/where/file.extension[some ]text] trailing text
+* https://some.org/some/where/file.extension[some \]text] - with escaped `]`
+
+// TODO: highlighting of text within [] ?
+* some text https://some.org/some/where/file.extension[*some text*] trailing text.
+
+// some characters may be placed before the `http`
+* (https://some.org
+* )https://some.org
+* [https://some.org
+* ]https://some.org
+* ;https://some.org
+* <https://some.org
+* >https://some.org
+
+
+
=== Not rendered as Link

+
+* {https://some.org
+* }https://some.org
+* ,https://some.org
+* .https://some.org
+* :https://some.org
+
+
+
== link

+
+* link:relative/path - not rendered as link as `[]` are misssing
+* link:relative/path[]
+* ##before##link:relative/path[]##after## - no spaces needed
+* link:relative/path/file.extension[local file]
+* link:relative/path/file.extension[local ]file]
+* link:relative/path/file.extension[local \]file] - with escaped `]`
+* link:relative/path with spaces/[] - not rendered as link because of spaces
+* link:++relative/path with spaces/++[] - but this is rendered as link with spaces
+* link:external.html#anchor[to anchor of local HTML file]
+* link:url[optional link text, optional target attribute, optional role attribute]
+
+
+
== E-Mail

+
+* some.person@org.com
+* some.person@org.com[some one] - brackets supported only with leading `mailto:`
+* :some.person@org.com - not rendered as link because of leading `:`
+* /some.person@org.com - not rendered as link because of leading `/`
+
+* mailto:some.person@org.com - not rendered as link as `[]` are misssing
+* mailto:some.person@org.com[]
+* ##before##mailto:some.person@org.com[]##after## - no spaces needed
+* mailto:some.person@org.com[some one]
+* mailto::some.person@org.com[] - not rendered as link because of double `:`
+* mailto: some.person@org.com[] - not rendered as mailto because of space after `:`, but still as inline email
+* mailto:[some one] - not rendered as link because of missing address
+
+
+
== Escaped

+
+* \ftp://some.org/some/where/file.extension
+* \irc://some.org/some/where/file.extension
+* \https://some.org/some/where/file.extension
+* \link:relative/path[]
+* \link:relative/path[]
+* \some.person@org.com
+* \:some.person@org.com
+* \/some.person@org.com
+* \mailto:some.person@org.com[]
+
+
+
= List

+
+
== Bulleted List

+
+////
+FIXME The *** without text in the list below should not be highlighted as a horizontal line.
+This is going to be problematic, as we would need to know that we are currently inside a list.
+////
+.using asterisks
+* item 1
+ * * item 2
+Has some text.
+** item 2.1
+Also has some text.
++
+And an additional paragraph.
+** item 2.2
+*** item 2.2.1
++
+Markers without a text are _no_ item.
+***
+** item 2.3
+*** item 2.3.1
+**** item 2.3.1.1
+* item 3
+
+ * item 4
+** item 4.1
+**not an item as there is no space
+ ** item 4.2
+
+.using hyphens
+- item 1
+ - item 2
+ -- item 2.1 is not an item as using hyphens is only supported for flat lists
+
+////
+FIXME: The line above should not be highlighted as literal.
+This is going to be problematic, as we would need to know that we are currently inside a list.
+////
+
+.inside a block
+****
+* item 1
+** item 1.1
+****
+
+
+
== Checklist

+
+////
+FIXME The invalid checklist items below should not be highlighted as bulleted list items.
+This is going to be problematic, as we would need to know that we are currently inside a checklist.
+////
+
+.using asterisks
+* [*] checked
+** [x] also checked
+*** [x] also checked
+* [X] _invalid_ check (capital X), normal list item
+* [o] _invalid_ check (invalid character), normal list item
+* [] _invalid_ check (no space), normal list item
+* [ ] not checked
+* normal list item
+
+.using hyphens
+- [*] checked
+- [*] also checked
+-- [*] _not a list item_ as hyphens are only supported for flat lists
+ -- [*] _not a list item_ as hyphens are only supported for flat lists
+
+////
+FIXME: the line above should not be highlighted as literal.
+This is going to be problematic, as we would need to know that we are currently inside a list.
+////
+
+
+
== Description List

+
+.Normal format
+Term normal:: This is a description.
+ Term indented:: This works too.
+
+Term multi line::
+This one has multiple lines.
+Two lines to be exact.
+Term L2::: This term is on level 2.
+Term L3:::: This term is on level 3.
+Term L4::::: This term is on level 4.
+Term L5:::::: This term is on level 5.
+Term with empty definition::
+Term with separated colons :: This one has spaces before the `::`.
+Term no space::This is _not a description item_ as there is no space after the `::`.
+Term with unnumbered list::
+* list item 1
+* list item 2
+Term with multiple colons:: in the term::
+Having multiple `::` in one line is OK too.
+.;Strange Term = !?*:: This one has a strange term.
+Term 9 : : A space between the double `:` does _not_ work.
+
+////
+FIXME The line with the "Strange Term" abvoe should not be highlighted as title in this case.
+This is going to be problematic, as we would need to know that we are currently inside a list.
+////
+
+.Term and description on the same line
+[horizontal]
+Term 1:: first level.
+Term 2::: second level.
+Term 3:: first level again.
+
+
+
== Numbered List

+
+.using numbers
+1. item 1
+2. item 2
+ 3. item 3
+4 Is not an item.
+Numbers without a trailing dot do _not_ result in an item.
+123. This is an item with an out-of-sequence number.
+It will be fixed in the rendered output.
+
+.using dots
+. item 1
+ . item 2
+..not an item as there is no space
+ .. item 2.1
+ .. item 2.2
+... item 2.2.1
+.... item 2.2.1.1
+ . item 3
+
+////
+FIXME The line above starting with "..not an item" should not be highlighted as title in this case.
+This is going to be problematic, as we would need to know that we are currently inside a list.
+////
+
+
+
== Question and Answer List

+
+////
+FIXME Indented answer is highlighted as verbatim block, messing up further question.
+This is going to be problematic, as we would need to know that we are currently inside a list.
+////
+
+[qanda]
+What is Asciidoctor?::
+An implementation of the AsciiDoc processor in Ruby.
+& answer pairs.
+Must the answer be indented?::
+ It's not necessary, but possibly.
+What is the answer to the Ultimate Question?:: 42
+
+
+
= Macro

+// for `btn:`, `kbd:`, `menu:`
+:experimental:
+// for icon:tags[] etc.
+:imagesdir: media
+// needed to use macro `toc::[]`
+:toc: macro
+
+
== General Information

+
+NOTE: There is no space needed before the macro name or after the closing `]`.
+
+
+
== Anchor

+
+There is a macro form anchor:anchor-id[Macro Anchor] for anchor definition.
+
+See `anchor.adoc` for other forms.
+
+
+
== Cross Reference

+
+xref:anchor-id[macro xref]
+
+WARNING: Highlighting for cross references with text spanning multiple lines is not supported.
+
+xref:id[
+Line 1 in cross reference text.
+Line 2 in cross reference text.
+]
+
+\xref:anchor-id[macro xref] escaped
+
+
+
== Footnote

+
+This text has a foonotefootnote:[A simple footnote.].
+
+This text has a foonote with idfootnoteref:[fn-1, A footnote reference.].
+
+
+
== Icon

+
+This is a tag icon:tags[] icon with no color set.
+
+This is a blue icon:tags[role="blue"] tag.
+
+This is a big green icon:tags[role="green", size="2x"] tag.
+
+
+
== Image

+
+An imageimage:logo-outline-color.svg[Logo,25]within some text.
+
+
+
== Keyboard Shortcut

+
+kbd:[Ctrl+M]
+
+
+
== Menu Selection

+
+menu:File[Save]
+
+menu:View[Zoom > 1:1]
+
+
+
== Pass

+
+Some pass:[passthrough] HTML.
+
+Some pass:quotes[passthrough with *quoted* text] HTML.
+
+Some pass:q[passthrough with *quoted* text] HTML.
+
+
+
== Table of Contents

+
+toc::[]
+
+
+
== UI Buttons

+
+Press the btn:[OK] button when you are finished.
+
+
+
== Escaped

+
+This is no anchor \anchor:macro-anchor[Macro Anchor].
+
+This is no button \btn:[Cancel].
+
+This is no foonote\footnote:[A simple footnote.].
+
+This is no foonote with id\footnoteref:[fn-1, A footnote reference.].
+
+This is no image\image:logo-outline-color.svg[Tree, 25].
+
+This is no icon \icon:tags[].
+
+This is no keyboard shortcut \kbd:[Ctrl+M].
+
+This is no menu \menu:File[Save].
+
+This is no passthrough \pass:[passthrough].
+
+
+
= Media

+// The name `imagesdir` is a bit misleading as audio and video use also this prefix.
+:imagesdir: media
+
+
== Audio

+
+audio::test.mp3[]
+
+audio::test.mp3[options="loop"]
+
+.Escaped
+\audio::test.mp3[]
+
+
+
== Image

+
+
=== Block Format

+
+.Test SVG
+[#logo]
+[link=https://github.com/asciidoctor/brand]
+image::test.svg[Asciidoctor Logo, 100]
+
+
+
==== Not highlighted

+
+.leading spaces, literal paragraph
+ image::test.svg[Test, 100]
+
+.trailing characters
+image::test.svg[Test, 100] trailing
+
+
+
==== Escaped

+
+\image::test.svg[Asciidoctor Logo, 100]
+
+
+
=== Inline Format

+
+Withinimage:logo-outline-color.svg[Tree, 25]some text.
+
+NOTE: There is no space needed before `image` and none after the closing `]`.
+
+image:logo-outline-color.svg[Tree, 25] at line start.
+
+At line end image:logo-outline-color.svg[Tree, 25]
+
+(image:logo-outline-color.svg[Tree, 25]) wrapped in non-space characters.
+
+
+
==== Not highlighted

+
+image
+
+image:
+
+someimage:
+
+some:image
+
+some image:[]
+
+
+
==== Escaped

+
+Within\image:logo-outline-color.svg[Tree, 25]some text.
+
+
+
== Video

+
+video::test.mp4[width=300]
+
+
+video::test.mp4[width=200, options=loop]
+
+.Escaped
+\video::test.mp4[]
+
+
+
= Page break

+
+
== Rendered as page break

+
+<<<
+
+
+
== Not rendered as page break

+
+.Not a page break as it is indented
+ <<<
+
+.Not a page break as it has trailing non-space characters
+<<< extra characters
+
+.Escaped
+\<<<
+
+
+
= Preprocessor

+
+
== If Defined

+
+:!attr-1:
+ifdef::attr-1[]
+This line is _not_ rendered as the attribute is not defined.
+endif::[]
+
+:attr-1:
+ifdef::attr-1[]
+This line _is_ rendered as the attribute is now defined.
+endif::[]
+
+.Short form avoiding `endif`
+ifdef::attr-1[The attribute `attr-1` is defined]
+
+
+
== If Not Defined

+
+:!attr-1:
+ifndef::some-attribute[]
+This line _is_ rendered as it is inside a 'if-not-defined' statement and `some-attribute` is not defined.
+endif::some-attribute[]
+
+.Short form avoiding `endif`
+ifndef::some-attribute[The attribute `attr-1` is _not_ defined]
+
+
+
== Any (or)

+
+:!attr-1:
+:!attr-2:
+:attr-3:
+ifdef::attr-1,attr-2,attr-3[]
+This line is rendered as at least one of the attributes is defined.
+endif::[]
+
+:!attr-1:
+:!attr-2:
+:!attr-3:
+ifdef::attr-1,attr-2,attr-3[]
+This line is not rendered as none of the attributes is defined.
+endif::[]
+
+
+
== None (nor)

+
+:!attr-1:
+:!attr-2:
+:!attr-3:
+ifndef::attr-1,attr-2,attr-3[]
+This line is rendered as none of the attributes is defined.
+endif::[]
+
+:!attr-1:
+:!attr-2:
+:attr-3:
+ifndef::attr-1,attr-2,attr-3[]
+This line is not rendered as at least one of the attributes is defined.
+endif::[]
+
+
+
== All (and)

+
+:attr-1:
+:attr-2:
+:attr-3:
+ifdef::attr-1+attr-2+attr-3[]
+This line is rendered as all the attributes are defined.
+endif::[]
+
+:attr-1:
+:attr-2:
+:!attr-3:
+ifndef::attr-1+attr-2+attr-3[]
+This line is not rendered as at least one of the attributes is not defined.
+endif::[]
+
+
+
== Not All (nand)

+
+:attr-1:
+:attr-2:
+:!attr-3:
+ifndef::attr-1+attr-2+attr-3[]
+This line is rendered as at least one of the attributes is defined.
+endif::[]
+
+:attr-1:
+:attr-2:
+:attr-3:
+ifndef::attr-1+attr-2+attr-3[]
+This line is not rendered as all the attributes are not defined.
+endif::[]
+
+
+
== If Eval

+
+:two: 2
+ifeval::[{two} > 1]
+This line is rendered as the expression evaluates to true.
+endif::[]
+
+:not-true: false
+ifeval::[{not-true} == true]
+This line is not rendered as the expression evaluates to false.
+endif::[]
+
+
+
== Escaped

+
+:!attr-1:
+\ifdef::attr-1[]
+This line is rendered as the `ifdef`-statement is escaped.
+\endif::[]
+
+:!attr-1:
+\ifndef::some-attribute[Only if the attribute is not defined]
+This line is rendered as the `ifndef`-statement is escaped.
+\endif::some-attribute[]
+
+:not-true: false
+\ifeval::[{not-true} == true]
+This line is rendered as the `ifeval`-statement is escaped.
+\endif::[]
+
+
+
= Quote and Verse

+
+
== Quote

+
+.Contiguous block / paragraph
+[quote, attribution, citation title and information]
+[[quote-block-id]]
+Inside the *contiguous block quote*.
+Last line of the quote block.
+
+This line is not part of the contiguous block quote anymore.
+
+.Delimited with block name
+[quote, attribution, citation title and information]
+[[quote-block-id]]
+____
+Inside the *delimited block quote*.
+
+May contain emtpy lines.
+____
+
+.Delimited without block name
+[[quote-block-id]]
+____
+Inside the *delimited block quote*.
+
+May contain emtpy lines.
+____
+
+.Using an open block
+[quote]
+[[quote-block-id]]
+--
+Inside the *open block quote*.
+--
+
+.Nested block quote
+[quote, outer attribution, outer citation title and information]
+[[quote-block-id]]
+____
+First line of outer quote.
+[quote, inner attribution, inner citation title and information]
+[[quote-block-id]]
+______
+Inside the inner quote.
+______
+Last line of outer quote.
+____
+
+// Currently no specific highlighting supported.
+.Quoted paragraph
+"Inside the *quoted paragraph*.
+As being a paragraph, no empty lines are supported."
+-- attribution, citation title and information
+
+
+.Air quote
+[,attribution, citation title and information]
+""
+Inside the *air quote*.
+
+Supports empty lines.
+""
+
+// Currently no specific highlighting supported.
+.Markdown style
+> Inside the *markdown quote*.
+>
+> May contain emtpy lines.
+> -- attribution, citation title and information
+
+// Currently no specific highlighting supported.
+.Nested markdown style
+> Start of outer quote.
+>
+> > Some inner quote.
+>
+> * can use AsciiDoc ...
+> * inside markdown block
+>
+> > Another inner quote.
+>
+> End of outer quote.
+
+
+
== Verse

+
+.Contiguous block / paragraph
+[verse, attribution, citation title and information]
+[[verse-block-id]]
+Inside the *contiguous block verse*.
+Second line of the verse block.
+
+This line is not part of the contiguous verse block anymore.
+
+.Delimited block with name
+[verse, attribution, citation title and information]
+[[verse-block-id]]
+____
+Inside the *delimited block verse*.
+
+Supports empty lines.
+____
+
+.Delimited block without name
+This would be rendered as a quote block as the same delimiters are used.
+
+.Using an open block
+[verse, attribution, citation title and information]
+[[verse-block-id]]
+--
+Inside the *open block verse*.
+--
+
+
+
= Replacement

+
+TIP: See also the https://asciidoctor.org/docs/user-manual/#replacements[corresponding section] in the Asciidoctor manual.
+
+
+
== Textual symbol replacements

+
+|===
+|Name |Syntax |Escaped
+
+|copyright |(C) |\(C)
+|registered |(R) |\(R)
+|trademark |(TM) |\(TM)
+
+|apostrophe |KDE's |KDE\'s
+|ellipses |... |\... footnote:[Escaping has no effect]
+|m dash |-- |\-- footnote:[Escaping yields another different dash]
+
+|left single arrow |<- |\<-
+|right single arrow |-> |\->
+|left double arrow |<= |\<=
+|right double arrow |=> |\=>
+|===
+
+
+
=== Not replaced

+
+// Single apostrophe must be surrounded by alphabetic characters.
+* a'
+* 'a
+* .'.
+* a'.
+* .'a
+
+
+
== Numerical Character Reference

+
+
=== Decimal

+
+§
+
+##before##§##after##
+
+§
+
+
+
=== Hexadecimal

+
+§
+
+##before##§##after##
+
+§
+
+
+
=== Escaped

+
+
+
+
+
+
+
+
== HTML/XML Character Entity References

+
+See e.g. https://en.wikipedia.org/wiki/List_of_XML_and_HTML_character_entity_references[Wikipedia].
+
+IMPORTANT: Highlighting of HTML/XML character entity references is _not_ supported.
+There are just too many of them.
+
+// some examples
+====
+
+
+====
+
+
+
= Section L0

+
+[abstract]
+
== Abstract

+
+This document is used for testing various aspects of syntax highlighting regarding sections.
+
+:title-attribute: with attribute
+
+
== Section L1

+
+
=== Section L2

+
+
==== Section L3

+
+
===== Section L4

+
+
====== Section L5

+
+======= This is not a new section
+
+The level would be too deep.
+Only sections up to level 5 (having 6 leading `=`) are supported.
+
+
+
#### Section L3

+
+Using Markdown section syntax works too.
+
+=#=# This is not a section.
+Use either `=` or `#`, but not mixed.
+
+
+
=====
[[id-1]]
[[id-2]]
Section L4

+
+This section has leading additional achors.
+
+
+
==== Section L3
[[id-1]][[id-2]]
+
+This section has trailing additional anchors.
+
+
====
[[id-1]][[id-2]]
Section L3
[[id-3]][[id-4]]
+
+This section has both leading and trailing additional anchors.
+
+
==== Section L3
{title-attribute}
in Title

+
+.Title {title-attribute}
+This section has an attribute in its title.
+
+[discrete]
+
== Discrete Section

+
+This section will not be shown in the table of contents.
+
+////
+== Section with _emphasized_ text
+
+=== Section with escaped \_emphasized_ text
+////
+
+
+
== Section with
#marked#
text

+
+
=== Section with escaped \
#
marked# text

+
+
+
== Section with
`monospaced`
text

+
+
=== Section with escaped \
`
monospaced` text

+
+////
+== Section with *strong* text
+
+=== Section with escaped \*strong* text
+////
+
+
= Another Section at Level 0

+
+
+
= Table

+
+
== Default Separator

+
+.PSV
+// some comment
+[[table-1]]
+[.some-role]
+[#table-shorthand]
+// some comment
+|===
+// some comment
+| header col 1 | header col 2 | header col 3
+// some comment
+
+// with escaped cell separator
+| row 1 \| col 1 | row 1 col 2 | row 1 col 3
+// no spaces needed around `|`
+| *row* 2 col 1|row 2 col 2|row 2 col 3
+
+|row 3 col 1
+// using attribute
+| row 3 col 2 {vbar}
+|ro3 3 col 3
+
+| row 4 col 1 a|some AsciiDoc in col 2 row 4
+
+* item 1
+* item 2
+|row 4 col 3
+
+2*| row 5 has same contents in first 2 columns
+|row 5 col 3
+
+|row 6 col 1 2+| span row 6 in col 2 and 3
+
+.2+|span col 1 in row 6 and 7|row 6 col 2|row 6 col 3
+|row 7 col 2|row 7 col 3
+
+2.2+^.^|span col 1 and 2 in row 8 and 9|row 8 col 3
+|row 9 col 3
+
+e|row 10 col 1 is emphasized (italic)
+s|row 10 col 2 is strong (bold)
+m|row 10 col 3 is monospaced
+|===
+
+
+
== Custom Separator

+
+IMPORTANT: Highlighting of tables with custom separator is not supported.
+All `|` inside the table will be falsly highlighted.
+
+[separator=!]
+|===
+// the `|` in the line below should not be highlighted.
+!row 1 | col 1 !row 1 col 2
+s!row 2 col 1 !row 2 col 2
+|===
+
+[separator=a]
+|===
+arow 1 col 1 arow 1 col 2
+sarow 2 col 1 arow 2 col 2
+|===
+
+
+
== Delimiter-Separated Values

+
+IMPORTANT: Highlighting for tables with delimiter-separated values is not supported.
+All `|` inside the table will be falsly highlighted.
+
+[format=csv]
+|===
+Col 1 ,Col 2 ,Col 3
+
+// the `|` in the line below should not be highlighted.
+row 1 | col 1 ,row 1 col 2 ,row 1 col 3
+row 2 col 2,row 2 col 2,row 2 col 3
+
+row 3 col 3 , "row ""3"", col 2" , row 3 col 3
+|===
+
+
+
=== Shorthand Notation for Data Tables

+
+.CSV
+,===
+Col 1 ,Col 2 ,Col 3
+
+row 1 col 1 ,row 1 col 2 ,row 1 col 3
+row 2 col 2,row 2 col 2,row 2 col 3
+
+row 3 col 3 , "row ""3"", col 2" , row 3 col 3
+,===
+
+.DSV
+:===
+Col 1 :Col 2 :Col 3
+
+row 1 col 1 :row 1 col 2 :row 1 col 3
+row 2 col 2:row 2 col 2:row 2 col 3
+row 3 col 3 : row 3 col 2 : row 3 col 3
+:===
+
+
diff --git a/data/syntax/asciidoc.xml b/data/syntax/asciidoc.xml new file mode 100644 index 0000000..e8b9941 --- /dev/null +++ b/data/syntax/asciidoc.xml @@ -0,0 +1,488 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +]> + + + + anchor + btn + footnote + footnoteref + icon + image + indexterm + indexterm2 + kbd + menu + pass + toc + xref + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +