diff options
| author | Philipp A | 2016-06-19 18:06:55 +0200 | 
|---|---|---|
| committer | Philipp A | 2016-06-19 18:06:55 +0200 | 
| commit | a53ddfe2c6c6736348b78565a8334c1b217e128f (patch) | |
| tree | f0c31ad2c595623f691f63464e5a579f8a63abcb | |
| parent | 087afdbd9b439a5fd37965b71df99038b28b7872 (diff) | |
| download | rust-rst-a53ddfe2c6c6736348b78565a8334c1b217e128f.tar.bz2 | |
some cleanups, parser module files (empty)
| -rw-r--r-- | Cargo.toml | 11 | ||||
| -rw-r--r-- | README.rst | 5 | ||||
| -rw-r--r-- | docutils.dtd | 2 | ||||
| -rw-r--r-- | src/document_tree/elements.rs | 61 | ||||
| -rw-r--r-- | src/lib.rs | 5 | ||||
| -rw-r--r-- | src/parser/mod.rs | 1 | ||||
| -rw-r--r-- | src/parser/token.rs | 62 | ||||
| -rw-r--r-- | src/renderer/mod.rs | 1 | 
8 files changed, 106 insertions, 42 deletions
| @@ -1,8 +1,9 @@  [package] - -name = "rst" -version = "0.0.0" -authors = [ "Phil Schaf <flying-sheep@web.de>" ] +name = 'rst' +version = '0.0.0' +authors = [ 'Phil Schaf <flying-sheep@web.de>' ]  [dependencies] -url = "0.2.37" +url = '0.5' +bitflags = '0.5' +unicode_categories = '0.1.0' @@ -2,8 +2,9 @@  RuSTructuredText  ================ -  Designed around the `Docutils Document Tree`_ and the `reStructuredText specification`_, this is supposed to become a library able to convert reStructuredText and Docutils XML to both each other and HTML5. +This project is dual-licensed under Apache 2.0 and MIT. +  .. _Docutils Document Tree: http://docutils.sourceforge.net/docs/ref/doctree.html -.. _reStructuredText specification: http://docutils.sourceforge.net/docs/ref/rst/restructuredtext.html
\ No newline at end of file +.. _reStructuredText specification: http://docutils.sourceforge.net/docs/ref/rst/restructuredtext.html diff --git a/docutils.dtd b/docutils.dtd index 229a6d9..c39d08a 100644 --- a/docutils.dtd +++ b/docutils.dtd @@ -1,3 +1,4 @@ +<!DOCTYPE dtd [  <!--  ======================================================================      Docutils Generic DTD @@ -605,3 +606,4 @@ indent-tabs-mode: nil  fill-column: 70  End:  --> +]> diff --git a/src/document_tree/elements.rs b/src/document_tree/elements.rs index 4928cee..ba5d78e 100644 --- a/src/document_tree/elements.rs +++ b/src/document_tree/elements.rs @@ -32,7 +32,7 @@ pub struct CommonAttributes {  //impl\\  //----\\ -macro_rules! impl_element(($name:ident) => { +macro_rules! impl_element { ($name:ident) => (  	impl Element for $name {  		fn     ids    (&    self) -> &    Vec<String> { &    self.common.ids     }  		fn     ids_mut(&mut self) -> &mut Vec<String> { &mut self.common.ids     } @@ -43,70 +43,61 @@ macro_rules! impl_element(($name:ident) => {  		fn classes    (&    self) -> &    Vec<String> { &    self.common.classes }  		fn classes_mut(&mut self) -> &mut Vec<String> { &mut self.common.classes }  	} -}); +)} -macro_rules! impl_children(($name:ident, $childtype:ident) => { +macro_rules! impl_children { ($name:ident, $childtype:ident) => (  	impl HasChildren<$childtype> for $name {  		fn with_children(children: Vec<$childtype>) -> $name { $name { children: children, ..Default::default() } }  		fn children    (&    self) -> &    Vec<$childtype> { &    self.children }  		fn children_mut(&mut self) -> &mut Vec<$childtype> { &mut self.children }  	} -}); +)} -macro_rules! impl_extra(($name:ident) => { +macro_rules! impl_extra { ($name:ident) => (  	impl ExtraAttributes<extra_attributes::$name> for $name {  //		fn with_extra(extra: extra_attributes::$name) -> $name { $name { extra: extra, ..Default::default() } }  		fn extra    (&    self) -> &    extra_attributes::$name { &    self.extra }  		fn extra_mut(&mut self) -> &mut extra_attributes::$name { &mut self.extra }  	} -}); +)} -macro_rules! impl_elem( +macro_rules! impl_new {( +	$(#[$attr:meta])* +	pub struct $name:ident { $( $field:ident : $typ:path ),* +}) => ( +	$(#[$attr])* +	pub struct $name { $( $field: $typ, )* } +	impl $name { +		pub fn new( $( $field: $typ, )* ) -> $name { $name { $( $field: $field, )* } } +	} +)} + +macro_rules! impl_elem {  	($name:ident) => { -		#[derive(Default,Debug)] -		pub struct $name { common: CommonAttributes } -		impl $name { -			pub fn new(common: CommonAttributes) -> $name { $name { common: common } } -		} +		impl_new!(#[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 $name { -			pub fn new(common: CommonAttributes, extra: extra_attributes::$name ) -> $name { $name { common: common, extra: extra } } -		} +		impl_new!(#[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 $name { -			pub fn new(common: CommonAttributes, extra: extra_attributes::$name ) -> $name { $name { common: common, extra: extra } } -		} +		impl_new!(#[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<$childtype> } -		impl $name { -			pub fn new(common: CommonAttributes, children: Vec<$childtype> ) -> $name { $name { common: common, children: children } } -		} +		impl_new!(#[derive(Default,Debug)] pub struct $name { common: CommonAttributes, children: Vec<$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<$childtype> } -		impl $name { -			pub fn new(common: CommonAttributes, extra: extra_attributes::$name, children: Vec<$childtype> ) -> $name { $name { common: common, extra: extra, children: children } } -		} +		impl_new!(#[derive(Default,Debug)] pub struct $name { common: CommonAttributes, extra: extra_attributes::$name, children: Vec<$childtype> });  		impl_element!($name); impl_extra!($name); impl_children!($name, $childtype);  	}; -); +} -macro_rules! impl_elems(( $( ($($args:tt)*) )* ) => { +macro_rules! impl_elems { ( $( ($($args:tt)*) )* ) => (  	$( impl_elem!($($args)*); )* -}); +)}  #[derive(Default,Debug)] @@ -1,3 +1,8 @@  extern crate url; +#[macro_use] +extern crate bitflags; +extern crate unicode_categories;  pub mod document_tree; +pub mod parser; +pub mod renderer; diff --git a/src/parser/mod.rs b/src/parser/mod.rs new file mode 100644 index 0000000..79c66ba --- /dev/null +++ b/src/parser/mod.rs @@ -0,0 +1 @@ +pub mod token; diff --git a/src/parser/token.rs b/src/parser/token.rs new file mode 100644 index 0000000..8c3a445 --- /dev/null +++ b/src/parser/token.rs @@ -0,0 +1,62 @@ +// rST does indentation for lists by using the column after the list item +// i’ll represent it as BulletList → Indent. e.g.: +// +//1. * foo +//   * bar +// +// becomes: +// +//EnumList(Arabic, Period) → Indent(3) +//   → BulletList(Asterisk) → Indent(2) +//     → Line("foo") +//   → Dedent(2) +//   → BulletList(Asterisk) → Indent(2) +//     → Line("bar") +//→ Dedent(5) + +//http://docutils.sourceforge.net/docs/ref/rst/restructuredtext.html#bullet-lists + +enum BulletListType { Ast, Plus, Minus, Bullet, TriBullet, HyphenBullet } +enum EnumListChar { Arabic, AlphaUpper, AlphaLower, RomanUpper, RomanLower, Auto } +enum EnumListType { Period, ParenEnclosed, Paren } +enum AdornmentChar { +	Bang, DQuote, Hash, Dollar, Percent, Amp, SQuote, LParen, RParen, Ast, Plus, Comma, +	Minus, Period, Slash, Colon, Semicolon, Less, Eq, More, Question, At, LBrack, +	Backslash, RBrack, Caret, Underscore, Backtick, LBrace, Pipe, RBrace, Tilde, +} +enum FootnoteType { Numbered(usize), AutoNumber, AutoSymbol, AutoNamed(String) } + +enum TokenBlockLevel { +	EmptyLine, +	Indent(u8),  // plain indents mean blockquotes +	Dedent(u8), +	Line(String), +	 +	Adornment(AdornmentChar, u32),  // ! " # $ % & ' ( ) * + , - . / : ; < = > ? @ [ \ ] ^ _ ` { | } ~ +	// for a transition, this must be surrounded by blank lines, and be of length ≥ 4 +	 +	ListBulletItem(BulletListType),  // *, +, -, •, ‣, ⁃ +	ListEnumItem(EnumListChar, EnumListType),  // 1, A, a, I, i; 1., (1), 1) +	ListDefinitionTerm(String, Option<String>),  //term and classifiers +	ListFieldName(String), +	ListOption(String), +	ListOptionArg(String), +	 +	BlockLiteral, +	BlockQuotedLiteral(AdornmentChar), +	// line blocks use pipes (|) +	BlockDoctest(String), +	 +	GridTableLine(String), +	GridTableRow(String), +	SimpleTableLine(String), +	 +	Footnote(FootnoteType), // [1], [#], [*], [#foo] +	Citation(String), +	Directive(String, String),  // name and args +	SubstitutionDef(String, String),  // symbol and substitited line TODO: maybe only the former? +	Comment, +	CommentEmpty,  // if not followed by anything, “..” is special +	Target(String, String), +	TargetAnonymous(String), +} diff --git a/src/renderer/mod.rs b/src/renderer/mod.rs new file mode 100644 index 0000000..0b13441 --- /dev/null +++ b/src/renderer/mod.rs @@ -0,0 +1 @@ +pub static FOOTNOTE_SYMBOLS: [char; 10] = ['*', '†', '‡', '§', '¶', '#', '♠', '♥', '♦', '♣']; | 
