From 96a182d5f172cef5a6a27bf6a6483263faae92af Mon Sep 17 00:00:00 2001 From: jonnyandrew Date: Mon, 2 Oct 2023 09:56:52 +0100 Subject: [PATCH 01/27] Replace paragraphs with line breaks in message output --- .../wysiwyg/src/dom/nodes/container_node.rs | 20 +++++++------------ .../wysiwyg/src/tests/test_to_message_html.rs | 4 ++-- 2 files changed, 9 insertions(+), 15 deletions(-) diff --git a/crates/wysiwyg/src/dom/nodes/container_node.rs b/crates/wysiwyg/src/dom/nodes/container_node.rs index 2a838f2d2..649ec3ff1 100644 --- a/crates/wysiwyg/src/dom/nodes/container_node.rs +++ b/crates/wysiwyg/src/dom/nodes/container_node.rs @@ -706,19 +706,10 @@ impl ContainerNode { ) { let as_message = true; assert!(matches!(self.kind, ContainerNodeKind::Paragraph)); - let name = self.name(); + self.fmt_children_html(formatter, selection_writer, state, as_message); - if self.is_empty() { - formatter.push('\n'); - } else { - self.fmt_tag_open(name, formatter, &self.attrs); - self.fmt_children_html( - formatter, - selection_writer, - state, - as_message, - ); - self.fmt_tag_close(name, formatter); + if !state.is_last_node_in_parent { + formatter.push("
"); } } @@ -1573,7 +1564,10 @@ mod test { #[test] fn paragraph_to_message_html() { let model = cm("

 

 

Hello!

 

|"); - assert_eq!(&model.state.dom.to_message_html(), "\n\n

Hello!

\n"); + assert_eq!( + &model.state.dom.to_message_html(), + "

Hello!
" + ); } #[test] diff --git a/crates/wysiwyg/src/tests/test_to_message_html.rs b/crates/wysiwyg/src/tests/test_to_message_html.rs index a9b5160a1..2ef46bbe8 100644 --- a/crates/wysiwyg/src/tests/test_to_message_html.rs +++ b/crates/wysiwyg/src/tests/test_to_message_html.rs @@ -15,7 +15,7 @@ use crate::tests::testutils_composer_model::{cm, tx}; #[test] -fn replaces_empty_paragraphs_with_newline_characters() { +fn outputs_paragraphs_as_line_breaks() { let mut model = cm("|"); model.replace_text("hello".into()); model.enter(); @@ -29,7 +29,7 @@ fn replaces_empty_paragraphs_with_newline_characters() { "

hello

 

 

 

Alice|

" ); let message_output = model.get_content_as_message_html(); - assert_eq!(message_output, "

hello

\n\n\n

Alice

"); + assert_eq!(message_output, "hello



Alice"); } #[test] From 156288019827959b3e684db585697aba9b4dc219 Mon Sep 17 00:00:00 2001 From: jonnyandrew Date: Mon, 2 Oct 2023 12:20:30 +0100 Subject: [PATCH 02/27] Parse line breaks to paragraphs --- .../wysiwyg/src/composer_model/new_lines.rs | 5 +- crates/wysiwyg/src/dom/parser/parse.rs | 379 ++++++++++++++++-- 2 files changed, 349 insertions(+), 35 deletions(-) diff --git a/crates/wysiwyg/src/composer_model/new_lines.rs b/crates/wysiwyg/src/composer_model/new_lines.rs index 90954b0e5..397bf868d 100644 --- a/crates/wysiwyg/src/composer_model/new_lines.rs +++ b/crates/wysiwyg/src/composer_model/new_lines.rs @@ -174,7 +174,10 @@ where Generic => { self.do_new_line_in_paragraph(first_leaf, block_location); } - _ => panic!("Unexpected kind block node with inline contents"), + _ => panic!( + "Unexpected kind {:?} with inline contents", + block_location.kind + ), } self.create_update_replace_all() } diff --git a/crates/wysiwyg/src/dom/parser/parse.rs b/crates/wysiwyg/src/dom/parser/parse.rs index 34c26f9da..dc66b8ef5 100644 --- a/crates/wysiwyg/src/dom/parser/parse.rs +++ b/crates/wysiwyg/src/dom/parser/parse.rs @@ -15,8 +15,8 @@ use regex::Regex; use crate::dom::dom_creation_error::HtmlParseError; -use crate::dom::nodes::dom_node::DomNodeKind::CodeBlock; -use crate::dom::nodes::ContainerNode; +use crate::dom::nodes::dom_node::DomNodeKind::{self}; +use crate::dom::nodes::{ContainerNode, ContainerNodeKind}; use crate::dom::Dom; use crate::{DomHandle, DomNode, UnicodeString}; @@ -69,7 +69,7 @@ mod sys { PaDomCreator::parse(html) .map(|pa_dom| { let dom = self.padom_to_dom(pa_dom); - post_process_code_blocks(dom) + post_process_blocks(dom) }) .map_err(|err| { self.padom_creation_error_to_html_parse_error(err) @@ -450,7 +450,19 @@ mod sys { #[test] fn parse_br_tag() { - assert_that!("
").roundtrips(); + let html = "
"; + let dom: Dom = + HtmlParser::default().parse(html).unwrap(); + let tree = dom.to_tree().to_string(); + assert_eq!( + tree, + indoc! { + r#" + + ├>p + └>p + "#} + ); } #[test] @@ -478,6 +490,245 @@ mod sys { ); } + #[test] + fn parse_line_breaks_none() { + let html = r#"foo"#; + let dom: Dom = + HtmlParser::default().parse(html).unwrap(); + let tree = dom.to_tree().to_string(); + assert_eq!( + tree, + indoc! { + r#" + + └>"foo" + "#} + ); + } + + #[test] + fn parse_line_breaks_br_end() { + let html = r#"foo
"#; + let dom: Dom = + HtmlParser::default().parse(html).unwrap(); + let tree = dom.to_tree().to_string(); + assert_eq!( + tree, + indoc! { + r#" + + ├>p + │ └>"foo" + └>p + "#} + ); + } + + #[test] + fn parse_line_breaks_br_start() { + let html = r#"
foo"#; + let dom: Dom = + HtmlParser::default().parse(html).unwrap(); + let tree = dom.to_tree().to_string(); + assert_eq!( + tree, + indoc! { + r#" + + ├>p + └>p + └>"foo" + "#} + ); + } + + #[test] + fn parse_line_breaks_br_before_inline_format() { + let html = "abc
def
gh
ijk"; + let dom: Dom = + HtmlParser::default().parse(html).unwrap(); + let tree = dom.to_tree().to_string(); + assert_eq!( + tree, + indoc! { + r#" + + ├>p + │ └>"abc" + ├>p + │ └>strong + │ └>"def" + └>p + ├>strong + │ └>"gh" + └>"ijk" + "#} + ); + } + + #[test] + fn parse_line_breaks_br_in_bold() { + let html = r#"foo
"#; + let dom: Dom = + HtmlParser::default().parse(html).unwrap(); + let tree = dom.to_tree().to_string(); + assert_eq!( + tree, + indoc! { + r#" + + ├>p + │ └>b + │ └>"foo" + └>p + └>b + "#} + ); + } + + #[test] + fn parse_line_breaks_br_in_code() { + let html = r#"
foo
"#; + let dom: Dom = + HtmlParser::default().parse(html).unwrap(); + let tree = dom.to_tree().to_string(); + assert_eq!( + tree, + indoc! { + r#" + + └>codeblock + ├>p + │ └>"foo" + └>p + "#} + ); + } + + #[test] + fn parse_line_breaks_br_in_quote() { + let html = r#"
foo
bar
"#; + let dom: Dom = + HtmlParser::default().parse(html).unwrap(); + let tree = dom.to_tree().to_string(); + assert_eq!( + tree, + indoc! { + r#" + + └>blockquote + ├>p + │ └>"foo" + ├>p + │ └>"bar" + └>p + "#} + ); + } + + #[test] + fn parse_line_breaks_br_in_list() { + let html = r#"
  • foo
    bar
"#; + let dom: Dom = + HtmlParser::default().parse(html).unwrap(); + let tree = dom.to_tree().to_string(); + assert_eq!( + tree, + indoc! { + r#" + + └>ul + └>li + ├>p + │ └>"foo" + ├>p + │ └>"bar" + └>p + "#} + ); + } + + #[test] + fn parse_line_breaks_br_in_p() { + let html = r#"

foo

"#; + let dom: Dom = + HtmlParser::default().parse(html).unwrap(); + let tree = dom.to_tree().to_string(); + assert_eq!( + tree, + indoc! { + r#" + + ├>p + │ └>"foo" + └>p + "#} + ); + } + + #[test] + fn parse_line_breaks_in_nested_p_in_blockquote() { + let html = r#"

foo
bar
foo

"#; + let dom: Dom = + HtmlParser::default().parse(html).unwrap(); + let tree = dom.to_tree().to_string(); + assert_eq!( + tree, + indoc! { + r#" + + └>blockquote + ├>p + │ └>b + │ └>"foo" + ├>p + │ ├>b + │ │ └>"bar" + │ └>i + │ └>"foo" + └>p + └>i + "#} + ); + } + + #[test] + fn parse_line_breaks_in_nested_blocks() { + let html = r#"

foo
bar
foo


  1. a
    b
"#; + let dom: Dom = + HtmlParser::default().parse(html).unwrap(); + let tree = dom.to_tree().to_string(); + assert_eq!( + tree, + indoc! { + r#" + + └>blockquote + ├>p + │ └>b + │ └>"foo" + ├>p + │ ├>b + │ │ └>"bar" + │ └>i + │ └>"foo" + ├>p + │ └>i + ├>codeblock + │ ├>p + │ └>p + └>ol + └>li + ├>p + │ └>b + │ └>"a" + └>p + └>b + └>"b" + "#} + ); + } + #[test] fn parse_code_block_roundtrips() { assert_that!( @@ -500,10 +751,8 @@ mod sys { "
Test
Code
" ); // Then these line breaks are post-processed and we get the actual paragraphs - let dom = post_process_code_blocks_lines( - dom, - &DomHandle::from_raw(vec![0]), - ); + let dom = + post_process_block_lines(dom, &DomHandle::from_raw(vec![0])); assert_eq!( dom.to_html().to_string(), "
Test\nCode
" @@ -616,67 +865,128 @@ mod sys { } } -fn post_process_code_blocks(mut dom: Dom) -> Dom { - let code_block_handles = find_code_block_handles(&dom); - for handle in code_block_handles.iter().rev() { - dom = post_process_code_blocks_lines(dom, handle); +fn post_process_blocks(mut dom: Dom) -> Dom { + let block_handles = find_block_handles(&dom); + for handle in block_handles.iter().rev() { + dom = post_process_block_lines(dom, handle); } dom } -fn find_code_block_handles(dom: &Dom) -> Vec { +fn find_block_handles(dom: &Dom) -> Vec { + // Get blocks that only contain inline nodes to process dom.iter() - .filter(|n| n.kind() == CodeBlock) + .filter(|n| { + n.is_block_node() + && !n + .as_container() + .unwrap() + .children() + .iter() + .any(|c| c.is_block_node()) + }) .map(|n| n.handle()) .collect() } -fn post_process_code_blocks_lines( +fn post_process_block_lines( mut dom: Dom, handle: &DomHandle, ) -> Dom { - assert_eq!(dom.lookup_node(handle).kind(), CodeBlock); + assert!(dom.lookup_node(handle).is_container_node()); let last_handle = dom.last_node_handle_in_sub_tree(handle); let mut next_handle = last_handle.clone(); let mut children = Vec::new(); - let mut line_break_handles = Vec::new(); - for node in dom.iter_from_handle(&last_handle).rev() { - if node.is_line_break() || node.handle() == *handle { - if node.handle() == next_handle { - line_break_handles.push(next_handle.next_sibling()); + let mut line_handles: Vec = Vec::new(); + let mut line_break_handles: Vec> = Vec::new(); + + // All the leaf nodes and the root container + let nodes = dom + .iter_from_handle(&last_handle) + .filter(|n| n.is_leaf() || n.handle() == *handle) + .rev(); + + for node in nodes { + if node.is_line_break() { + let next_line = if node.handle() == last_handle { + last_handle.next_sibling() } else { - line_break_handles.push(next_handle.clone()); - } + next_handle.clone() + }; + + line_break_handles.push(Some(node.handle())); + line_handles.push(next_line); + } else if node.handle() == *handle { + line_break_handles.push(None); + line_handles.push(next_handle.clone()); } next_handle = node.handle(); - if node.handle().depth() <= handle.depth() { + + // After handling the container, stop + if node.handle().depth() == handle.depth() { break; } } - for line_break_handle in line_break_handles { + if line_handles.len() <= 1 // line_handles always contains at least the container + // Code blocks need inline content to be wrapped in a paragraph + && dom.lookup_node(handle).kind() != DomNodeKind::CodeBlock + { + // No line breaks, no need to do anything + return dom; + } + + let old_node = dom.lookup_node(handle).as_container().unwrap(); + let new_node = match old_node.kind() { + ContainerNodeKind::Paragraph => None, + _ => Some(old_node.clone_with_new_children(vec![])), + }; + + for (i, line_handle) in line_handles.iter().enumerate() { let mut sub_tree = - dom.split_sub_tree_from(&line_break_handle, 0, handle.depth()); - if line_break_handle.index_in_parent() > 0 { - // Remove line break too - dom.remove(&line_break_handle.prev_sibling()); + dom.split_sub_tree_from(line_handle, 0, handle.depth()); + + if let Some(line_break_handle) = &line_break_handles[i] { + dom.remove(line_break_handle); } - let node = - DomNode::new_paragraph(sub_tree.document_mut().remove_children()); + + // Create a paragraph if it doesn't already exist + let node = if sub_tree.children().get(0).map(|n| n.kind()) + == Some(DomNodeKind::Paragraph) + { + sub_tree.document_mut().remove_children().remove(0) + } else { + DomNode::new_paragraph(sub_tree.document_mut().remove_children()) + }; + children.insert(0, node); } + if handle.is_root() { + return Dom::new(children); + } + let needs_removal = if dom.contains(handle) { let block = dom.lookup_node(handle); - block.kind() == CodeBlock && block.is_empty() + block.is_empty() } else { false }; + if needs_removal { dom.remove(handle); } - dom.insert_at(handle, DomNode::new_code_block(children)); + match new_node { + Some(mut n) => { + n.set_handle(handle.clone()); + n.append_children(children); + dom.insert_at(handle, DomNode::Container(n)); + } + None => { + dom.insert(handle, children); + } + } dom } @@ -738,6 +1048,7 @@ fn convert_text( mod js { use super::*; use crate::dom::nodes::dom_node::DomNodeKind; + use crate::dom::nodes::dom_node::DomNodeKind::CodeBlock; use crate::{ dom::nodes::{ContainerNode, DomNode}, InlineFormatType, ListType, @@ -802,7 +1113,7 @@ mod js { self.convert_container(nodes, dom_document)?; - dom = post_process_code_blocks(dom); + dom = post_process_blocks(dom); Ok(dom) } From 07aa46aa6345662699c261a050d4d77c141087a2 Mon Sep 17 00:00:00 2001 From: jonnyandrew Date: Tue, 3 Oct 2023 16:01:09 +0100 Subject: [PATCH 03/27] Update rendering tests --- crates/wysiwyg/src/tests/test_to_markdown.rs | 53 ++++++++++--------- .../wysiwyg/src/tests/test_to_plain_text.rs | 21 +++++--- crates/wysiwyg/src/tests/test_to_tree.rs | 7 +-- 3 files changed, 47 insertions(+), 34 deletions(-) diff --git a/crates/wysiwyg/src/tests/test_to_markdown.rs b/crates/wysiwyg/src/tests/test_to_markdown.rs index c993d9bba..0266818a9 100644 --- a/crates/wysiwyg/src/tests/test_to_markdown.rs +++ b/crates/wysiwyg/src/tests/test_to_markdown.rs @@ -44,17 +44,17 @@ fn text_with_ascii_punctuation() { #[test] fn text_with_linebreaks() { // One new line. - assert_to_message_md( + assert_to_message_md_no_roundtrip( "abc
def", - r#"abc\ + r#"abc def"#, ); // Two new lines (isn't transformed into a new block). - assert_to_message_md( + assert_to_message_md_no_roundtrip( "abc

def", - r#"abc\ -\ + r#"abc + def"#, ); } @@ -63,12 +63,12 @@ def"#, fn text_with_italic() { assert_to_message_md("abc", "*abc*"); assert_to_message_md("abc def ghi", "abc *def* ghi"); - assert_to_message_md( + assert_to_message_md_no_roundtrip( "abc line1
line2

line3
def", - r#"abc *line1\ -line2\ -\ -line3* def"#, + r#"abc *line1* +*line2* +** +*line3* def"#, ); // Intraword emphasis is restricted to `*` so it works here! @@ -82,12 +82,12 @@ line3* def"#, fn text_with_bold() { assert_to_message_md("abc", "__abc__"); assert_to_message_md("abc def ghi", "abc __def__ ghi"); - assert_to_message_md( + assert_to_message_md_no_roundtrip( "abc line1
line2

line3
def", - r#"abc __line1\ -line2\ -\ -line3__ def"#, + r#"abc __line1__ +__line2__ +____ +__line3__ def"#, ); // Intraword emphasis is restricted to `*` (simple emphasis, i.e. italic), @@ -108,10 +108,10 @@ fn text_with_italic_and_bold() { "abc def ghi", "*abc __def__* ghi", ); - assert_to_message_md( + assert_to_message_md_no_roundtrip( "abc line1
line2
def
", - r#"abc *__line1\ -line2__ def*"#, + r#"abc *__line1__* +*__line2__ def*"#, ); } @@ -119,12 +119,12 @@ line2__ def*"#, fn text_with_strikethrough() { assert_to_message_md("abc", "~~abc~~"); assert_to_message_md("abc def ghi", "abc ~~def~~ ghi"); - assert_to_message_md( + assert_to_message_md_no_roundtrip( "abc line1
line2

line3
def", - r#"abc ~~line1\ -line2\ -\ -line3~~ def"#, + r#"abc ~~line1~~ +~~line2~~ +~~~~ +~~line3~~ def"#, ); // Intraword strikethrough isn't supported in the specification. @@ -152,7 +152,7 @@ fn text_with_inline_code() { // It's impossible to get a line break inside an inline code with Markdown. assert_to_md_no_roundtrip( "abc line1
line2

line3
def", - "abc `` line1 line2 line3 `` def", + "abc `` line1 ``\n`` line2 ``\n`` ``\n`` line3 `` def", ); // Inline formatting inside an inline code is ignored. assert_to_md_no_roundtrip( @@ -292,6 +292,11 @@ fn assert_to_message_md(html: &str, expected_markdown: &str) { assert_eq!(html, expected_html); } +fn assert_to_message_md_no_roundtrip(html: &str, expected_markdown: &str) { + let markdown = to_message_markdown(html); + assert_eq!(markdown, expected_markdown); +} + fn assert_to_composer_md(html: &str, expected_markdown: &str) { let markdown = to_composer_markdown(html); assert_eq!(markdown, expected_markdown); diff --git a/crates/wysiwyg/src/tests/test_to_plain_text.rs b/crates/wysiwyg/src/tests/test_to_plain_text.rs index cec7200d8..e791e1237 100644 --- a/crates/wysiwyg/src/tests/test_to_plain_text.rs +++ b/crates/wysiwyg/src/tests/test_to_plain_text.rs @@ -31,7 +31,8 @@ fn text_with_linebreaks() { "abc
def", indoc! { r#"abc - def"# + def + "# }, ); @@ -41,7 +42,8 @@ fn text_with_linebreaks() { indoc! { r#"abc - def"# + def + "# }, ); } @@ -56,7 +58,8 @@ fn text_with_italic() { r#"abc line1 line2 - line3 def"# + line3 def + "# }, ); @@ -75,7 +78,8 @@ fn text_with_bold() { r#"abc line1 line2 - line3 def"# + line3 def + "# }, ); @@ -92,7 +96,8 @@ fn text_with_italic_and_bold() { "abc line1
line2
def
", indoc! { r#"abc line1 - line2 def"# + line2 def + "# }, ); } @@ -107,7 +112,8 @@ fn text_with_strikethrough() { r#"abc line1 line2 - line3 def"# + line3 def + "# }, ); } @@ -133,7 +139,8 @@ fn text_with_inline_code() { r#"abc line1 line2 - line3 def"# + line3 def + "# }, ); } diff --git a/crates/wysiwyg/src/tests/test_to_tree.rs b/crates/wysiwyg/src/tests/test_to_tree.rs index dc5880e09..0d79bcedd 100644 --- a/crates/wysiwyg/src/tests/test_to_tree.rs +++ b/crates/wysiwyg/src/tests/test_to_tree.rs @@ -56,9 +56,10 @@ fn br_within_text_shows_up_in_tree() { assert_eq!( model.state.dom.to_tree(), r#" -├>"a" -├>br -└>"b" +├>p +│ └>"a" +└>p + └>"b" "#, ); } From d7964e555c24aa35c2b848107309bc27e82e1c0d Mon Sep 17 00:00:00 2001 From: jonnyandrew Date: Wed, 4 Oct 2023 11:14:39 +0100 Subject: [PATCH 04/27] Fix deletion tests --- .../wysiwyg/src/composer_model/delete_text.rs | 26 +++++------ crates/wysiwyg/src/tests/test_deleting.rs | 44 ++++++++++--------- 2 files changed, 36 insertions(+), 34 deletions(-) diff --git a/crates/wysiwyg/src/composer_model/delete_text.rs b/crates/wysiwyg/src/composer_model/delete_text.rs index 3cbcd7bd0..009ef48f5 100644 --- a/crates/wysiwyg/src/composer_model/delete_text.rs +++ b/crates/wysiwyg/src/composer_model/delete_text.rs @@ -224,18 +224,12 @@ where }; } match self.state.dom.lookup_node_mut(&location.node_handle) { - // we should never be passed a container - DomNode::Container(_) => ComposerUpdate::keep(), - DomNode::LineBreak(_) => { - // for a linebreak, remove it if we started the operation from the whitespace - // char type, otherwise keep it - match start_type { - CharType::Whitespace => self.delete_to_cursor( - direction.increment(location.index_in_dom()), - ), - _ => ComposerUpdate::keep(), - } - } + DomNode::Container(_) | DomNode::LineBreak(_) => match start_type { + CharType::Whitespace => self.delete_to_cursor( + direction.increment(location.index_in_dom()), + ), + _ => ComposerUpdate::keep(), + }, DomNode::Mention(_) => self .delete_to_cursor(direction.increment(location.index_in_dom())), DomNode::Text(node) => { @@ -354,7 +348,13 @@ where ) -> Option { let node = self.state.dom.lookup_node(&location.node_handle); match node { - DomNode::Container(_) => None, + DomNode::Container(node) => { + if node.is_empty() { + Some(CharType::Whitespace) + } else { + None + } + } DomNode::LineBreak(_) => { // we have to treat linebreaks as chars, this type fits best Some(CharType::Whitespace) diff --git a/crates/wysiwyg/src/tests/test_deleting.rs b/crates/wysiwyg/src/tests/test_deleting.rs index b90511d49..8e7571c4b 100644 --- a/crates/wysiwyg/src/tests/test_deleting.rs +++ b/crates/wysiwyg/src/tests/test_deleting.rs @@ -232,7 +232,7 @@ fn deleting_a_newline_deletes_it() { let mut model = cm("abc|
def"); model.delete(); model.delete(); - assert_eq!(tx(&model), "abc|ef"); + assert_eq!(tx(&model), "

abc|ef

"); model.state.dom.explicitly_assert_invariants(); } @@ -294,7 +294,7 @@ fn test_backspace_complex_grapheme() { fn deleting_initial_text_node_removes_it_completely_without_crashing() { let mut model = cm("abc
def
gh|"); model.delete_in(4, 10); - assert_eq!(tx(&model), "abc
|",); + assert_eq!(tx(&model), "

abc

 |

",); model.state.dom.explicitly_assert_invariants(); } @@ -302,7 +302,7 @@ fn deleting_initial_text_node_removes_it_completely_without_crashing() { fn deleting_initial_text_node_via_selection_removes_it_completely() { let mut model = cm("abc
{def
gh}|"); model.delete(); - assert_eq!(tx(&model), "abc
|",); + assert_eq!(tx(&model), "

abc

 |

",); model.state.dom.explicitly_assert_invariants(); } @@ -310,7 +310,7 @@ fn deleting_initial_text_node_via_selection_removes_it_completely() { fn deleting_all_initial_text_and_merging_later_text_produces_one_text_node() { let mut model = cm("abc
{def
gh}|ijk"); model.delete(); - assert_eq!(tx(&model), "abc
|ijk",); + assert_eq!(tx(&model), "

abc

|ijk

",); model.state.dom.explicitly_assert_invariants(); } @@ -318,7 +318,7 @@ fn deleting_all_initial_text_and_merging_later_text_produces_one_text_node() { fn deleting_all_initial_text_within_a_tag_preserves_the_tag() { let mut model = cm("abc
{def
gh}|ijk
"); model.delete(); - assert_eq!(tx(&model), "abc
|ijk",); + assert_eq!(tx(&model), "

abc

|ijk

",); model.state.dom.explicitly_assert_invariants(); } @@ -326,7 +326,7 @@ fn deleting_all_initial_text_within_a_tag_preserves_the_tag() { fn deleting_all_text_within_a_tag_deletes_the_tag() { let mut model = cm("abc
{def
gh}|
ijk"); model.delete(); - assert_eq!(tx(&model), "abc
|ijk",); + assert_eq!(tx(&model), "

abc

|ijk

",); model.state.dom.explicitly_assert_invariants(); } @@ -595,73 +595,75 @@ fn html_delete_word_removes_runs_of_non_word_characters_and_whitespace() { fn html_backspace_word_removes_single_linebreak() { let mut model = cm("
|"); model.backspace_word(); - assert_eq!(tx(&model), "|") + assert_eq!(restore_whitespace(&tx(&model)), "

|

") } #[test] fn html_delete_word_removes_single_linebreak() { let mut model = cm("|
"); model.delete_word(); - assert_eq!(restore_whitespace(&tx(&model)), "|") + assert_eq!(restore_whitespace(&tx(&model)), "

|

") } #[test] fn html_backspace_word_removes_only_one_linebreak_of_many() { let mut model = cm("

|
"); model.backspace_word(); - assert_eq!(tx(&model), "
|
"); + assert_eq!(tx(&model), "

 

 |

 

"); model.backspace_word(); - assert_eq!(tx(&model), "|
") + assert_eq!(tx(&model), "

 |

 

"); } #[test] fn html_delete_word_removes_only_one_linebreak_of_many() { let mut model = cm("
|

"); model.delete_word(); - assert_eq!(restore_whitespace(&tx(&model)), "
|
"); + assert_eq!(restore_whitespace(&tx(&model)), "

|

"); model.delete_word(); - assert_eq!(restore_whitespace(&tx(&model)), "
|") + assert_eq!(restore_whitespace(&tx(&model)), "

|

"); } #[test] fn html_backspace_word_does_not_remove_past_linebreak_in_word() { let mut model = cm("a
defg|"); model.backspace_word(); - assert_eq!(tx(&model), "a
|") + assert_eq!(tx(&model), "

a

 |

") } #[test] fn html_delete_word_does_not_remove_past_linebreak_in_word() { let mut model = cm("|abcd
f "); model.delete_word(); - assert_eq!(restore_whitespace(&tx(&model)), "|
f ") + assert_eq!(restore_whitespace(&tx(&model)), "

|

f

") } +#[ignore] // FIXME #[test] fn html_backspace_word_at_linebreak_removes_linebreak() { let mut model = cm("abc
|"); model.backspace_word(); - assert_eq!(restore_whitespace(&tx(&model)), "abc |"); + assert_eq!(restore_whitespace(&tx(&model)), "

abc

|

"); } #[test] fn html_delete_word_at_linebreak_removes_linebreak() { let mut model = cm("|
abc"); model.delete_word(); - assert_eq!(restore_whitespace(&tx(&model)), "| abc"); + assert_eq!(restore_whitespace(&tx(&model)), "

| abc

"); } +#[ignore] // FIXME #[test] fn html_backspace_word_removes_past_linebreak_in_whitespace() { let mut model = cm("abc
|"); model.backspace_word(); - assert_eq!(restore_whitespace(&tx(&model)), "abc |"); + assert_eq!(restore_whitespace(&tx(&model)), "

abc |

"); model.backspace_word(); - assert_eq!(restore_whitespace(&tx(&model)), "|"); + assert_eq!(restore_whitespace(&tx(&model)), "

|

"); } #[test] fn html_delete_word_removes_past_linebreak_in_whitespace() { let mut model = cm("|
abc"); model.delete_word(); - assert_eq!(restore_whitespace(&tx(&model)), "| abc"); + assert_eq!(restore_whitespace(&tx(&model)), "

| abc

"); model.delete_word(); - assert_eq!(restore_whitespace(&tx(&model)), "|"); + assert_eq!(restore_whitespace(&tx(&model)), "

|

"); } #[test] @@ -857,7 +859,7 @@ fn html_delete_word_for_empty_list_item() { model.delete_word(); assert_eq!( restore_whitespace(&tx(&model)), - "
  1. 1
  2. |
  3. 123
" + "
  1. 1
  2. |123
" ); } From 536a4b4c98f1569a42b7f87f9cf6209a800c7067 Mon Sep 17 00:00:00 2001 From: jonnyandrew Date: Wed, 4 Oct 2023 11:41:36 +0100 Subject: [PATCH 05/27] Update find range tests --- crates/wysiwyg/src/dom/find_extended_range.rs | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/crates/wysiwyg/src/dom/find_extended_range.rs b/crates/wysiwyg/src/dom/find_extended_range.rs index 2206e7fa2..76c2a7275 100644 --- a/crates/wysiwyg/src/dom/find_extended_range.rs +++ b/crates/wysiwyg/src/dom/find_extended_range.rs @@ -146,7 +146,10 @@ mod test { #[test] fn find_extended_selection_stops_at_leading_trailing_line_breaks() { let dom = cm("abc
def
ghi|").state.dom; - assert_eq!(dom.find_extended_selection(5, 6), (3, 8)); + + assert_eq!(dom.find_extended_selection(1, 2), (0, 3)); + assert_eq!(dom.find_extended_selection(5, 6), (4, 7)); + assert_eq!(dom.find_extended_selection(9, 10), (8, 11)); } #[test] @@ -166,8 +169,8 @@ mod test { #[test] fn find_extended_selection_stops_immediately_on_selected_linebreaks() { let dom = cm("abc
def
ghi|").state.dom; - assert_eq!(dom.find_extended_selection(3, 8), (3, 8)); - assert_eq!(dom.find_extended_selection(4, 6), (3, 8)); + assert_eq!(dom.find_extended_selection(4, 7), (4, 7)); + assert_eq!(dom.find_extended_selection(5, 6), (4, 7)); } #[test] From 15f4166a73611e277b6766218e5b8d8000c1b31c Mon Sep 17 00:00:00 2001 From: jonnyandrew Date: Wed, 4 Oct 2023 12:26:53 +0100 Subject: [PATCH 06/27] Update inline code tests --- .../wysiwyg/src/composer_model/format_inline_code.rs | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/crates/wysiwyg/src/composer_model/format_inline_code.rs b/crates/wysiwyg/src/composer_model/format_inline_code.rs index d7f461273..eb1f1afc0 100644 --- a/crates/wysiwyg/src/composer_model/format_inline_code.rs +++ b/crates/wysiwyg/src/composer_model/format_inline_code.rs @@ -218,7 +218,10 @@ mod test { fn inline_code_with_formatting_preserves_line_breaks() { let mut model = cm("{bold
text}|"); model.inline_code(); - assert_eq!(tx(&model), "{bold
text}|
"); + assert_eq!( + tx(&model), + "

{bold

text}|

" + ); } #[test] @@ -249,7 +252,8 @@ mod test { model.inline_code(); assert_eq!( tx(&model), - "bo{ld
te}|
xt" + "

bo{ld

te}|xt

", + ); } @@ -260,7 +264,7 @@ mod test { model.inline_code(); assert_eq!( tx(&model), - "bo{ld
te}|
xt" + "

bo{ld

te}|xt

", ); } @@ -328,7 +332,7 @@ mod test { fn unformat_inline_code_same_row_with_line_breaks() { let mut model = cm("{bold
text}|
"); model.inline_code(); - assert_eq!(tx(&model), "{bold
text}|"); + assert_eq!(tx(&model), "

{bold

text}|

"); } #[test] From 983a4369bd590f157baad1d6cb08c1f1f7262e9b Mon Sep 17 00:00:00 2001 From: jonnyandrew Date: Wed, 4 Oct 2023 13:43:53 +0100 Subject: [PATCH 07/27] Update example format tests --- .../src/composer_model/example_format.rs | 147 +++++++++++++----- 1 file changed, 109 insertions(+), 38 deletions(-) diff --git a/crates/wysiwyg/src/composer_model/example_format.rs b/crates/wysiwyg/src/composer_model/example_format.rs index 867abd3e5..ebaf7c9f8 100644 --- a/crates/wysiwyg/src/composer_model/example_format.rs +++ b/crates/wysiwyg/src/composer_model/example_format.rs @@ -591,24 +591,95 @@ mod test { #[test] fn cm_creates_correct_component_model_newlines() { - let t0 = cm("|
"); - assert_eq!(t0.state.start, 0); - assert_eq!(t0.state.end, 0); - assert_eq!(t0.get_content_as_html(), utf16("
")); - // TODO: There should only be one node for the br tag - //assert_eq!(t0.state.dom.children().len(), 1); - - let t1 = cm("
|
"); - assert_eq!(t1.state.start, 1); - assert_eq!(t1.state.end, 1); - assert_eq!(t1.get_content_as_html(), utf16("

")); - // TODO: assert_eq!(t1.state.dom.children().len(), 2); - - let t2 = cm("

|"); - assert_eq!(t2.state.start, 2); - assert_eq!(t2.state.end, 2); - assert_eq!(t2.get_content_as_html(), utf16("

")); - // TODO: assert_eq!(t1.state.dom.children().len(), 2); + assert_eq!( + cm("
|").get_content_as_html(), + "

\u{a0}

\u{a0}

" + ); + assert_eq!( + cm("

|").get_content_as_html(), + "

\u{a0}

\u{a0}

\u{a0}

" + ); + assert_eq!( + cm("
|
").get_content_as_html(), + "

\u{a0}

\u{a0}

\u{a0}

" + ); + assert_eq!(cm("a
b|").get_content_as_html(), "

a

b

"); + assert_eq!( + cm("a
|
b").get_content_as_html(), + "

a

\u{a0}

b

" + ); + assert_eq!( + cm("a
b|
c").get_content_as_html(), + "

a

b

c

" + ); + assert_eq!( + cm("a
|b
c").get_content_as_html(), + "

a

b

c

" + ); + assert_eq!( + cm("a
|b
c
").get_content_as_html(), + "

a

b

c

" + ); + assert_eq!( + cm("|
").get_content_as_html(), + "

\u{a0}

\u{a0}

" + ); + assert_eq!( + cm("aaa
|bbb").get_content_as_html(), + "

aaa

bbb

" + ); + assert_eq!( + cm("aaa|
bbb").get_content_as_html(), + "

aaa

bbb

" + ); + assert_eq!( + cm("aa{a
b}|bb").get_content_as_html(), + "

aaa

bbb

" + ); + assert_eq!(cm("aa{a
b}|bb").state.start, 2); + assert_eq!(cm("aa{a
b}|bb").state.end, 5); + assert_eq!( + cm("aa|{a
b}bb").get_content_as_html(), + "

aaa

bbb

" + ); + assert_eq!(cm("aa|{a
b}bb").state.start, 5); + assert_eq!(cm("aa|{a
b}bb").state.end, 2); + assert_eq!( + cm("aa{
b}|bb").get_content_as_html(), + "

aa

bbb

" + ); + assert_eq!(cm("aa{
b}|bb").state.start, 2); + assert_eq!(cm("aa{
b}|bb").state.end, 4); + assert_eq!( + cm("aa|{
b}bb").get_content_as_html(), + "

aa

bbb

" + ); + assert_eq!(cm("aa|{
b}bb").state.start, 4); + assert_eq!(cm("aa|{
b}bb").state.end, 2); + assert_eq!( + cm("aa{a
b}|bb").get_content_as_html(), + "

aaa

bbb

" + ); + assert_eq!(cm("aa{a
b}|bb").state.start, 2); + assert_eq!(cm("aa{a
b}|bb").state.end, 5); + assert_eq!( + cm("aa|{a
}bb").get_content_as_html(), + "

aaa

bb

" + ); + assert_eq!(cm("aa|{a
}bb").state.start, 4); + assert_eq!(cm("aa|{a
}bb").state.end, 2); + assert_eq!( + cm("aa{
}|bb").get_content_as_html(), + "

aa

bb

" + ); + assert_eq!(cm("aa{
}|bb").state.start, 2); + assert_eq!(cm("aa{
}|bb").state.end, 3); + assert_eq!( + cm("aa|{
}bb").get_content_as_html(), + "

aa

bb

" + ); + assert_eq!(cm("aa|{
}bb").state.start, 3); + assert_eq!(cm("aa|{
}bb").state.end, 2); } #[test] @@ -814,27 +885,27 @@ mod test { assert_that!("AAAB{BBC}|CC").roundtrips(); assert_that!("AAAB|{BBC}CC").roundtrips(); assert_that!("
  • ~|
").roundtrips(); - assert_that!("
|").roundtrips(); - assert_that!("

|").roundtrips(); - assert_that!("
|
").roundtrips(); - assert_that!("
|
").roundtrips(); - assert_that!("a
b|").roundtrips(); - assert_that!("a
|
b").roundtrips(); - assert_that!("a
b|
c").roundtrips(); - assert_that!("a
|b
c").roundtrips(); - assert_that!("a
|b
c
").roundtrips(); - assert_that!("|
").roundtrips(); - assert_that!("aaa
|bbb").roundtrips(); - assert_that!("aaa|
bbb").roundtrips(); - assert_that!("aa{a
b}|bb").roundtrips(); - assert_that!("aa|{a
b}bb").roundtrips(); - assert_that!("aa{
b}|bb").roundtrips(); - assert_that!("aa|{
b}bb").roundtrips(); - assert_that!("aa{a
b}|bb").roundtrips(); - assert_that!("aa|{a
}bb").roundtrips(); - assert_that!("aa{
}|bb").roundtrips(); - assert_that!("aa|{
}bb").roundtrips(); assert_that!("
  1. a|
").roundtrips(); + assert_that!("

aa{a

b}|bb

").roundtrips(); + assert_that!("

aa|{a}

bb

").roundtrips(); + assert_that!("

|

").roundtrips(); + assert_that!("

|

").roundtrips(); + assert_that!("

a

b|

").roundtrips(); + assert_that!("

a

|b

").roundtrips(); + assert_that!("

a

b|

c

").roundtrips(); + assert_that!("

a

|b

c

").roundtrips(); + assert_that!("

a

|b

c

") + .roundtrips(); + assert_that!("

|

").roundtrips(); + assert_that!("

aaa

|bbb

").roundtrips(); + assert_that!("

aaa|

bbb

").roundtrips(); + assert_that!("

aa{a

b}|bb

").roundtrips(); + assert_that!("

aa|{a

b}bb

").roundtrips(); + assert_that!("

aa

{b}|bb

").roundtrips(); + assert_that!("

aa

|{b}bb

").roundtrips(); + assert_that!("

aa|{a}

bb

").roundtrips(); + assert_that!("

aa

|bb

").roundtrips(); + assert_that!("

aa|

bb

").roundtrips(); } #[test] From 0268f47ca5512ac7f4abdf7088a66d708ac2f76a Mon Sep 17 00:00:00 2001 From: jonnyandrew Date: Wed, 4 Oct 2023 14:12:20 +0100 Subject: [PATCH 08/27] Update paragraphs tests --- crates/wysiwyg/src/tests/test_paragraphs.rs | 27 ++++++++++++--------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/crates/wysiwyg/src/tests/test_paragraphs.rs b/crates/wysiwyg/src/tests/test_paragraphs.rs index f9106457e..f2f40d3ef 100644 --- a/crates/wysiwyg/src/tests/test_paragraphs.rs +++ b/crates/wysiwyg/src/tests/test_paragraphs.rs @@ -19,6 +19,8 @@ use crate::{ ComposerModel, }; +use super::testutils_conversion::utf16; + #[test] #[allow(deprecated)] fn pressing_enter_with_a_brand_new_model() { @@ -30,8 +32,8 @@ fn pressing_enter_with_a_brand_new_model() { #[test] #[allow(deprecated)] fn adding_line_break_after_replacing_with_empty_html() { - let mut model = ComposerModel::new(); - model.set_content_from_html(&Utf16String::new()).unwrap(); + let mut model = ComposerModel::::new(); + model.set_content_from_html(&utf16("")).unwrap(); model.add_line_break(); assert_eq!(tx(&model), "
|"); } @@ -98,14 +100,17 @@ fn multiple_line_breaks_can_be_added() { } #[test] -fn can_place_cursor_inside_brs_and_delete() { +fn can_place_cursor_inside_brs_and_backspace() { let mut model = cm("123
|
abc"); model.backspace(); - assert_eq!(tx(&model), "123|
abc"); + assert_eq!(tx(&model), "

123|

abc

"); +} +#[test] +fn can_place_cursor_inside_brs_and_delete() { let mut model = cm("123
|
abc"); model.delete(); - assert_eq!(tx(&model), "123
|abc"); + assert_eq!(tx(&model), "

123

|abc

"); } #[test] @@ -120,21 +125,21 @@ fn can_add_line_break_on_later_lines() { fn backspace_to_beginning_of_line() { let mut model = cm("123
a|bc"); model.backspace(); - assert_eq!(tx(&model), "123
|bc"); + assert_eq!(tx(&model), "

123

|bc

"); } #[test] fn backspace_deletes_br() { let mut model = cm("123
|abc"); model.backspace(); - assert_eq!(tx(&model), "123|abc"); + assert_eq!(tx(&model), "

123|abc

"); } #[test] fn delete_deletes_br() { let mut model = cm("123|
abc"); model.delete(); - assert_eq!(tx(&model), "123|abc"); + assert_eq!(tx(&model), "

123|abc

"); } #[test] @@ -161,14 +166,14 @@ fn can_backspace_to_beginning_after_adding_a_line_break() { fn test_replace_text_in_first_line_with_line_break() { let mut model = cm("{AAA}|
BBB"); model.add_line_break(); - assert_eq!(tx(&model), "
|
BBB"); + assert_eq!(tx(&model), "

 

|BBB


"); } #[test] fn backspace_merges_text_nodes() { let mut model = cm("a
|b"); model.backspace(); - assert_eq!(tx(&model), "a|b"); + assert_eq!(tx(&model), "

a|b

"); // The two text nodes were merged assert_eq!(model.state.dom.document().children().len(), 1); } @@ -177,7 +182,7 @@ fn backspace_merges_text_nodes() { fn backspace_merges_formatting_nodes() { let mut model = cm("a
|b"); model.backspace(); - assert_eq!(tx(&model), "a|b"); + assert_eq!(tx(&model), "

a|b

"); } #[test] From e6537e3ec46c6ca6cf8ead825467aab55f3c6777 Mon Sep 17 00:00:00 2001 From: jonnyandrew Date: Wed, 4 Oct 2023 14:23:25 +0100 Subject: [PATCH 09/27] Update mentions tests --- crates/wysiwyg/src/tests/test_mentions.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/crates/wysiwyg/src/tests/test_mentions.rs b/crates/wysiwyg/src/tests/test_mentions.rs index 9e4d35cb0..793e6c7e5 100644 --- a/crates/wysiwyg/src/tests/test_mentions.rs +++ b/crates/wysiwyg/src/tests/test_mentions.rs @@ -168,7 +168,7 @@ fn linebreak_insert_before() { insert_mention_at_cursor(&mut model); assert_eq!( tx(&model), - "Alice|
", + "

Alice |

 

", ); } @@ -178,7 +178,7 @@ fn linebreak_insert_after() { insert_mention_at_cursor(&mut model); assert_eq!( tx(&model), - "
Alice |", + "

 

Alice |

", ); } From efd2aed98fe6a7b724fde5c12af6d5b910f963b2 Mon Sep 17 00:00:00 2001 From: jonnyandrew Date: Wed, 4 Oct 2023 14:26:06 +0100 Subject: [PATCH 10/27] Update quotes tests --- crates/wysiwyg/src/composer_model/quotes.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/crates/wysiwyg/src/composer_model/quotes.rs b/crates/wysiwyg/src/composer_model/quotes.rs index 55ac7d407..2bcef20a7 100644 --- a/crates/wysiwyg/src/composer_model/quotes.rs +++ b/crates/wysiwyg/src/composer_model/quotes.rs @@ -240,7 +240,7 @@ mod test { model.quote(); assert_eq!( tx(&model), - "

Some |text


Next line
" + "

Some |text

Next line

" ) } @@ -263,7 +263,7 @@ mod test { model.quote(); assert_eq!( tx(&model), - "
  • Some {text
    Next line
  • Second}| item
  • Third item
" + "
  • Some {text

    Next line

  • Second}| item
  • Third item
" ) } From b5310c1aa7dce3083ff2e7580c84c35dc6cdc3ed Mon Sep 17 00:00:00 2001 From: jonnyandrew Date: Wed, 4 Oct 2023 14:33:52 +0100 Subject: [PATCH 11/27] Update wrap in block tests --- crates/wysiwyg/src/dom/dom_block_nodes.rs | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/crates/wysiwyg/src/dom/dom_block_nodes.rs b/crates/wysiwyg/src/dom/dom_block_nodes.rs index 36af36906..a9f600c95 100644 --- a/crates/wysiwyg/src/dom/dom_block_nodes.rs +++ b/crates/wysiwyg/src/dom/dom_block_nodes.rs @@ -208,9 +208,10 @@ mod test { let model = cm("Some text| and bold
and italic"); let (s, e) = model.safe_selection(); let ret = model.state.dom.find_nodes_to_wrap_in_block(s, e).unwrap(); - assert_eq!(ret.ancestor_handle, DomHandle::from_raw(Vec::new())); - assert_eq!(ret.start_handle, DomHandle::from_raw(vec![0])); - assert_eq!(ret.end_handle, DomHandle::from_raw(vec![1, 0])); + //
has been converted to

hence the extra depth + assert_eq!(ret.ancestor_handle, DomHandle::from_raw(vec![])); + assert_eq!(ret.start_handle, DomHandle::from_raw(vec![0, 0])); + assert_eq!(ret.end_handle, DomHandle::from_raw(vec![0, 1, 0])); } #[test] @@ -218,9 +219,10 @@ mod test { let model = cm("Some text
and bold |and italic"); let (s, e) = model.safe_selection(); let ret = model.state.dom.find_nodes_to_wrap_in_block(s, e).unwrap(); - assert_eq!(ret.ancestor_handle, DomHandle::from_raw(Vec::new())); - assert_eq!(ret.start_handle, DomHandle::from_raw(vec![2, 0])); - assert_eq!(ret.end_handle, DomHandle::from_raw(vec![3, 0])); + //
has been converted to

hence the extra depth + assert_eq!(ret.ancestor_handle, DomHandle::from_raw(vec![])); + assert_eq!(ret.start_handle, DomHandle::from_raw(vec![1, 0, 0])); + assert_eq!(ret.end_handle, DomHandle::from_raw(vec![1, 1, 0])); } #[test] @@ -242,9 +244,10 @@ mod test { ); let (s, e) = model.safe_selection(); let ret = model.state.dom.find_nodes_to_wrap_in_block(s, e).unwrap(); - assert_eq!(ret.ancestor_handle, DomHandle::from_raw(vec![0, 0])); - assert_eq!(ret.start_handle, DomHandle::from_raw(vec![0, 0, 3, 0])); - assert_eq!(ret.end_handle, DomHandle::from_raw(vec![0, 0, 3, 0])); + //
has been converted to

hence the extra depth + assert_eq!(ret.ancestor_handle, DomHandle::from_raw(vec![0, 0, 1])); + assert_eq!(ret.start_handle, DomHandle::from_raw(vec![0, 0, 1, 0, 0])); + assert_eq!(ret.end_handle, DomHandle::from_raw(vec![0, 0, 1, 0, 0])); } #[test] From a0bd138bf3c801069ecac534d57a64401272bf3f Mon Sep 17 00:00:00 2001 From: jonnyandrew Date: Wed, 4 Oct 2023 14:37:46 +0100 Subject: [PATCH 12/27] Update wrap in list tests --- crates/wysiwyg/src/dom/dom_list_methods.rs | 30 +++------------------- 1 file changed, 3 insertions(+), 27 deletions(-) diff --git a/crates/wysiwyg/src/dom/dom_list_methods.rs b/crates/wysiwyg/src/dom/dom_list_methods.rs index 46946095a..406c29626 100644 --- a/crates/wysiwyg/src/dom/dom_list_methods.rs +++ b/crates/wysiwyg/src/dom/dom_list_methods.rs @@ -221,11 +221,7 @@ mod test { .dom; dom.wrap_nodes_in_list( ListType::Ordered, - vec![ - &DomHandle::from_raw(vec![0]), - &DomHandle::from_raw(vec![1]), - &DomHandle::from_raw(vec![2]), - ], + vec![&DomHandle::from_raw(vec![0]), &DomHandle::from_raw(vec![1])], ); assert_eq!( ds(&dom), @@ -242,11 +238,7 @@ mod test { let mut dom = cm("abc
def|").state.dom; dom.wrap_nodes_in_list( ListType::Ordered, - vec![ - &DomHandle::from_raw(vec![0]), - &DomHandle::from_raw(vec![1]), - &DomHandle::from_raw(vec![2]), - ], + vec![&DomHandle::from_raw(vec![0]), &DomHandle::from_raw(vec![1])], ); assert_eq!(ds(&dom), "

  1. abc
  2. def
"); @@ -263,8 +255,6 @@ mod test { &DomHandle::from_raw(vec![0]), &DomHandle::from_raw(vec![1]), &DomHandle::from_raw(vec![2]), - &DomHandle::from_raw(vec![3]), - &DomHandle::from_raw(vec![4]), ], ); assert_eq!(ds(&dom), "
  1. abc
  2. def
  3. ghi
"); @@ -278,11 +268,7 @@ mod test { let mut dom = cm("abc
def|").state.dom; dom.wrap_nodes_in_list( ListType::Ordered, - vec![ - &DomHandle::from_raw(vec![0]), - &DomHandle::from_raw(vec![1]), - &DomHandle::from_raw(vec![2]), - ], + vec![&DomHandle::from_raw(vec![0]), &DomHandle::from_raw(vec![1])], ); assert_eq!(ds(&dom), "
  1. abc
  2. def
"); @@ -299,8 +285,6 @@ mod test { &DomHandle::from_raw(vec![0]), &DomHandle::from_raw(vec![1]), &DomHandle::from_raw(vec![2]), - &DomHandle::from_raw(vec![3]), - &DomHandle::from_raw(vec![4]), ], ); assert_eq!(ds(&dom), "
  1. abc
  2. def
  3. ghi
"); @@ -319,9 +303,6 @@ mod test { &DomHandle::from_raw(vec![1]), &DomHandle::from_raw(vec![2]), &DomHandle::from_raw(vec![3]), - &DomHandle::from_raw(vec![4]), - &DomHandle::from_raw(vec![5]), - &DomHandle::from_raw(vec![6]), ], ); assert_eq!( @@ -346,9 +327,6 @@ mod test { &DomHandle::from_raw(vec![1]), &DomHandle::from_raw(vec![2]), &DomHandle::from_raw(vec![3]), - &DomHandle::from_raw(vec![4]), - &DomHandle::from_raw(vec![5]), - &DomHandle::from_raw(vec![6]), ], ); assert_eq!( @@ -385,8 +363,6 @@ mod test { &DomHandle::from_raw(vec![0]), &DomHandle::from_raw(vec![1]), &DomHandle::from_raw(vec![2]), - &DomHandle::from_raw(vec![3]), - &DomHandle::from_raw(vec![4]), ], ); assert_eq!(ds(&dom), "
  1. abc
  2. def
  3. ghi
"); From 519bac42720f6b2f21d18f705e6dff3933adadd6 Mon Sep 17 00:00:00 2001 From: jonnyandrew Date: Wed, 4 Oct 2023 15:19:10 +0100 Subject: [PATCH 13/27] Update dom iterator tests --- crates/wysiwyg/src/dom/iter.rs | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/crates/wysiwyg/src/dom/iter.rs b/crates/wysiwyg/src/dom/iter.rs index 7010c7e98..662dbb090 100644 --- a/crates/wysiwyg/src/dom/iter.rs +++ b/crates/wysiwyg/src/dom/iter.rs @@ -433,7 +433,7 @@ mod test { text_nodes, vec![ "", "ul", "li", "'b'", "strong", "'c'", "li", "'foo'", "p", - "i", "'d'", "'e'", "br", "b", "'x'" + "i", "'d'", "'e'", "p", "b", "'x'" ] ); } @@ -464,7 +464,7 @@ mod test { #[test] fn can_walk_all_nodes_of_a_trailing_subtree() { let dom = cm(EXAMPLE_HTML).state.dom; - let sub_tree = dom.lookup_node(&DomHandle::from_raw(vec![1, 3])); + let sub_tree = dom.lookup_node(&DomHandle::from_raw(vec![2, 0])); let text_nodes: Vec = sub_tree.iter_subtree().map(node_txt).collect(); @@ -523,7 +523,7 @@ mod test { #[test] fn can_walk_all_text_nodes_of_a_trailing_subtree() { let dom = cm(EXAMPLE_HTML).state.dom; - let sub_tree = &dom.lookup_node(&DomHandle::from_raw(vec![1, 3])); + let sub_tree = &dom.lookup_node(&DomHandle::from_raw(vec![2, 0])); let text_nodes: Vec = sub_tree .iter_text_in_subtree() .map(|text| text.data().to_string()) @@ -559,7 +559,7 @@ mod test { text_nodes, vec![ "ul", "li", "'b'", "strong", "'c'", "li", "'foo'", "p", "i", - "'d'", "'e'", "br", "b", "'x'" + "'d'", "'e'", "p", "b", "'x'" ] ) } @@ -573,9 +573,7 @@ mod test { assert_eq!( text_nodes, - vec![ - "'c'", "li", "'foo'", "p", "i", "'d'", "'e'", "br", "b", "'x'" - ] + vec!["'c'", "li", "'foo'", "p", "i", "'d'", "'e'", "p", "b", "'x'"] ) } @@ -589,7 +587,7 @@ mod test { text_nodes, vec![ "", "ul", "li", "'b'", "strong", "'c'", "li", "'foo'", "p", - "i", "'d'", "'e'", "br", "b", "'x'" + "i", "'d'", "'e'", "p", "b", "'x'" ] ) } @@ -614,7 +612,7 @@ mod test { assert_eq!( text_nodes, vec![ - "'x'", "b", "br", "'e'", "i", "'d'", "p", "ul", "li", "'foo'", + "'x'", "b", "p", "p", "'e'", "i", "'d'", "ul", "li", "'foo'", "li", "strong", "'c'", "'b'", "", ] ) @@ -671,7 +669,7 @@ mod test { fn can_walk_all_nodes_of_the_tree_from_a_node_reversed() { let dom = cm(EXAMPLE_HTML).state.dom; // Start from the last tag. - let handle = DomHandle::from_raw(vec![1, 3]); + let handle = DomHandle::from_raw(vec![2, 0]); let last_child = dom.lookup_node(&handle); let text_nodes: Vec = dom.iter_from(last_child).rev().map(node_txt).collect(); @@ -679,7 +677,7 @@ mod test { assert_eq!( text_nodes, vec![ - "b", "br", "'e'", "i", "'d'", "p", "ul", "li", "'foo'", "li", + "b", "p", "p", "'e'", "i", "'d'", "ul", "li", "'foo'", "li", "strong", "'c'", "'b'", "" ] ) @@ -695,7 +693,7 @@ mod test { assert_eq!( container_nodes, - vec!["", "ul", "li", "strong", "li", "p", "i", "b"] + vec!["", "ul", "li", "strong", "li", "p", "i", "p", "b"] ); } From ef5faa09d8ea3b12797112f846779a730c716a9b Mon Sep 17 00:00:00 2001 From: jonnyandrew Date: Wed, 4 Oct 2023 15:28:34 +0100 Subject: [PATCH 14/27] Update characters test --- crates/wysiwyg/src/tests/test_characters.rs | 17 +++++------------ 1 file changed, 5 insertions(+), 12 deletions(-) diff --git a/crates/wysiwyg/src/tests/test_characters.rs b/crates/wysiwyg/src/tests/test_characters.rs index b708dd004..54b1088c9 100644 --- a/crates/wysiwyg/src/tests/test_characters.rs +++ b/crates/wysiwyg/src/tests/test_characters.rs @@ -216,28 +216,21 @@ fn replacing_across_lists_joins_them() { fn replacing_a_selection_containing_br_with_a_character() { let mut model = cm("abc{de
f}|ghi"); replace_text(&mut model, "Z"); - assert_eq!(tx(&model), "abcZ|ghi"); -} - -#[test] -fn replacing_a_selection_containing_only_br_with_a_character() { - let mut model = cm("abc{
}|ghi"); - replace_text(&mut model, "Z"); - assert_eq!(tx(&model), "abcZ|ghi"); + assert_eq!(tx(&model), "

abcZ|ghi

"); } #[test] fn replacing_a_selection_starting_br_with_a_character() { let mut model = cm("abc{
def}|ghi"); replace_text(&mut model, "Z"); - assert_eq!(tx(&model), "abcZ|ghi"); + assert_eq!(tx(&model), "

abcZ|ghi

"); } #[test] fn replacing_a_selection_ending_br_with_a_character() { let mut model = cm("abc{def
}|ghi"); replace_text(&mut model, "Z"); - assert_eq!(tx(&model), "abcZ|ghi"); + assert_eq!(tx(&model), "

abcZ|ghi

"); } #[test] @@ -305,14 +298,14 @@ fn inserting_a_line_break_and_text_before_a_line_break_works() { fn insert_text_between_line_breaks() { let mut model = cm("A
|
B"); model.replace_text(utf16("C")); - assert_eq!(tx(&model), "A
C|
B"); + assert_eq!(tx(&model), "

A

C|

B

"); } #[test] fn insert_text_between_line_breaks_in_format_node() { let mut model = cm("A
|
B
"); model.replace_text(utf16("C")); - assert_eq!(tx(&model), "A
C|
B
"); + assert_eq!(tx(&model), "

A

C|

B

"); } #[test] From ac09d0458a2f16efa71f8e39905a1dcf1e249bb1 Mon Sep 17 00:00:00 2001 From: jonnyandrew Date: Wed, 4 Oct 2023 15:39:41 +0100 Subject: [PATCH 15/27] Update formatting tests --- crates/wysiwyg/src/tests/test_formatting.rs | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/crates/wysiwyg/src/tests/test_formatting.rs b/crates/wysiwyg/src/tests/test_formatting.rs index 4669baa83..6119e7d95 100644 --- a/crates/wysiwyg/src/tests/test_formatting.rs +++ b/crates/wysiwyg/src/tests/test_formatting.rs @@ -120,23 +120,21 @@ fn formatting_twice_adds_no_formatting() { #[test] fn formatting_nested_format_nodes_and_line_breaks() { - let mut model = - cm("aaa
{bbb
}|cc
c"); + let mut model = cm("aaa
{bbb
}|cc
c"); model.italic(); assert_eq!( tx(&model), - "aaa
{bbb
}|
cc
c" + "

aaa

{bbb

ccc

" ); } #[test] fn formatting_deeper_nested_format_nodes_and_nested_line_breaks() { - let mut model = - cm("aaa
{b
bb
}|cc
c"); + let mut model = cm("aaa
{b
bb
}|cc
c"); model.italic(); assert_eq!( tx(&model), - "aaa
{b
bb
}|
cc
c" + "

aaa

{bbb

ccc

", ); } @@ -217,7 +215,7 @@ fn unformatting_consecutive_same_formatting_nodes() { fn unformatting_consecutive_same_formatting_nodes_with_nested_line_break() { let mut model = cm("{Test te
st
test}|"); model.bold(); - assert_eq!(tx(&model), "{Test te
st test}|"); + assert_eq!(tx(&model), "

{Test te

st test}|

"); } #[test] @@ -276,7 +274,10 @@ fn formatting_some_char_in_word_with_inline_code() { fn formatting_multiple_lines_with_inline_code() { let mut model = cm("fo{o
b}|ar"); model.inline_code(); - assert_eq!(tx(&model), "fo{o
b}|
ar"); + assert_eq!( + tx(&model), + "

fo{o

b}|ar

" + ); } #[test] From da49ec5743163a926e18add98a9d3f44ae90a69e Mon Sep 17 00:00:00 2001 From: jonnyandrew Date: Wed, 4 Oct 2023 15:41:32 +0100 Subject: [PATCH 16/27] Update link tests --- crates/wysiwyg/src/tests/test_links.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/crates/wysiwyg/src/tests/test_links.rs b/crates/wysiwyg/src/tests/test_links.rs index 5edddb8c9..3c81bffd0 100644 --- a/crates/wysiwyg/src/tests/test_links.rs +++ b/crates/wysiwyg/src/tests/test_links.rs @@ -514,7 +514,7 @@ fn set_link_with_text_on_blank_selection_with_line_break() { ); assert_eq!( tx(&model), - "testadded_link|test" + "

testadded_link|test

" ); } @@ -526,7 +526,7 @@ fn set_link_with_text_on_blank_selection_with_different_containers() { utf16("added_link"), vec![], ); - assert_eq!(tx(&model), "test_boldadded_link|test_italic"); + assert_eq!(tx(&model), "

test_boldadded_link|test_italic

"); } #[test] From 519ff31c1d6f0743a0a5e4d98ef4d5402b44db28 Mon Sep 17 00:00:00 2001 From: jonnyandrew Date: Wed, 4 Oct 2023 16:47:08 +0100 Subject: [PATCH 17/27] Refactor --- crates/wysiwyg/src/dom/parser/parse.rs | 126 +++++++++++++------------ 1 file changed, 68 insertions(+), 58 deletions(-) diff --git a/crates/wysiwyg/src/dom/parser/parse.rs b/crates/wysiwyg/src/dom/parser/parse.rs index dc66b8ef5..c1dceb743 100644 --- a/crates/wysiwyg/src/dom/parser/parse.rs +++ b/crates/wysiwyg/src/dom/parser/parse.rs @@ -866,21 +866,23 @@ mod sys { } fn post_process_blocks(mut dom: Dom) -> Dom { - let block_handles = find_block_handles(&dom); + let block_handles = find_deepest_block_handles(&dom); for handle in block_handles.iter().rev() { dom = post_process_block_lines(dom, handle); } dom } -fn find_block_handles(dom: &Dom) -> Vec { - // Get blocks that only contain inline nodes to process +// Find blocks that only contain inline nodes +fn find_deepest_block_handles( + dom: &Dom, +) -> Vec { dom.iter() .filter(|n| { n.is_block_node() && !n .as_container() - .unwrap() + .expect("it is a block") .children() .iter() .any(|c| c.is_block_node()) @@ -889,81 +891,88 @@ fn find_block_handles(dom: &Dom) -> Vec { .collect() } +// Process block nodes by converting line breaks into paragraphs. fn post_process_block_lines( mut dom: Dom, handle: &DomHandle, ) -> Dom { assert!(dom.lookup_node(handle).is_container_node()); + let container_node = dom.lookup_node(handle).as_container().unwrap(); let last_handle = dom.last_node_handle_in_sub_tree(handle); - let mut next_handle = last_handle.clone(); - let mut children = Vec::new(); - let mut line_handles: Vec = Vec::new(); - let mut line_break_handles: Vec> = Vec::new(); - - // All the leaf nodes and the root container - let nodes = dom - .iter_from_handle(&last_handle) - .filter(|n| n.is_leaf() || n.handle() == *handle) - .rev(); - - for node in nodes { - if node.is_line_break() { - let next_line = if node.handle() == last_handle { - last_handle.next_sibling() - } else { - next_handle.clone() - }; - line_break_handles.push(Some(node.handle())); - line_handles.push(next_line); - } else if node.handle() == *handle { - line_break_handles.push(None); - line_handles.push(next_handle.clone()); - } - next_handle = node.handle(); + // Collect the positions of all the line breaks and the lines following them + let (line_breaks, lines) = { + let mut line_breaks: Vec> = Vec::new(); + let mut next_lines: Vec = Vec::new(); + + let nodes = dom + .iter_from_handle(&last_handle) + .filter(|n| n.is_leaf() && handle.is_ancestor_of(&n.handle())) + .rev() + .collect::>(); + let mut next_handle = if nodes.is_empty() { + last_handle.clone() + } else { + last_handle.next_sibling() + }; - // After handling the container, stop - if node.handle().depth() == handle.depth() { - break; + for node in nodes { + if node.is_line_break() { + line_breaks.push(Some(node.handle())); + next_lines.push(next_handle.clone()); + } + next_handle = node.handle(); } - } - if line_handles.len() <= 1 // line_handles always contains at least the container - // Code blocks need inline content to be wrapped in a paragraph + line_breaks.push(None); + next_lines.push(next_handle.clone()); + + (line_breaks, next_lines) + }; + + // If there were no line breaks we might stop here + if lines.len() <= 1 // (<= 1 because lines will always contain at least the container) + // Code blocks require all inline content to be wrapped in a paragraph && dom.lookup_node(handle).kind() != DomNodeKind::CodeBlock { - // No line breaks, no need to do anything return dom; } - let old_node = dom.lookup_node(handle).as_container().unwrap(); - let new_node = match old_node.kind() { + // Create a new node to hold the processed contents if necessary + let new_node = match container_node.kind() { ContainerNodeKind::Paragraph => None, - _ => Some(old_node.clone_with_new_children(vec![])), + _ => Some(container_node.clone_with_new_children(vec![])), }; - for (i, line_handle) in line_handles.iter().enumerate() { - let mut sub_tree = - dom.split_sub_tree_from(line_handle, 0, handle.depth()); + // Remove each line from the DOM and collect it in a vector + let contents = { + let mut contents = Vec::new(); + for (i, line_handle) in lines.iter().enumerate() { + let mut sub_tree = + dom.split_sub_tree_from(line_handle, 0, handle.depth()); - if let Some(line_break_handle) = &line_break_handles[i] { - dom.remove(line_break_handle); - } + if let Some(line_break_handle) = &line_breaks[i] { + dom.remove(line_break_handle); + } - // Create a paragraph if it doesn't already exist - let node = if sub_tree.children().get(0).map(|n| n.kind()) - == Some(DomNodeKind::Paragraph) - { - sub_tree.document_mut().remove_children().remove(0) - } else { - DomNode::new_paragraph(sub_tree.document_mut().remove_children()) - }; + // Create a paragraph if it doesn't already exist + let node = if sub_tree.children().get(0).map(|n| n.kind()) + == Some(DomNodeKind::Paragraph) + { + sub_tree.document_mut().remove_children().remove(0) + } else { + DomNode::new_paragraph( + sub_tree.document_mut().remove_children(), + ) + }; - children.insert(0, node); - } + contents.insert(0, node); + } + contents + }; if handle.is_root() { - return Dom::new(children); + return Dom::new(contents); } let needs_removal = if dom.contains(handle) { @@ -977,14 +986,15 @@ fn post_process_block_lines( dom.remove(handle); } + // Insert the processed contents back into the dom match new_node { Some(mut n) => { n.set_handle(handle.clone()); - n.append_children(children); + n.append_children(contents); dom.insert_at(handle, DomNode::Container(n)); } None => { - dom.insert(handle, children); + dom.insert(handle, contents); } } dom From 74337c9dbbb54409bce7797c80abdf20d27a2339 Mon Sep 17 00:00:00 2001 From: jonnyandrew Date: Wed, 4 Oct 2023 17:15:19 +0100 Subject: [PATCH 18/27] Update web test --- crates/wysiwyg/src/dom/parser/parse.rs | 4 +++- platforms/web/lib/useWysiwyg.test.tsx | 8 ++++++-- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/crates/wysiwyg/src/dom/parser/parse.rs b/crates/wysiwyg/src/dom/parser/parse.rs index c1dceb743..4c1fe5215 100644 --- a/crates/wysiwyg/src/dom/parser/parse.rs +++ b/crates/wysiwyg/src/dom/parser/parse.rs @@ -1404,7 +1404,9 @@ mod js { #[wasm_bindgen_test] fn br() { - roundtrip("foo
bar"); + let html = "foo
bar"; + let dom = HtmlParser::default().parse::(html).unwrap(); + assert_eq!(dom.to_string(), "

foo

bar

"); } #[wasm_bindgen_test] diff --git a/platforms/web/lib/useWysiwyg.test.tsx b/platforms/web/lib/useWysiwyg.test.tsx index 14b5251ba..0afc2b419 100644 --- a/platforms/web/lib/useWysiwyg.test.tsx +++ b/platforms/web/lib/useWysiwyg.test.tsx @@ -147,13 +147,17 @@ describe('useWysiwyg', () => { }); test('Create wysiwyg with initial content', async () => { - // When + // Given const content = 'foo
bar'; + const processedContent = + '

foo

bar

'; + + // When render(); // Then await waitFor(() => - expect(screen.getByRole('textbox')).toContainHTML(content), + expect(screen.getByRole('textbox')).toContainHTML(processedContent), ); }); From 9539239c983074dc3c7758023ed0fd738d0f8709 Mon Sep 17 00:00:00 2001 From: jonnyandrew Date: Thu, 5 Oct 2023 12:34:58 +0100 Subject: [PATCH 19/27] Handle paragraphs mixed with inline content --- crates/wysiwyg/src/dom/parser/parse.rs | 98 ++++++++++++++++++-------- 1 file changed, 69 insertions(+), 29 deletions(-) diff --git a/crates/wysiwyg/src/dom/parser/parse.rs b/crates/wysiwyg/src/dom/parser/parse.rs index 4c1fe5215..2d5896df0 100644 --- a/crates/wysiwyg/src/dom/parser/parse.rs +++ b/crates/wysiwyg/src/dom/parser/parse.rs @@ -566,6 +566,29 @@ mod sys { ); } + #[test] + fn parse_line_breaks_br_before_p() { + let html = "abc

def
gh

ijk"; + let dom: Dom = + HtmlParser::default().parse(html).unwrap(); + let tree = dom.to_tree().to_string(); + assert_eq!( + tree, + indoc! { + r#" + + ├>p + │ └>"abc" + ├>p + │ └>"def" + ├>p + │ └>"gh" + └>p + └>"ijk" + "#} + ); + } + #[test] fn parse_line_breaks_br_in_bold() { let html = r#"foo
"#; @@ -628,7 +651,7 @@ mod sys { #[test] fn parse_line_breaks_br_in_list() { - let html = r#"
  • foo
    bar
"#; + let html = r#"
  • foo
    bar

    baz

"#; let dom: Dom = HtmlParser::default().parse(html).unwrap(); let tree = dom.to_tree().to_string(); @@ -644,13 +667,14 @@ mod sys { ├>p │ └>"bar" └>p + └>"baz" "#} ); } #[test] fn parse_line_breaks_br_in_p() { - let html = r#"

foo

"#; + let html = r#"

foo
bar
baz

"#; let dom: Dom = HtmlParser::default().parse(html).unwrap(); let tree = dom.to_tree().to_string(); @@ -661,6 +685,10 @@ mod sys { ├>p │ └>"foo" + ├>p + │ └>"bar" + ├>p + │ └>"baz" └>p "#} ); @@ -866,29 +894,18 @@ mod sys { } fn post_process_blocks(mut dom: Dom) -> Dom { - let block_handles = find_deepest_block_handles(&dom); + let block_handles = find_blocks(&dom); for handle in block_handles.iter().rev() { dom = post_process_block_lines(dom, handle); } dom } -// Find blocks that only contain inline nodes -fn find_deepest_block_handles( - dom: &Dom, -) -> Vec { +fn find_blocks(dom: &Dom) -> Vec { dom.iter() - .filter(|n| { - n.is_block_node() - && !n - .as_container() - .expect("it is a block") - .children() - .iter() - .any(|c| c.is_block_node()) - }) + .filter(|n| n.is_block_node()) .map(|n| n.handle()) - .collect() + .collect::>() } // Process block nodes by converting line breaks into paragraphs. @@ -955,18 +972,10 @@ fn post_process_block_lines( dom.remove(line_break_handle); } - // Create a paragraph if it doesn't already exist - let node = if sub_tree.children().get(0).map(|n| n.kind()) - == Some(DomNodeKind::Paragraph) - { - sub_tree.document_mut().remove_children().remove(0) - } else { - DomNode::new_paragraph( - sub_tree.document_mut().remove_children(), - ) - }; - - contents.insert(0, node); + group_inline_nodes(sub_tree.document_mut().remove_children()) + .iter() + .rev() + .for_each(|n| contents.insert(0, n.clone())); } contents }; @@ -1000,6 +1009,37 @@ fn post_process_block_lines( dom } +// Group consecutive inline nodes into paragraphs. +// +// Always returns at least one empty paragraph. +fn group_inline_nodes( + nodes: Vec>, +) -> Vec> { + let mut output: Vec> = Vec::new(); + let mut cur_group: Vec> = Vec::new(); + + for node in nodes.clone() { + if node.is_block_node() { + // If there are inline elements waiting to be grouped, create a new block with them + if !cur_group.is_empty() { + output.push(DomNode::new_paragraph(cur_group.clone())); + cur_group.clear(); + } + + // Then add the current block + output.push(node); + } else { + cur_group.push(node) + } + } + + if !cur_group.is_empty() || output.is_empty() { + output.push(DomNode::new_paragraph(cur_group)); + } + + output +} + #[cfg(feature = "sys")] fn last_container_mut_in( node: &mut ContainerNode, From a40c98a71c1ac52d97982108907394628244571d Mon Sep 17 00:00:00 2001 From: jonnyandrew Date: Thu, 5 Oct 2023 14:31:05 +0100 Subject: [PATCH 20/27] Fix repeated post-processing by web parser --- crates/wysiwyg/src/dom/parser/parse.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/crates/wysiwyg/src/dom/parser/parse.rs b/crates/wysiwyg/src/dom/parser/parse.rs index 2d5896df0..0d4fa8f6b 100644 --- a/crates/wysiwyg/src/dom/parser/parse.rs +++ b/crates/wysiwyg/src/dom/parser/parse.rs @@ -1139,7 +1139,9 @@ mod js { ) })?; - self.webdom_to_dom(document).map_err(to_dom_creation_error) + self.webdom_to_dom(document) + .map_err(to_dom_creation_error) + .map(post_process_blocks) } fn webdom_to_dom( @@ -1163,8 +1165,6 @@ mod js { self.convert_container(nodes, dom_document)?; - dom = post_process_blocks(dom); - Ok(dom) } From e6370a31dec70a2df53d7743edd6d78be393da9e Mon Sep 17 00:00:00 2001 From: jonnyandrew Date: Thu, 5 Oct 2023 16:50:12 +0100 Subject: [PATCH 21/27] Don't add line breaks where it is implicit --- .../wysiwyg/src/dom/nodes/container_node.rs | 29 ++++++++++++++----- crates/wysiwyg/src/dom/nodes/dom_node.rs | 2 +- crates/wysiwyg/src/dom/nodes/text_node.rs | 4 +-- crates/wysiwyg/src/dom/to_html.rs | 9 ++++-- crates/wysiwyg/src/format_type.rs | 2 +- .../wysiwyg/src/tests/test_to_message_html.rs | 8 +++++ 6 files changed, 40 insertions(+), 14 deletions(-) diff --git a/crates/wysiwyg/src/dom/nodes/container_node.rs b/crates/wysiwyg/src/dom/nodes/container_node.rs index 649ec3ff1..61a7a6f47 100644 --- a/crates/wysiwyg/src/dom/nodes/container_node.rs +++ b/crates/wysiwyg/src/dom/nodes/container_node.rs @@ -706,9 +706,21 @@ impl ContainerNode { ) { let as_message = true; assert!(matches!(self.kind, ContainerNodeKind::Paragraph)); + + // If the previous node was a paragraph, it expected this node to + // be a block node and break onto a new line. + if state + .prev_sibling + .is_some_and(|k| matches!(k, DomNodeKind::Paragraph)) + { + formatter.push("
"); + } + self.fmt_children_html(formatter, selection_writer, state, as_message); - if !state.is_last_node_in_parent { + // If the next node is a block node, no need to add a line break as + // one is implicitly added. + if state.next_sibling.is_some_and(|k| !k.is_block_kind()) { formatter.push("
"); } } @@ -722,12 +734,12 @@ impl ContainerNode { ) { assert!(matches!(self.kind, ContainerNodeKind::Paragraph)); if self.is_empty() - && (state.is_last_node_in_parent || state.is_first_node_in_parent) + && (state.next_sibling.is_none() || state.prev_sibling.is_none()) { formatter.push(char::nbsp()); } self.fmt_children_html(formatter, selection_writer, state, as_message); - if !state.is_last_node_in_parent { + if state.next_sibling.is_some() { formatter.push('\n'); } } @@ -783,11 +795,14 @@ impl ContainerNode { initial_state: ToHtmlState, child_index: usize, ) -> ToHtmlState { - let is_last = self.children().len() == child_index + 1; - let is_first = child_index == 0; let mut state = initial_state; - state.is_last_node_in_parent = is_last; - state.is_first_node_in_parent = is_first; + state.next_sibling = + self.children().get(child_index + 1).map(|n| n.kind()); + state.prev_sibling = if child_index == 0 { + None + } else { + self.children().get(child_index - 1).map(|n| n.kind()) + }; state } } diff --git a/crates/wysiwyg/src/dom/nodes/dom_node.rs b/crates/wysiwyg/src/dom/nodes/dom_node.rs index 3f05cabba..67bbc0d26 100644 --- a/crates/wysiwyg/src/dom/nodes/dom_node.rs +++ b/crates/wysiwyg/src/dom/nodes/dom_node.rs @@ -504,7 +504,7 @@ where } } -#[derive(Clone, Debug, PartialEq, Eq)] +#[derive(Clone, Copy, Debug, PartialEq, Eq)] pub enum DomNodeKind { Generic, // Should only be used for root node so far Text, diff --git a/crates/wysiwyg/src/dom/nodes/text_node.rs b/crates/wysiwyg/src/dom/nodes/text_node.rs index f6315be17..c5748b946 100644 --- a/crates/wysiwyg/src/dom/nodes/text_node.rs +++ b/crates/wysiwyg/src/dom/nodes/text_node.rs @@ -228,7 +228,7 @@ where if !state.is_inside_code_block { escaped = escaped.replace(" ", "\u{A0}\u{A0}"); - if state.is_last_node_in_parent + if state.next_sibling.is_none() && escaped.chars().next_back().map_or(false, |c| c == ' ') { // If this is the last node and it ends in a space, replace that @@ -236,7 +236,7 @@ where escaped.replace_range(escaped.len() - 1.., "\u{A0}"); } - if state.is_first_node_in_parent + if state.prev_sibling.is_none() && escaped.chars().next().map_or(false, |c| c == ' ') { // If this is the first node and it starts with a space, replace that diff --git a/crates/wysiwyg/src/dom/to_html.rs b/crates/wysiwyg/src/dom/to_html.rs index 17d0a197e..cca73ab5b 100644 --- a/crates/wysiwyg/src/dom/to_html.rs +++ b/crates/wysiwyg/src/dom/to_html.rs @@ -14,7 +14,10 @@ use crate::composer_model::example_format::SelectionWriter; -use super::{unicode_string::UnicodeStringExt, UnicodeString}; +use super::{ + nodes::dom_node::DomNodeKind, unicode_string::UnicodeStringExt, + UnicodeString, +}; pub trait ToHtml where @@ -98,6 +101,6 @@ where #[derive(Copy, Clone, Default)] pub struct ToHtmlState { pub is_inside_code_block: bool, - pub is_last_node_in_parent: bool, - pub is_first_node_in_parent: bool, + pub prev_sibling: Option, + pub next_sibling: Option, } diff --git a/crates/wysiwyg/src/format_type.rs b/crates/wysiwyg/src/format_type.rs index 516695431..7d2e0545f 100644 --- a/crates/wysiwyg/src/format_type.rs +++ b/crates/wysiwyg/src/format_type.rs @@ -14,7 +14,7 @@ use crate::{ComposerAction, UnicodeString}; -#[derive(Debug, Clone, Eq, PartialEq)] +#[derive(Debug, Copy, Clone, Eq, PartialEq)] pub enum InlineFormatType { Bold, Italic, diff --git a/crates/wysiwyg/src/tests/test_to_message_html.rs b/crates/wysiwyg/src/tests/test_to_message_html.rs index 2ef46bbe8..955066562 100644 --- a/crates/wysiwyg/src/tests/test_to_message_html.rs +++ b/crates/wysiwyg/src/tests/test_to_message_html.rs @@ -32,6 +32,14 @@ fn outputs_paragraphs_as_line_breaks() { assert_eq!(message_output, "hello



Alice"); } +#[test] +fn outputs_paragraphs_content_without_linebreak_when_followed_by_block() { + let model = cm("

foo

bar|
"); + assert_eq!(tx(&model), "

foo

bar|
"); + let message_output = model.get_content_as_message_html(); + assert_eq!(message_output, "foo
bar
"); +} + #[test] fn only_outputs_href_attribute_on_user_mention() { let mut model = cm("|"); From a642b37b7000733788731b9ecd72fc1f1c002cb9 Mon Sep 17 00:00:00 2001 From: jonnyandrew Date: Thu, 5 Oct 2023 18:18:16 +0100 Subject: [PATCH 22/27] Fix clippy issue --- .../src/composer_model/example_format.rs | 2 +- crates/wysiwyg/src/dom/dom_struct.rs | 2 +- .../wysiwyg/src/dom/nodes/container_node.rs | 35 +++++++++++-------- crates/wysiwyg/src/dom/nodes/dom_node.rs | 4 +-- .../wysiwyg/src/dom/nodes/line_break_node.rs | 2 +- crates/wysiwyg/src/dom/nodes/mention_node.rs | 4 +-- crates/wysiwyg/src/dom/nodes/text_node.rs | 2 +- crates/wysiwyg/src/dom/to_html.rs | 8 ++--- crates/wysiwyg/src/format_type.rs | 2 +- 9 files changed, 33 insertions(+), 28 deletions(-) diff --git a/crates/wysiwyg/src/composer_model/example_format.rs b/crates/wysiwyg/src/composer_model/example_format.rs index ebaf7c9f8..92c4b45b7 100644 --- a/crates/wysiwyg/src/composer_model/example_format.rs +++ b/crates/wysiwyg/src/composer_model/example_format.rs @@ -255,7 +255,7 @@ impl ComposerModel { root.fmt_html( &mut buf, Some(&mut selection_writer), - ToHtmlState::default(), + &ToHtmlState::default(), false, ); if range.is_empty().not() { diff --git a/crates/wysiwyg/src/dom/dom_struct.rs b/crates/wysiwyg/src/dom/dom_struct.rs index b7a4c0e26..4812660c3 100644 --- a/crates/wysiwyg/src/dom/dom_struct.rs +++ b/crates/wysiwyg/src/dom/dom_struct.rs @@ -626,7 +626,7 @@ where &self, buf: &mut S, selection_writer: Option<&mut SelectionWriter>, - state: ToHtmlState, + state: &ToHtmlState, as_message: bool, ) { self.document diff --git a/crates/wysiwyg/src/dom/nodes/container_node.rs b/crates/wysiwyg/src/dom/nodes/container_node.rs index 61a7a6f47..0aebaa33f 100644 --- a/crates/wysiwyg/src/dom/nodes/container_node.rs +++ b/crates/wysiwyg/src/dom/nodes/container_node.rs @@ -607,7 +607,7 @@ where &self, formatter: &mut S, selection_writer: Option<&mut SelectionWriter>, - state: ToHtmlState, + state: &ToHtmlState, as_message: bool, ) { match self.kind() { @@ -639,7 +639,7 @@ impl ContainerNode { &self, formatter: &mut S, selection_writer: Option<&mut SelectionWriter>, - state: ToHtmlState, + state: &ToHtmlState, as_message: bool, ) { let name = self.name(); @@ -658,7 +658,7 @@ impl ContainerNode { &self, formatter: &mut S, selection_writer: Option<&mut SelectionWriter>, - state: ToHtmlState, + state: &ToHtmlState, as_message: bool, ) { assert!(matches!(self.kind, ContainerNodeKind::Paragraph)); @@ -684,7 +684,7 @@ impl ContainerNode { &self, formatter: &mut S, selection_writer: Option<&mut SelectionWriter>, - state: ToHtmlState, + state: &ToHtmlState, ) { let as_message = false; assert!(matches!(self.kind, ContainerNodeKind::Paragraph)); @@ -702,7 +702,7 @@ impl ContainerNode { &self, formatter: &mut S, selection_writer: Option<&mut SelectionWriter>, - state: ToHtmlState, + state: &ToHtmlState, ) { let as_message = true; assert!(matches!(self.kind, ContainerNodeKind::Paragraph)); @@ -711,6 +711,7 @@ impl ContainerNode { // be a block node and break onto a new line. if state .prev_sibling + .as_ref() .is_some_and(|k| matches!(k, DomNodeKind::Paragraph)) { formatter.push("
"); @@ -720,7 +721,11 @@ impl ContainerNode { // If the next node is a block node, no need to add a line break as // one is implicitly added. - if state.next_sibling.is_some_and(|k| !k.is_block_kind()) { + if state + .next_sibling + .as_ref() + .is_some_and(|k| !k.is_block_kind()) + { formatter.push("
"); } } @@ -729,7 +734,7 @@ impl ContainerNode { &self, formatter: &mut S, selection_writer: Option<&mut SelectionWriter>, - state: ToHtmlState, + state: &ToHtmlState, as_message: bool, ) { assert!(matches!(self.kind, ContainerNodeKind::Paragraph)); @@ -748,17 +753,17 @@ impl ContainerNode { &self, formatter: &mut S, selection_writer: Option<&mut SelectionWriter>, - state: ToHtmlState, + state: &ToHtmlState, as_message: bool, ) { assert!(matches!(self.kind, ContainerNodeKind::CodeBlock)); self.fmt_tag_open(&S::from("pre"), formatter, &self.attrs); - let mut state = state; + let mut state = state.clone(); state.is_inside_code_block = true; self.fmt_tag_open(&S::from("code"), formatter, &None::>); - self.fmt_children_html(formatter, selection_writer, state, as_message); + self.fmt_children_html(formatter, selection_writer, &state, as_message); self.fmt_tag_close(&S::from("code"), formatter); self.fmt_tag_close(&S::from("pre"), formatter); @@ -768,13 +773,13 @@ impl ContainerNode { &self, formatter: &mut S, selection_writer: Option<&mut SelectionWriter>, - state: ToHtmlState, + state: &ToHtmlState, as_message: bool, ) { if let Some(w) = selection_writer { for (i, child) in self.children.iter().enumerate() { let state = self.updated_state(state, i); - child.fmt_html(formatter, Some(w), state, as_message); + child.fmt_html(formatter, Some(w), &state, as_message); } if self.is_empty() { w.write_selection_empty_container( @@ -786,16 +791,16 @@ impl ContainerNode { } else { for (i, child) in self.children.iter().enumerate() { let state = self.updated_state(state, i); - child.fmt_html(formatter, None, state, as_message); + child.fmt_html(formatter, None, &state, as_message); } } } fn updated_state( &self, - initial_state: ToHtmlState, + initial_state: &ToHtmlState, child_index: usize, ) -> ToHtmlState { - let mut state = initial_state; + let mut state = initial_state.clone(); state.next_sibling = self.children().get(child_index + 1).map(|n| n.kind()); state.prev_sibling = if child_index == 0 { diff --git a/crates/wysiwyg/src/dom/nodes/dom_node.rs b/crates/wysiwyg/src/dom/nodes/dom_node.rs index 67bbc0d26..cdc18414d 100644 --- a/crates/wysiwyg/src/dom/nodes/dom_node.rs +++ b/crates/wysiwyg/src/dom/nodes/dom_node.rs @@ -415,7 +415,7 @@ where &self, buf: &mut S, selection_writer: Option<&mut SelectionWriter>, - state: ToHtmlState, + state: &ToHtmlState, as_message: bool, ) { match self { @@ -504,7 +504,7 @@ where } } -#[derive(Clone, Copy, Debug, PartialEq, Eq)] +#[derive(Clone, Debug, PartialEq, Eq)] pub enum DomNodeKind { Generic, // Should only be used for root node so far Text, diff --git a/crates/wysiwyg/src/dom/nodes/line_break_node.rs b/crates/wysiwyg/src/dom/nodes/line_break_node.rs index b29127ce6..66c689ca8 100644 --- a/crates/wysiwyg/src/dom/nodes/line_break_node.rs +++ b/crates/wysiwyg/src/dom/nodes/line_break_node.rs @@ -78,7 +78,7 @@ where &self, buf: &mut S, selection_writer: Option<&mut SelectionWriter>, - _: ToHtmlState, + _: &ToHtmlState, _as_message: bool, ) { let cur_pos = buf.len(); diff --git a/crates/wysiwyg/src/dom/nodes/mention_node.rs b/crates/wysiwyg/src/dom/nodes/mention_node.rs index 64e947acd..d7e6b6642 100644 --- a/crates/wysiwyg/src/dom/nodes/mention_node.rs +++ b/crates/wysiwyg/src/dom/nodes/mention_node.rs @@ -138,7 +138,7 @@ where &self, formatter: &mut S, selection_writer: Option<&mut SelectionWriter>, - state: ToHtmlState, + state: &ToHtmlState, as_message: bool, ) { self.fmt_mention_html(formatter, selection_writer, state, as_message) @@ -150,7 +150,7 @@ impl MentionNode { &self, formatter: &mut S, selection_writer: Option<&mut SelectionWriter>, - _: ToHtmlState, + _: &ToHtmlState, as_message: bool, ) { let tag = &S::from("a"); diff --git a/crates/wysiwyg/src/dom/nodes/text_node.rs b/crates/wysiwyg/src/dom/nodes/text_node.rs index c5748b946..b2db2da26 100644 --- a/crates/wysiwyg/src/dom/nodes/text_node.rs +++ b/crates/wysiwyg/src/dom/nodes/text_node.rs @@ -215,7 +215,7 @@ where &self, buf: &mut S, selection_writer: Option<&mut SelectionWriter>, - state: ToHtmlState, + state: &ToHtmlState, _as_message: bool, ) { let cur_pos = buf.len(); diff --git a/crates/wysiwyg/src/dom/to_html.rs b/crates/wysiwyg/src/dom/to_html.rs index cca73ab5b..6232c428d 100644 --- a/crates/wysiwyg/src/dom/to_html.rs +++ b/crates/wysiwyg/src/dom/to_html.rs @@ -31,7 +31,7 @@ where &self, buf: &mut S, selection_writer: Option<&mut SelectionWriter>, - state: ToHtmlState, + state: &ToHtmlState, as_message: bool, ); @@ -39,14 +39,14 @@ where /// for sending as a message fn to_message_html(&self) -> S { let mut buf = S::default(); - self.fmt_html(&mut buf, None, ToHtmlState::default(), true); + self.fmt_html(&mut buf, None, &ToHtmlState::default(), true); buf } /// Convert to a literal HTML represention of the source object fn to_html(&self) -> S { let mut buf = S::default(); - self.fmt_html(&mut buf, None, ToHtmlState::default(), false); + self.fmt_html(&mut buf, None, &ToHtmlState::default(), false); buf } } @@ -98,7 +98,7 @@ where /// State of the HTML generation at every `fmt_html` call, usually used to pass info from ancestor /// nodes to their descendants. -#[derive(Copy, Clone, Default)] +#[derive(Clone, Default)] pub struct ToHtmlState { pub is_inside_code_block: bool, pub prev_sibling: Option, diff --git a/crates/wysiwyg/src/format_type.rs b/crates/wysiwyg/src/format_type.rs index 7d2e0545f..516695431 100644 --- a/crates/wysiwyg/src/format_type.rs +++ b/crates/wysiwyg/src/format_type.rs @@ -14,7 +14,7 @@ use crate::{ComposerAction, UnicodeString}; -#[derive(Debug, Copy, Clone, Eq, PartialEq)] +#[derive(Debug, Clone, Eq, PartialEq)] pub enum InlineFormatType { Bold, Italic, From 482862b9b7c4025419e7a4692426d1fb6abb4eb6 Mon Sep 17 00:00:00 2001 From: jonnyandrew Date: Wed, 11 Oct 2023 15:23:11 +0100 Subject: [PATCH 23/27] Add documentation to explain paragaph grouping logic --- crates/wysiwyg/src/dom/parser/parse.rs | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/crates/wysiwyg/src/dom/parser/parse.rs b/crates/wysiwyg/src/dom/parser/parse.rs index 0d4fa8f6b..58706dd80 100644 --- a/crates/wysiwyg/src/dom/parser/parse.rs +++ b/crates/wysiwyg/src/dom/parser/parse.rs @@ -972,6 +972,9 @@ fn post_process_block_lines( dom.remove(line_break_handle); } + // If the nodes following the line break start with inline nodes, + // ensure they are wrapped in a paragraph in order to add an + // implicit line break here. group_inline_nodes(sub_tree.document_mut().remove_children()) .iter() .rev() @@ -1011,6 +1014,12 @@ fn post_process_block_lines( // Group consecutive inline nodes into paragraphs. // +// This function accepts a list of nodes of any type, inline or block. +// For example: [b, codeblock, b, i, p]. +// +// It will first group any inline nodes: [[b], codeblock, [b, i], p]. +// And wrap each group in a pararaph: [p, codeblock, p, p]. +// // Always returns at least one empty paragraph. fn group_inline_nodes( nodes: Vec>, From 9ed1a4f0b434a0885f5258ebabedd987bb1d6241 Mon Sep 17 00:00:00 2001 From: David Langley Date: Thu, 12 Oct 2023 13:01:44 +0100 Subject: [PATCH 24/27] update snapshot on ios --- .../testMultipleBlocksContent.1.png | Bin 88221 -> 88236 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/platforms/ios/lib/WysiwygComposer/Tests/WysiwygComposerSnapshotTests/__Snapshots__/SnapshotTests+Blocks/testMultipleBlocksContent.1.png b/platforms/ios/lib/WysiwygComposer/Tests/WysiwygComposerSnapshotTests/__Snapshots__/SnapshotTests+Blocks/testMultipleBlocksContent.1.png index 13ba297694a9442e0b4b0e9cf33d9b54ed6b6ab9..861aad0f8f1c24220c79acecee8c9afbd13eab33 100644 GIT binary patch literal 88236 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Τ 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 acsQ5b^mhK80YnBVR1~gU%9X!*=YIh+`1F7P literal 88221 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 From e3ed1f6cc16114da919bfcc0c312661e061f5907 Mon Sep 17 00:00:00 2001 From: David Langley Date: Thu, 12 Oct 2023 14:21:58 +0100 Subject: [PATCH 25/27] Revert "update snapshot on ios" This reverts commit 9ed1a4f0b434a0885f5258ebabedd987bb1d6241. --- .../testMultipleBlocksContent.1.png | Bin 88236 -> 88221 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/platforms/ios/lib/WysiwygComposer/Tests/WysiwygComposerSnapshotTests/__Snapshots__/SnapshotTests+Blocks/testMultipleBlocksContent.1.png b/platforms/ios/lib/WysiwygComposer/Tests/WysiwygComposerSnapshotTests/__Snapshots__/SnapshotTests+Blocks/testMultipleBlocksContent.1.png index 861aad0f8f1c24220c79acecee8c9afbd13eab33..13ba297694a9442e0b4b0e9cf33d9b54ed6b6ab9 100644 GIT binary patch literal 88221 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 literal 88236 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Τ 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 acsQ5b^mhK80YnBVR1~gU%9X!*=YIh+`1F7P From ba2e8c933e8c080c8c965b4212cb668db7db30be Mon Sep 17 00:00:00 2001 From: David Langley Date: Thu, 12 Oct 2023 14:23:55 +0100 Subject: [PATCH 26/27] Update SnapshotTests+Blocks.swift - Reverting snapshot as I think the latest difference might be because of running locally on my machine(maybe as it's intel chip). - Check if changing input to
's fixes it. --- .../WysiwygComposerSnapshotTests/SnapshotTests+Blocks.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platforms/ios/lib/WysiwygComposer/Tests/WysiwygComposerSnapshotTests/SnapshotTests+Blocks.swift b/platforms/ios/lib/WysiwygComposer/Tests/WysiwygComposerSnapshotTests/SnapshotTests+Blocks.swift index d1da826a3..1b0cb4efe 100644 --- a/platforms/ios/lib/WysiwygComposer/Tests/WysiwygComposerSnapshotTests/SnapshotTests+Blocks.swift +++ b/platforms/ios/lib/WysiwygComposer/Tests/WysiwygComposerSnapshotTests/SnapshotTests+Blocks.swift @@ -36,7 +36,7 @@ final class BlocksSnapshotTests: SnapshotTests { } func testQuoteContent() throws { - viewModel.setHtmlContent("

Some quote with

line breaks inside

") + viewModel.setHtmlContent("
Some quote with



line breaks inside
") assertSnapshot( matching: hostingController, as: .image(on: .iPhone13), From 88e69e589975a81d06ffe769c5c54a18c6255f9f Mon Sep 17 00:00:00 2001 From: David Langley Date: Mon, 16 Oct 2023 16:18:20 +0100 Subject: [PATCH 27/27] Fix testMultipleBlocksContent according to new format. --- .../SnapshotTests+Blocks.swift | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/platforms/ios/lib/WysiwygComposer/Tests/WysiwygComposerSnapshotTests/SnapshotTests+Blocks.swift b/platforms/ios/lib/WysiwygComposer/Tests/WysiwygComposerSnapshotTests/SnapshotTests+Blocks.swift index 1b0cb4efe..505863530 100644 --- a/platforms/ios/lib/WysiwygComposer/Tests/WysiwygComposerSnapshotTests/SnapshotTests+Blocks.swift +++ b/platforms/ios/lib/WysiwygComposer/Tests/WysiwygComposerSnapshotTests/SnapshotTests+Blocks.swift @@ -47,15 +47,17 @@ final class BlocksSnapshotTests: SnapshotTests { func testMultipleBlocksContent() throws { viewModel.setHtmlContent( """ -

Some

\ -

multi-line

\ -

quote

\ -

\ -

Some text

\ -

\ +
Some
\ + multi-line
\ + quote
\ +
\ +
\ + Some text
\ +
\
A\n\tcode\nblock
\ -

\ -

Some inline code

+
\ +
\ + Some inline code """ ) assertSnapshot(