diff options
| author | Philipp A | 2019-12-08 16:55:21 +0100 |
|---|---|---|
| committer | Philipp A | 2019-12-08 17:13:15 +0100 |
| commit | 13ecb9436b5987237062a79c21b1630689d4715d (patch) | |
| tree | c410ed45edfff10c5d09e9c38e1fd90f1ef9f7e9 | |
| parent | 588f2474c4f13417c9dae18defc657fcb6c0f07e (diff) | |
| download | rust-rst-13ecb9436b5987237062a79c21b1630689d4715d.tar.bz2 | |
Render emph, strong, and literal
| -rw-r--r-- | src/parser/conversion/inline.rs | 8 | ||||
| -rw-r--r-- | src/parser/tests.rs | 14 | ||||
| -rw-r--r-- | src/renderer/html_tests.rs | 4 | ||||
| -rw-r--r-- | src/rst.pest | 15 |
4 files changed, 31 insertions, 10 deletions
diff --git a/src/parser/conversion/inline.rs b/src/parser/conversion/inline.rs index ed118c3..297680a 100644 --- a/src/parser/conversion/inline.rs +++ b/src/parser/conversion/inline.rs @@ -5,7 +5,8 @@ use crate::document_tree::{ elements as e, element_categories as c, extra_attributes as a, - attribute_types as at + attribute_types as at, + element_categories::HasChildren, }; use crate::parser::{ @@ -19,9 +20,12 @@ use super::whitespace_normalize_name; pub fn convert_inline(pair: Pair<Rule>) -> Result<c::TextOrInlineElement, Error> { Ok(match pair.as_rule() { - Rule::str => pair.as_str().into(), + Rule::str | Rule::str_nested => pair.as_str().into(), Rule::reference => convert_reference(pair)?, Rule::substitution_ref => convert_substitution_ref(pair)?.into(), + Rule::emph => e::Emphasis::with_children(convert_inlines(pair)?).into(), + Rule::strong => e::Strong::with_children(convert_inlines(pair)?).into(), + Rule::literal => e::Literal::with_children(convert_inlines(pair)?).into(), rule => unimplemented!("unknown rule {:?}", rule), }) } diff --git a/src/parser/tests.rs b/src/parser/tests.rs index bf9fe22..e161108 100644 --- a/src/parser/tests.rs +++ b/src/parser/tests.rs @@ -17,6 +17,18 @@ fn plain() { } #[test] +fn emph_only() { + parses_to! { + parser: RstParser, + input: "*emphasis*", + rule: Rule::emph_outer, + tokens: [ + emph(1, 9, [str_nested(1, 9)]) + ] + }; +} + +#[test] fn emph() { parses_to! { parser: RstParser, @@ -25,7 +37,7 @@ fn emph() { tokens: [ paragraph(0, 18, [ str(0, 5), - emph(6, 17), + emph(6, 17, [str_nested(6, 17)]), ]) ] }; diff --git a/src/renderer/html_tests.rs b/src/renderer/html_tests.rs index c12890a..32871dc 100644 --- a/src/renderer/html_tests.rs +++ b/src/renderer/html_tests.rs @@ -23,8 +23,8 @@ fn test_simple_string() { #[test] fn test_simple_string_with_markup() { check_renders_to( - "Simple String with *markup*", - "<p>Simple String with <em>markup</em></p>", + "Simple String with *emph* and **strong**", + "<p>Simple String with <em>emph</em> and <strong>strong</strong></p>", ); } diff --git a/src/rst.pest b/src/rst.pest index 34e7bd2..1034d03 100644 --- a/src/rst.pest +++ b/src/rst.pest @@ -110,7 +110,7 @@ inline_special = _{ | substitution_ref | emph_outer | strong_outer - | literal_outer + | literal_outer // | ul_or_star_line // | space // | note_reference @@ -126,13 +126,18 @@ inline_special = _{ str = { (!(NEWLINE | inline_special) ~ ANY)+ } -// simple formatting. TODO: similar to substitution_name, make function or so? +// simple formatting +inline_nested = _{ inline_special | str_nested } +str_nested = { word_nested ~ ( " "+ ~ word_nested)* } +// TODO: allow ` in emph and * in literal +word_nested = _{ (!(NEWLINE | " " | inline_special | "*" | "`") ~ ANY)+ } + emph_outer = _{ "*" ~ emph ~ "*" } -emph = { (!("*"|" ") ~ ANY)+ ~ (" "+ ~ (!("*"|" ") ~ ANY)+)* } +emph = { (!("*"|" ") ~ inline_nested)+ ~ (" "+ ~ (!("*"|" ") ~ inline_nested)+)* } strong_outer = _{ "**" ~ strong ~ "**" } -strong = { (!("*"|" ") ~ ANY)+ ~ (" "+ ~ (!("*"|" ") ~ ANY)+)* } +strong = { (!("*"|" ") ~ inline_nested)+ ~ (" "+ ~ (!("*"|" ") ~ inline_nested)+)* } literal_outer = _{ "``" ~ literal ~ "``" } -literal = { (!("`"|" ") ~ ANY)+ ~ (" "+ ~ (!("`"|" ") ~ ANY)+)* } +literal = { (!("`"|" ") ~ inline_nested)+ ~ (" "+ ~ (!("`"|" ") ~ inline_nested)+)* } // inline links reference = { reference_target | reference_explicit | reference_auto } |
