rustdoc: properly handle path wrapping

This commit is contained in:
Michael Howell 2024-07-19 09:00:50 -07:00
parent 1d339b07ca
commit 3bf8bcfbe0
6 changed files with 21 additions and 5 deletions

View File

@ -107,12 +107,17 @@ fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
let next_is_uppercase = let next_is_uppercase =
|| pk.map_or(true, |(_, t)| t.chars().any(|c| c.is_uppercase())); || pk.map_or(true, |(_, t)| t.chars().any(|c| c.is_uppercase()));
let next_is_underscore = || pk.map_or(true, |(_, t)| t.contains('_')); let next_is_underscore = || pk.map_or(true, |(_, t)| t.contains('_'));
let next_is_colon = || pk.map_or(true, |(_, t)| t.contains(':'));
if (i - last > 3 && is_uppercase() && !next_is_uppercase()) if (i - last > 3 && is_uppercase() && !next_is_uppercase())
|| (s.contains('_') && !next_is_underscore()) || (s.contains('_') && !next_is_underscore())
{ {
EscapeBodyText(&text[last..i]).fmt(fmt)?; EscapeBodyText(&text[last..i]).fmt(fmt)?;
fmt.write_str("<wbr>")?; fmt.write_str("<wbr>")?;
last = i; last = i;
} else if s.contains(':') && !next_is_colon() {
EscapeBodyText(&text[last..i + 1]).fmt(fmt)?;
fmt.write_str("<wbr>")?;
last = i + 1;
} }
} }
if last < text.len() { if last < text.len() {

View File

@ -6,6 +6,12 @@ fn escape_body_text_with_wbr() {
assert_eq!(&E("").to_string(), ""); assert_eq!(&E("").to_string(), "");
assert_eq!(&E("a").to_string(), "a"); assert_eq!(&E("a").to_string(), "a");
assert_eq!(&E("A").to_string(), "A"); assert_eq!(&E("A").to_string(), "A");
assert_eq!(&E("_").to_string(), "_");
assert_eq!(&E(":").to_string(), ":");
assert_eq!(&E(" ").to_string(), " ");
assert_eq!(&E("___________").to_string(), "___________");
assert_eq!(&E(":::::::::::").to_string(), ":::::::::::");
assert_eq!(&E(" ").to_string(), " ");
// real(istic) examples // real(istic) examples
assert_eq!(&E("FirstSecond").to_string(), "First<wbr>Second"); assert_eq!(&E("FirstSecond").to_string(), "First<wbr>Second");
assert_eq!(&E("First_Second").to_string(), "First<wbr>_Second"); assert_eq!(&E("First_Second").to_string(), "First<wbr>_Second");
@ -15,8 +21,9 @@ fn escape_body_text_with_wbr() {
assert_eq!(&E("First SecondThird").to_string(), "First Second<wbr>Third"); assert_eq!(&E("First SecondThird").to_string(), "First Second<wbr>Third");
assert_eq!(&E("First<T>_Second").to_string(), "First&lt;<wbr>T&gt;<wbr>_Second"); assert_eq!(&E("First<T>_Second").to_string(), "First&lt;<wbr>T&gt;<wbr>_Second");
assert_eq!(&E("first_second").to_string(), "first<wbr>_second"); assert_eq!(&E("first_second").to_string(), "first<wbr>_second");
assert_eq!(&E("first:second").to_string(), "first:<wbr>second");
assert_eq!(&E("first::second").to_string(), "first::<wbr>second");
assert_eq!(&E("MY_CONSTANT").to_string(), "MY<wbr>_CONSTANT"); assert_eq!(&E("MY_CONSTANT").to_string(), "MY<wbr>_CONSTANT");
assert_eq!(&E("___________").to_string(), "___________");
// a string won't get wrapped if it's less than 8 bytes // a string won't get wrapped if it's less than 8 bytes
assert_eq!(&E("HashSet").to_string(), "HashSet"); assert_eq!(&E("HashSet").to_string(), "HashSet");
// an individual word won't get wrapped if it's less than 4 bytes // an individual word won't get wrapped if it's less than 4 bytes

View File

@ -558,7 +558,7 @@ fn tag_html<'a>(
display_fn(move |f| { display_fn(move |f| {
write!( write!(
f, f,
r#"<span class="stab {class}" title="{title}">{contents}</span>"#, r#"<wbr><span class="stab {class}" title="{title}">{contents}</span>"#,
title = Escape(title), title = Escape(title),
) )
}) })

View File

@ -586,12 +586,15 @@ ul.block, .block li {
} }
.sidebar h2 { .sidebar h2 {
text-wrap: balance;
overflow-wrap: anywhere; overflow-wrap: anywhere;
padding: 0; padding: 0;
margin: 0.7rem 0; margin: 0.7rem 0;
} }
.sidebar h3 { .sidebar h3 {
text-wrap: balance;
overflow-wrap: anywhere;
font-size: 1.125rem; /* 18px */ font-size: 1.125rem; /* 18px */
padding: 0; padding: 0;
margin: 0; margin: 0;
@ -2222,7 +2225,7 @@ in src-script.js and main.js
width: 33%; width: 33%;
} }
.item-table > li > div { .item-table > li > div {
word-break: break-all; overflow-wrap: anywhere;
} }
} }

View File

@ -31,6 +31,6 @@
</section> </section>
{% endif %} {% endif %}
{% if !path.is_empty() %} {% if !path.is_empty() %}
<h2><a href="{% if is_mod %}../{% endif %}index.html">In {{+ path}}</a></h2> <h2><a href="{% if is_mod %}../{% endif %}index.html">In {{+ path|wrapped|safe}}</a></h2>
{% endif %} {% endif %}
</div> </div>

View File

@ -27,7 +27,8 @@ compare-elements-position-near: (
".item-name .stab.deprecated", ".item-name .stab.deprecated",
{"y": 2}, {"y": 2},
) )
compare-elements-position: ( // "Unix" part is on second line
compare-elements-position-false: (
".item-name .stab.deprecated", ".item-name .stab.deprecated",
".item-name .stab.portability", ".item-name .stab.portability",
["y"], ["y"],