121 lines
3.7 KiB
Markdown
121 lines
3.7 KiB
Markdown
|
---
|
||
|
title: AsciiDoc Parsing
|
||
|
...
|
||
|
|
||
|
# Document Structure
|
||
|
|
||
|
A *document* is a series of *block elements*.
|
||
|
|
||
|
The first element is optionally a *document header*.
|
||
|
|
||
|
The next element is optionally a *preamble*.
|
||
|
|
||
|
* Document
|
||
|
* Header (optional)
|
||
|
Must be separated from the remainder of the document by one or more
|
||
|
blank lines and cannot contain blank lines.
|
||
|
Can include comments.
|
||
|
Can include attribute entries, typically *doctype*, *lang*, *encoding*,
|
||
|
*icons*, *data-uri*, *toc*, *numbered*
|
||
|
Command-line attributes override header attributes.
|
||
|
* Title
|
||
|
* Info (optional)
|
||
|
* AuthorInfo
|
||
|
Format: firstname[ [middlename ]lastname][ <email>]
|
||
|
Multi-word names should be separated by underscores,
|
||
|
e.g. van_Gogh.
|
||
|
If the format isn't matched, the entire line becomes a
|
||
|
FirstName.
|
||
|
* FirstName
|
||
|
* OtherNames (optional)
|
||
|
* MiddleName (optional)
|
||
|
* LastName
|
||
|
* EmailAddress (optional)
|
||
|
* RevisionInfo (optional)
|
||
|
* Either
|
||
|
* RevisionNumber (optional)
|
||
|
* RevisionDate
|
||
|
* RevisionRemark (optional)
|
||
|
* Or
|
||
|
* RCS/CVS/SVN $Id$ marker.
|
||
|
The *revnumber*, *revdata*, and *author* attributes are
|
||
|
extracted and set and displayed in the header.
|
||
|
The header author line may be omitted.
|
||
|
|
||
|
* Preamble (optional)
|
||
|
* SectionBody
|
||
|
* Section (0 or more)
|
||
|
Up to 4 section levels (1-4) in addition to the document title (level 0)
|
||
|
Has attributes *level* and *sectnum* implcitly defined
|
||
|
* Title
|
||
|
* SectionBody (optional)
|
||
|
* One of (repeated 1 or more times)
|
||
|
* Either
|
||
|
* BlockTitle (optional)
|
||
|
Format: .<title>
|
||
|
* Block
|
||
|
* Or
|
||
|
* BlockMacro
|
||
|
* Section (0 or more)
|
||
|
|
||
|
* Block
|
||
|
Floating titles probably belong in here somewhere.
|
||
|
* One of
|
||
|
* Paragraph
|
||
|
* DelimitedBlock
|
||
|
* List
|
||
|
* One of
|
||
|
* BulletedList
|
||
|
* ListItem (1 or more)
|
||
|
* NumberedList
|
||
|
* ListItem (1 or more)
|
||
|
* CalloutList
|
||
|
* ListItem (1 or more)
|
||
|
* LabeledList
|
||
|
* ListEntry (1 or more)
|
||
|
* ListLabel
|
||
|
* ListTerm (1 or more)
|
||
|
* ListItem
|
||
|
* ItemText
|
||
|
* One of (repeated 0 or more times)
|
||
|
* List
|
||
|
* ListParagraph
|
||
|
A paragraph with *listelement* option set
|
||
|
* ListContinuation
|
||
|
* Table
|
||
|
* Or (these can appear almost anywhere)
|
||
|
* BlockId
|
||
|
Applies to the following *Title*, *Paragraph*, *List*,
|
||
|
*DelimitedBlock*, *Table*, or *BlockMacro*
|
||
|
Format: [[<id>]]
|
||
|
* AttributeEntry
|
||
|
* AttributeList
|
||
|
Applies to the following *Block*
|
||
|
Most blocks support *id*, *role*, and *reftext* attributes
|
||
|
Format: [<attr>(, <attr>)*]
|
||
|
|
||
|
Notes:
|
||
|
* Block elements are separated by line boundaries
|
||
|
* *Header*, *Title*, *Paragraph*, and *ItemText* cannot contain blank lines.
|
||
|
|
||
|
|
||
|
```.haskell
|
||
|
data Document = Doc
|
||
|
{ _docAttrs :: Attributes
|
||
|
, _header :: Maybe DocHeader
|
||
|
, _preamble :: Maybe SectionBody
|
||
|
, _sections :: Seq Section
|
||
|
}
|
||
|
|
||
|
|
||
|
data Section = Sec
|
||
|
{ _secAttrs :: Attributes
|
||
|
, _secTitle :: Text
|
||
|
, _secBody :: Maybe SectionBody
|
||
|
, _secChildren :: Seq Section
|
||
|
}
|
||
|
|
||
|
type SectionBody = Seq Block
|
||
|
|
||
|
```
|