11import formatsEnum from "./formatsEnum"
22
3+ // // TODO
4+ // if (domNode.nodeType === Node.ELEMENT_NODE && domNode.getAttribute("contenteditable") === "false") {
5+ // // No-op
6+ // continue
7+ // }
8+
39// Reads a span from a DOM node.
410function readSpan ( domNode ) {
511 const span = {
@@ -30,12 +36,6 @@ function readSpan(domNode) {
3036 return span
3137}
3238
33- // // TODO
34- // if (domNode.nodeType === Node.ELEMENT_NODE && domNode.getAttribute("contenteditable") === "false") {
35- // // No-op
36- // continue
37- // }
38-
3939// Returns whether two spans’ formats and props are equal.
4040function formatsAndPropsAreEqual ( spanA , spanB ) {
4141 if ( spanA . formats . length !== spanB . formats . length ) {
@@ -51,17 +51,26 @@ function formatsAndPropsAreEqual(spanA, spanB) {
5151 return true
5252}
5353
54+ // Merges redundant spans (e.g. fragmented).
55+ export function mergeRedundantSpans ( spans ) {
56+ for ( let x = 0 ; x < spans . length ; x ++ ) {
57+ if ( x && formatsAndPropsAreEqual ( spans [ x - 1 ] , spans [ x ] ) ) {
58+ spans . splice ( x - 1 , 2 , {
59+ ...spans [ x - 1 ] ,
60+ content : spans [ x - 1 ] . content + spans [ x ] . content ,
61+ } )
62+ continue
63+ }
64+ }
65+ }
66+
5467// Reads spans from a UUID element.
5568export function readSpans ( uuidElement ) {
5669 const spans = [ ]
5770 for ( let x = 0 ; x < uuidElement . childNodes . length ; x ++ ) {
58- const span = readSpan ( uuidElement . childNodes [ x ] )
59- if ( x && formatsAndPropsAreEqual ( spans [ spans . length - 1 ] , span ) ) {
60- spans [ spans . length - 1 ] . content += span . content
61- continue
62- }
63- spans . push ( span )
71+ spans . push ( readSpan ( uuidElement . childNodes [ x ] ) )
6472 }
73+ mergeRedundantSpans ( spans )
6574 console . log ( spans )
6675 return spans
6776}
0 commit comments