use std::collections::HashMap; use std::fs; use std::fs::File; use std::io::Write;
use pulldown_cmark::Event::{End, Start, Text}; use pulldown_cmark::Tag::List; use pulldown_cmark::TagEnd; use pulldown_cmark_to_cmark::cmark; use xshell::{cmd, Shell};
#[test] fn reference_metrics_toc_is_sorted() { // Relative to `glean-core` let index_file = "../docs/user/reference/metrics/index.md"; let src = fs::read_to_string(index_file).expect("unable to read file"); let parser = pulldown_cmark::Parser::new(&src); letmut events = parser.into_offset_iter();
// Everything before the list letmut list_start = 0; for (event, span) in events.by_ref() { iflet Start(List(..)) = event {
modified_events.push(event);
list_start = span.start; break;
}
}
// Output everything up to the list start unmodified. if list_start > 0 {
writeln!(&mut output, "{}", &src[0..(list_start - 1)]).unwrap();
}
letmut items = HashMap::new();
// The list itself. // We store a `title -> events` mapping to sort it later by `title`. letmut list_end = 0; whilelet Some((event, span)) = events.next() { iflet End(TagEnd::List(..)) = event {
list_end = span.end; break;
}
letmut elems = Vec::new();
elems.push(event);
letmut title: Option<String> = None; for (event, _) in events.by_ref() { match event {
End(TagEnd::Item) => {
elems.push(End(TagEnd::Item)); break;
}
Text(s) if title.is_none() => {
title = Some(s.to_string());
elems.push(Text(s));
}
e => elems.push(e),
}
}
items.insert(title.unwrap(), elems);
}
letmut item_keys: Vec<_> = items.keys().cloned().collect();
item_keys.sort_by_key(|item| { // We need to handle a few special cases: // // * Dual-labeled and labeled metrics should be sorted right after their top-level metric type // * Normalizing plurals to be sorted correctly after the singular (quantity -> quantities)
letmut k = item.to_ascii_lowercase();
k = k.strip_prefix("dual-labeled ").unwrap_or(&k).to_string();
k = k.strip_prefix("labeled ").unwrap_or(&k).to_string();
// The remaining document can be printed unmodified. if list_end > 0 {
write!(&mut output, "{}", &src[list_end..]).unwrap();
}
// Last but not least check if we modified the document. let sh = Shell::new().unwrap();
cmd!(sh, "git --no-pager diff --exit-code {index_file}")
.run()
.unwrap();
}
Messung V0.5 in Prozent
¤ Dauer der Verarbeitung: 0.11 Sekunden
(vorverarbeitet am 2026-08-25)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.