Fix linebreaking at the end of links

Fixes #2689
This commit is contained in:
Laurenz 2023-11-19 15:53:24 +01:00
parent 18cb3becb3
commit ea987ef4a3
3 changed files with 22 additions and 20 deletions

View File

@ -101,7 +101,7 @@ pub(crate) fn breakpoints<'a>(
let (link, _) = link_prefix(tail); let (link, _) = link_prefix(tail);
let end = last + link.len(); let end = last + link.len();
linebreak_link(link, |i| f(last + i, Breakpoint::Normal)); linebreak_link(link, |i| f(last + i, Breakpoint::Normal));
while iter.peek().map_or(false, |&p| p <= end) { while iter.peek().map_or(false, |&p| p < end) {
iter.next(); iter.next();
} }
} }
@ -206,7 +206,20 @@ fn linebreak_link(link: &str, mut f: impl FnMut(usize)) {
} }
let mut offset = 0; let mut offset = 0;
let mut emit = |end: usize| { let mut prev = Class::Other;
for (end, c) in link.char_indices() {
let class = Class::of(c);
// Emit opportunities when going from
// - other -> other
// - alphabetic -> numeric
// - numeric -> alphabetic
// Never before after opening delimiters.
if end > 0
&& prev != Class::Open
&& if class == Class::Other { prev == Class::Other } else { class != prev }
{
let piece = &link[offset..end]; let piece = &link[offset..end];
if piece.len() < 16 { if piece.len() < 16 {
// For bearably long segments, emit them as one. // For bearably long segments, emit them as one.
@ -220,28 +233,10 @@ fn linebreak_link(link: &str, mut f: impl FnMut(usize)) {
f(offset); f(offset);
} }
} }
};
let mut prev = Class::Other;
for (end, c) in link.char_indices() {
let class = Class::of(c);
// Emit opportunities when going from
// - other -> other
// - alphabetic -> numeric
// - numeric -> alphabetic
// Never before after opening delimiters.
if end > 0
&& prev != Class::Open
&& if class == Class::Other { prev == Class::Other } else { class != prev }
{
emit(end);
} }
prev = class; prev = class;
} }
emit(link.len());
} }
/// Whether hyphenation is enabled at the given offset. /// Whether hyphenation is enabled at the given offset.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 65 KiB

After

Width:  |  Height:  |  Size: 64 KiB

View File

@ -14,3 +14,10 @@
Here's a link https://url.com/data/extern12840%data_urlenc and then there are more Here's a link https://url.com/data/extern12840%data_urlenc and then there are more
links #link("www.url.com/data/extern12840%data_urlenc") in my text of links links #link("www.url.com/data/extern12840%data_urlenc") in my text of links
http://mydataurl/hash/12098541029831025981024980124124214/incremental/progress%linkdata_information_setup_my_link_just_never_stops_going/on?query=false http://mydataurl/hash/12098541029831025981024980124124214/incremental/progress%linkdata_information_setup_my_link_just_never_stops_going/on?query=false
---
// Ensure that there's no unconditional break at the end of a link.
#set page(width: 180pt, height: auto, margin: auto)
#set text(11pt)
For info see #link("https://myhost.tld").