diff --git a/crates/diff-test/src/main.rs b/crates/diff-test/src/main.rs index 01c2105c..a7d9de4d 100644 --- a/crates/diff-test/src/main.rs +++ b/crates/diff-test/src/main.rs @@ -142,6 +142,8 @@ struct BuildArgs { #[arg(long)] ignore_html_whitespace: bool, #[arg(long)] + fast: bool, + #[arg(long)] value: bool, #[arg(short, long)] verbose: bool, @@ -185,7 +187,13 @@ static WS_DIFF: LazyLock = static DATA_FLAW_SRC: LazyLock = LazyLock::new(|| Regex::new(r#" data-flaw-src="[^"]+""#).unwrap()); -fn full_diff(lhs: &Value, rhs: &Value, path: &[PathIndex], diff: &mut BTreeMap) { +fn full_diff( + lhs: &Value, + rhs: &Value, + path: &[PathIndex], + diff: &mut BTreeMap, + fast: bool, +) { if path.len() == 1 { if let PathIndex::Object(s) = &path[0] { if s == "url" { @@ -209,6 +217,7 @@ fn full_diff(lhs: &Value, rhs: &Value, path: &[PathIndex], diff: &mut BTreeMap Result<(), anyhow::Error> { let left = v; let right = b.get(k).unwrap_or(&Value::Null); let mut diff = BTreeMap::new(); - full_diff(left, right, &[], &mut diff); + full_diff(left, right, &[], &mut diff, arg.fast); if !diff.is_empty() { return Some(format!( r#"
  • {k}
    {}
  • "#, diff --git a/crates/rari-doc/src/helpers/summary_hack.rs b/crates/rari-doc/src/helpers/summary_hack.rs index 252bdbf9..2c08ab21 100644 --- a/crates/rari-doc/src/helpers/summary_hack.rs +++ b/crates/rari-doc/src/helpers/summary_hack.rs @@ -1,6 +1,7 @@ +use rari_md::{m2h_internal, M2HOptions}; + use crate::error::DocError; use crate::pages::page::{Page, PageLike}; -use crate::pages::types::doc::render_md_to_html; use crate::templ::render::render_for_summary; /// There's a few places were we still tansplant content. @@ -14,7 +15,13 @@ pub fn get_hacky_summary_md(page: &Page) -> Result { || line.starts_with("##")) }) .map(|line| { - render_for_summary(line).and_then(|md| render_md_to_html(md.trim(), page.locale())) + render_for_summary(line).and_then(|md| { + Ok(m2h_internal( + md.trim(), + page.locale(), + M2HOptions { sourcepos: false }, + )?) + }) }) .unwrap_or_else(|| Ok(String::from("No summray found."))) } diff --git a/crates/rari-doc/src/html/rewriter.rs b/crates/rari-doc/src/html/rewriter.rs index a9bd8537..393d7e6a 100644 --- a/crates/rari-doc/src/html/rewriter.rs +++ b/crates/rari-doc/src/html/rewriter.rs @@ -247,6 +247,12 @@ pub fn post_process_html( } Ok(()) }), + element!("pre:not(.notranslate)", |el| { + let mut class = el.get_attribute("class").unwrap_or_default(); + class.push_str(" notranslate"); + el.set_attribute("class", &class)?; + Ok(()) + }), element!("pre[class*=brush]:not(.hidden)", |el| { let class = el.get_attribute("class"); let class = class.as_deref().unwrap_or_default(); diff --git a/crates/rari-doc/src/templ/render.rs b/crates/rari-doc/src/templ/render.rs index 2063e998..b120868a 100644 --- a/crates/rari-doc/src/templ/render.rs +++ b/crates/rari-doc/src/templ/render.rs @@ -160,7 +160,7 @@ pub(crate) fn decode_ref(input: &str, templs: &[String]) -> Result Result { out.push_str("
    "); for page in pages { + let summary = get_hacky_summary_md(&page)?; out.extend([ r#"
    "#, page.title(), r#"
    "#, - strip_paragraph_unckecked(get_hacky_summary_md(&page)?.as_str()), + strip_paragraph_unckecked(summary.as_str()), r#"
    "#, ]); } diff --git a/crates/rari-md/src/anchor.rs b/crates/rari-md/src/anchor.rs index d9f62a97..4ad8df7e 100644 --- a/crates/rari-md/src/anchor.rs +++ b/crates/rari-md/src/anchor.rs @@ -5,7 +5,7 @@ use regex::Regex; pub fn anchorize(content: &str) -> Cow<'_, str> { static REJECTED_CHARS: LazyLock = - LazyLock::new(|| Regex::new(r#"[<>"$#%&+,/:;=?@\[\]^`{|}~')(\\]"#).unwrap()); + LazyLock::new(|| Regex::new(r#"[*<>"$#%&+,/:;=?@\[\]^`{|}~')(\\]"#).unwrap()); let id = REJECTED_CHARS.replace_all(content, ""); let mut id = id.trim().to_lowercase(); diff --git a/crates/rari-md/src/lib.rs b/crates/rari-md/src/lib.rs index d8542629..3f4d816d 100644 --- a/crates/rari-md/src/lib.rs +++ b/crates/rari-md/src/lib.rs @@ -27,13 +27,31 @@ where } } +pub struct M2HOptions { + pub sourcepos: bool, +} + +impl Default for M2HOptions { + fn default() -> Self { + Self { sourcepos: true } + } +} + /// rari's custom markdown parser. This implements the MDN markdown extensions. /// See [MDN Markdown](https://developer.mozilla.org/en-US/docs/MDN/Writing_guidelines/Howto/Markdown_in_MDN) pub fn m2h(input: &str, locale: Locale) -> Result { + m2h_internal(input, locale, Default::default()) +} + +pub fn m2h_internal( + input: &str, + locale: Locale, + m2h_options: M2HOptions, +) -> Result { let arena = Arena::new(); let mut options = ComrakOptions::default(); options.extension.tagfilter = false; - options.render.sourcepos = true; + options.render.sourcepos = m2h_options.sourcepos; options.render.experimental_inline_sourcepos = true; options.render.unsafe_ = true; options.extension.table = true; diff --git a/crates/rari-md/src/node_card.rs b/crates/rari-md/src/node_card.rs index 6c95fc5f..464ad522 100644 --- a/crates/rari-md/src/node_card.rs +++ b/crates/rari-md/src/node_card.rs @@ -76,17 +76,30 @@ pub(crate) fn is_callout<'a>(block_quote: &'a AstNode<'a>, locale: Locale) -> Op } if let Some(child) = block_quote.first_child() { if let Some(marker) = child.first_child() { - if let NodeValue::Text(ref text) = marker.data.borrow().value { + let mut data = marker.data.borrow_mut(); + if let NodeValue::Text(ref text) = data.value { if text.starts_with(NoteCard::Callout.new_prefix()) { - marker.detach(); + if text.trim() == NoteCard::Callout.new_prefix() { + marker.detach(); + } else if let Some(tail) = text.strip_prefix(NoteCard::Callout.new_prefix()) { + data.value = NodeValue::Text(tail.trim().to_string()); + } return Some(NoteCard::Callout); } if text.starts_with(NoteCard::Warning.new_prefix()) { - marker.detach(); + if text.trim() == NoteCard::Warning.new_prefix() { + marker.detach(); + } else if let Some(tail) = text.strip_prefix(NoteCard::Warning.new_prefix()) { + data.value = NodeValue::Text(tail.trim().to_string()); + } return Some(NoteCard::Warning); } if text.starts_with(NoteCard::Note.new_prefix()) { - marker.detach(); + if text.trim() == NoteCard::Note.new_prefix() { + marker.detach(); + } else if let Some(tail) = text.strip_prefix(NoteCard::Note.new_prefix()) { + data.value = NodeValue::Text(tail.trim().to_string()); + } return Some(NoteCard::Note); } } diff --git a/crates/rari-types/src/fm_types.rs b/crates/rari-types/src/fm_types.rs index 84458d38..a4dd5d42 100644 --- a/crates/rari-types/src/fm_types.rs +++ b/crates/rari-types/src/fm_types.rs @@ -69,6 +69,8 @@ pub enum PageType { JavascriptStaticMethod, MathmlAttribute, MathmlElement, + MdnCommunityGuide, + MdnWritingGuide, SvgAttribute, SvgElement, WebApiOverview,