From e54f07830aa45ced8b3a3059a74eb7c5771862b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tobias=20H=C3=B6=C3=9Fl?= Date: Fri, 13 Dec 2024 11:53:46 +0100 Subject: [PATCH] Support MARK tag as inline, fix another diff issue (#4479) --- .../motion-diff.service.spec.ts | 24 ++++++++++ .../motion-diff.service.ts | 47 +++++++++++++++++-- 2 files changed, 67 insertions(+), 4 deletions(-) diff --git a/client/src/app/site/pages/meetings/pages/motions/modules/change-recommendations/services/motion-diff.service/motion-diff.service.spec.ts b/client/src/app/site/pages/meetings/pages/motions/modules/change-recommendations/services/motion-diff.service/motion-diff.service.spec.ts index 013fc6eea8..c1e79b225b 100644 --- a/client/src/app/site/pages/meetings/pages/motions/modules/change-recommendations/services/motion-diff.service/motion-diff.service.spec.ts +++ b/client/src/app/site/pages/meetings/pages/motions/modules/change-recommendations/services/motion-diff.service/motion-diff.service.spec.ts @@ -1186,6 +1186,30 @@ describe(`MotionDiffService`, () => { } )); + it(`does not fall back to block level replacement when replacement and tag insertion overlap (3)`, inject( + [MotionDiffService], + (service: MotionDiffService) => { + const before = `

es war ihnen wie eine Bestätigung ihrer neuen Träume und guten Absichten, als am Ziele ihrer Fahrt die Tochter als erste sich erhob und ihren jungen Körper dehnte.

`, + after = `

es war ihnen wie eine Bestätigung NEU NEU2 ihrer neuen Träume und guten Absichten, als am Ziele ihrer Fahrt die Tochter als erste sich erhob und ihren jungen Körper dehnte.

`; + const diff = service.diff(before, after); + expect(diff).toBe( + `

es war ihnen wie eine Bestätigung NEU NEU2 ihrer neuen Träume und guten Absichten, als am Ziele ihrer Fahrt die Tochter als erste sich erhob und ihren jungen Körper dehnte.

` + ); + } + )); + + it(`does not fall back to block level replacement when replacement and tag insertion overlap (4)`, inject( + [MotionDiffService], + (service: MotionDiffService) => { + const before = `

Und es war ihnen wie eine Bestätigung ihrer neuen Träume und guten Absichten, als am Ziele ihrer Fahrt die Tochter als erste sich erhob und ihren jungen Körper dehnte.

`, + after = `

Und es war ihnen wie eine Bestätigung ihrer neuen Träume und guten Absichten, als am Ziele ihrer Fahrt die Tochter als erste sich erhob und ihren jungen alten Körpergehülle dehnte.

`; + const diff = service.diff(before, after); + expect(diff).toBe( + `

Und es war ihnen wie eine Bestätigung ihrer neuen Träume und guten Absichten, als am Ziele ihrer Fahrt die Tochter als erste sich erhob und ihren jungen alten KörperKörpergehülle dehnte.

` + ); + } + )); + it(`works with multiple inserted paragraphs`, inject([MotionDiffService], (service: MotionDiffService) => { const before = `

This is the text before

`, after = `

This is the text before

\n

This is one added line

\n

Another added line

`; diff --git a/client/src/app/site/pages/meetings/pages/motions/modules/change-recommendations/services/motion-diff.service/motion-diff.service.ts b/client/src/app/site/pages/meetings/pages/motions/modules/change-recommendations/services/motion-diff.service/motion-diff.service.ts index c98c823d46..39dd6a1677 100644 --- a/client/src/app/site/pages/meetings/pages/motions/modules/change-recommendations/services/motion-diff.service/motion-diff.service.ts +++ b/client/src/app/site/pages/meetings/pages/motions/modules/change-recommendations/services/motion-diff.service/motion-diff.service.ts @@ -1581,7 +1581,7 @@ export class MotionDiffService { // formatted => formattedformatted diffUnnormalized = diffUnnormalized.replace( - /<(span|strong|em|b|i|u|s|a|small|big|sup|sub)( [^>]*)?><\/ins>([^<]*)<\/\1><\/ins>/gi, + /<(mark|span|strong|em|b|i|u|s|a|small|big|sup|sub)( [^>]*)?><\/ins>([^<]*)<\/\1><\/ins>/gi, (_whole: string, inlineTag: string, tagAttributes: string, content: string): string => `` + content + @@ -1598,7 +1598,7 @@ export class MotionDiffService { // formatted => formattedformatted diffUnnormalized = diffUnnormalized.replace( - /<(span|strong|em|b|i|u|s|a|small|big|sup|sub)( [^>]*)?><\/del>([^<]*)<\/\1><\/del>/gi, + /<(mark|span|strong|em|b|i|u|s|a|small|big|sup|sub)( [^>]*)?><\/del>([^<]*)<\/\1><\/del>/gi, (_whole: string, inlineTag: string, tagAttributes: string, content: string): string => `<` + inlineTag + @@ -1613,10 +1613,36 @@ export class MotionDiffService { `` ); + // Körperalten Körpergehülle => alten KörperKörpergehülle + diffUnnormalized = diffUnnormalized.replace( + /<(mark|span|strong|em|b|i|u|s|a|small|big|sup|sub)( [^>]*)?>([^<]*)<\/del>([^<]*)<\1>([^<]*)<\/ins><\/\1>/gi, + ( + _whole: string, + inlineTag: string, + tagAttributes: string, + delContent: string, + insContent1: string, + insContent2: string + ): string => + `` + + insContent1 + + `<` + + inlineTag + + (tagAttributes ? tagAttributes : ``) + + `>` + + delContent + + `` + + `` + + insContent2 + + `` + ); + // with a a unformatted wordsentence -> // unformatted wordformatted word diffUnnormalized = diffUnnormalized.replace( - /([^<]*)<\/del><(span|strong|em|b|i|u|s|a|small|big|sup|sub)( [^>]*)?>([^<]*)<\/ins>([^<]*)<\/\2><\/ins>/gi, + /([^<]*)<\/del><(mark|span|strong|em|b|i|u|s|a|small|big|sup|sub)( [^>]*)?>([^<]*)<\/ins>([^<]*)<\/\2><\/ins>/gi, ( _whole: string, delContent: string, @@ -1642,7 +1668,7 @@ export class MotionDiffService { // unformatted wordsentence -> // unformatted wordunformatted sentence diffUnnormalized = diffUnnormalized.replace( - /<(span|strong|em|b|i|u|s|a|small|big|sup|sub)( [^>]*)?><\/ins>([^<]*)([^<]*)<\/del>([^<]*)<\/\1><\/ins>/gi, + /<(mark|span|strong|em|b|i|u|s|a|small|big|sup|sub)( [^>]*)?><\/ins>([^<]*)([^<]*)<\/del>([^<]*)<\/\1><\/ins>/gi, ( _whole: string, inlineTag: string, @@ -1665,6 +1691,19 @@ export class MotionDiffService { `>` ); + // Bestätigung NEU NEU2 --> + // Bestätigung NEU NEU2 + diffUnnormalized = diffUnnormalized.replace( + /(<\/(mark|span|strong|em|b|i|u|s|a|small|big|sup|sub)>)<\/del>([^>]*)<\/\2>([^>]*)<\/ins>/gi, + ( + _whole: string, + closingTag: string, + closingTagInner: string, + insertedText1: string, + insertedText2: string + ): string => `` + insertedText1 + `` + closingTag + `` + insertedText2 + `` + ); + // Ebene 3
  •  Ebene 3a
    • // => Ebene 3 Ebene 3a
      •   diffUnnormalized = diffUnnormalized.replace(