Skip to content

Commit

Permalink
Support MARK tag as inline, fix another diff issue (#4479)
Browse files Browse the repository at this point in the history
  • Loading branch information
CatoTH authored Dec 13, 2024
1 parent 3b63252 commit e54f078
Show file tree
Hide file tree
Showing 2 changed files with 67 additions and 4 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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 = `<p>es war ihnen wie eine <strong>Bestätigung</strong> ihrer neuen Träume und guten Absichten, als am Ziele ihrer Fahrt die Tochter als erste sich erhob und ihren jungen Körper dehnte.</p>`,
after = `<p>es war ihnen wie eine <strong>Bestätigung NEU</strong> 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.</p>`;
const diff = service.diff(before, after);
expect(diff).toBe(
`<p>es war ihnen wie eine <strong>Bestätigung<ins> NEU</ins></strong> <ins>NEU2 </ins>ihrer neuen Träume und guten Absichten, als am Ziele ihrer Fahrt die Tochter als erste sich erhob und ihren jungen Körper dehnte.</p>`
);
}
));

it(`does not fall back to block level replacement when replacement and tag insertion overlap (4)`, inject(
[MotionDiffService],
(service: MotionDiffService) => {
const before = `<p>Und es war ihnen wie eine <strong>Bestätigung</strong> ihrer neuen Träume und guten Absichten, als am Ziele ihrer Fahrt die Tochter als erste sich erhob und ihren jungen <strong>Körper</strong> dehnte.</p>`,
after = `<p>Und es war ihnen wie eine <strong>Bestätigung</strong> ihrer neuen Träume und guten Absichten, als am Ziele ihrer Fahrt die Tochter als erste sich erhob und ihren jungen alten <strong>Körpergehülle</strong> dehnte.</p>`;
const diff = service.diff(before, after);
expect(diff).toBe(
`<p>Und es war ihnen wie eine <strong>Bestätigung</strong> ihrer neuen Träume und guten Absichten, als am Ziele ihrer Fahrt die Tochter als erste sich erhob und ihren jungen <ins>alten </ins><strong><del>Körper</del><ins>Körpergehülle</ins></strong> dehnte.</p>`
);
}
));

