pub fn put(&mut self, x0: usize, s: &str) {
let w = Widths::new(s).sum::<usize>();
- dbg!(w);
let x1 = x0 + w;
if w == 0 {
// Nothing to do.
self.string.push_str(s);
self.width = x1;
} else {
+ dbg!(s);
+ dbg!(w);
dbg!(x0);
dbg!(x1);
let span = self.find_span(x0, x1);
if span.columns.start < x0 || span.columns.end > x1 {
let tail = self.string.split_off(span.offsets.end);
self.string.truncate(span.offsets.start);
- self.string.extend((span.offsets.start..x0).map(|_| '?'));
+ self.string.extend((span.columns.start..x0).map(|_| '?'));
self.string.push_str(s);
- self.string.extend((x1..span.offsets.end).map(|_| '?'));
+ self.string.extend((x1..span.columns.end).map(|_| '?'));
self.string.push_str(&tail);
} else {
self.string.replace_range(span.offsets, s);
}
fn find_span(&self, x0: usize, x1: usize) -> Position {
+ debug_assert!(x1 > x0);
let p0 = self.find_pos(x0);
- let p1 = self.find_pos(x1);
- if true || p0.columns.start >= x1 {
- Position {
- columns: p0.columns.start..p1.columns.start,
- offsets: p0.offsets.start..p1.offsets.start,
- }
- } else {
- Position {
- columns: p0.columns.start..p1.columns.end,
- offsets: p0.offsets.start..p1.offsets.end,
- }
+ let p1 = self.find_pos(x1 - 1);
+ dbg!(&p0);
+ dbg!(&p1);
+ Position {
+ columns: p0.columns.start..p1.columns.end,
+ offsets: p0.offsets.start..p1.offsets.end,
}
}
for top in all::<Emphasis>() {
let mut line = TextLine::new();
// Produces `?か??くけ?さ`.
+ // Produces `?か?うえお`.
line.put(0, &bottom.apply("あいうえお"));
line.put(1, &top.apply("か"));
//line.put(5, &top.apply("くけ"));
+ /*
assert_eq!(
line.str(),
&format!(
bottom.apply("さ")
),
"bottom={bottom:?} top={top:?}"
+ );*/
+ assert_eq!(
+ line.str(),
+ &format!("?{}?{}", top.apply("か"), bottom.apply("うえお"),),
+ "bottom={bottom:?} top={top:?}"
);
}
}