From c32b5d87ed96048f656cd8e77c3b49144d15e200 Mon Sep 17 00:00:00 2001 From: Florian Dieminger Date: Thu, 10 Oct 2024 17:28:52 +0200 Subject: [PATCH] fix(diff): pretty html diff and fixes --- Cargo.lock | 19 +++--- crates/diff-test/Cargo.toml | 2 +- crates/diff-test/src/main.rs | 28 ++++----- crates/diff-test/src/xml.rs | 22 +++++++ .../src/templ/templs/embeds/embedyoutube.rs | 15 +++-- .../src/templ/templs/embeds/jsfiddleembed.rs | 4 +- .../src/templ/templs/embeds/livesample.rs | 2 +- .../src/templ/templs/previous_menu_next.rs | 60 ++++++++++--------- 8 files changed, 90 insertions(+), 62 deletions(-) create mode 100644 crates/diff-test/src/xml.rs diff --git a/Cargo.lock b/Cargo.lock index 55b56ad0..12c76b1e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -801,11 +801,11 @@ dependencies = [ "anyhow", "clap", "html-minifier", - "htmldiff", "ignore", "itertools", "jsonpath_lib", "prettydiff", + "quick-xml 0.36.2", "rayon", "regex", "serde", @@ -1335,12 +1335,6 @@ dependencies = [ "syn 2.0.79", ] -[[package]] -name = "htmldiff" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35b798ad26682ba974f035682fa7512c6b092262fc924f17cbb8fa54e464ea50" - [[package]] name = "http" version = "1.1.0" @@ -2409,6 +2403,15 @@ dependencies = [ "memchr", ] +[[package]] +name = "quick-xml" +version = "0.36.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7649a7b4df05aed9ea7ec6f628c67c9953a43869b8bc50929569b2999d443fe" +dependencies = [ + "memchr", +] + [[package]] name = "quinn" version = "0.11.5" @@ -3082,7 +3085,7 @@ dependencies = [ "hyper", "indicatif", "log", - "quick-xml", + "quick-xml 0.23.1", "regex", "reqwest", "self-replace", diff --git a/crates/diff-test/Cargo.toml b/crates/diff-test/Cargo.toml index 15274eba..07d3fad9 100644 --- a/crates/diff-test/Cargo.toml +++ b/crates/diff-test/Cargo.toml @@ -20,5 +20,5 @@ prettydiff = "0.7" html-minifier = "5" ansi-to-html = "0.2" similar = "2" -htmldiff = "0.1" +quick-xml = "0.36" clap = { version = "4.5.1", features = ["derive"] } diff --git a/crates/diff-test/src/main.rs b/crates/diff-test/src/main.rs index 8d3878cc..01c2105c 100644 --- a/crates/diff-test/src/main.rs +++ b/crates/diff-test/src/main.rs @@ -10,15 +10,17 @@ use std::sync::LazyLock; use anyhow::{anyhow, Error}; use clap::{Args, Parser, Subcommand}; -use htmldiff::htmldiff; use ignore::types::TypesBuilder; use ignore::WalkBuilder; use itertools::Itertools; use jsonpath_lib::Compiled; -use prettydiff::diff_words; +use prettydiff::{diff_lines, diff_words}; use rayon::prelude::*; use regex::Regex; use serde_json::Value; +use xml::fmt_html; + +mod xml; fn html(body: &str) -> String { format!( @@ -243,21 +245,17 @@ fn full_diff(lhs: &Value, rhs: &Value, path: &[PathIndex], diff: &mut BTreeMap { diff --git a/crates/diff-test/src/xml.rs b/crates/diff-test/src/xml.rs new file mode 100644 index 00000000..921bd66b --- /dev/null +++ b/crates/diff-test/src/xml.rs @@ -0,0 +1,22 @@ +use std::io::Cursor; + +use quick_xml::events::Event; +use quick_xml::reader::Reader; +use quick_xml::writer::Writer; + +pub fn fmt_html(html: &str) -> String { + let mut reader = Reader::from_str(html); + reader.config_mut().trim_text(true); + let mut writer = Writer::new_with_indent(Cursor::new(Vec::new()), b' ', 0); + loop { + match reader.read_event() { + Ok(Event::Eof) => break, + // we can either move or borrow the event to write, depending on your use-case + Ok(e) => assert!(writer.write_event(e).is_ok()), + _ => {} + } + } + + let result = writer.into_inner().into_inner(); + String::from_utf8(result).unwrap() +} diff --git a/crates/rari-doc/src/templ/templs/embeds/embedyoutube.rs b/crates/rari-doc/src/templ/templs/embeds/embedyoutube.rs index 538492f6..6024b81e 100644 --- a/crates/rari-doc/src/templ/templs/embeds/embedyoutube.rs +++ b/crates/rari-doc/src/templ/templs/embeds/embedyoutube.rs @@ -1,6 +1,7 @@ use std::borrow::Cow; use rari_templ_func::rari_f; +use rari_utils::concat_strs; use crate::error::DocError; @@ -8,16 +9,14 @@ use crate::error::DocError; pub fn embed_youtube(video_id: String, title: Option) -> Result { let title = title .as_deref() - .map(|s| html_escape::encode_double_quoted_attribute(s)); - let mut out = String::new(); - out.extend([ + .map(|s| html_escape::encode_double_quoted_attribute(s)) + .unwrap_or(Cow::Borrowed("YouTube video")); + Ok(concat_strs!( r#""#, - r#"">"#, - ]); - Ok(out) + &title, + r#"" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen>"# + )) } diff --git a/crates/rari-doc/src/templ/templs/embeds/jsfiddleembed.rs b/crates/rari-doc/src/templ/templs/embeds/jsfiddleembed.rs index fa3a060f..b634b234 100644 --- a/crates/rari-doc/src/templ/templs/embeds/jsfiddleembed.rs +++ b/crates/rari-doc/src/templ/templs/embeds/jsfiddleembed.rs @@ -12,7 +12,7 @@ pub fn embded_jsfiddle( height: Option, ) -> Result { let mut out = String::new(); - out.push_str(r#""#, + r#"">

"#, ]); Ok(out) } diff --git a/crates/rari-doc/src/templ/templs/embeds/livesample.rs b/crates/rari-doc/src/templ/templs/embeds/livesample.rs index 67d499ba..39ad446a 100644 --- a/crates/rari-doc/src/templ/templs/embeds/livesample.rs +++ b/crates/rari-doc/src/templ/templs/embeds/livesample.rs @@ -35,7 +35,7 @@ pub fn live_sample( if !height.is_empty() { // TODO: fix this if height.as_int() < 60 { - write!(&mut out, r#"height="{}" "#, height.as_int())?; + write!(&mut out, r#"height="60" "#)?; } else { write!(&mut out, r#"height="{}" "#, height)?; } diff --git a/crates/rari-doc/src/templ/templs/previous_menu_next.rs b/crates/rari-doc/src/templ/templs/previous_menu_next.rs index 4b8203d3..ac5e42d9 100644 --- a/crates/rari-doc/src/templ/templs/previous_menu_next.rs +++ b/crates/rari-doc/src/templ/templs/previous_menu_next.rs @@ -50,37 +50,43 @@ fn previous_next_menu_internal( let mut out = String::new(); out.push_str(r#"
    "#); if let Some(prev) = prev { - let page = RariApi::get_page(&concat_strs!( - "/", - locale.as_url_str(), - "/docs/", - prev.as_str() - ))?; - let title = l10n_json_data("Template", "previous", locale)?; - generate_link(&mut out, page.slug(), locale, title)?; + if !prev.is_empty() { + let page = RariApi::get_page(&concat_strs!( + "/", + locale.as_url_str(), + "/docs/", + prev.as_str() + ))?; + let title = l10n_json_data("Template", "previous", locale)?; + generate_link(&mut out, page.slug(), locale, title)?; + } } if let Some(menu) = menu { - let page = RariApi::get_page(&concat_strs!( - "/", - locale.as_url_str(), - "/docs/", - menu.as_str() - ))?; - let title = concat_strs!( - l10n_json_data("Template", "prev_next_menu", locale)?, - page.title() - ); - generate_link(&mut out, page.slug(), locale, &title)?; + if !menu.is_empty() { + let page = RariApi::get_page(&concat_strs!( + "/", + locale.as_url_str(), + "/docs/", + menu.as_str() + ))?; + let title = concat_strs!( + l10n_json_data("Template", "prev_next_menu", locale)?, + page.title() + ); + generate_link(&mut out, page.slug(), locale, &title)?; + } } if let Some(next) = next { - let page = RariApi::get_page(&concat_strs!( - "/", - locale.as_url_str(), - "/docs/", - next.as_str() - ))?; - let title = l10n_json_data("Template", "next", locale)?; - generate_link(&mut out, page.slug(), locale, title)?; + if !next.is_empty() { + let page = RariApi::get_page(&concat_strs!( + "/", + locale.as_url_str(), + "/docs/", + next.as_str() + ))?; + let title = l10n_json_data("Template", "next", locale)?; + generate_link(&mut out, page.slug(), locale, title)?; + } } out.push_str("
"); Ok(out)