--- 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][ ] 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: . * 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 ```