it(`works with multiple inserted paragraphs`, inject([MotionDiffService], (service: MotionDiffService) => {
const before = `<p>This is the text before</p>`,
after = `<p>This is the text before</p>\n<p>This is one added line</p>\n<p>Another added line</p>`;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1581,7 +1581,7 @@ export class MotionDiffService {

// <ins><STRONG></ins>formatted<ins></STRONG></ins> => <del>formatted</del><ins><STRONG>formatted</STRONG></ins>
diffUnnormalized = diffUnnormalized.replace(
/<ins><(span|strong|em|b|i|u|s|a|small|big|sup|sub)( [^>]*)?><\/ins>([^<]*)<ins><\/\1><\/ins>/gi,
/<ins><(mark|span|strong|em|b|i|u|s|a|small|big|sup|sub)( [^>]*)?><\/ins>([^<]*)<ins><\/\1><\/ins>/gi,
(_whole: string, inlineTag: string, tagAttributes: string, content: string): string =>
`<del>` +
content +
Expand All @@ -1598,7 +1598,7 @@ export class MotionDiffService {

// <del><STRONG></del>formatted<del></STRONG></del> => <del><STRONG>formatted</STRONG></del><ins>formatted</ins>
diffUnnormalized = diffUnnormalized.replace(
/<del><(span|strong|em|b|i|u|s|a|small|big|sup|sub)( [^>]*)?><\/del>([^<]*)<del><\/\1><\/del>/gi,
/<del><(mark|span|strong|em|b|i|u|s|a|small|big|sup|sub)( [^>]*)?><\/del>([^<]*)<del><\/\1><\/del>/gi,
(_whole: string, inlineTag: string, tagAttributes: string, content: string): string =>
`<del><` +
inlineTag +
Expand All @@ -1613,10 +1613,36 @@ export class MotionDiffService {
`</ins>`
);

// <del><STRONG>Körper</del><ins>alten <STRONG>Körpergehülle</ins></STRONG> => <ins>alten </ins><STRONG><del>Körper</del><ins>Körpergehülle</ins></STRONG>
diffUnnormalized = diffUnnormalized.replace(
/<del><(mark|span|strong|em|b|i|u|s|a|small|big|sup|sub)( [^>]*)?>([^<]*)<\/del><ins>([^<]*)<\1>([^<]*)<\/ins><\/\1>/gi,
(
_whole: string,
inlineTag: string,
tagAttributes: string,
delContent: string,
insContent1: string,
insContent2: string
): string =>
`<ins>` +
insContent1 +
`</ins><` +
inlineTag +
(tagAttributes ? tagAttributes : ``) +
`><del>` +
delContent +
`</del>` +
`<ins>` +
insContent2 +
`</ins></` +
inlineTag +
`>`
);

// <del>with a </del><ins>a <STRONG></ins>unformatted <del>word</del><ins>sentence</STRONG></ins> ->
// <del>unformatted word</del><ins><STRONG>formatted word</STRONG></ins>
diffUnnormalized = diffUnnormalized.replace(
/<del>([^<]*)<\/del><ins><(span|strong|em|b|i|u|s|a|small|big|sup|sub)( [^>]*)?>([^<]*)<\/ins>([^<]*)<ins><\/\2><\/ins>/gi,
/<del>([^<]*)<\/del><ins><(mark|span|strong|em|b|i|u|s|a|small|big|sup|sub)( [^>]*)?>([^<]*)<\/ins>([^<]*)<ins><\/\2><\/ins>/gi,
(
_whole: string,
delContent: string,
Expand All @@ -1642,7 +1668,7 @@ export class MotionDiffService {
// <ins><STRONG></ins>unformatted <del>word</del><ins>sentence</STRONG></ins> ->
// <del>unformatted word</del><ins><STRONG>unformatted sentence</STRONG></ins>
diffUnnormalized = diffUnnormalized.replace(
/<ins><(span|strong|em|b|i|u|s|a|small|big|sup|sub)( [^>]*)?><\/ins>([^<]*)<del>([^<]*)<\/del><ins>([^<]*)<\/\1><\/ins>/gi,
/<ins><(mark|span|strong|em|b|i|u|s|a|small|big|sup|sub)( [^>]*)?><\/ins>([^<]*)<del>([^<]*)<\/del><ins>([^<]*)<\/\1><\/ins>/gi,
(
_whole: string,
inlineTag: string,
Expand All @@ -1665,6 +1691,19 @@ export class MotionDiffService {
`></ins>`
);

// <STRONG>Bestätigung<del></STRONG></del><ins> NEU</STRONG> NEU2</ins> -->
// <STRONG>Bestätigung<ins> NEU</ins></STRONG><ins> NEU2</ins>
diffUnnormalized = diffUnnormalized.replace(
/<del>(<\/(mark|span|strong|em|b|i|u|s|a|small|big|sup|sub)>)<\/del><ins>([^>]*)<\/\2>([^>]*)<\/ins>/gi,
(
_whole: string,
closingTag: string,
closingTagInner: string,
insertedText1: string,
insertedText2: string
): string => `<ins>` + insertedText1 + `</ins>` + closingTag + `<ins>` + insertedText2 + `</ins>`
);

// <del>Ebene 3 <UL><LI></del><span class="line-number-4 os-line-number" contenteditable="false" data-line-number="4">&nbsp;</span><ins>Ebene 3a <UL><LI></ins>
// => <del>Ebene 3 </del><ins>Ebene 3a </ins><UL><LI><span class="line-number-4 os-line-number" contenteditable="false" data-line-number="4">&nbsp;</span>
diffUnnormalized = diffUnnormalized.replace(
Expand Down

0 comments on commit e54f078

Please sign in to comment.