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#"
"#,
]);
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)