From 59dbbf62fb5f8c3f8056ae3e76fb5681b0da7824 Mon Sep 17 00:00:00 2001 From: Maxim Karpov Date: Mon, 2 Dec 2024 17:35:42 +0300 Subject: [PATCH] fix: add pairs group check --- src/constants/pairs.ts | 6 +++--- src/index.ts | 35 +---------------------------------- src/parsers/index.spec.ts | 19 +++++++++++++++++++ src/parsers/index.ts | 35 +++++++++++++++++++++++++++++++++++ 4 files changed, 58 insertions(+), 37 deletions(-) diff --git a/src/constants/pairs.ts b/src/constants/pairs.ts index 0eb1d27..88ff90f 100644 --- a/src/constants/pairs.ts +++ b/src/constants/pairs.ts @@ -1,7 +1,7 @@ export type RegExpPair = [() => RegExp, () => RegExp]; export const REGEXP_PAIRS: RegExpPair[] = [ - [() => /\*\*[\p{L}\W]/giu, () => /[\p{L}\W]\*\*/giu], - [() => /_[\p{L}\W]/giu, () => /[\p{L}\W]_/giu], - [() => /~~[\p{L}\W]/giu, () => /[\p{L}\W]~~/giu], + [() => /\*\*[\p{L}_~*]/giu, () => /[\p{L}_~*]\*\*/giu], + [() => /_[\p{L}_~*]/giu, () => /[\p{L}_~*]_/giu], + [() => /~~[\p{L}_~*]/giu, () => /[\p{L}_~*]~~/giu], ]; diff --git a/src/index.ts b/src/index.ts index a93de18..1aa2d21 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,6 +1,6 @@ import {anyPass, call, compose, zipWith} from 'ramda'; -import {fstChars, lstChars, sentences} from './parsers'; +import {fstChars, groupPairs, lstChars, sentences} from './parsers'; import { leftAbbreviation, leftEndsWithHardbreak, @@ -18,7 +18,6 @@ import { rightStartsWithLowercase, spaceBothSides, } from './rules'; -import {REGEXP_PAIRS, RegExpPair} from './constants'; // sides preprocessing before evaluation const leftPreprocessor = lstChars(20); @@ -52,38 +51,6 @@ const join = compose(joinCondition, zipWith(call, sidesPreprocess // eslint-disable-next-line @typescript-eslint/no-explicit-any const breaks = compose(breakCondition, zipWith(call, sidesPreprocessors)); -function isUnpairedStr(str: string, regExp: RegExpPair) { - const first = str?.match(regExp[0]()) ?? []; - const second = str?.match(regExp[1]()) ?? []; - return first.length !== second.length; -} - -function isUnpaired(str: string) { - for (const pair of REGEXP_PAIRS) { - if (isUnpairedStr(str, pair)) { - return true; - } - } - return false; -} - -function groupPairs(parsed: string[]) { - let index = 0; - - while (index < parsed.length - 1) { - const current = parsed[index]; - const next = parsed[index + 1] || ''; - - if (isUnpaired(current)) { - parsed.splice(index, 2, current + next); - } else { - index++; - } - } - - return parsed; -} - // sentences processing export function sentenize(text: string): string[] { const parts = text.split(/((?:\n\s*){2,})/); diff --git a/src/parsers/index.spec.ts b/src/parsers/index.spec.ts index 18f7f6c..bf8bfba 100644 --- a/src/parsers/index.spec.ts +++ b/src/parsers/index.spec.ts @@ -16,6 +16,7 @@ import { fstChars, fstToken, fstWord, + groupPairs, lstChars, lstToken, lstWord, @@ -76,6 +77,24 @@ describe('sentences', () => { expect(actual).toStrictEqual(expected[i]); } }); + it('should split text on delimiter(s) with groupPairs special symbols **', () => { + const input = [ + 'Предложение **один.Предложение два.Предложение** три.Предложение четыре.', + 'Предложение **один?Предложение два?Предложение** три?Предложение четыре?', + 'Предложение **один!Предложение два!Предложение** три!Предложение четыре!', + 'Предложение **один…Предложение два…Предложение** три…Предложение четыре…', + ]; + const expected = [ + ['Предложение **один.Предложение два.Предложение** три.', 'Предложение четыре.'], + ['Предложение **один?Предложение два?Предложение** три?', 'Предложение четыре?'], + ['Предложение **один!Предложение два!Предложение** три!', 'Предложение четыре!'], + ['Предложение **один…Предложение два…Предложение** три…', 'Предложение четыре…'], + ]; + for (let i = 0; i < input.length; i++) { + const actual = groupPairs(sentences(input[i])); + expect(actual).toStrictEqual(expected[i]); + } + }); it('should default to array of single element of original text in case of one sentence', () => { const input = 'Одно длинное предложение без разделителя'; const expected = ['Одно длинное предложение без разделителя']; diff --git a/src/parsers/index.ts b/src/parsers/index.ts index 8ed678c..ddd06ed 100644 --- a/src/parsers/index.ts +++ b/src/parsers/index.ts @@ -4,6 +4,8 @@ import { BRACKETS_CLOSE_MARKERS, QUOTATION_CLOSE_MARKERS, QUOTATION_GENERIC_MARKERS, + REGEXP_PAIRS, + RegExpPair, SENTENCE_END_MARKERS, WINDOW_WIDTH, } from '../constants'; @@ -130,8 +132,41 @@ const dotSuffixRegExp = new RegExp(dotSuffixPattern, dotSuffixFlags); const dotSuffix = compose(defaultTo(''), snd, match(dotSuffixRegExp)); +function isUnpairedStr(str: string, regExp: RegExpPair) { + const first = str?.match(regExp[0]()) ?? []; + const second = str?.match(regExp[1]()) ?? []; + return first.length !== second.length; +} + +function isUnpaired(str: string) { + for (const pair of REGEXP_PAIRS) { + if (isUnpairedStr(str, pair)) { + return true; + } + } + return false; +} + +function groupPairs(parsed: string[]) { + let index = 0; + + while (index < parsed.length - 1) { + const current = parsed[index]; + const next = parsed[index + 1] || ''; + + if (isUnpaired(current)) { + parsed.splice(index, 2, current + next); + } else { + index++; + } + } + + return parsed; +} + export { sentences, + groupPairs, words, delimiters, fst,