diff options
| author | Phil Schaf | 2014-09-23 17:54:42 +0200 |
|---|---|---|
| committer | Phil Schaf | 2014-09-23 17:54:42 +0200 |
| commit | 8c48866b957fde3228323d032d675f03ac312b0e (patch) | |
| tree | e16450057d2db186aea5e49643e11b268d042586 /src/document_tree.rs | |
| download | rust-rst-8c48866b957fde3228323d032d675f03ac312b0e.tar.bz2 | |
initial commit
Diffstat (limited to 'src/document_tree.rs')
| -rw-r--r-- | src/document_tree.rs | 237 |
1 files changed, 237 insertions, 0 deletions
diff --git a/src/document_tree.rs b/src/document_tree.rs new file mode 100644 index 0000000..5a13a19 --- /dev/null +++ b/src/document_tree.rs @@ -0,0 +1,237 @@ +///http://docutils.sourceforge.net/docs/ref/doctree.html +///serves as AST + +#![feature(struct_inherit)] + +//----------\\ +//Categories\\ +//----------\\ + +trait IElement; //TODO: needed? + +///A document’s direct children +trait SubDocument: IElement; +///body elements, topics, sidebars, transitions +trait SubStructure: SubDocument; +trait SubSection: IElement; +trait SubTopic: IElement; +trait SubSidebar: IElement; +trait SubDLItem: IElement; +trait SubField: IElement; +trait SubOption: IElement; +trait SubLineBlock: IElement; + +//-----------------\\ +//Element hierarchy\\ +//-----------------\\ + +virtual struct Element: IElement { + ids: Vec<String>, + names: Vec<String>, + //left out dupnames + source, + classes, +}; + + +//TODO: restructure so that elements with and without children derive from common structs + +virtual struct BodyOrStructuralElement: Element; + +virtual struct StructuralElement: BodyOrStructuralElement; +virtual struct StructuralSubElement: SubDocument; + +virtual struct BodyElement: BodyOrStructuralElement, SubStructure, SubSection, SubTopic, SubSidebar; +virtual struct SimpleBodyElement: BodyElement; +virtual struct CompoundBodyElement: BodyElement; + + +virtual struct BodySubElement: Element; + + +virtual struct BibliographicElement: Element; + + +virtual struct DecorationElement: Element; + + +virtual struct TextOrInlineElement: Element; +virtual struct InlineElement: TextOrInlineElement; + + +//--------------\\ +//Content Models\\ +//--------------\\ + +trait HasChildren<C: Element> { + fn add_child(C), +} + +trait TextModel: HasChildren<TextOrInlineElement>; +trait StructureModel: HasChildren<SubStructure>; +trait DocumentModel: HasChildren<SubDocument>; +trait InfoModel: HasChildren<BibliographicElement>; +trait AuthorsModel: HasChildren<AuthorInfo>; +trait DecorationModel: HasChildren<DecorationElement>; +trait BodyModel: HasChildren<BodyElement>; +trait SectionModel: HasChildren<SubSection>; +trait TopicModel: HasChildren<SubTopic>; +trait SidebarModel: HasChildren<SubSidebar>; + +trait ListModel: HasChildren<ListItem>; + +trait DLModel: HasChildren<DefinitionListItem>; +trait DLItemModel: HasChildren<SubDLItem>; + +trait FieldListModel: HasChildren<Field>; +trait FieldModel: HasChildren<SubField>; + +trait OptionListModel: HasChildren<OptionListItem>; +trait OptionGroupModel: HasChildren<Option_>; +trait OptionModel: HasChildren<SubOption>; + +//--------\\ +//Elements\\ +//--------\\ + +struct Document: StructuralElement, DocumentModel; +struct Section: StructuralElement, SectionModel; +struct Topic: StructuralElement, TopicModel, SubStructure, SubSection, SubSidebar; +struct Sidebar: StructuralElement, SidebarModel, SubStructure, SubSection; + + +struct Title: StructuralSubElement, TextModel, SubSidebar, SubSection, SubTopic; +struct Subtitle: StructuralSubElement, TextModel, SubSidebar; +struct Decoration: StructuralSubElement, DecorationModel; +struct Docinfo: StructuralSubElement, InfoModel; +struct Transition: StructuralSubElement, SubStructure, SubSection; + + +struct Author: BibliographicElement, TextModel, AuthorInfo; +struct Authors: BibliographicElement, AuthorsModel; +struct Organization: BibliographicElement, TextModel, AuthorInfo; +struct Address: BibliographicElement, TextModel, AuthorInfo { space: FixedSpace }; +struct Contact: BibliographicElement, TextModel, AuthorInfo; +struct Version: BibliographicElement, TextModel; +struct Revision: BibliographicElement, TextModel; +struct Status: BibliographicElement, TextModel; +struct Date: BibliographicElement, TextModel; +struct Copyright: BibliographicElement, TextModel; +struct Field: BibliographicElement, FieldModel; + + +struct Header: DecorationElement, BodyModel; +struct Footer: DecorationElement, BodyModel; + + +struct Paragraph: SimpleBodyElement, TextModel; +struct LiteralBlock: SimpleBodyElement, TextModel { space: FixedSpace }; +struct Comment: SimpleBodyElement { space: FixedSpace }; +struct DoctestBlock: SimpleBodyElement { space: FixedSpace }; +struct Image: SimpleBodyElement; +struct MathBlock: SimpleBodyElement; +struct Pending: SimpleBodyElement; +struct Raw: SimpleBodyElement { space: FixedSpace }; +struct Rubric: SimpleBodyElement; +struct SubstitutionDefinition: SimpleBodyElement; +struct Target: SimpleBodyElement; + + +struct Compound: CompoundBodyElement, BodyModel; +struct Container: CompoundBodyElement, BodyModel; + +struct BulletList: CompoundBodyElement, ListModel { bullet: String }; +struct EnumeratedList: CompoundBodyElement, ListModel { enumtype: EnumeratedListType, prefix: String, suffix: String } +struct DefinitionList: CompoundBodyElement, DLModel; +struct FieldList: CompoundBodyElement, FieldListModel; +struct OptionList: CompoundBodyElement, OptionListModel; + +struct LineBlock: CompoundBodyElement, LineBlockModel, SubLineBlock; +struct Admonition: CompoundBodyElement; +struct Attention: CompoundBodyElement; +struct BlockQuote: CompoundBodyElement; +struct Caution: CompoundBodyElement; +struct Citation: CompoundBodyElement; +struct Danger: CompoundBodyElement; +struct Error: CompoundBodyElement; +struct Figure: CompoundBodyElement; +struct Footnote: CompoundBodyElement; +struct Hint: CompoundBodyElement; +struct Important: CompoundBodyElement; +struct Note: CompoundBodyElement; +struct SystemMessage: CompoundBodyElement; +struct Table: CompoundBodyElement; +struct Tip: CompoundBodyElement; +struct Warning: CompoundBodyElement; + + +struct ListItem: BodySubElement, BodyModel; + +struct DefinitionListItem: BodySubElement, DLItemModel; +struct Term: BodySubElement, TextModel, SubDLItem; +struct Classifier: BodySubElement, TextModel, SubDLItem; +struct Definition: BodySubElement, BodyModel, SubDLItem; + +struct FieldName: BodySubElement, TextModel, SubField; +struct FieldBody: BodySubElement, BodyModel, SubField; + +struct OptionList: BodySubElement, OptionListModel; +struct OptionListItem: BodySubElement, OptionListItemModel; +struct OptionGroup: BodySubElement, OptionGroupModel; +struct Description: BodySubElement, BodyModel; +struct Option_: BodySubElement, OptionModel; +struct OptionString: BodySubElement, TextModel, SubOption; +struct OptionArgument: BodySubElement, TextModel, SubOption { delimiter: String }; + +struct Line: BodySubElement, TextModel, SubLineBlock; + + +struct Abbreviation: InlineElement; +struct Acronym: InlineElement; +struct CitationReference: InlineElement; +struct Emphasis: InlineElement; +struct FootnoteReference: InlineElement; +struct Generated: InlineElement; +struct Image: InlineElement; +struct Inline: InlineElement; +struct Literal: InlineElement; +struct Math: InlineElement; +struct Problematic: InlineElement; +struct Reference: InlineElement; +struct Strong: InlineElement; +struct Subscript: InlineElement; +struct SubstitutionReference: InlineElement; +struct Superscript: InlineElement; +struct Target: InlineElement; +struct TitleReference: InlineElement; +struct Raw: InlineElement; + +struct TextElement: TextOrInlineElement; + + +//------\\ +//Others\\ +//------\\ + + +enum EnumeratedListType { + Arabic, + LowerAlpha, + UpperAlpha, + LowerRoman, + UpperRoman, +} + +enum FixedSpace { Default, Preserve } + + +//----\\ +//impl\\ +//----\\ + +impl Field { + get_name(&self) { + let name_elem = self.children[0]; + assert!(name_elem.t) + } +}
\ No newline at end of file |
