UNPKG

node-webodf

Version:

WebODF - JavaScript Document Engine http://webodf.org/

972 lines (969 loc) 111 kB
<!-- * Copyright (C) 2013-2014 KO GmbH <copyright@kogmbh.com> * * @licstart * This file is part of WebODF. * * WebODF is free software: you can redistribute it and/or modify it * under the terms of the GNU Affero General Public License (GNU AGPL) * as published by the Free Software Foundation, either version 3 of * the License, or (at your option) any later version. * * WebODF is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with WebODF. If not, see <http://www.gnu.org/licenses/>. * @licend * * @source: http://www.webodf.org/ * @source: https://github.com/kogmbh/WebODF/ --> <tests xmlns:html="http://www.w3.org/1999/xhtml" xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" xmlns:c="urn:webodf:names:cursor" xmlns:e="urn:webodf:names:editinfo" xmlns:h="urn:webodf:names:helper" xmlns:wo="urn:webodf:names:scope" xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" xmlns:foreign="urn:operationtests:foreign"> <test name="AddCursor_Simple"> <before><office:text><text:p/></office:text></before> <ops> <op optype="AddCursor" memberid="Joe"/> </ops> <after><office:text><text:p><c:cursor c:memberId="Joe"/></text:p></office:text></after> </test> <test name="AddCursor_Span"> <before><office:text><text:p><text:span/></text:p></office:text></before> <ops> <op optype="AddCursor" memberid="Joe"/> </ops> <after><office:text><text:p><c:cursor c:memberId="Joe"/><text:span/></text:p></office:text></after> </test> <test name="AddCursor_Text"> <before><office:text><text:p>a</text:p></office:text></before> <ops> <op optype="AddCursor" memberid="Joe"/> </ops> <after><office:text><text:p><c:cursor c:memberId="Joe"/>a</text:p></office:text></after> </test> <test name="AddCursor_Space"> <before><office:text><text:p> a</text:p></office:text></before> <ops> <op optype="AddCursor" memberid="Joe"/> </ops> <after><office:text><text:p> <c:cursor c:memberId="Joe"/>a</text:p></office:text></after> </test> <test name="AddCursor_SpanSpace"> <before><office:text><text:p> <text:span> a</text:span></text:p></office:text></before> <ops> <op optype="AddCursor" memberid="Joe"/> </ops> <after><office:text><text:p> <text:span> <c:cursor c:memberId="Joe"/>a</text:span></text:p></office:text></after> </test> <test name="AddCursor_JustAfterEdit"> <before><office:text><text:p><editinfo /><text:span>a</text:span></text:p></office:text></before> <ops> <op optype="AddCursor" memberid="Joe"/> </ops> <after><office:text><text:p><editinfo /><text:span><c:cursor c:memberId="Joe"/>a</text:span></text:p></office:text></after> </test> <test name="AddCursor_NonEmptySpan"> <before><office:text><text:p><text:span>a</text:span></text:p></office:text></before> <ops> <op optype="AddCursor" memberid="Joe"/> </ops> <after><office:text><text:p><text:span><c:cursor c:memberId="Joe"/>a</text:span></text:p></office:text></after> </test> <test name="AddCursor_NestedSpan"> <before><office:text><text:p><text:span><text:span>a</text:span></text:span></text:p></office:text></before> <ops> <op optype="AddCursor" memberid="Joe"/> </ops> <after><office:text><text:p><text:span><text:span><c:cursor c:memberId="Joe"/>a</text:span></text:span></text:p></office:text></after> </test> <test name="AddCursor_NestedSpan_JustAfterEdit_Level1"> <before><office:text><text:p><editinfo /><text:span><text:span>a</text:span></text:span></text:p></office:text></before> <ops> <op optype="AddCursor" memberid="Joe"/> </ops> <after><office:text><text:p><editinfo /><text:span><text:span><c:cursor c:memberId="Joe"/>a</text:span></text:span></text:p></office:text></after> </test> <test name="AddCursor_NestedSpan_JustAfterEdit_Level2"> <before><office:text><text:p><text:span><editinfo /><text:span>a</text:span></text:span></text:p></office:text></before> <ops> <op optype="AddCursor" memberid="Joe"/> </ops> <after><office:text><text:p><text:span><editinfo /><text:span><c:cursor c:memberId="Joe"/>a</text:span></text:span></text:p></office:text></after> </test> <!-- <test name="RemoveCursor_Simple"> <before><office:text><text:p><c:cursor c:memberId="Joe"/></text:p></office:text></before> <ops> <op optype="RemoveCursor" memberid="Joe"/> </ops> <after><office:text><text:p/></office:text></after> </test> --> <test name="AddRemoveCursor_Simple"> <before><office:text><text:p/></office:text></before> <ops> <op optype="AddCursor" memberid="Joe"/> <op optype="RemoveCursor" memberid="Joe"/> </ops> <after><office:text><text:p/></office:text></after> </test> <test name="MoveCursor_OverImageAnchoredAsCharInStyle" isFailing="true"> <before> <office:automatic-styles> <style:style style:name="Graphics" style:family="graphic"> <style:graphic-properties text:anchor-type="as-char"/> </style:style> </office:automatic-styles> <office:text> <text:p><draw:frame draw:style-name="Graphics"/></text:p> </office:text> </before> <ops> <op optype="AddCursor" memberid="Joe"/> <op optype="MoveCursor" memberid="Joe" position="1"/> </ops> <after> <office:automatic-styles> <style:style style:name="Graphics" style:family="graphic"> <style:graphic-properties text:anchor-type="as-char"/> </style:style> </office:automatic-styles> <office:text> <text:p><draw:frame draw:style-name="Graphics"/><c:cursor c:memberId="Joe"/></text:p> </office:text> </after> </test> <test name="InsertText_Simple"> <before><office:text><text:p/></office:text></before> <ops> <op optype="InsertText" position="0" text="hello"/> </ops> <after><office:text><text:p>hello</text:p></office:text></after> </test> <test name="InsertRemoveText_Simple"> <before><office:text><text:p/></office:text></before> <ops> <op optype="InsertText" position="0" text="hello"/> <op optype="RemoveText" position="0" length="5"/> </ops> <after><office:text><text:p/></office:text></after> </test> <test name="InsertText_Simple2"> <before><office:text><text:p>a</text:p></office:text></before> <ops> <op optype="InsertText" position="0" text="b"/> </ops> <after><office:text><text:p>ba</text:p></office:text></after> </test> <test name="InsertText_Simple3"> <before><office:text><text:p>a</text:p></office:text></before> <ops> <op optype="InsertText" position="1" text="b"/> </ops> <after><office:text><text:p>ab</text:p></office:text></after> </test> <test name="InsertText_InsertNewLineChar"> <before><office:text><text:p>a</text:p></office:text></before> <ops> <op optype="InsertText" position="1" text="&#10;"/> </ops> <after><office:text><text:p>a<text:s> </text:s></text:p></office:text></after> </test> <test name="InsertText_OneByOneBeforeExisting"> <before><office:text><text:p>T</text:p></office:text></before> <ops> <op optype="InsertText" position="0" text="a"/> <op optype="InsertText" position="1" text="b"/> </ops> <after><office:text><text:p>abT</text:p></office:text></after> </test> <test name="InsertText_Span"> <before><office:text><text:p><text:span>a</text:span></text:p></office:text></before> <ops> <op optype="InsertText" position="1" text="b"/> </ops> <after><office:text><text:p><text:span>ab</text:span></text:p></office:text></after> </test> <test name="InsertText_Span2"> <before><office:text><text:p><text:span>a</text:span></text:p></office:text></before> <ops> <op optype="InsertText" position="0" text="b"/> </ops> <after><office:text><text:p><text:span>ba</text:span></text:p></office:text></after> </test> <test name="InsertText_BeforeSpace"> <before><office:text><text:p><text:s> </text:s></text:p></office:text></before> <ops> <op optype="InsertText" position="0" text="a"/> </ops> <after><office:text><text:p>a<text:s> </text:s></text:p></office:text></after> </test> <test name="InsertText_AfterSpace"> <before><office:text><text:p><text:s> </text:s></text:p></office:text></before> <ops> <op optype="InsertText" position="1" text="a"/> </ops> <after><office:text><text:p><text:s> </text:s>a</text:p></office:text></after> </test> <test name="InsertText_AfterSpace2"> <before><office:text><text:p>a<text:s> </text:s></text:p></office:text></before> <ops> <op optype="InsertText" position="2" text="b"/> </ops> <after><office:text><text:p>a b</text:p></office:text></after> </test> <test name="InsertText_withSameCursor_AfterSpace2"> <before><office:text><text:p>a<text:s> </text:s></text:p><text:p/></office:text></before> <ops> <op optype="AddCursor" memberid="Joe"/> <op optype="MoveCursor" memberid="Joe" position="2"/> <op optype="InsertText" memberid="Joe" position="2" text="b"/> </ops> <after><office:text><text:p>a <c:cursor c:memberId="Joe"/>b</text:p><text:p/></office:text></after> </test> <test name="InsertText_withSameCursor_AfterSpace2_moveCursor"> <before><office:text><text:p>a<text:s> </text:s></text:p><text:p/></office:text></before> <ops> <op optype="AddCursor" memberid="Joe"/> <op optype="MoveCursor" memberid="Joe" position="2"/> <op optype="InsertText" memberid="Joe" position="2" text="b" moveCursor="true"/> </ops> <after><office:text><text:p>a b<c:cursor c:memberId="Joe"/></text:p><text:p/></office:text></after> </test> <test name="InsertText_withSameCursor_BeforeSpan_moveCursor"> <before><office:text><text:p>a<text:span>b</text:span></text:p><text:p/></office:text></before> <ops> <op optype="AddCursor" memberid="Joe"/> <op optype="InsertText" memberid="Joe" position="0" text="c" moveCursor="true"/> </ops> <after><office:text><text:p>c<c:cursor c:memberId="Joe"/>a<text:span>b</text:span></text:p><text:p/></office:text></after> </test> <test name="InsertText_withSameCursor_BeforeSpan"> <before><office:text><text:p>a<text:span>b</text:span></text:p><text:p/></office:text></before> <ops> <op optype="AddCursor" memberid="Joe"/> <op optype="InsertText" memberid="Joe" position="0" text="c"/> </ops> <after><office:text><text:p><c:cursor c:memberId="Joe"/>ca<text:span>b</text:span></text:p><text:p/></office:text></after> </test> <test name="InsertText_withSameCursor_moveCursor"> <before><office:text><text:p>a</text:p><text:p/></office:text></before> <ops> <op optype="AddCursor" memberid="Joe"/> <op optype="InsertText" memberid="Joe" position="0" text="b" moveCursor="true"/> </ops> <after><office:text><text:p>b<c:cursor c:memberId="Joe"/>a</text:p><text:p/></office:text></after> </test> <test name="InsertText_withSameCursor"> <before><office:text><text:p>a</text:p><text:p/></office:text></before> <ops> <op optype="AddCursor" memberid="Joe"/> <op optype="InsertText" memberid="Joe" position="0" text="b"/> </ops> <after><office:text><text:p><c:cursor c:memberId="Joe"/>ba</text:p><text:p/></office:text></after> </test> <test name="InsertText_withSameCursor2"> <before><office:text><text:p>ab c</text:p><text:p/></office:text></before> <ops> <op optype="AddCursor" memberid="Joe"/> <op optype="MoveCursor" memberid="Joe" position="1"/> <op optype="InsertText" memberid="Joe" position="1" text="d" moveCursor="true"/> </ops> <after><office:text><text:p>ad<c:cursor c:memberId="Joe"/>b c</text:p><text:p/></office:text></after> </test> <test name="InsertText_withOtherCursor_AfterSpace2"> <before><office:text><text:p>a<text:s> </text:s></text:p><text:p/></office:text></before> <ops> <op optype="AddCursor" memberid="Joe"/> <op optype="MoveCursor" memberid="Joe" position="2"/> <op optype="InsertText" memberid="Alice" position="2" text="b" moveCursor="true"/> </ops> <after><office:text><text:p>a <c:cursor c:memberId="Joe"/>b</text:p><text:p/></office:text></after> </test> <test name="InsertText_withOtherCursor_BeforeSpan"> <before><office:text><text:p>a<text:span>b</text:span></text:p><text:p/></office:text></before> <ops> <op optype="AddCursor" memberid="Joe"/> <op optype="InsertText" memberid="Alice" position="0" text="c" moveCursor="true"/> </ops> <after><office:text><text:p><c:cursor c:memberId="Joe"/>ca<text:span>b</text:span></text:p><text:p/></office:text></after> </test> <test name="InsertText_withOtherCursor"> <before><office:text><text:p>a</text:p><text:p/></office:text></before> <ops> <op optype="AddCursor" memberid="Joe"/> <op optype="InsertText" memberid="Alice" position="0" text="b" moveCursor="true"/> </ops> <after><office:text><text:p><c:cursor c:memberId="Joe"/>ba</text:p><text:p/></office:text></after> </test> <test name="InsertText_withOtherCursor2"> <before><office:text><text:p>ab c</text:p><text:p/></office:text></before> <ops> <op optype="AddCursor" memberid="Joe"/> <op optype="MoveCursor" memberid="Joe" position="1"/> <op optype="InsertText" memberid="Alice" position="1" text="d" moveCursor="true"/> </ops> <after><office:text><text:p>a<c:cursor c:memberId="Joe"/>db c</text:p><text:p/></office:text></after> </test> <test name="InsertSpace"> <before><office:text><text:p/></office:text></before> <ops> <op optype="InsertText" position="0" text=" " moveCursor="true"/> </ops> <after><office:text><text:p><text:s> </text:s></text:p></office:text></after> </test> <test name="InsertSpace_IntoExistingSpaceBlock"> <before><office:text><text:p>a <text:s> </text:s><text:s> </text:s>b</text:p></office:text></before> <ops> <op optype="InsertText" position="2" text=" " moveCursor="true"/> </ops> <after><office:text><text:p>a <text:s> </text:s><text:s> </text:s><text:s> </text:s>b</text:p></office:text></after> </test> <test name="InsertSpaceAndCharacters"> <before><office:text><text:p/></office:text></before> <ops> <op optype="InsertText" position="0" text="a" moveCursor="true"/> <op optype="InsertText" position="1" text=" " moveCursor="true"/> <op optype="InsertText" position="2" text="b" moveCursor="true"/> <op optype="InsertText" position="3" text="c" moveCursor="true"/> </ops> <after><office:text><text:p>a bc</text:p></office:text></after> </test> <test name="InsertMultipleSpaces"> <before><office:text><text:p/></office:text></before> <ops> <op optype="InsertText" position="0" text="a b" moveCursor="true"/> </ops> <after><office:text><text:p>a <text:s> </text:s><text:s> </text:s><text:s> </text:s>b</text:p></office:text></after> </test> <test name="InsertWithTrailingSpace"> <before><office:text><text:p/></office:text></before> <ops> <op optype="InsertText" position="0" text="a " moveCursor="true"/> </ops> <after><office:text><text:p>a<text:s> </text:s></text:p></office:text></after> </test> <test name="InsertSpaceAndCharacters2"> <before><office:text><text:p/></office:text></before> <ops> <op optype="InsertText" position="0" text="a " moveCursor="true"/> <op optype="InsertText" position="2" text="b" moveCursor="true"/> <op optype="InsertText" position="3" text="c" moveCursor="true"/> </ops> <after><office:text><text:p>a bc</text:p></office:text></after> </test> <test name="InsertText_AfterSpaceAndTab_InNewParagraph"> <before><office:text><text:p/></office:text></before> <ops> <op optype="SplitParagraph" position="0" moveCursor="true"/> <op optype="InsertText" position="1" text="&#x9; " moveCursor="true"/> <op optype="SplitParagraph" position="4" moveCursor="true"/> <op optype="InsertText" position="5" text="U" moveCursor="true"/> <op optype="MergeParagraph" destinationStartPosition="0" sourceStartPosition="1"/> </ops> <after><office:text><text:p><text:tab>&#x9;</text:tab> <text:s> </text:s></text:p><text:p>U</text:p></office:text></after> </test> <test name="RemoveSpace"> <before><office:text><text:p><text:s> </text:s></text:p></office:text></before> <ops> <op optype="RemoveText" position="0" length="1"/> </ops> <after><office:text><text:p/></office:text></after> </test> <test name="RemoveText_SurroundingCursor"> <before><office:text><text:p>a<c:cursor>b</c:cursor>c</text:p></office:text></before> <ops> <op optype="RemoveText" position="0" length="2"/> </ops> <after><office:text><text:p><c:cursor>b</c:cursor></text:p></office:text></after> </test> <test name="AddRemoveSpace"> <before><office:text><text:p>ab</text:p></office:text></before> <ops> <op optype="InsertText" position="1" text=" " moveCursor="true"/> <op optype="RemoveText" position="1" length="1"/> </ops> <after><office:text><text:p>a b</text:p></office:text></after> </test> <test name="InsertTab"> <before><office:text><text:p/></office:text></before> <ops> <op optype="InsertText" position="0" text="&#x9;" moveCursor="true"/> </ops> <after><office:text><text:p><text:tab>&#09;</text:tab></text:p></office:text></after> </test> <test name="InsertText_TabChars"> <before><office:text><text:p/></office:text></before> <ops> <op optype="InsertText" position="0" text="ab&#x9;c" moveCursor="true"/> </ops> <after><office:text><text:p>ab<text:tab>&#09;</text:tab>c</text:p></office:text></after> </test> <test name="InsertText_SingleSpaceChar"> <before><office:text><text:p/></office:text></before> <ops> <op optype="InsertText" position="0" text="a bc" moveCursor="true"/> </ops> <after><office:text><text:p>a bc</text:p></office:text></after> </test> <test name="InsertText_TextWithLeadingSpaceAfterSpace"> <before><office:text><text:p>a d</text:p></office:text></before> <ops> <op optype="InsertText" position="2" text=" bc" moveCursor="true"/> </ops> <after><office:text><text:p>a <text:s> </text:s>bcd</text:p></office:text></after> </test> <test name="InsertText_TextAfterUnexpandedSpace"> <before><office:text><text:p>a d</text:p></office:text></before> <ops> <op optype="InsertText" position="2" text="bc" moveCursor="true"/> </ops> <after><office:text><text:p>a bcd</text:p></office:text></after> </test> <test name="InsertText_TextAfterExpandedSpace"> <before><office:text><text:p>a<text:s> </text:s>d</text:p></office:text></before> <ops> <op optype="InsertText" position="2" text="bc" moveCursor="true"/> </ops> <after><office:text><text:p>a bcd</text:p></office:text></after> </test> <test name="InsertText_MultipleSpaceChar"> <before><office:text><text:p/></office:text></before> <ops> <op optype="InsertText" position="0" text="a bc" moveCursor="true"/> </ops> <after><office:text><text:p>a <text:s> </text:s><text:s> </text:s>bc</text:p></office:text></after> </test> <test name="InsertText_DowngradeLeadingSpaces"> <before><office:text><text:p>a</text:p></office:text></before> <ops> <op optype="InsertText" position="1" text=" bc" moveCursor="true"/> </ops> <after><office:text><text:p>a bc</text:p></office:text></after> </test> <test name="InsertText_DowngradeTrailingSpaces"> <before><office:text><text:p>a <text:s> </text:s>d</text:p></office:text></before> <ops> <op optype="InsertText" position="2" text="bc" moveCursor="true"/> </ops> <after><office:text><text:p>a bc d</text:p></office:text></after> </test> <test name="InsertText_UpgradesTrailingSpace"> <before><office:text><text:p>a d</text:p></office:text></before> <ops> <op optype="InsertText" position="1" text="bc " moveCursor="true"/> </ops> <after><office:text><text:p>abc <text:s> </text:s>d</text:p></office:text></after> </test> <test name="RemoveCharacter"> <before><office:text><text:p>A</text:p></office:text></before> <ops> <op optype="RemoveText" position="0" length="1"/> </ops> <after><office:text><text:p/></office:text></after> </test> <test name="RemoveCharacter_DowngradesWhiteSpace"> <before><office:text><text:p>A <text:s> </text:s>B</text:p></office:text></before> <ops> <op optype="RemoveText" position="1" length="1"/> </ops> <after><office:text><text:p>A B</text:p></office:text></after> </test> <test name="InsertRemoveText_Simple_Backwards"> <before><office:text><text:p/></office:text></before> <ops> <op optype="InsertText" position="0" text="ABC" moveCursor="true"/> <op optype="RemoveText" position="1" length="2"/> <op optype="RemoveText" position="0" length="1"/> </ops> <after><office:text><text:p/></office:text></after> </test> <test name="RemoveSpace2"> <before><office:text><text:p>a<text:s> </text:s><text:s> </text:s></text:p></office:text></before> <ops> <op optype="RemoveText" position="1" length="1"/> </ops> <after><office:text><text:p>a<text:s> </text:s></text:p></office:text></after> </test> <test name="Remove_characterInSpanCursorBehind"> <before><office:text><text:p><text:span>A</text:span></text:p></office:text></before> <ops> <op optype="AddCursor" memberid="Bob"/> <op optype="MoveCursor" memberid="Bob" position="1"/> <op optype="RemoveText" memberid="Bob" position="0" length="1"/> </ops> <after><office:text><text:p><c:cursor c:memberId="Bob"/></text:p></office:text></after> </test> <test name="RemoveText_bridgeSpan_withCursor"> <before><office:text><text:p text:style-name="A">ab<text:span>cd</text:span></text:p></office:text></before> <ops> <op optype="AddCursor" memberid="Bob"/> <op optype="MoveCursor" memberid="Bob" position="1" length="2"/> <op optype="RemoveText" position="1" length="2"/> </ops> <after><office:text><text:p text:style-name="A">a<c:cursor c:memberId="Bob"/><text:span>d</text:span></text:p></office:text></after> </test> <test name="MergeParagraph_1"> <before><office:text><text:p text:style-name="A">abcd</text:p><text:p text:style-name="B">efgh</text:p></office:text></before> <ops> <op optype="MergeParagraph" destinationStartPosition="0" sourceStartPosition="5" paragraphStyleName="A"/> </ops> <after><office:text><text:p text:style-name="A">abcdefgh</text:p></office:text></after> </test> <test name="MergeParagraphWithEmptyAnnotationText inside"> <before><office:text><text:p text:style-name="A">ab</text:p><text:p text:style-name="B">c<office:annotation office:name="alice_1"> <dc:creator e:memberid="Alice">Alice</dc:creator> <dc:date>2013-08-05T12:34:07.061Z</dc:date> <text:list> <text:list-item> <text:p></text:p> </text:list-item> </text:list> </office:annotation>d</text:p></office:text></before> <ops> <op optype="MergeParagraph" destinationStartPosition="0" sourceStartPosition="3" paragraphStyleName="A"/> </ops> <after><office:text><text:p text:style-name="A">abc<office:annotation office:name="alice_1"> <dc:creator e:memberid="Alice">Alice</dc:creator> <dc:date>2013-08-05T12:34:07.061Z</dc:date> <text:list> <text:list-item> <text:p></text:p> </text:list-item> </text:list> </office:annotation>d</text:p></office:text></after> </test> <test name="RemoveAndMerge"> <before><office:text><text:p text:style-name="A">abc<text:span text:style-name="B">d</text:span></text:p><text:p text:style-name="C"><text:span text:style-name="D">efgh</text:span></text:p></office:text></before> <ops> <op optype="RemoveText" position="5" length="2"/> <op optype="MergeParagraph" destinationStartPosition="0" sourceStartPosition="5" paragraphStyleName="A"/> <op optype="RemoveText" position="2" length="2"/> </ops> <after><office:text><text:p text:style-name="A">ab<text:span text:style-name="D">gh</text:span></text:p></office:text></after> </test> <test name="RemoveAndMerge_withCursor"> <before><office:text><text:p text:style-name="A"><text:span>a</text:span>bcd</text:p><text:p text:style-name="B"><text:span>e</text:span>fgh</text:p></office:text></before> <ops> <op optype="AddCursor" memberid="Bob"/> <op optype="MoveCursor" memberid="Bob" position="2" length="5"/> <op optype="RemoveText" position="5" length="2"/> <op optype="MergeParagraph" destinationStartPosition="0" sourceStartPosition="5" paragraphStyleName="A"/> <op optype="RemoveText" position="2" length="2"/> </ops> <after><office:text><text:p text:style-name="A"><text:span>a</text:span>b<c:cursor c:memberId="Bob"/>gh</text:p></office:text></after> </test> <test name="RemoveAndMerge_OntoFirstLine"> <before><office:text><text:p text:style-name="A"><text:span>ab</text:span></text:p><text:p text:style-name="B"><text:span>cde</text:span></text:p></office:text></before> <ops> <op optype="AddCursor" memberid="Bob"/> <op optype="RemoveText" position="0" length="1"/> <op optype="RemoveText" position="0" length="1"/> <op optype="MergeParagraph" destinationStartPosition="0" sourceStartPosition="1" paragraphStyleName="A"/> </ops> <after><office:text><text:p text:style-name="A"><text:span><c:cursor c:memberId="Bob"/>cde</text:span></text:p></office:text></after> </test> <test name="RemoveAndMerge_EmptyParagraph"> <before><office:text><text:p text:style-name="A"><draw:frame text:anchor-type="as-char"/></text:p><text:p text:style-name="B"/><text:p text:style-name="C"></text:p></office:text></before> <ops> <op optype="AddCursor" memberid="Bob"/> <op optype="RemoveText" position="0" length="1"/> <op optype="MergeParagraph" destinationStartPosition="0" sourceStartPosition="1" paragraphStyleName="A"/> <op optype="MoveCursor" memberid="Bob" position="1" length="0"/> </ops> <after><office:text><text:p text:style-name="A"/><text:p text:style-name="C"><c:cursor c:memberId="Bob"/></text:p></office:text></after> </test> <test name="RemoveAndMerge_EmptyParagraph_naturalStyling"> <before><office:text><text:p text:style-name="A"><draw:frame text:anchor-type="as-char"/></text:p><text:p text:style-name="B"/><text:p text:style-name="C"></text:p></office:text></before> <ops> <op optype="AddCursor" memberid="Bob"/> <op optype="RemoveText" position="0" length="1"/> <op optype="MergeParagraph" destinationStartPosition="0" sourceStartPosition="1"/> <op optype="SetParagraphStyle" position="0" styleName="B"/> <op optype="MoveCursor" memberid="Bob" position="1" length="0"/> </ops> <after><office:text><text:p text:style-name="B"/><text:p text:style-name="C"><c:cursor c:memberId="Bob"/></text:p></office:text></after> </test> <test name="Remove_DeleteLastCharacterNearTabs"> <before><office:text><text:p><text:span><text:tab>&#09;</text:tab><text:tab>&#09;</text:tab>a</text:span></text:p></office:text></before> <ops> <op optype="AddCursor" memberid="Bob"/> <op optype="MoveCursor" memberid="Bob" position="2"/> <op optype="RemoveText" position="2" length="1"/> </ops> <after><office:text><text:p><text:span><text:tab>&#09;</text:tab><text:tab>&#09;</text:tab><c:cursor c:memberId="Bob"/></text:span></text:p></office:text></after> </test> <test name="Remove_DeleteLastCharacterInSpan"> <before><office:text><text:p>a<text:span><e:editinfo e:id="A"/>b</text:span>c</text:p></office:text></before> <ops> <op optype="AddCursor" memberid="Bob"/> <op optype="MoveCursor" memberid="Bob" position="1"/> <op optype="RemoveText" position="1" length="1"/> </ops> <after><office:text><text:p>a<c:cursor c:memberId="Bob"/><e:editinfo e:id="A"/>c</text:p></office:text></after> </test> <test name="Remove_DeleteTabs"> <before><office:text><text:p><text:span><text:tab>&#09;</text:tab><text:tab>&#09;</text:tab></text:span></text:p></office:text></before> <ops> <op optype="AddCursor" memberid="Bob"/> <op optype="MoveCursor" memberid="Bob" position="1"/> <op optype="RemoveText" position="1" length="1"/> </ops> <after><office:text><text:p><text:span><text:tab>&#09;</text:tab><c:cursor c:memberId="Bob"/></text:span></text:p></office:text></after> </test> <test name="Remove_DeleteTabs2"> <before><office:text><text:p><text:span>a<text:tab>&#09;</text:tab><text:tab>&#09;</text:tab></text:span></text:p></office:text></before> <ops> <op optype="AddCursor" memberid="Bob"/> <op optype="MoveCursor" memberid="Bob" position="2"/> <op optype="RemoveText" position="2" length="1"/> </ops> <after><office:text><text:p><text:span>a<text:tab>&#09;</text:tab><c:cursor c:memberId="Bob"/></text:span></text:p></office:text></after> </test> <test name="Remove_DeleteLineBreak"> <before><office:text><text:p><text:span>a<text:line-break/>b</text:span></text:p></office:text></before> <ops> <op optype="RemoveText" position="0" length="2"/> </ops> <after><office:text><text:p><text:span>b</text:span></text:p></office:text></after> </test> <test name="Remove_DeleteImageWithText"> <before><office:text><text:p><draw:frame draw:name="graphics1" draw:style-name="fr1" text:anchor-type="as-char" svg:width="5cm" svg:height="6cm"><draw:image xlink:href="Pictures/helloworld.jpg" xlink:type="simple" xlink:actuate="onLoad" xlink:show="embed" /></draw:frame><text:span>hello</text:span></text:p></office:text></before> <ops> <op optype="RemoveText" position="0" length="3"/> </ops> <after><office:text><text:p><text:span>llo</text:span></text:p></office:text></after> </test> <test name="Remove_DeleteImageWithSvgDesc"> <before><office:text><text:p><draw:frame draw:name="graphics1" draw:style-name="fr1" text:anchor-type="as-char" svg:width="5cm" svg:height="6cm"><draw:image xlink:href="Pictures/helloworld.jpg" xlink:type="simple" xlink:actuate="onLoad" xlink:show="embed" /><svg:desc>hello world</svg:desc></draw:frame></text:p></office:text></before> <ops> <op optype="RemoveText" position="0" length="13"/> </ops> <after><office:text><text:p/></office:text></after> </test> <test name="Merge_ListItem1"> <before><office:text><text:list><text:list-item><text:p><text:span>hello</text:span></text:p></text:list-item><text:list-item><text:p><text:span>world</text:span></text:p></text:list-item></text:list></office:text></before> <ops> <op optype="MergeParagraph" destinationStartPosition="0" sourceStartPosition="6"/> </ops> <after><office:text><text:list><text:list-item><text:p><text:span>hello</text:span><text:span>world</text:span></text:p></text:list-item></text:list></office:text></after> </test> <test name="Merge_ListItem2"> <before><office:text><text:list><text:list-item><text:p></text:p><text:list><text:list-item><text:p><text:span>hello</text:span></text:p></text:list-item></text:list></text:list-item></text:list></office:text></before> <ops> <op optype="MergeParagraph" destinationStartPosition="0" sourceStartPosition="1"/> </ops> <after><office:text><text:list><text:list-item><text:p><text:span>hello</text:span></text:p></text:list-item></text:list></office:text></after> </test> <test name="Merge_EmptyParagraph1"> <before><office:text><text:p text:style-name="A"></text:p><text:p text:style-name="B">efgh</text:p></office:text></before> <ops> <op optype="MergeParagraph" destinationStartPosition="0" sourceStartPosition="1" paragraphStyleName="A"/> </ops> <after><office:text><text:p text:style-name="A">efgh</text:p></office:text></after> </test> <test name="Merge_Empty1_naturalStyling"> <before><office:text><text:p text:style-name="A"></text:p><text:p text:style-name="B">efgh</text:p></office:text></before> <ops> <op optype="MergeParagraph" destinationStartPosition="0" sourceStartPosition="1"/> <op optype="SetParagraphStyle" position="0" styleName="B"/> </ops> <after><office:text><text:p text:style-name="B">efgh</text:p></office:text></after> </test> <test name="Merge_Empty1_naturalStyling_unspecifiedName"> <before><office:text><text:p text:style-name="A"></text:p><text:p>efgh</text:p></office:text></before> <ops> <op optype="MergeParagraph" destinationStartPosition="0" sourceStartPosition="1"/> <op optype="SetParagraphStyle" position="0" styleName=""/> </ops> <after><office:text><text:p>efgh</text:p></office:text></after> </test> <test name="Merge_Empty_WithNonOdfChildren"> <before><office:text><text:p text:style-name="A"><foreign:test foreign:id="1"/><foreign:test foreign:id="2"/></text:p><text:p text:style-name="B"><foreign:test foreign:id="3"/>efgh<foreign:test foreign:id="4"/></text:p></office:text></before> <ops> <op optype="MergeParagraph" destinationStartPosition="0" sourceStartPosition="1"/> <op optype="SetParagraphStyle" position="0" styleName="B"/> </ops> <after><office:text><text:p text:style-name="B"><foreign:test foreign:id="1"/><foreign:test foreign:id="2"/><foreign:test foreign:id="3"/>efgh<foreign:test foreign:id="4"/></text:p></office:text></after> </test> <test name="Merge_Empty_WithNonOdfChildren_PreservesForeignElements"> <before><office:text><text:p><foreign:test foreign:id="1"/></text:p><text:p><text:span><foreign:test foreign:id="2"/></text:span></text:p></office:text></before> <ops> <op optype="MergeParagraph" destinationStartPosition="0" sourceStartPosition="1"/> </ops> <after><office:text><text:p><foreign:test foreign:id="1"/><foreign:test foreign:id="2"/></text:p></office:text></after> </test> <test name="Merge_HighlightedAnnotation_bug666"> <before><office:text><text:p>A</text:p><text:p><html:span class="webodf-annotationHighlight">B</html:span></text:p></office:text></before> <ops> <op optype="MergeParagraph" memberid="Alice" destinationStartPosition="0" sourceStartPosition="2"/> </ops> <after><office:text><text:p>A<html:span class="webodf-annotationHighlight">B</html:span></text:p></office:text></after> </test> <test name="Merge_MovesCursor"> <before><office:text><text:p/><text:p/><text:p>B</text:p></office:text></before> <ops> <op optype="AddCursor" memberid="Alice"/> <op optype="MergeParagraph" memberid="Alice" destinationStartPosition="1" sourceStartPosition="2" moveCursor="true"/> </ops> <after><office:text><text:p/><text:p><c:cursor c:memberId="Alice"/>B</text:p></office:text></after> </test> <test name="Merge_CopesWithOddElements_AtParagraphBounds"> <before><office:text><text:p/><text:p><text:hidden-text>hidden</text:hidden-text>B</text:p></office:text></before> <ops> <op optype="MergeParagraph" memberid="Alice" destinationStartPosition="0" sourceStartPosition="1"/> </ops> <after><office:text><text:p><text:hidden-text>hidden</text:hidden-text>B</text:p></office:text></after> </test> <test name="Merge_CleansUpEmptySpans"> <before><office:text><text:p/><text:p><text:span/>B</text:p></office:text></before> <ops> <op optype="MergeParagraph" memberid="Alice" destinationStartPosition="0" sourceStartPosition="1"/> </ops> <after><office:text><text:p>B</text:p></office:text></after> </test> <test name="Remove_deleteLink1"> <before><office:text><text:p><text:a xlink:type="simple" xlink:href="http://www.hello.com"><text:span>Hello</text:span></text:a></text:p></office:text></before> <ops> <op optype="RemoveText" position="0" length="5"/> </ops> <after><office:text><text:p/></office:text></after> </test> <test name="Remove_deleteLink2"> <before><office:text><text:p><text:span><text:a xlink:type="simple" xlink:href="http://www.hello.com">Hello</text:a><text:a xlink:type="simple" xlink:href="http://www.world.com">World</text:a></text:span></text:p></office:text></before> <ops> <op optype="RemoveText" position="4" length="6"/> </ops> <after><office:text><text:p><text:span><text:a xlink:type="simple" xlink:href="http://www.hello.com">Hell</text:a></text:span></text:p></office:text></after> </test> <test name="Remove_deleteNearSpace"> <before><office:text><text:p>AB</text:p><text:p><text:s> </text:s><text:span>CD</text:span></text:p></office:text></before> <ops> <op optype="AddCursor" memberid="Bob"/> <op optype="MoveCursor" memberid="Bob" position="3"/> <op optype="RemoveText" position="3" length="1"/> </ops> <after><office:text><text:p>AB</text:p><text:p><text:span><c:cursor c:memberId="Bob" />CD</text:span></text:p></office:text></after> </test> <test name="SpaceBetweenParagraphs"> <before><office:text><text:p>a</text:p> <text:p>b</text:p></office:text></before> <ops> <op optype="AddCursor" memberid="Joe"/> <op optype="MoveCursor" memberid="Joe" position="2"/> </ops> <after><office:text><text:p>a</text:p> <text:p><c:cursor c:memberId="Joe"/>b</text:p></office:text></after> </test> <test name="20130517_split_text_2space"> <before><office:text><text:p>20130517_split_text_2space</text:p></office:text></before> <ops> <op optype="AddCursor" memberid="Joe"/> <op optype="MoveCursor" memberid="Joe" position="9"/> <op optype="InsertText" memberid="Joe" position="9" text="A" moveCursor="true"/> <op optype="InsertText" memberid="Joe" position="10" text=" " moveCursor="true"/> <op optype="InsertText" memberid="Joe" position="11" text=" " moveCursor="true"/> <op optype="MoveCursor" memberid="Joe" position="11"/> <op optype="MoveCursor" memberid="Joe" position="10"/> </ops> <after><office:text><text:p>20130517_A<c:cursor c:memberId="Joe"/> <text:s> </text:s>split_text_2space</text:p></office:text></after> </test> <test name="20130517_split_text_2space_otherCursor"> <before><office:text><text:p>20130517_split_text_2space</text:p></office:text></before> <ops> <op optype="AddCursor" memberid="Joe"/> <op optype="MoveCursor" memberid="Joe" position="9"/> <op optype="InsertText" memberid="Alice" position="9" text="A" moveCursor="true"/> <op optype="InsertText" memberid="Alice" position="10" text=" " moveCursor="true"/> <op optype="InsertText" memberid="Alice" position="11" text=" " moveCursor="true"/> <op optype="MoveCursor" memberid="Joe" position="11"/> <op optype="MoveCursor" memberid="Joe" position="10"/> </ops> <after><office:text><text:p>20130517_A<c:cursor c:memberId="Joe"/> <text:s> </text:s>split_text_2space</text:p></office:text></after> </test> <test name="InsertText_multiCursors"> <before><office:text><text:p>abcdefgh</text:p></office:text></before> <ops> <op optype="AddCursor" memberid="Alice"/> <op optype="MoveCursor" memberid="Alice" position="3"/> <op optype="AddCursor" memberid="Bob"/> <op optype="MoveCursor" memberid="Bob" position="3"/> <op optype="AddCursor" memberid="Eve"/> <op optype="MoveCursor" memberid="Eve" position="3"/> <op optype="InsertText" memberid="Eve" position="3" text="123" moveCursor="true"/> </ops> <after><office:text><text:p>abc<c:cursor c:memberId="Alice"/><c:cursor c:memberId="Bob"/>123<c:cursor c:memberId="Eve"/>defgh</text:p></office:text></after> </test> <test name="SplitParagraph_multiCursors"> <before><office:text><text:p>abcdefgh</text:p></office:text></before> <ops> <op optype="AddCursor" memberid="Alice"/> <op optype="MoveCursor" memberid="Alice" position="3"/> <op optype="AddCursor" memberid="Bob"/> <op optype="MoveCursor" memberid="Bob" position="3"/> <op optype="AddCursor" memberid="Eve"/> <op optype="MoveCursor" memberid="Eve" position="3"/> <op optype="SplitParagraph" memberid="Eve" position="3" moveCursor="true"/> </ops> <after><office:text><text:p>abc<c:cursor c:memberId="Alice"/><c:cursor c:memberId="Bob"/></text:p><text:p><c:cursor c:memberId="Eve"/>defgh</text:p></office:text></after> </test> <test name="DeleteExposesSpace1"> <before><office:text><text:p> a b </text:p></office:text></before> <ops> <op optype="RemoveText" position="0" length="1"/> </ops> <after><office:text><text:p> <text:s> </text:s>b </text:p></office:text></after> </test> <test name="DeleteExposesSpace2"> <before><office:text><text:p> a b<text:s> </text:s></text:p></office:text></before> <ops> <op optype="RemoveText" position="2" length="1"/> </ops> <after><office:text><text:p> a <text:s> </text:s></text:p></office:text></after> </test> <test name="InsertText_startOfAutomaticStyleSpanAtStartOfParagraph"> <!-- text inserted at the position of a start of a span at the start of a paragraph should be added to the span, not before --> <before> <office:automatic-styles><style:style style:name="a" wo:scope="document-content" style:family="text"><style:text-properties fo:font-weight="bold"/></style:style></office:automatic-styles> <office:text><text:p/><text:p><text:span text:style-name="a">ABCD</text:span></text:p></office:text> </before> <ops> <op optype="AddCursor" memberid="Alice"/> <op optype="MoveCursor" memberid="Alice" position="1"/> <op optype="InsertText" memberid="Alice" position="1" text="123" moveCursor="true"/> </ops> <after> <office:automatic-styles><style:style style:name="a" wo:scope="document-content" style:family="text"><style:text-properties fo:font-weight="bold"/></style:style></office:automatic-styles> <office:text><text:p/><text:p><text:span text:style-name="a">123<c:cursor c:memberId="Alice"/>ABCD</text:span></text:p></office:text> </after> </test> <test name="InsertText_startOfAutomaticStyleSpanNotAtStartOfParagraph"> <!-- text inserted at the position of a start of a span which is not at the start of a paragraph should be added before the span, not to it --> <before> <office:automatic-styles><style:style style:name="a" wo:scope="document-content" style:family="text"><style:text-properties fo:font-weight="bold"/></style:style></office:automatic-styles> <office:text><text:p/><text:p>A<text:span text:style-name="a">BCD</text:span></text:p></office:text> </before> <ops> <op optype="AddCursor" memberid="Alice"/> <op optype="MoveCursor" memberid="Alice" position="2"/> <op optype="InsertText" memberid="Alice" position="2" text="123" moveCursor="true"/> </ops> <after> <office:automatic-styles><style:style style:name="a" wo:scope="document-content" style:family="text"><style:text-properties fo:font-weight="bold"/></style:style></office:automatic-styles> <office:text><text:p/><text:p>A123<c:cursor c:memberId="Alice"/><text:span text:style-name="a">BCD</text:span></text:p></office:text> </after> </test> <test name="InsertText_endOfAutomaticStyleSpanAtEndOfParagraph"> <!-- text inserted at the position of the end of a span which is at the end of a paragraph should be added to the span, not behind it --> <before> <office:automatic-styles><style:style style:name="a" wo:scope="document-content" style:family="text"><style:text-properties fo:font-weight="bold"/></style:style></office:automatic-styles> <office:text><text:p><text:span text:style-name="a">ABCD</text:span></text:p><text:p/></office:text> </before> <ops> <op optype="AddCursor" memberid="Alice"/> <op optype="MoveCursor" memberid="Alice" position="4"/> <op optype="InsertText" memberid="Alice" position="4" text="123" moveCursor="true"/> </ops> <after> <office:automatic-styles><style:style style:name="a" wo:scope="document-content" style:family="text"><style:text-properties fo:font-weight="bold"/></style:style></office:automatic-styles> <office:text><text:p><text:span text:style-name="a">ABCD123<c:cursor c:memberId="Alice"/></text:span></text:p><text:p/></office:text> </after> </test> <test name="InsertText_endOfAutomaticStyleSpanNotAtEndOfParagraph"> <!-- also text inserted at the position of the end of a span which is not at the end of a paragraph should be added to the span, not behind it --> <before> <office:automatic-styles><style:style style:name="a" wo:scope="document-content" style:family="text"><style:text-properties fo:font-weight="bold"/></style:style></office:automatic-styles> <office:text><text:p><text:span text:style-name="a">ABC</text:span>D</text:p><text:p/></office:text> </before> <ops> <op optype="AddCursor" memberid="Alice"/> <op optype="MoveCursor" memberid="Alice" position="3"/> <op optype="InsertText" memberid="Alice" position="3" text="123" moveCursor="true"/> </ops> <after> <office:automatic-styles><style:style style:name="a" wo:scope="document-content" style:family="text"><style:text-properties fo:font-weight="bold"/></style:style></office:automatic-styles> <office:text><text:p><text:span text:style-name="a">ABC123<c:cursor c:memberId="Alice"/></text:span>D</text:p><text:p/></office:text> </after> </test> <test name="SplitParagraph_SetParagraphStyle"> <before><office:text><text:p text:style-name="currentStyle"/></office:text></before> <ops> <op optype="SplitParagraph" memberid="Bob" position="0" paragraphStyleName="newStyle"/> </ops> <after><office:text><text:p text:style-name="currentStyle"/><text:p text:style-name="newStyle"/></office:text></after> </test> <test name="SplitParagraph_ClearParagraphStyle"> <before><office:text><text:p text:style-name="currentStyle"/></office:text></before> <ops> <op optype="SplitParagraph" memberid="Bob" position="0" paragraphStyleName=""/> </ops> <after><office:text><text:p text:style-name="currentStyle"/><text:p/></office:text></after> </test> <test name="SplitListParagraph_singleCursor"> <before><office:text><text:list><text:list-item><text:p>helloworld</text:p></text:list-item></text:list></office:text></before> <ops> <op optype="AddCursor" memberid="Bob"/> <op optype="MoveCursor" memberid="Bob" position="5"/> <op optype="SplitParagraph" memberid="Bob" position="5" moveCursor="true"/> </ops> <after><office:text><text:list><text:list-item><text:p>hello</text:p></text:list-item><text:list-item><text:p><c:cursor c:memberId="Bob"/>world</text:p></text:list-item></text:list></office:text></after> </test> <test name="SplitListParagraph_singleCursor_singleSpan"> <before><office:text><text:list><text:list-item><text:p><text:span>helloworld</text:span></text:p></text:list-item></text:list></office:text></before> <ops> <op optype="AddCursor" memberid="Bob"/> <op optype="MoveCursor" memberid="Bob" position="5"/> <op optype="SplitParagraph" memberid="Bob" position="5" moveCursor="true"/> </ops> <after><office:text><text:list><text:list-item><text:p><text:span>hello</text:span></text:p></text:list-item><text:list-item><text:p><text:span><c:cursor c:memberId="Bob"/>world</text:span></text:p></text:list-item></text:list></office:text></after> </test> <test name="SplitListParagraph_singleCursor_nestedSpan"> <before><office:text><text:list><text:list-item><text:p><text:span><text:span>helloworld</text:span></text:span></text:p></text:list-item></text:list></office:text></before> <ops> <op optype="AddCursor" memberid="Bob"/> <op optype="MoveCursor" memberid="Bob" position="5"/> <op optype="SplitParagraph" memberid="Bob" position="5" moveCursor="true"/> </ops> <after><office:text><text:list><text:list-item><text:p><text:span><text:span>hello</text:span></text:span></text:p></text:list-item><text:list-item><text:p><text:span><text:span><c:cursor c:memberId="Bob"/>world</text:span></text:span></text:p></text:list-item></text:list></office:text></after> </test> <test name="SplitParagraph_BeforeSpace"> <before><office:text><text:p>hello world</text:p></office:text></before> <ops> <op optype="AddCursor" memberid="Bob"/> <op optype="MoveCursor" memberid="Bob" position="5"/> <op optype="SplitParagraph" memberid="Bob" position="5" moveCursor="true"/> </ops> <after><office:text><text:p>hello</text:p><text:p><c:cursor c:memberId="Bob"/><text:s> </text:s>world</text:p></office:text></after> </test> <test name="SplitParagraph_BeforeSpace_2"> <before><office:text><text:p><text:span>hello</text:span><text:span> world</text:span></text:p></office:text></before> <ops> <op optype="AddCursor" memberid="Bob"/> <op optype="MoveCursor" memberid="Bob" position="5"/> <op optype="SplitParagraph" memberid="Bob" position="5" moveCursor="true"/> </ops> <after><office:text><text:p><text:span>hello</text:span></text:p><text:p><text:span/><text:span><c:cursor c:memberId="Bob"/><text:s> </text:s>world</text:span></text:p></office:text></after> </test> <test name="SplitParagraph_DoesntSplitAtNodeEnd" isFailing="true"> <before><office:text><text:p><text:span>hello</text:span><text:span>world</text:span></text:p></office:text></before> <ops> <op optype="AddCursor" memberid="Bob"/> <op optype="MoveCursor" memberid="Bob" position="5"/> <op optype="SplitParagraph" memberid="Bob" position="5" moveCursor="true"/> </ops> <after><of