diff --git a/examples/demo/demo.css b/examples/demo/demo.css index b72220f97..cc1e62705 100644 --- a/examples/demo/demo.css +++ b/examples/demo/demo.css @@ -3,6 +3,11 @@ body { height:100vh; } +* { + border-top: 3px black solid; + margin: 0; +} + jw-editor { display: block; height: 100vh; diff --git a/examples/demo/demo.xml b/examples/demo/demo.xml index a7eb03a9b..4b9b46e34 100644 --- a/examples/demo/demo.xml +++ b/examples/demo/demo.xml @@ -17,37 +17,6 @@ neologisms such as "galumphing" and "chortle".

Table examples

- - - - - - - - - - - - - - - - - - - - - - - - - - - -










© Piet - Mondrian

-


@@ -132,7 +101,14 @@ neologisms such as "galumphing" and "chortle".
    1. -
    2. 1.2.1
    3. +
    4. A 2 br

    5. +
    6. A br + char
    7. +
    8. B 3 br


    9. +
    10. B 2 br + char

    11. +
    12. P B 3 br


    13. +
    14. P B 2 br + char

    15. +
    16. B 4 br



    17. +
    18. B 3 br + char


    19. 1.2.2
    20. 1.2.3
    21. diff --git a/packages/plugin-linebreak/src/LineBreakDomObjectRenderer.ts b/packages/plugin-linebreak/src/LineBreakDomObjectRenderer.ts index 12f57257b..6805960a3 100644 --- a/packages/plugin-linebreak/src/LineBreakDomObjectRenderer.ts +++ b/packages/plugin-linebreak/src/LineBreakDomObjectRenderer.ts @@ -22,10 +22,11 @@ export class LineBreakDomObjectRenderer extends NodeRenderer { worker.locate([node], br); if (!node.nextSibling()) { // If a LineBreakNode has no next sibling, it must be rendered - // as two BRs in order for it to be visible. - const br2 = { tag: 'BR' }; - const domObject = { children: [br, br2] }; - worker.locate([node], br2); + // as a BR and a placeholder invisible char in order for it to be + // visible. + const invisible: DomObject = { text: '\u200B' }; + const domObject = { children: [br, invisible] }; + worker.locate([node], invisible); return domObject; } return br; diff --git a/packages/plugin-linebreak/src/LineBreakXmlDomParser.ts b/packages/plugin-linebreak/src/LineBreakXmlDomParser.ts index 929609cd8..032dd3825 100644 --- a/packages/plugin-linebreak/src/LineBreakXmlDomParser.ts +++ b/packages/plugin-linebreak/src/LineBreakXmlDomParser.ts @@ -10,7 +10,13 @@ export class LineBreakXmlDomParser extends AbstractParser { engine: XmlDomParsingEngine; predicate = (item: Node): boolean => { - return item instanceof Element && nodeName(item) === 'BR'; + return ( + (item instanceof Element && nodeName(item) === 'BR') || + (item instanceof Text && + item.textContent === '\u200B' && + !item.nextSibling && + (!item.previousSibling || nodeName(item.previousSibling) === 'BR')) + ); }; async parse(item: Element): Promise { diff --git a/packages/plugin-renderer-dom-object/src/DomObjectRenderingEngine.ts b/packages/plugin-renderer-dom-object/src/DomObjectRenderingEngine.ts index 2d1393ab9..da7d31da1 100644 --- a/packages/plugin-renderer-dom-object/src/DomObjectRenderingEngine.ts +++ b/packages/plugin-renderer-dom-object/src/DomObjectRenderingEngine.ts @@ -270,7 +270,7 @@ export class DomObjectRenderingEngine extends RenderingEngine { async renderChildren(node: VNode): Promise> { const children: Array = node.children(); if (!children.length && this.editor.mode.is(node, RuleProperty.ALLOW_EMPTY) !== true) { - children.push({ tag: 'BR' }); + children.push({ text: '\u200B' }); } return children; }