diff --git a/.npmignore b/.npmignore new file mode 100644 index 00000000..7525646b --- /dev/null +++ b/.npmignore @@ -0,0 +1,14 @@ +.yalc/ +.vscode/ +.idea/ +.editorconfig +**/__tests__/ +coverage/ +cypress/ +node_modules/ +scripts/ +src/ +styleguide.config.js +styleguide.styles.js +styleguide/ +yalc.lock diff --git a/__tests__/fixtures/highlighting/tit/1-1-3.js b/__tests__/fixtures/highlighting/tit/1-1-3.js index 55b5d1d2..b72aed91 100644 --- a/__tests__/fixtures/highlighting/tit/1-1-3.js +++ b/__tests__/fixtures/highlighting/tit/1-1-3.js @@ -4,5 +4,16 @@ module.exports = { verse: 1, quote: "Θεοῦ & ἀπόστολος", occurrence: -1, - expected: [], + expected: [ + { + "occurrence": 1, + "occurrences": 2, + "text": "Θεοῦ", + }, + { + "occurrence": 1, + "occurrences": 1, + "text": "ἀπόστολος", + }, + ], }; diff --git a/__tests__/greek-highlighting-helpers.spec.js b/__tests__/greek-highlighting-helpers.spec.js index b855ef1e..0ac231ec 100644 --- a/__tests__/greek-highlighting-helpers.spec.js +++ b/__tests__/greek-highlighting-helpers.spec.js @@ -5,6 +5,7 @@ import deepEqual from 'deep-equal'; import ugnt_tit from './fixtures/books/ugnt_tit.js'; import ugnt_3jn from './fixtures/books/ugnt_3jn.js'; import ugnt_php from './fixtures/books/ugnt_php.js'; +import { flattenVerseObjects } from "../src/core"; describe('selectionHelpers.selectionsFromQuoteAndVerseObjects PHP', () => { it('should have all words highlighted PHP 2:1', () => { @@ -146,7 +147,12 @@ function generateTest(fileName) { } const { verseObjects } = books[bookName].chapters[chapter][verse]; - const selections = selectionsFromQuoteAndVerseObjects({ quote, verseObjects, occurrence }); + const _verseObjects = flattenVerseObjects(verseObjects); + const verseObjectsMap = new Map(); + let ref = `${chapter}:${verse}`; + verseObjectsMap.set(ref, _verseObjects); + const selections_ = selectionsFromQuoteAndVerseObjects({ quote, verseObjectsMap, occurrence }); + const selections = selections_.get(ref) || []; // log details to console if there is a miscompare of data if (!deepEqual(selections, expected)) { diff --git a/package.json b/package.json index 61e54beb..2c73f79b 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "scripture-resources-rcl", "description": "A React Component Library for Rendering Scripture Resources.", - "version": "5.5.7", + "version": "5.5.8", "homepage": "https://scripture-resources-rcl.netlify.com/", "repository": { "type": "git", @@ -44,11 +44,11 @@ "nyc": "^15.0.0-beta.3", "prop-types": "^15.8.1", "react-waypoint": "^9.0.2", - "string-punctuation-tokenizer": "2.1.2", + "string-punctuation-tokenizer": "^2.2.0", "tc-ui-toolkit": "^5.3.3", "use-deep-compare-effect": "^1.3.1", "usfm-js": "^3.4.2", - "uw-quote-helpers": "^1.0.0", + "uw-quote-helpers": "^1.1.0", "word-aligner": "^1.0.0", "xregexp": "^4.1.1" }, diff --git a/src/components/parallel-scripture/ParallelScripture.spec.js b/src/components/parallel-scripture/ParallelScripture.spec.js index 8b7c9f95..8e31e20b 100644 --- a/src/components/parallel-scripture/ParallelScripture.spec.js +++ b/src/components/parallel-scripture/ParallelScripture.spec.js @@ -1,9 +1,6 @@ import React from "react"; import { TextField } from "@material-ui/core"; -import { - ParallelScripture, - ResourcesContextProvider, -} from "scripture-resources-rcl"; +import { resourceFromResourceLink } from "../../core"; // To do: Implement a new strategy for how to test functional components // - probably by using React Testing Library instead of Enzyme diff --git a/src/components/selections/useSelections.js b/src/components/selections/useSelections.js index 76ac49fc..fb64a846 100644 --- a/src/components/selections/useSelections.js +++ b/src/components/selections/useSelections.js @@ -17,7 +17,7 @@ function useSelections({ useDeepCompareEffectNoCheck(() => { try { - const _selections = bookObject ? getQuoteMatchesInBookRef({ + const _selections = quote && refString && bookObject ? getQuoteMatchesInBookRef({ quote, ref: refString, bookObject, @@ -28,7 +28,7 @@ function useSelections({ } catch (error) { console.error(`Selections broken:\n`, error); } - }, [quote, currentOccurrenceValue, bookObject]); + }, [quote, currentOccurrenceValue, bookObject, refString]); useDeepCompareEffectNoCheck(() => { if (bookObject && onQuote) { @@ -108,11 +108,11 @@ useSelections.propTypes = { onSelections: PropTypes.func.isRequired, /** the quote to be selected */ quote: PropTypes.string.isRequired, - /** all chapter-verses where quote may be found */ + /** all chapter-verses where quote may be found - note this is either original language bible or aligned bible */ bookObject: PropTypes.object, /** string chapter-verse reference. i.e. 1:5-6 */ refString: PropTypes.string, - /** if quote occurs mulitple times, this is the occurence of the one selected */ + /** if quote occurs mulitple times, this is the occurrence of the one selected */ occurrence: PropTypes.oneOfType([PropTypes.number, PropTypes.string]), /** action taken when quote is provided */ onQuote: PropTypes.func, diff --git a/src/core/selections/selections.js b/src/core/selections/selections.js index 92daefcb..f14e909d 100644 --- a/src/core/selections/selections.js +++ b/src/core/selections/selections.js @@ -31,7 +31,7 @@ export const selectionsFromQuoteAndVerseObjects = ({ }) => { let selections = new Map(); let stringMap = new Map(); - stringMap = verseObjectsToString(verseObjectsMap); + stringMap = verseObjectsToString(verseObjectsMap); selections = selectionsFromQuoteAndString({ quote, stringMap, occurrence }); return selections; }; diff --git a/src/core/selections/selections.spec.js b/src/core/selections/selections.spec.js index 14d54ba9..9ad7b8c0 100644 --- a/src/core/selections/selections.spec.js +++ b/src/core/selections/selections.spec.js @@ -1,8 +1,8 @@ import { - selectionsFromQuoteAndString, generateSelection, getPrecedingText, normalizeString, + selectionsFromQuoteAndString, } from "./selections"; const normalizedText = (arr) => arr.map( obj => { @@ -12,15 +12,23 @@ const normalizedText = (arr) => arr.map( obj => { } }) +function createStringMap(ref, rawString) { + const stringMap = new Map(); + stringMap.set(ref, rawString); + return stringMap; +} + describe("selectionsFromQuoteAndString", () => { + const ref = '1:2'; + it("phrase at beginning", () => { const input = { quote: "ἐν ἀρχῇ ἦν", - string: - "ἐν ἀρχῇ ἦν ὁ λόγος, καὶ ὁ λόγος ἦν πρὸς τὸν Θεόν, καὶ Θεὸς ἦν ὁ λόγος.", + stringMap: createStringMap(ref, + "ἐν ἀρχῇ ἦν ὁ λόγος, καὶ ὁ λόγος ἦν πρὸς τὸν Θεόν, καὶ Θεὸς ἦν ὁ λόγος."), occurrence: 1, }; - const output = selectionsFromQuoteAndString(input); + const output = selectionsFromQuoteAndString(input).get(ref); const expected = [ { text: "ἐν", occurrence: 1, occurrences: 1 }, { text: "ἀρχῇ", occurrence: 1, occurrences: 1 }, @@ -32,11 +40,11 @@ describe("selectionsFromQuoteAndString", () => { it("all occurrences -1", () => { const input = { quote: "καὶ", - string: - "διὰ τοῦτο, ἐὰν ἔλθω, ὑπομνήσω αὐτοῦ τὰ ἔργα, ἃ ποιεῖ, λόγοις πονηροῖς φλυαρῶν ἡμᾶς; καὶ μὴ ἀρκούμενος ἐπὶ τούτοις, οὔτε αὐτὸς ἐπιδέχεται τοὺς ἀδελφοὺς, καὶ τοὺς βουλομένους κωλύει, καὶ ἐκ τῆς ἐκκλησίας ἐκβάλλει.", + stringMap: createStringMap(ref, + "διὰ τοῦτο, ἐὰν ἔλθω, ὑπομνήσω αὐτοῦ τὰ ἔργα, ἃ ποιεῖ, λόγοις πονηροῖς φλυαρῶν ἡμᾶς; καὶ μὴ ἀρκούμενος ἐπὶ τούτοις, οὔτε αὐτὸς ἐπιδέχεται τοὺς ἀδελφοὺς, καὶ τοὺς βουλομένους κωλύει, καὶ ἐκ τῆς ἐκκλησίας ἐκβάλλει."), occurrence: -1, }; - const output = selectionsFromQuoteAndString(input); + const output = selectionsFromQuoteAndString(input).get(ref); const expected = [ { text: "καὶ", occurrence: 1, occurrences: 3 }, { text: "καὶ", occurrence: 2, occurrences: 3 }, @@ -48,23 +56,34 @@ describe("selectionsFromQuoteAndString", () => { it("skip -1 with ampersand", () => { const input = { quote: "καὶ & μὴ", - string: - "διὰ τοῦτο, ἐὰν ἔλθω, ὑπομνήσω αὐτοῦ τὰ ἔργα, ἃ ποιεῖ, λόγοις πονηροῖς φλυαρῶν ἡμᾶς; καὶ μὴ ἀρκούμενος ἐπὶ τούτοις, οὔτε αὐτὸς ἐπιδέχεται τοὺς ἀδελφοὺς, καὶ τοὺς βουλομένους κωλύει, καὶ ἐκ τῆς ἐκκλησίας ἐκβάλλει.", + stringMap: createStringMap(ref, + "διὰ τοῦτο, ἐὰν ἔλθω, ὑπομνήσω αὐτοῦ τὰ ἔργα, ἃ ποιεῖ, λόγοις πονηροῖς φλυαρῶν ἡμᾶς; καὶ μὴ ἀρκούμενος ἐπὶ τούτοις, οὔτε αὐτὸς ἐπιδέχεται τοὺς ἀδελφοὺς, καὶ τοὺς βουλομένους κωλύει, καὶ ἐκ τῆς ἐκκλησίας ἐκβάλλει."), occurrence: -1, }; - const output = selectionsFromQuoteAndString(input); - const expected = []; + const output = selectionsFromQuoteAndString(input).get(ref); + const expected = [ + { + "occurrence": 1, + "occurrences": 3, + "text": "καὶ" + }, + { + "occurrence": 1, + "occurrences": 1, + "text": "μὴ" + } + ]; expect(output).toStrictEqual(normalizedText(expected)); }); it("ampersand: repeated word", () => { const input = { quote: "Θεοῦ & Θεοῦ", - string: - "Παῦλος, δοῦλος Θεοῦ, ἀπόστολος δὲ Ἰησοῦ Χριστοῦ, κατὰ πίστιν ἐκλεκτῶν Θεοῦ, καὶ ἐπίγνωσιν ἀληθείας, τῆς κατ’ εὐσέβειαν", + stringMap: createStringMap(ref, + "Παῦλος, δοῦλος Θεοῦ, ἀπόστολος δὲ Ἰησοῦ Χριστοῦ, κατὰ πίστιν ἐκλεκτῶν Θεοῦ, καὶ ἐπίγνωσιν ἀληθείας, τῆς κατ’ εὐσέβειαν"), occurrence: 1, }; - const output = selectionsFromQuoteAndString(input); + const output = selectionsFromQuoteAndString(input).get(ref); const expected = [ { text: "Θεοῦ", occurrence: 1, occurrences: 2 }, { text: "Θεοῦ", occurrence: 2, occurrences: 2 }, @@ -75,11 +94,11 @@ describe("selectionsFromQuoteAndString", () => { it("ampersand: repeating ending word preceding first.", () => { const input = { quote: "Θεὸς & λόγος", - string: - "ἐν ἀρχῇ ἦν ὁ λόγος, καὶ ὁ λόγος ἦν πρὸς τὸν Θεόν, καὶ Θεὸς ἦν ὁ λόγος.", + stringMap: createStringMap(ref, + "ἐν ἀρχῇ ἦν ὁ λόγος, καὶ ὁ λόγος ἦν πρὸς τὸν Θεόν, καὶ Θεὸς ἦν ὁ λόγος."), occurrence: 1, }; - const output = selectionsFromQuoteAndString(input); + const output = selectionsFromQuoteAndString(input).get(ref); const expected = [ { text: "Θεὸς", occurrence: 1, occurrences: 1 }, { text: "λόγος", occurrence: 3, occurrences: 3 }, @@ -90,14 +109,14 @@ describe("selectionsFromQuoteAndString", () => { it("ampersand: repeating ending word preceding first.", () => { const input = { quote: "Θεὸς & λόγος", - string: - "ἐν ἀρχῇ ἦν ὁ λόγος, καὶ Θεὸς ὁ λόγος ἦν πρὸς τὸν Θεόν, καὶ Θεὸς ἦν ὁ λόγος.", + stringMap: createStringMap(ref, + "ἐν ἀρχῇ ἦν ὁ λόγος, καὶ Θεὸς ὁ λόγος ἦν πρὸς τὸν Θεόν, καὶ Θεὸς ἦν ὁ λόγος."), occurrence: 2, }; - const output = selectionsFromQuoteAndString(input); + const output = selectionsFromQuoteAndString(input).get(ref); const expected = [ - { text: "Θεὸς", occurrence: 2, occurrences: 2 }, - { text: "λόγος", occurrence: 3, occurrences: 3 }, + { text: "Θεὸς", occurrence: 1, occurrences: 2 }, + { text: "λόγος", occurrence: 2, occurrences: 3 }, ]; expect(output).toStrictEqual(normalizedText(expected)); }); @@ -105,11 +124,11 @@ describe("selectionsFromQuoteAndString", () => { it("ampersand: simple, short", () => { const input = { quote: "ὁ λόγος & πρὸς", - string: - "ἐν ἀρχῇ ἦν ὁ λόγος, καὶ ὁ λόγος ἦν πρὸς τὸν Θεόν, καὶ Θεὸς ἦν ὁ λόγος.", + stringMap: createStringMap(ref, + "ἐν ἀρχῇ ἦν ὁ λόγος, καὶ ὁ λόγος ἦν πρὸς τὸν Θεόν, καὶ Θεὸς ἦν ὁ λόγος."), occurrence: 1, }; - const output = selectionsFromQuoteAndString(input); + const output = selectionsFromQuoteAndString(input).get(ref); const expected = [ { text: "ὁ", occurrence: 1, occurrences: 3 }, { text: "λόγος", occurrence: 1, occurrences: 3 }, @@ -121,11 +140,11 @@ describe("selectionsFromQuoteAndString", () => { it("ampersand: first occurrence of repeated quote", () => { const input = { quote: "ὁ λόγος & Θεόν", - string: - "ἐν ἀρχῇ ἦν ὁ λόγος, καὶ ὁ λόγος ἦν πρὸς τὸν Θεόν, καὶ Θεὸς ἦν ὁ λόγος.", + stringMap: createStringMap(ref, + "ἐν ἀρχῇ ἦν ὁ λόγος, καὶ ὁ λόγος ἦν πρὸς τὸν Θεόν, καὶ Θεὸς ἦν ὁ λόγος."), occurrence: 1, }; - const output = selectionsFromQuoteAndString(input); + const output = selectionsFromQuoteAndString(input).get(ref); const expected = [ { text: "ὁ", occurrence: 1, occurrences: 3 }, { text: "λόγος", occurrence: 1, occurrences: 3 }, @@ -137,14 +156,14 @@ describe("selectionsFromQuoteAndString", () => { it("ampersand: second occurrence of repeated quote", () => { const input = { quote: "ὁ λόγος & Θεόν", - string: - "ἐν ἀρχῇ ἦν ὁ λόγος, καὶ ὁ λόγος ἦν πρὸς τὸν Θεόν, καὶ Θεὸς ἦν ὁ λόγος.", + stringMap: createStringMap(ref, + "ἐν ἀρχῇ ἦν ὁ λόγος, καὶ ὁ λόγος ἦν πρὸς τὸν Θεόν, καὶ Θεὸς ἦν ὁ λόγος."), occurrence: 2, }; - const output = selectionsFromQuoteAndString(input); + const output = selectionsFromQuoteAndString(input).get(ref); const expected = [ - { text: "ὁ", occurrence: 2, occurrences: 3 }, - { text: "λόγος", occurrence: 2, occurrences: 3 }, + { text: "ὁ", occurrence: 1, occurrences: 3 }, + { text: "λόγος", occurrence: 1, occurrences: 3 }, { text: "Θεόν", occurrence: 1, occurrences: 1 }, ]; expect(output).toStrictEqual(normalizedText(expected)); @@ -153,11 +172,11 @@ describe("selectionsFromQuoteAndString", () => { it("repeated phrase: first occurrence", () => { const input = { quote: "ὁ λόγος", - string: - "ἐν ἀρχῇ ἦν ὁ λόγος, καὶ ὁ λόγος ἦν πρὸς τὸν Θεόν, καὶ Θεὸς ἦν ὁ λόγος.", + stringMap: createStringMap(ref, + "ἐν ἀρχῇ ἦν ὁ λόγος, καὶ ὁ λόγος ἦν πρὸς τὸν Θεόν, καὶ Θεὸς ἦν ὁ λόγος."), occurrence: 1, }; - const output = selectionsFromQuoteAndString(input); + const output = selectionsFromQuoteAndString(input).get(ref); const expected = [ { text: "ὁ", occurrence: 1, occurrences: 3 }, { text: "λόγος", occurrence: 1, occurrences: 3 }, @@ -168,11 +187,11 @@ describe("selectionsFromQuoteAndString", () => { it("repeated phrase: second occurrence", () => { const input = { quote: "ὁ λόγος", - string: - "ἐν ἀρχῇ ἦν ὁ λόγος, καὶ ὁ λόγος ἦν πρὸς τὸν Θεόν, καὶ Θεὸς ἦν ὁ λόγος.", + stringMap: createStringMap(ref, + "ἐν ἀρχῇ ἦν ὁ λόγος, καὶ ὁ λόγος ἦν πρὸς τὸν Θεόν, καὶ Θεὸς ἦν ὁ λόγος."), occurrence: 2, }; - const output = selectionsFromQuoteAndString(input); + const output = selectionsFromQuoteAndString(input).get(ref); const expected = [ { text: "ὁ", occurrence: 2, occurrences: 3 }, { text: "λόγος", occurrence: 2, occurrences: 3 }, @@ -183,11 +202,11 @@ describe("selectionsFromQuoteAndString", () => { it("repeated phrase: last occurrence", () => { const input = { quote: "ὁ λόγος", - string: - "ἐν ἀρχῇ ἦν ὁ λόγος, καὶ ὁ λόγος ἦν πρὸς τὸν Θεόν, καὶ Θεὸς ἦν ὁ λόγος.", + stringMap: createStringMap(ref, + "ἐν ἀρχῇ ἦν ὁ λόγος, καὶ ὁ λόγος ἦν πρὸς τὸν Θεόν, καὶ Θεὸς ἦν ὁ λόγος."), occurrence: 3, }; - const output = selectionsFromQuoteAndString(input); + const output = selectionsFromQuoteAndString(input).get(ref); const expected = [ { text: "ὁ", occurrence: 3, occurrences: 3 }, { text: "λόγος", occurrence: 3, occurrences: 3 }, diff --git a/yarn.lock b/yarn.lock index 176b7f1e..4262929d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1228,12 +1228,12 @@ regenerator-runtime "^0.13.11" "@babel/runtime-corejs3@^7.16.5": - version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.22.3.tgz#a684fb6b2eb987d9eb4ee7f1bba832473a29f0f1" - integrity sha512-6bdmknScYKmt8I9VjsJuKKGr+TwUb555FTf6tT1P/ANlCjTHCiYLhiQ4X/O7J731w5NOqu8c1aYHEVuOwPz7jA== + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.23.4.tgz#ae5aa568d1320c23459aef5893dc970f6711d02c" + integrity sha512-zQyB4MJGM+rvd4pM58n26kf3xbiitw9MHzL8oLiBMKb8MCtVDfV5nDzzJWWzLMtbvKI9wN6XwJYl479qF4JluQ== dependencies: core-js-pure "^3.30.2" - regenerator-runtime "^0.13.11" + regenerator-runtime "^0.14.0" "@babel/runtime@7.3.1": version "7.3.1" @@ -3700,12 +3700,7 @@ bfj@6.1.1: hoopy "^0.1.2" tryer "^1.0.0" -bible-reference-range@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/bible-reference-range/-/bible-reference-range-1.0.1.tgz#b577d20eeb1a62195c827d567063b27dcf033f8e" - integrity sha512-DpjJJaFe9SfqCnJ6E6Xiz3yJAL7UdoZx+daRL84j+NCBsMOV0HMCzNuF8vKf1m8VOy8qkGnxwKdwxQUOIgYL1Q== - -bible-reference-range@^1.1.0: +bible-reference-range@^1.0.1, bible-reference-range@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/bible-reference-range/-/bible-reference-range-1.1.0.tgz#2e80f066d30e9884d30f582c623de9cc2414676b" integrity sha512-EVPhDLSY/hmeW6reO9XLst1SKAAf6Opyfy6l2MZSna9kE6DqEiFW/eWOrkPq5g40Hs+Xe8odPGJuIpdysokQpg== @@ -4846,9 +4841,9 @@ core-js-pure@^3.25.1: integrity sha512-BS2NHgwwUppfeoqOXqi08mUqS5FiZpuRuJJpKsaME7kJz0xxuk0xkhDdfMIlP/zLa80krBqss1LtD7f889heAw== core-js-pure@^3.30.2: - version "3.30.2" - resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.30.2.tgz#005a82551f4af3250dcfb46ed360fad32ced114e" - integrity sha512-p/npFUJXXBkCCTIlEGBdghofn00jWG6ZOtdoIXSJmAu2QBvN0IqpZXWweOytcwE6cfx8ZvVUy1vw8zxhe4Y2vg== + version "3.33.3" + resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.33.3.tgz#cbf9180ac4c4653823d784862bfb5c77eac0bf98" + integrity sha512-taJ00IDOP+XYQEA2dAe4ESkmHt1fL8wzYDo3mRWQey8uO9UojlBFMneA65kMyxfYP7106c6LzWaq7/haDT6BCQ== core-js@2.6.4: version "2.6.4" @@ -14318,6 +14313,11 @@ regenerator-runtime@^0.13.11: resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz#f6dca3e7ceec20590d07ada785636a90cdca17f9" integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== +regenerator-runtime@^0.14.0: + version "0.14.0" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz#5e19d68eb12d486f797e15a3c6a918f7cec5eb45" + integrity sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA== + regenerator-transform@^0.15.1: version "0.15.1" resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.15.1.tgz#f6c4e99fc1b4591f780db2586328e4d9a9d8dc56" @@ -15596,13 +15596,6 @@ string-punctuation-tokenizer@2.0.0: dependencies: xregexp "^4.1.1" -string-punctuation-tokenizer@2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/string-punctuation-tokenizer/-/string-punctuation-tokenizer-2.1.2.tgz#db2b5707bbab6d20540ebf0fd49c18280d94d898" - integrity sha512-jFVSLxWca5xIjaoi8vTSipXXK0Ng3+BdbfAtjCgqS4ZxHTGLYvKrGaARpATtBHIAOEMXhwMaBKLrypnyQ6cR6A== - dependencies: - xregexp "^4.1.1" - string-punctuation-tokenizer@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/string-punctuation-tokenizer/-/string-punctuation-tokenizer-2.2.0.tgz#058465f994e29bfb93eaf4a9a2503d3ab6a50a18" @@ -16783,10 +16776,10 @@ uuid@^8.3.2: resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== -uw-quote-helpers@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/uw-quote-helpers/-/uw-quote-helpers-1.0.0.tgz#cc684523c7686ac45d63cdc9d4348db6641f25d5" - integrity sha512-VT6fh6w+oEjb/YBczNahmZ7dnC7rM4wbRifcOsNQWnlntunDnCNrS8AhbWFEt7X+jn/NmLYXYqsUPeKd+R8NBQ== +uw-quote-helpers@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/uw-quote-helpers/-/uw-quote-helpers-1.1.0.tgz#fe519d5b771259db3c4b3fd1051647fb9a2e2b49" + integrity sha512-TFP37QaUquxltPoDKko5L8yT0yXOWx54gWLyzWKnu6XZtIT3Nh3qz0JaT1jj5wbnajrw+o7W5xDwNGTowCvrNQ== dependencies: bible-reference-range "^1.1.0" string-punctuation-tokenizer "^2.2.0"