diff options
| author | Phil Schaf | 2015-11-14 20:13:45 +0100 | 
|---|---|---|
| committer | Phil Schaf | 2015-11-14 20:13:45 +0100 | 
| commit | 5fdb21df228c78061cce9ee910fa87da0fd99d46 (patch) | |
| tree | 707d234259202381be0c784e8f1efea8eb5081ec /src/document_tree/elements.rs | |
| parent | 9c2f818b7e7139ed7a5da573d1cc104defa7579f (diff) | |
| download | rust-rst-5fdb21df228c78061cce9ee910fa87da0fd99d46.tar.bz2 | |
redesign
Diffstat (limited to 'src/document_tree/elements.rs')
| -rw-r--r-- | src/document_tree/elements.rs | 207 | 
1 files changed, 207 insertions, 0 deletions
| diff --git a/src/document_tree/elements.rs b/src/document_tree/elements.rs new file mode 100644 index 0000000..e6709b4 --- /dev/null +++ b/src/document_tree/elements.rs @@ -0,0 +1,207 @@ +use url::Url; + +use super::extra_attributes::{self,ExtraAttributes}; +use super::element_categories::*; + + +//-----------------\\ +//Element hierarchy\\ +//-----------------\\ + +pub trait Element { +	fn ids(&self)     -> &Vec<String>; +	fn names(&self)   -> &Vec<String>; +	fn source(&self)  -> &Option<Url>; +	fn classes(&self) -> &Vec<String>; +} + +#[derive(Default,Debug)] +pub struct CommonAttributes { +	ids: Vec<String>, +	names: Vec<String>, +	//left out dupnames +	source: Option<Url>, +	classes: Vec<String>, +} + +//----\\ +//impl\\ +//----\\ + +macro_rules! impl_element(($name:ident) => { +	impl Element for $name { +		fn ids(&self)     -> &Vec<String> { &self.common.ids } +		fn names(&self)   -> &Vec<String> { &self.common.names } +		fn source(&self)  -> &Option<Url> { &self.common.source } +		fn classes(&self) -> &Vec<String> { &self.common.classes } +	} +}); + +macro_rules! impl_children(($name:ident, $childtype:ident) => { +	impl HasChildren<$childtype> for $name { +		fn add_child<R: Into<$childtype>>(&mut self, child: R) { +			self.children.push(Box::new(child.into())); +		} +	} +}); + +macro_rules! impl_extra(($name:ident) => { +	impl ExtraAttributes<extra_attributes::$name> for $name { +		fn extra(&self) -> &extra_attributes::$name { &self.extra } +	} +}); + +macro_rules! impl_elem( +	($name:ident) => { +		#[derive(Default,Debug)] +		pub struct $name { common: CommonAttributes } +		impl_element!($name); +	}; +	($name:ident; +) => { +		#[derive(Default,Debug)] +		pub struct $name { common: CommonAttributes, extra: extra_attributes::$name } +		impl_element!($name); impl_extra!($name); +	}; +	($name:ident; *) => { //same as above with no default +		#[derive(Debug)] +		pub struct $name { common: CommonAttributes, extra: extra_attributes::$name } +		impl_element!($name); impl_extra!($name); +	}; +	($name:ident, $childtype:ident) => { +		#[derive(Default,Debug)] +		pub struct $name { common: CommonAttributes, children: Vec<Box<$childtype>> } +		impl_element!($name); impl_children!($name, $childtype); +	}; +	($name:ident, $childtype:ident; +) => { +		#[derive(Default,Debug)] +		pub struct $name { common: CommonAttributes, extra: extra_attributes::$name, children: Vec<Box<$childtype>> } +		impl_element!($name); impl_extra!($name); impl_children!($name, $childtype); +	}; +); + +macro_rules! impl_elems(( $( ($($args:tt)*) )* ) => { +	$( impl_elem!($($args)*); )* +}); + +impl_elems!( +	//structual elements +	(Section, SubSection) +	(Topic,   SubTopic) +	(Sidebar, SubSidebar) +	 +	//structural subelements +	(Title,      TextOrInlineElement) +	(Subtitle,   TextOrInlineElement) +	(Decoration, DecorationElement) +	(Docinfo,    BibliographicElement) +	(Transition) +	 +	//bibliographic elements +	(Author,       TextOrInlineElement) +	(Authors,      AuthorInfo) +	(Organization, TextOrInlineElement) +	(Address,      TextOrInlineElement; +) +	(Contact,      TextOrInlineElement) +	(Version,      TextOrInlineElement) +	(Revision,     TextOrInlineElement) +	(Status,       TextOrInlineElement) +	(Date,         TextOrInlineElement) +	(Copyright,    TextOrInlineElement) +	(Field,        SubField) +	 +	//decoration elements +	(Header, BodyElement) +	(Footer, BodyElement) +	 +	//simple body elements +	(Paragraph,              TextOrInlineElement) +	(LiteralBlock,           TextOrInlineElement; +) +	(DoctestBlock,           TextOrInlineElement; +) +	(MathBlock) +	(Rubric,                 TextOrInlineElement) +	(SubstitutionDefinition, TextOrInlineElement; +) +	(Comment,                TextOrInlineElement; +) +	(Pending) +	(Target; +) +	(Raw; +) +	(Image; *) +	 +	//compound body elements +	(Compound,  BodyElement) +	(Container, BodyElement) +	 +	(BulletList,     ListItem; +) +	(EnumeratedList, ListItem; +) +	(DefinitionList, DefinitionListItem) +	(FieldList,      Field) +	(OptionList,     OptionListItem) +	 +	(LineBlock,     SubLineBlock) +	(BlockQuote,    SubBlockQuote) +	(Admonition,    SubTopic) +	(Attention,     BodyElement) +	(Hint,          BodyElement) +	(Note,          BodyElement) +	(Caution,       BodyElement) +	(Danger,        BodyElement) +	(Error,         BodyElement) +	(Important,     BodyElement) +	(Tip,           BodyElement) +	(Warning,       BodyElement) +	(Footnote,      SubFootnote; +) +	(Citation,      SubFootnote; +) +	(SystemMessage, BodyElement; +) +	(Figure,        SubFigure; +) +	(Table; +) //TODO +	 +	//body sub elements +	(ListItem, BodyElement) +	 +	(DefinitionListItem, SubDLItem) +	(Term,               TextOrInlineElement) +	(Classifier,         TextOrInlineElement) +	(Definition,         BodyElement) +	 +	(FieldName, TextOrInlineElement) +	(FieldBody, BodyElement) +	 +	(OptionListItem, SubOptionListItem) +	(OptionGroup,    Option_) +	(Description,    BodyElement) +	(Option_,        SubOption) +	(OptionString,   TextOrInlineElement) +	(OptionArgument, TextOrInlineElement; +) +	 +	(Line,        TextOrInlineElement) +	(Attribution, TextOrInlineElement) +	(Label_,      TextOrInlineElement) +	 +	(Caption, TextOrInlineElement) +	(Legend,  BodyElement) +	 +	//inline elements +	(Emphasis,              TextOrInlineElement) +	(Literal,               TextOrInlineElement) +	(Reference,             TextOrInlineElement; +) +	(Strong,                TextOrInlineElement) +	(FootnoteReference,     TextOrInlineElement; +) +	(CitationReference,     TextOrInlineElement; +) +	(SubstitutionReference, TextOrInlineElement; +) +	(TitleReference,        TextOrInlineElement) +	(Abbreviation,          TextOrInlineElement) +	(Acronym,               TextOrInlineElement) +	(Superscript,           TextOrInlineElement) +	(Subscript,             TextOrInlineElement) +	(Inline,                TextOrInlineElement) +	(Problematic,           TextOrInlineElement; +) +	(Generated,             TextOrInlineElement) +	(Math) +	 +	//also have non-inline versions. Inline image is no figure child, inline target has content +	(TargetInline, TextOrInlineElement; +) +	(RawInline; +) +	(ImageInline; *) +	 +	//text element +	(TextElement) +); | 
