From 82c57b5f0611e6b57ec9a795dc488edd0bd9b597 Mon Sep 17 00:00:00 2001
From: chris <kokosias@yahoo.gr>
Date: Thu, 22 Oct 2020 15:04:03 +0300
Subject: [PATCH] split by view

---
 .../findAndReplace/FindComponent.js           | 20 +++--
 .../src/components/findAndReplace/helpers.js  | 75 ++++++++++++++++++-
 .../findAndReplace/FindAndReplacePlugin.js    |  1 +
 3 files changed, 81 insertions(+), 15 deletions(-)

diff --git a/wax-prosemirror-components/src/components/findAndReplace/FindComponent.js b/wax-prosemirror-components/src/components/findAndReplace/FindComponent.js
index 4b331e30c..13cf24c1b 100644
--- a/wax-prosemirror-components/src/components/findAndReplace/FindComponent.js
+++ b/wax-prosemirror-components/src/components/findAndReplace/FindComponent.js
@@ -81,7 +81,7 @@ const FindComponent = ({ close, expand, setPreviousSearcValue }) => {
   } = useContext(WaxContext);
 
   const {
-    state: { doc, tr },
+    state: { tr },
   } = main;
 
   const searchRef = useRef(null);
@@ -106,17 +106,15 @@ const FindComponent = ({ close, expand, setPreviousSearcValue }) => {
   const searchDocument = () => {
     setCounterText('0 of 0');
 
-    const slpitedViews = helpers.splitViews(view);
-
-    const results = helpers.findMatches(doc, searchValue);
-
-    findAndReplacePlugin.props.setResults(results);
-
-    if (results.length > 0) {
-      setCounterText(`1 of ${results.length}`);
+    const results = helpers.getMatchesByView(
+      view,
+      searchValue,
+      findAndReplacePlugin,
+    );
+    console.log('search');
+    if (results > 0) {
+      setCounterText(`1 of ${results}`);
     }
-    tr.setMeta('search', true);
-    main.dispatch(tr);
   };
 
   const closeFind = () => {
diff --git a/wax-prosemirror-components/src/components/findAndReplace/helpers.js b/wax-prosemirror-components/src/components/findAndReplace/helpers.js
index 4e65c136e..46eb1b2a8 100644
--- a/wax-prosemirror-components/src/components/findAndReplace/helpers.js
+++ b/wax-prosemirror-components/src/components/findAndReplace/helpers.js
@@ -1,4 +1,4 @@
-import { each } from 'lodash';
+import { each, eachRight } from 'lodash';
 
 const findMatches = (doc, searchValue) => {
   const results = [];
@@ -41,10 +41,77 @@ const findMatches = (doc, searchValue) => {
   return results;
 };
 
-const splitViews = views => {
+const findMatchesOnMain = (doc, searchValue) => {
+  const allNodes = [];
+
+  doc.descendants((node, pos) => {
+    allNodes.push({ node, pos });
+  });
+
+  eachRight(allNodes, (node, index) => {
+    if (node.node.type.name === 'footnote') {
+      allNodes.splice(index + 1, node.node.childCount);
+    }
+  });
+
+  const results = [];
+  const mergedTextNodes = [];
+  let index = 0;
+
+  allNodes.forEach((node, i) => {
+    if (node.node.isText) {
+      if (mergedTextNodes[index]) {
+        mergedTextNodes[index] = {
+          text: mergedTextNodes[index].text + node.node.text,
+          pos: mergedTextNodes[index].pos,
+        };
+      } else {
+        mergedTextNodes[index] = {
+          text: node.node.text,
+          pos: node.pos,
+        };
+      }
+    } else {
+      index += 1;
+    }
+  });
+  mergedTextNodes.forEach(({ text, pos }) => {
+    const search = RegExp(searchValue, 'gui');
+    let m;
+    // eslint-disable-next-line no-cond-assign
+    while ((m = search.exec(text))) {
+      if (m[0] === '') {
+        break;
+      }
+
+      results.push({
+        from: pos + m.index,
+        to: pos + m.index + m[0].length,
+      });
+    }
+  });
+  return results;
+};
+
+const getMatchesByView = (views, searchValue, findAndReplacePlugin) => {
+  let allResults = 0;
   each(views, (singleView, viewId) => {
-    console.log(singleView, viewId);
+    if (viewId === 'main') {
+      const results = findMatchesOnMain(singleView.state.doc, searchValue);
+      allResults += results.length;
+      findAndReplacePlugin.props.setResults(results);
+      singleView.state.tr.setMeta('search', true);
+      singleView.dispatch(singleView.state.tr);
+    } else {
+      const results = findMatches(singleView.state.doc, searchValue);
+      allResults += results.length;
+      findAndReplacePlugin.props.setResults(results);
+      singleView.state.tr.setMeta('search', true);
+      singleView.dispatch(singleView.state.tr);
+    }
+    return allResults;
   });
+  return allResults;
 };
 
-export default { findMatches, splitViews };
+export default { findMatches, getMatchesByView };
diff --git a/wax-prosemirror-plugins/src/findAndReplace/FindAndReplacePlugin.js b/wax-prosemirror-plugins/src/findAndReplace/FindAndReplacePlugin.js
index 95b122f03..1033f1da6 100644
--- a/wax-prosemirror-plugins/src/findAndReplace/FindAndReplacePlugin.js
+++ b/wax-prosemirror-plugins/src/findAndReplace/FindAndReplacePlugin.js
@@ -13,6 +13,7 @@ export default props => {
         return DecorationSet.empty;
       },
       apply(tr, prev, _, newState) {
+        console.log('again in apply', allResults);
         let createDecoration;
         let decorations;
         let createdDecorations;
-- 
GitLab