diff --git a/gradle/changelog/hightlight_jsx_conflict.yaml b/gradle/changelog/hightlight_jsx_conflict.yaml new file mode 100644 index 0000000000..5fd9a26a5e --- /dev/null +++ b/gradle/changelog/hightlight_jsx_conflict.yaml @@ -0,0 +1,2 @@ +- type: fixed + description: Search highlighting in jsx ([#1886](https://github.com/scm-manager/scm-manager/pull/1886)) diff --git a/scm-ui/ui-components/src/search/HighlightedFragment.tsx b/scm-ui/ui-components/src/search/HighlightedFragment.tsx index 8f1d779250..5444ff039c 100644 --- a/scm-ui/ui-components/src/search/HighlightedFragment.tsx +++ b/scm-ui/ui-components/src/search/HighlightedFragment.tsx @@ -24,6 +24,9 @@ import React, { FC } from "react"; +const PRE_TAG = "<|[[--"; +const POST_TAG = "--]]|>"; + type Props = { value: string; }; @@ -33,14 +36,14 @@ const HighlightedFragment: FC = ({ value }) => { const result = []; while (content.length > 0) { - const start = content.indexOf("<>"); - const end = content.indexOf(""); + const start = content.indexOf(PRE_TAG); + const end = content.indexOf(POST_TAG); if (start >= 0 && end > 0) { if (start > 0) { result.push(content.substring(0, start)); } - result.push({content.substring(start + 2, end)}); - content = content.substring(end + 3); + result.push({content.substring(start + PRE_TAG.length, end)}); + content = content.substring(end + POST_TAG.length); } else { result.push(content); break; diff --git a/scm-webapp/src/main/java/sonia/scm/search/LuceneHighlighter.java b/scm-webapp/src/main/java/sonia/scm/search/LuceneHighlighter.java index 53772f23dd..a1cbd97a9e 100644 --- a/scm-webapp/src/main/java/sonia/scm/search/LuceneHighlighter.java +++ b/scm-webapp/src/main/java/sonia/scm/search/LuceneHighlighter.java @@ -55,7 +55,6 @@ public final class LuceneHighlighter { fragments = keepWholeLine(value, fragments); } return Arrays.stream(fragments) - .map(fragment -> fragment.replace(PRE_TAG, "<>").replace(POST_TAG, "")) .toArray(String[]::new); } diff --git a/scm-webapp/src/test/java/sonia/scm/search/LuceneHighlighterTest.java b/scm-webapp/src/test/java/sonia/scm/search/LuceneHighlighterTest.java index 7cad613fbc..2e4d149247 100644 --- a/scm-webapp/src/test/java/sonia/scm/search/LuceneHighlighterTest.java +++ b/scm-webapp/src/test/java/sonia/scm/search/LuceneHighlighterTest.java @@ -52,7 +52,7 @@ class LuceneHighlighterTest { String[] snippets = highlighter.highlight("content", Indexed.Analyzer.DEFAULT, content); assertThat(snippets).hasSize(1).allSatisfy( - snippet -> assertThat(snippet).contains("<>Golgafrinchan") + snippet -> assertThat(snippet).contains("<|[[--Golgafrinchan--]]|>") ); } @@ -64,7 +64,7 @@ class LuceneHighlighterTest { snippet -> assertThat(snippet.split("\n")).contains( "\t\t\t\tint neighbors= getNeighbors(above, same, below);", "\t\t\t\tif(neighbors < 2 || neighbors > 3){", - "\t\t\t\t\tnewGen[row]+= \"_\";//<2 or >3 neighbors -> <>die", + "\t\t\t\t\tnewGen[row]+= \"_\";//<2 or >3 neighbors -> <|[[--die--]]|>", "\t\t\t\t}else if(neighbors == 3){", "\t\t\t\t\tnewGen[row]+= \"#\";//3 neighbors -> spawn/live" ) @@ -79,7 +79,7 @@ class LuceneHighlighterTest { snippet -> assertThat(snippet.split("\n")).contains( "}) => {", " const renderIcon = () => {", - " return <>{icon ? inherit\" className=\"is-medium pr-1\" /> : null};", + " return <>{icon ? \" className=\"is-medium pr-1\" /> : null};", " };" ) ); diff --git a/scm-webapp/src/test/java/sonia/scm/search/LuceneQueryBuilderTest.java b/scm-webapp/src/test/java/sonia/scm/search/LuceneQueryBuilderTest.java index 8945eca061..043ef4a58a 100644 --- a/scm-webapp/src/test/java/sonia/scm/search/LuceneQueryBuilderTest.java +++ b/scm-webapp/src/test/java/sonia/scm/search/LuceneQueryBuilderTest.java @@ -499,7 +499,7 @@ class LuceneQueryBuilderTest { JsonNode displayName = fields.get("displayName"); assertThat(displayName.get("highlighted").asBoolean()).isTrue(); - assertThat(displayName.get("fragments").get(0).asText()).contains("<>Arthur"); + assertThat(displayName.get("fragments").get(0).asText()).contains("<|[[--Arthur--]]|>"); } @Test