Finish gemtext parsing implementation
[?]
Jan 13, 2021, 3:24 AM
Y55SCAUN3MQCMRGJQBBMICEO6ARTGICWGGZYA7VB6ZRPK6US4B5ACDependencies
- [2]
JBZGFYVOAdd nom parsers for main types - [3]
K37J3USBAdd WIP gemtext parsers - [4]
J4PKMKJXAdd root doc comment, gemtext module - [5]
FR4RRLIKMake comment more descriptive - [*]
5II6T7YEAdd gemini library
Change contents
- edit in gemini/src/lib.rs at line 70
pub use gemtext::parse_gemtext; - replacement in gemini/src/gemtext.rs at line 38
Preformatted(String),Preformatted {/// Optional alt text following the opening "```".alt: Option<String>,/// Preformatted text to display to clients.text: String,}, - replacement in gemini/src/gemtext.rs at line 151
pub fn preformatted(self, preformatted: impl Into<String>) -> Self {self.push(Doc::Preformatted(preformatted.into()))pub fn preformatted(self, alt: Option<impl Into<String>>, text: impl Into<String>) -> Self {let alt = alt.map(Into::into);let text = text.into();self.push(Doc::Preformatted { alt, text }) - replacement in gemini/src/gemtext.rs at line 185
Doc::Preformatted(p) => {writeln!(f, "```\n{}\n```", p)Doc::Preformatted { alt, text } => {writeln!(f,"```{}\n{}\n```",alt.as_ref().unwrap_or(&String::new()),text) - replacement in gemini/src/gemtext.rs at line 204
.preformatted(" wooo\n/^^^^\\\n| |\n\\____/").preformatted(Some("logo"), "wooo\n/^^^^\\\n| |\n\\____/") - replacement in gemini/src/gemtext.rs at line 216
r#"```r#"```logo - replacement in gemini/src/gemtext.rs at line 241
bytes::complete::{is_not, tag, take},branch::alt,bytes::complete::{is_not, tag, take_until}, - replacement in gemini/src/gemtext.rs at line 244
combinator::{map, map_res, opt, peek},combinator::{map, opt, value},error::context,multi::many1, - replacement in gemini/src/gemtext.rs at line 257
pub fn text(input: &str) -> IResult<&str, Doc> {map(line, |s: &str| {if s.is_empty() {Doc::Blank} else {Doc::Text(s.to_string())}})(input)fn text(input: &str) -> IResult<&str, Doc> {context("gemtext text line",map(line, |s: &str| {if s.is_empty() {Doc::Blank} else {Doc::Text(s.to_string())}}),)(input) - replacement in gemini/src/gemtext.rs at line 270
pub fn link(input: &str) -> IResult<&str, Doc> {fn link(input: &str) -> IResult<&str, Doc> { - replacement in gemini/src/gemtext.rs at line 272
map(preceded(pair(tag("=>"), space1), terminated(body, line_ending)),|(to, name): (&str, Option<&str>)| Doc::Link {to: to.to_string(),name: name.map(|s| s.to_string()),},context("gemtext link line",map(preceded(pair(tag("=>"), space1), terminated(body, line_ending)),|(to, name): (&str, Option<&str>)| Doc::Link {to: to.to_string(),name: name.map(|s| s.to_string()),},), - replacement in gemini/src/gemtext.rs at line 285
map_res(peek(take(3usize)), |s| {Ok(match s {"###" => Level::Three,_ if s.starts_with("##") => Level::Two,_ if s.starts_with("#") => Level::One,_ => return Err(()),})})(input)alt((value(Level::One, tag("#")),value(Level::Two, tag("##")),value(Level::Three, tag("###")),))(input) - replacement in gemini/src/gemtext.rs at line 292
pub fn heading(input: &str) -> IResult<&str, Doc> {map(terminated(pair(level, not_line_ending), line_ending),|(lvl, s)| Doc::Heading(lvl, s.to_string()),fn heading(input: &str) -> IResult<&str, Doc> {context("gemtext heading line",map(terminated(pair(level, not_line_ending), line_ending),|(lvl, s)| Doc::Heading(lvl, s.to_string()),), - replacement in gemini/src/gemtext.rs at line 302
pub fn list_item(input: &str) -> IResult<&str, Doc> {todo!()fn list_item(input: &str) -> IResult<&str, Doc> {context("gemtex list item line",map(terminated(preceded(tag("*"), not_line_ending), line_ending),|s: &str| Doc::ListItem(s.to_string()),),)(input) - replacement in gemini/src/gemtext.rs at line 312
pub fn quote(input: &str) -> IResult<&str, Doc> {todo!()fn quote(input: &str) -> IResult<&str, Doc> {context("gemtext quote line",map(terminated(preceded(tag(">"), not_line_ending), line_ending),|s: &str| Doc::Quote(s.to_string()),),)(input) - replacement in gemini/src/gemtext.rs at line 322
pub fn preformatted(input: &str) -> IResult<&str, Doc> {todo!()fn preformatted(input: &str) -> IResult<&str, Doc> {context("gemtext preformatted block",map(terminated(pair(terminated(preceded(tag("```"), opt(not_line_ending)), line_ending),take_until("\n```"),),pair(line_ending, tag("```")),),|(alt, text): (Option<&str>, &str)| Doc::Preformatted {alt: alt.map(|s| s.to_string()),text: text.to_string(),},),)(input) - edit in gemini/src/gemtext.rs at line 341
/// Parse a utf-8 encoded gemtext document. - replacement in gemini/src/gemtext.rs at line 343
todo!()context("gemtext document",map(many1(alt((text, link, heading, list_item, quote, preformatted))),Builder::from_docs,),)(input) - edit in gemini/src/gemtext.rs at line 352[3.2102]
pub use parse::document as parse_gemtext;