mirror of
https://github.com/jgm/pandoc.git
synced 2026-08-28 17:20:47 +08:00
8651ec3c28
New exported module Text.Pandoc.Readers.AsciiDoc, exporting readAsciiDoc [API change]. The bulk of parsing is handled by the asciidoc library. Closes #1456.
909 lines
12 KiB
Plaintext
909 lines
12 KiB
Plaintext
// Some comment here.
|
|
= AsciiDoc reader test
|
|
John MacFarlane <jgm@berkeley.edu>; John Doe <doe@example.com>
|
|
v1.0, 2025-11-24
|
|
:custom: Foo bar \
|
|
baz
|
|
:flag:
|
|
:stem: latexmath
|
|
|
|
[#firsty]
|
|
== Inline markup
|
|
|
|
=== Characters and escapes
|
|
|
|
Dog's has a curved apostrophe, but dog\'s does not.
|
|
|
|
An escaped symbol: \*star\*.
|
|
|
|
Character references: ä ⋠
|
|
|
|
=== Line breaks
|
|
|
|
This is a hard +
|
|
break.
|
|
|
|
Or set it for a whole paragraph
|
|
|
|
[%hardbreaks]
|
|
These are
|
|
all
|
|
hard
|
|
breaks.
|
|
|
|
=== Autolinks
|
|
|
|
http://example.com/foobar?a=333&b=no%20body, me@example.com
|
|
|
|
<http://example.com/foobar?a=333&b=no%20body>, <me@example.com>
|
|
|
|
=== Cross-reference
|
|
|
|
See <<firsty>>
|
|
|
|
See <<firsty,My great section on Inline markup>>
|
|
|
|
Go to <<anch,an inline anchor>>
|
|
|
|
=== Anchors
|
|
|
|
An [[anch]]inline anchor.
|
|
|
|
[[[bibanchor]]Doe, John. A Book.
|
|
|
|
=== Inline macros
|
|
|
|
kbd:[F11]
|
|
|
|
kbd:[Ctrl+Shift+F]
|
|
|
|
menu:File[Save]
|
|
|
|
menu:Reader[Markdown > Pandoc]
|
|
|
|
btn:[Cancel]
|
|
|
|
icon:heart[2x,role=red]
|
|
|
|
anchor:tiger
|
|
|
|
pass:[<b>*bold*</b>]
|
|
|
|
link:downloads/report.pdf[Get Report]
|
|
|
|
link:tools.html#editors[]
|
|
|
|
link:file:///home/username[Your files]
|
|
|
|
Tricky cases:
|
|
|
|
link:pass:[My Documents/report.pdf][Get Report]
|
|
|
|
link:My Documents/report.pdf[Get Report]
|
|
|
|
link:My%20Documents/report.pdf[Get Report]
|
|
|
|
link:++https://example.org/now_this__link_works.html++[]
|
|
|
|
mailto:join@discuss.example.org[Subscribe]
|
|
|
|
mailto:join@discuss.example.org["Click, subscribe, and participate!",role=mail]
|
|
|
|
xref:link-macro-attributes[use attributes within the link macro]
|
|
|
|
image::sunset.jpg[Sunset]
|
|
|
|
image::name.png[]
|
|
|
|
image::sunset.jpg[Sunset,300,400]
|
|
|
|
image::sunset.jpg[alt=Sunset,width=300,height=400]
|
|
|
|
[latexmath]
|
|
++++
|
|
e=mc^2
|
|
++++
|
|
|
|
[asciimath]
|
|
++++
|
|
sin n / 3
|
|
++++
|
|
|
|
[stem]
|
|
++++
|
|
e^i
|
|
++++
|
|
|
|
=== Attribute substitutions
|
|
|
|
{custom}
|
|
|
|
{nonexistent}
|
|
|
|
Built in: x{blank}y{empty}z{sp}a{nbsp}b{zwsp}c{apos}d{lsquo}
|
|
|
|
=== Bold and italic
|
|
|
|
Constrained: *this is bold _and italic_*.
|
|
|
|
Unconstrained: wild**content__with italic__stuff**.
|
|
|
|
=== Monospace
|
|
|
|
`simple`
|
|
|
|
`complex *with bold* text and a link:foo.html[]`
|
|
|
|
unconstrained``wwow``okay
|
|
|
|
=== Span and inline attributes
|
|
|
|
[.red]#Bonjour *monsieur*#
|
|
|
|
Un[.red]##constrained##content
|
|
|
|
With #no attribute# it's highlighted.
|
|
|
|
=== Sub and superscript
|
|
|
|
H~2~O
|
|
|
|
H~a{sp}b~O
|
|
|
|
Not subscript: H~a b~O.
|
|
|
|
H^2&O
|
|
|
|
H^a{sp}b^O
|
|
|
|
Not subscript: H^a b^O.
|
|
|
|
=== Passthrough
|
|
|
|
Here the special characters just come through as literal:
|
|
|
|
+<b>*test*</b>+
|
|
|
|
xx++<b>*test*</b>++xx
|
|
|
|
But here they are passed through:
|
|
|
|
xx+++<b>*test*</b>+++xx
|
|
|
|
=== Quoted
|
|
|
|
"`double quoted`"
|
|
|
|
'`single quoted`'
|
|
|
|
=== Footnotes
|
|
|
|
Doublefootnote:[The double hail-and-rainbow level makes my toes tingle.]
|
|
|
|
A bold statement!footnote:disclaimer[Opinions are my own.]
|
|
Another outrageous statement.footnote:disclaimer[]
|
|
|
|
== Block markup
|
|
|
|
=== Sections
|
|
|
|
==== Another level
|
|
|
|
===== Level 5
|
|
|
|
#### Markdown style
|
|
|
|
##### Level 5
|
|
|
|
=== Discrete heading
|
|
|
|
[discrete]
|
|
==== A discrete heading, not a section
|
|
|
|
=== Paragraph
|
|
|
|
This is a paragraph
|
|
whose source fits on two lines.
|
|
|
|
{.This is my title}
|
|
A paragraph with a title.
|
|
|
|
=== Example block
|
|
|
|
.Optional title
|
|
[example]
|
|
This is an example of an example block.
|
|
|
|
.Optional title
|
|
====
|
|
Paragraph *one*.
|
|
|
|
Paragraph *two*.
|
|
====
|
|
|
|
=== Admonition
|
|
|
|
Simple form:
|
|
|
|
WARNING: This is very dangerous.
|
|
Don't do it unless you understand the risks.
|
|
|
|
[IMPORTANT]
|
|
.Title of the admonition
|
|
====
|
|
Remember:
|
|
|
|
. Don't do this.
|
|
. And don't do that.
|
|
====
|
|
|
|
=== Sidebar
|
|
|
|
[sidebar]
|
|
A simple sidebar.
|
|
|
|
.Optional Title *with strong emphasis*
|
|
****
|
|
Here is a sidebar.
|
|
|
|
TIP: It can contain any type of content.
|
|
****
|
|
|
|
=== Literal block
|
|
|
|
Short indented code:
|
|
|
|
$ ls -a
|
|
$ cat /foo/bar/baz \
|
|
/bi/bim/bop
|
|
|
|
[literal]
|
|
This is
|
|
a literal block too.
|
|
|
|
....
|
|
Fenced
|
|
$+ *a* literal
|
|
|
|
****
|
|
not a sidebar
|
|
****
|
|
....
|
|
|
|
=== Listing
|
|
|
|
[source,ruby]
|
|
----
|
|
require 'sinatra'
|
|
|
|
get '/hi' do
|
|
"Hello World!"
|
|
end
|
|
----
|
|
|
|
Implied:
|
|
|
|
[source,ruby]
|
|
----
|
|
require 'sinatra'
|
|
|
|
get '/hi' do
|
|
"Hello World!"
|
|
end
|
|
----
|
|
|
|
[,ruby]
|
|
----
|
|
include::asciidoc-reader-include.rb[]
|
|
----
|
|
|
|
[#hello.haskell]
|
|
----
|
|
putStrLn $ unwords ["Hello", "world"]
|
|
----
|
|
|
|
Line numbering:
|
|
|
|
[%linenums,ruby]
|
|
----
|
|
puts 1
|
|
puts 2
|
|
puts 3
|
|
----
|
|
|
|
----
|
|
This doesn't have a language.
|
|
+="hi"
|
|
----
|
|
|
|
And with a callout list:
|
|
|
|
[source,ruby]
|
|
----
|
|
require 'sinatra' <1>
|
|
|
|
get '/hi' do <2> <3>
|
|
"Hello World!"
|
|
end
|
|
----
|
|
<1> Library import
|
|
<2> URL mapping
|
|
<3> Response block
|
|
|
|
Markdown-style fenced:
|
|
|
|
```ruby
|
|
def foo
|
|
return 5
|
|
end
|
|
```
|
|
|
|
=== Verse
|
|
|
|
[verse,Carl Sandburg, two lines from the poem Fog]
|
|
The fog comes
|
|
on little cat feet.
|
|
|
|
[verse,Carl Sandburg,Fog]
|
|
____
|
|
The fog comes
|
|
on little cat feet.
|
|
It sits looking
|
|
over harbor and city
|
|
on silent haunches
|
|
and then moves on.
|
|
____
|
|
|
|
=== Collapsible
|
|
|
|
Click here for more.
|
|
[%collapsible%open]
|
|
====
|
|
This is collapsible.
|
|
|
|
It can be hidden.
|
|
====
|
|
|
|
.Click me!
|
|
[%collapsible]
|
|
This paragraph is
|
|
also collapsible.
|
|
|
|
=== Quote
|
|
|
|
[quote,Captain James T. Kirk,Star Trek IV: The Voyage Home]
|
|
Everybody remember where we parked.
|
|
|
|
[quote,Monty Python and the Holy Grail]
|
|
____
|
|
Dennis: Come and see the violence inherent in the system. Help! Help! I'm being
|
|
repressed.
|
|
|
|
King Arthur: Bloody peasant!
|
|
|
|
Dennis: Oh, what a giveaway! Did you hear that? Did you hear that, eh? That's what I'm
|
|
on about! Did you see him repressing me? You saw him, Didn't you?
|
|
____
|
|
|
|
[quote.movie#roads,Dr. Emmett Brown]
|
|
____
|
|
Roads? Where we're going, we don't need roads.
|
|
____
|
|
|
|
=== Pass
|
|
|
|
++++
|
|
<p>pass <em>through</em>
|
|
</p>
|
|
++++
|
|
|
|
=== Open block
|
|
|
|
.A title.
|
|
[key="a value"]
|
|
--
|
|
Any content can go here:
|
|
|
|
. one
|
|
. two
|
|
--
|
|
|
|
=== Anchor
|
|
|
|
[[goals]]
|
|
* one
|
|
* two
|
|
|
|
=== Breaks
|
|
|
|
Asciidoc thematic break:
|
|
|
|
'''
|
|
|
|
Markdown style:
|
|
|
|
---
|
|
- - -
|
|
***
|
|
* * *
|
|
|
|
Page breaks:
|
|
|
|
<<<
|
|
|
|
[%always]
|
|
<<<
|
|
|
|
=== List
|
|
|
|
* Edgar Allan Poe
|
|
* Sheri S. Tepper
|
|
* Bill Bryson
|
|
|
|
// titled
|
|
|
|
.Kizmet's Favorite Authors
|
|
* Edgar Allan Poe
|
|
* Sheri S. Tepper
|
|
* Bill Bryson
|
|
|
|
// hyphen
|
|
|
|
- Edgar Allan Poe
|
|
- Sheri S. Tepper
|
|
- Bill Bryson
|
|
|
|
. Nested list
|
|
* West wood maze
|
|
** Maze heart
|
|
*** Reflection pool
|
|
** Secret exit
|
|
* Level 1 list item
|
|
** Level 2 list item
|
|
*** Level 3 list item
|
|
**** Level 4 list item
|
|
***** Level 5 list item
|
|
****** etc.
|
|
* Level 1 list item
|
|
|
|
// attributes
|
|
|
|
[square]
|
|
* one
|
|
* two
|
|
* three
|
|
|
|
// ordered with actual numbers
|
|
|
|
1. Protons
|
|
2. Electrons
|
|
3. Neutrons
|
|
|
|
// ordered with .
|
|
|
|
. Protons
|
|
. Electrons
|
|
. Neutrons
|
|
|
|
Start with 4:
|
|
|
|
4. Step four
|
|
5. Step five
|
|
6. Step six
|
|
|
|
or
|
|
|
|
[start=4]
|
|
. Step four
|
|
. Step five
|
|
. Step six
|
|
|
|
Reversed:
|
|
|
|
[%reversed]
|
|
.Parts of an atom
|
|
. Protons
|
|
. Electrons
|
|
. Neutrons
|
|
|
|
Nested
|
|
|
|
. Step 1
|
|
. Step 2
|
|
.. Step 2a
|
|
.. Step 2b
|
|
. Step 3
|
|
|
|
Mixed nested
|
|
|
|
. Linux
|
|
* Fedora
|
|
* Ubuntu
|
|
* Slackware
|
|
. BSD
|
|
* FreeBSD
|
|
* NetBSD
|
|
|
|
With spacing
|
|
|
|
. Linux
|
|
* Fedora
|
|
* Ubuntu
|
|
* Slackware
|
|
. BSD
|
|
* FreeBSD
|
|
* NetBSD
|
|
|
|
With number styles
|
|
|
|
[lowerroman,start=5]
|
|
. Five
|
|
. Six
|
|
[loweralpha]
|
|
.. a
|
|
.. b
|
|
.. c
|
|
. Seven
|
|
|
|
Checklist
|
|
|
|
* [*] checked
|
|
* [x] also checked
|
|
* [ ] not checked
|
|
* normal list item
|
|
|
|
Separate lists with block attribute
|
|
|
|
* Apples
|
|
* Oranges
|
|
[]
|
|
. Wash
|
|
. Slice
|
|
|
|
Multiline items
|
|
|
|
* Blah blah.
|
|
Blah blah.
|
|
* The document header in AsciiDoc is optional.
|
|
If present, it must start with a document title.
|
|
|
|
* Optional author and revision information lines
|
|
immediately follow the document title.
|
|
|
|
* The document header must be separated from
|
|
the remainder of the document by one or more
|
|
empty lines and it cannot contain empty lines.
|
|
|
|
Complex item
|
|
|
|
* The header in AsciiDoc must start with a document title.
|
|
+
|
|
----
|
|
= Document Title
|
|
----
|
|
+
|
|
Keep in mind that the header is optional.
|
|
* Optional author and revision information lines immediately follow the document
|
|
title.
|
|
+
|
|
----
|
|
= Document Title
|
|
Doc Writer <doc.writer@asciidoc.org>
|
|
v1.0, 2022-01-01
|
|
----
|
|
* Second item
|
|
|
|
Empty principle element:
|
|
|
|
. {empty}
|
|
+
|
|
----
|
|
test
|
|
----
|
|
|
|
=== Table
|
|
|
|
==== Simple with column specs
|
|
|
|
[cols="3,2,3"]
|
|
|===
|
|
|This content is placed in the first cell of column 1
|
|
|This line starts with a vertical bar so this content is placed in a new cell in
|
|
column 2 |When the processor encounters a whitespace followed by a vertical bar it
|
|
ends the previous cell and starts a new cell
|
|
|===
|
|
|
|
==== Repeated column in specs
|
|
|
|
[cols="2*"]
|
|
|===
|
|
>s|This cell's specifier indicates that this cell's content is right-aligned and bold.
|
|
|The cell specifier on this cell hasn't been set explicitly, so the default
|
|
properties are applied.
|
|
|===
|
|
|
|
==== Simple without column specs
|
|
|
|
|===
|
|
|Column 1, header row |Column 2, header row
|
|
|
|
|Cell in column 1, row 2
|
|
|Cell in column 2, row 2
|
|
|
|
|Cell in column 1, row 3
|
|
|Cell in column 2, row 3
|
|
|===
|
|
|
|
==== With caption
|
|
|
|
.My cool table.
|
|
|===
|
|
|Column 1, header row |Column 2, header row
|
|
|
|
|Cell in column 1, row 2
|
|
|Cell in column 2, row 2
|
|
|
|
|Cell in column 1, row 3
|
|
|Cell in column 2, row 3
|
|
|===
|
|
|
|
==== No header
|
|
|
|
By default the first line should turn into the header, but this
|
|
can be disabled:
|
|
|
|
[%noheader]
|
|
|===
|
|
|Cell in column 1, row 1 |Cell in column 2, row 1
|
|
|Cell in column 1, row 2 |Cell in column 2, row 2
|
|
|===
|
|
|
|
And also explicitly enabled:
|
|
|
|
[%header%footer%autowidth,cols=2*~]
|
|
|===
|
|
|Cell A1 |Cell B1
|
|
|Cell A2 |Cell B2
|
|
|Cell A3 |Cell B3
|
|
|===
|
|
|
|
==== Footer
|
|
|
|
[%header%footer,cols="2,2,1"]
|
|
|===
|
|
|Column 1, header row
|
|
|Column 2, header row
|
|
|Column 3, header row
|
|
|Cell in column 1, row 2
|
|
|Cell in column 2, row 2
|
|
|Cell in column 3, row 2
|
|
|Column 1, footer row
|
|
|Column 2, footer row
|
|
|Column 3, footer row
|
|
|===
|
|
|
|
or
|
|
|
|
[options="footer"]
|
|
|===
|
|
|Column 1, header row |Column 2, header row
|
|
|Cell in column 1, row 2
|
|
|Cell in column 2, row 2
|
|
|Cell in column 1, row 3
|
|
|Cell in column 2, row 3
|
|
|Column 1, footer row
|
|
|Column 2, footer row
|
|
|===
|
|
|
|
==== Alignment
|
|
|
|
|===
|
|
|Column Name |Column Name
|
|
2+^|This cell spans two columns, and its content is horizontally centered because the
|
|
cell specifier includes the `+^+` operator.
|
|
2*^|This content is duplicated in two adjacent columns.
|
|
Its content is horizontally centered because the cell specifier
|
|
includes the `+^+` operator.
|
|
|===
|
|
|
|
==== Multiple paragraphs in cells
|
|
|
|
|===
|
|
|
|
|Single paragraph on row 1
|
|
|
|
|First paragraph on row 2
|
|
|
|
Second paragraph on row 2
|
|
|===
|
|
|
|
==== Complex table
|
|
|
|
|===
|
|
|
|
2*>m|This content is duplicated across two columns.
|
|
|
|
It is aligned right horizontally.
|
|
|
|
And it is monospaced.
|
|
|
|
.3+^.>s|This cell spans 3 rows. The content is centered horizontally, aligned to the bottom of the cell, and strong.
|
|
e|This content is emphasized.
|
|
|
|
.^l|This content is aligned to the top of the cell and literal.
|
|
|
|
a|
|
|
[source]
|
|
puts "This is a source block!"
|
|
|
|
|===
|
|
|
|
==== Column styles
|
|
|
|
[cols="m,m"]
|
|
|===
|
|
|monospace | mono
|
|
d|default | mono
|
|
|===
|
|
|
|
==== Block elements in cells
|
|
|
|
|===
|
|
|Normal Style |AsciiDoc Style
|
|
|This cell isn't prefixed with an `a`, so the processor doesn't interpret the
|
|
following lines as an AsciiDoc list.
|
|
|
|
* List item 1
|
|
* List item 2
|
|
* List item 3
|
|
|
|
a|This cell is prefixed with an `a`, so the processor interprets the following lines
|
|
as an AsciiDoc list.
|
|
|
|
* List item 1
|
|
* List item 2
|
|
* List item 3
|
|
|
|
|This cell isn't prefixed with an `a`, so the processor doesn't interpret the listing
|
|
block delimiters or the `source` style.
|
|
|
|
[source,python]
|
|
----
|
|
import os
|
|
print ("%s" %(os.uname()))
|
|
----
|
|
|
|
a|This cell is prefixed with an `a`, so the listing block is processed and rendered
|
|
according to the `source` style rules.
|
|
|
|
[source,python]
|
|
----
|
|
import os
|
|
print "%s" %(os.uname())
|
|
----
|
|
|===
|
|
|
|
==== Col and rowspan
|
|
|
|
|===
|
|
|Column 1, header row |Column 2, header row | Column 3, header row
|
|
2.2+|This cell spans 2 cols and 2 rows
|
|
|Cell in column 3, row 2
|
|
|Cell in column 3, row 3
|
|
3+|Cell in column 1-3, row 4
|
|
|===
|
|
|
|
==== CSV table
|
|
|
|
[%header,format=csv]
|
|
|===
|
|
Artist,Track,Genre
|
|
Baauer,Harlem Shake,Hip Hop
|
|
The Lumineers,Ho Hey,Folk Rock
|
|
|===
|
|
|
|
or
|
|
|
|
,===
|
|
Artist,Track,Genre
|
|
Baauer,Harlem Shake,Hip Hop
|
|
,===
|
|
|
|
==== DSV table
|
|
|
|
[format=dsv,separator=;]
|
|
|===
|
|
a;b;c
|
|
d;e;f
|
|
|===
|
|
|
|
or
|
|
|
|
:===
|
|
Artist:Track:Genre
|
|
Robyn:Indestructible:Dance
|
|
:===
|
|
|
|
=== Definition list
|
|
|
|
CPU:: The brain of the computer.
|
|
Hard drive:: Permanent storage for operating system and/or user files.
|
|
|
|
Mixed
|
|
|
|
Dairy::
|
|
* Milk
|
|
* Eggs
|
|
Bakery::
|
|
* Bread
|
|
Produce::
|
|
* Bananas
|
|
|
|
With spaces
|
|
|
|
Dairy::
|
|
|
|
* Milk
|
|
* Eggs
|
|
|
|
Bakery::
|
|
|
|
* Bread
|
|
|
|
Produce::
|
|
|
|
* Bananas
|
|
|
|
Nested
|
|
|
|
Operating Systems::
|
|
Linux:::
|
|
. Fedora
|
|
* Desktop
|
|
. Ubuntu
|
|
* Desktop
|
|
* Server
|
|
BSD:::
|
|
. FreeBSD
|
|
. NetBSD
|
|
Cloud Providers::
|
|
PaaS:::
|
|
. OpenShift
|
|
. CloudBees
|
|
IaaS:::
|
|
. Amazon EC2
|
|
|
|
This just affects the output:
|
|
|
|
[horizontal,labelwidth=25,itemwidth=75]
|
|
CPU:: The brain of the computer.
|
|
RAM:: Temporarily stores information the CPU uses during operation.
|
|
|
|
Q&A list
|
|
|
|
[qanda]
|
|
What is the answer?::
|
|
This is the answer.
|
|
Are cameras allowed?::
|
|
Are backpacks allowed?::
|
|
No.
|
|
|
|
Ordered description list (with numbers)
|
|
|
|
[ordered]
|
|
&:: ampersand
|
|
>:: greater than
|
|
|
|
=== Block macros
|
|
|
|
image::sunset.jpg[Sunset,300,200]
|
|
|
|
video::mymovie.mp4[]
|
|
|
|
audio::mysong.mp3[]
|
|
|
|
toc::[]
|
|
|
|
include::asciidoc-reader-include.adoc[]
|
|
|