diff --git a/client/src/app/site/motions/services/diff.service.spec.ts b/client/src/app/site/motions/services/diff.service.spec.ts index df8cfa809..a19c638a6 100644 --- a/client/src/app/site/motions/services/diff.service.spec.ts +++ b/client/src/app/site/motions/services/diff.service.spec.ts @@ -669,7 +669,7 @@ describe('DiffService', () => { const diff = service.diff(before, after); expect(diff).toBe( '
Lorem ipsum dolor sit amet, consectetuer adipiscing elit.
\n' + - 'Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim. Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu. Nulla consequat massa quis enim. Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu.
' + 'Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim. Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu. Nulla consequat massa quis enim. Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu.
' ); } )); @@ -762,7 +762,7 @@ describe('DiffService', () => { 'Test 123
', expected = "rief sie alle sieben herbei und sprach 'liebe Kinder, ich will hinaus in den Wald, seid Noch
" + - 'Test 123
'; + 'Test 123
'; const diff = service.diff(before, after); expect(diff).toBe(expected); @@ -778,7 +778,7 @@ describe('DiffService', () => { 'Stet clita kasd gubergren, no sea takimata sanctus est.
', expected = 'Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum.
\n' + - 'Stet clita kasd gubergren, no sea takimata sanctus est.
'; + 'Stet clita kasd gubergren, no sea takimata sanctus est.
'; const diff = service.diff(before, after); expect(diff).toBe(expected); @@ -792,8 +792,8 @@ describe('DiffService', () => { 'Neither should this line
', expected = 'This is a random first line that remains unchanged.
' + - 'Inserting this line should not make any troubles, especially not affect the first line
' + - 'Neither should this line
'; + 'Inserting this line should not make any troubles, especially not affect the first line
' + + 'Neither should this line
'; const diff = service.diff(before, after); expect(diff).toBe(expected); @@ -935,6 +935,16 @@ describe('DiffService', () => { } )); + it('works with multiple inserted paragraphs', inject( + [DiffService], + (service: DiffService) => { + const before = 'This is the text before
', + after = "This is the text before
\nThis is one added line
\nAnother added line
"; + const diff = service.diff(before, after); + expect(diff).toBe("This is the text before
\nThis is one added line
\nAnother added line
"); + } + )); + it('does not a change in a very specific case', inject([DiffService], (service: DiffService) => { // See diff._fixWrongChangeDetection const inHtml = @@ -1007,7 +1017,7 @@ describe('DiffService', () => { 'their grammar, their pronunciation and their most common words. Everyone ' + brMarkup(3) + 'realizes why a\n' + - 'NEW PARAGRAPH 2.
' + 'NEW PARAGRAPH 2.
' ); } )); @@ -1033,8 +1043,8 @@ describe('DiffService', () => { 'their grammar, their pronunciation and their most common words. Everyone ' + brMarkup(3) + 'realizes why a\n' + - 'NEW PARAGRAPH 1.
\n' + - 'NEW PARAGRAPH 2.
\n' + + 'NEW PARAGRAPH 1.
\n' + + 'NEW PARAGRAPH 2.
\n' + ']*)?>[\s\S]*?<\/p>)(\s*)<\/ins>/gim, - (match: string, whiteBefore: string, inner: string, tagInner: string, whiteAfter: string): string => { - return ( - whiteBefore + - inner - .replace( - /
]*)?>/gi, - (match2: string): string => { - return match2 + ''; - } - ) - .replace(/<\/p>/gi, '
') + - whiteAfter - ); - } - ); - - // Fixes HTML produced by the diff like this: - // from:More inserted text
- // into: Inserted Text\nMore inserted text
- diffUnnormalized = diffUnnormalized.replace( - /)/gi, '
$1'); - } - ); - // If only a few characters of a word have changed, don't display this as a replacement of the whole word, // but only of these specific characters diffUnnormalized = diffUnnormalized.replace( @@ -1919,28 +1915,43 @@ export class DiffService { } ); - //...
...... - if (content.match(/<(ins|del)>/gi)) { - return whole; - } - // Add the CSS-class to the existing "class"-attribute, or add one - let newArguments = blockArguments; + /<(ins|del)>([\s\S]*?)<\/\1>/gi, + (whole: string, insDel: string): string => { const modificationClass = (insDel.toLowerCase() === 'ins' ? 'insert' : 'delete'); - if (newArguments.match(/class="/gi)) { - // class="someclass" => class="someclass insert" - newArguments = newArguments.replace(/(class\s*=\s*)(["'])([^\2]*)\2/gi, - (classWhole: string, attr: string, para: string, classContent: string): string => { - return attr + para + classContent + ' ' + modificationClass + para; - } - ); - } else { - newArguments += ' class="' + modificationClass + '"'; - } - return '<' + block + newArguments + '>' + content + '' + block + '>'; + return whole.replace( + /(<(p|div|blockquote|li)[^>]*>)([\s\S]*?)(<\/\2>)/gi, + (whole2: string, opening: string, blockTag: string, content: string, closing: string): string => { + const modifiedTag = this.addClassToHtmlTag(opening, modificationClass); + return '' + insDel + '>' + modifiedTag + content + closing + '<' + insDel + '>'; + } + ); + } + ); + + // Cleanup leftovers from the operation above, when -tags ore -tags are left + // around block tags. It should be safe to remove them and just leave the whitespaces. + diffUnnormalized = diffUnnormalized.replace( + /<(ins|del)>(\s*)<\/\1>/gi, + (whole: string, insDel: string, space: string): string => space + ); + + //