Browse Source

:art: https://github.com/siyuan-note/siyuan/issues/13324

Vanessa 7 months ago
parent
commit
fdee19e703

+ 0 - 10
app/src/assets/scss/protyle/_wysiwyg.scss

@@ -18,16 +18,6 @@
     outline: none;
   }
 
-  &::highlight(search-mark) {
-    background-color: var(--b3-protyle-inline-mark-background);
-    color: var(--b3-protyle-inline-mark-color);
-  }
-
-  &::highlight(search-mark-hl) {
-    background-color: var(--b3-theme-primary-lighter);
-    box-shadow: 0 0 0 .5px var(--b3-theme-on-background);
-  }
-
   [data-node-id] {
     position: relative;
 

+ 6 - 0
app/src/protyle/index.ts

@@ -77,9 +77,15 @@ export class Protyle {
                 markHL: new Highlight(),
                 ranges: [],
                 rangeIndex: 0,
+                styleElement: document.createElement("style"),
             }
         };
 
+        const styleId = genUUID();
+        this.protyle.highlight.styleElement.dataset.uuid = styleId;
+        this.protyle.highlight.styleElement.textContent = `.protyle-wysiwyg::highlight(search-mark-${styleId}) {background-color: var(--b3-protyle-inline-mark-background);color: var(--b3-protyle-inline-mark-color);}
+  .protyle-wysiwyg::highlight(search-mark-hl-${styleId}) {background-color: var(--b3-theme-primary-lighter);box-shadow: 0 0 0 .5px var(--b3-theme-on-background);}`;
+
         this.protyle.hint = new Hint(this.protyle);
         if (mergedOptions.render.breadcrumb) {
             this.protyle.breadcrumb = new Breadcrumb(this.protyle);

+ 5 - 3
app/src/protyle/render/searchMarkRender.ts

@@ -15,13 +15,15 @@ export const searchMarkRender = (protyle: IProtyle, matchElements: NodeListOf<El
             item.setAttribute("data-type", item.getAttribute("data-type").replace(" search-mark", "").replace("search-mark ", ""));
             range.selectNodeContents(item);
         }
-        if (index === protyle.highlight.rangeIndex) {
+        if (index === protyle.highlight.rangeIndex && !protyle.options.backlinkData) {
             protyle.highlight.markHL.add(range);
         } else {
             protyle.highlight.mark.add(range);
         }
         protyle.highlight.ranges.push(range);
     });
-    CSS.highlights.set("search-mark", protyle.highlight.mark);
-    CSS.highlights.set("search-mark-hl", protyle.highlight.markHL);
+    CSS.highlights.set("search-mark-" + protyle.highlight.styleElement.dataset.uuid, protyle.highlight.mark);
+    if (!protyle.options.backlinkData) {
+        CSS.highlights.set("search-mark-hl-" + protyle.highlight.styleElement.dataset.uuid, protyle.highlight.markHL);
+    }
 };

+ 2 - 0
app/src/protyle/ui/initUI.ts

@@ -48,6 +48,8 @@ export const initUI = (protyle: IProtyle) => {
     protyle.element.appendChild(protyle.toolbar.element);
     protyle.element.appendChild(protyle.toolbar.subElement);
 
+    protyle.element.append(protyle.highlight.styleElement);
+
     addLoading(protyle);
 
     setEditMode(protyle, protyle.options.mode);

+ 2 - 2
app/src/search/util.ts

@@ -1183,7 +1183,7 @@ const renderNextSearchMark = (options: {
         return;
     }
     let matchElement;
-    const allMatchElements = Array.from(options.edit.protyle.wysiwyg.element.querySelectorAll(`div[data-node-id="${options.id}"] span[data-type~="search-mark"]`));
+    const allMatchElements = Array.from(options.edit.protyle.wysiwyg.element.querySelectorAll('span[data-type~="search-mark"]'));
     allMatchElements.find((item, itemIndex) => {
         if (item.classList.contains("search-mark--hl")) {
             item.classList.remove("search-mark--hl");
@@ -1233,7 +1233,7 @@ export const getArticle = (options: {
                     protyle: options.edit.protyle,
                     action: zoomIn ? [Constants.CB_GET_ALL, Constants.CB_GET_HTML] : [Constants.CB_GET_HTML],
                 });
-                const matchElements = options.edit.protyle.wysiwyg.element.querySelectorAll(`div[data-node-id="${options.id}"] span[data-type~="search-mark"]`);
+                const matchElements = options.edit.protyle.wysiwyg.element.querySelectorAll('span[data-type~="search-mark"]');
                 if (matchElements.length === 0) {
                     return;
                 }

+ 1 - 0
app/src/types/protyle.d.ts

@@ -487,6 +487,7 @@ interface IProtyle {
         markHL: Highlight
         ranges: Range[]
         rangeIndex: 0
+        styleElement: HTMLStyleElement
     }
     getInstance: () => import("../protyle").Protyle,
     observerLoad?: ResizeObserver,