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