78 lines
3.8 KiB
TypeScript
78 lines
3.8 KiB
TypeScript
|
import { JSX } from "solid-js/jsx-runtime"
|
|||
|
import { mergeProps } from "solid-js/web"
|
|||
|
|
|||
|
export const dictionaryBefore = [
|
|||
|
'а', 'без', 'в', 'во', 'до', 'за', 'из', 'к', 'ко', 'на', 'над', 'о', 'об', 'от', 'по', 'под', 'при', 'про', 'с', 'со', 'у', 'через',
|
|||
|
'близ', 'вне', 'для', 'меж', 'ради', 'среди', 'около', 'против', 'между', 'перед', 'вокруг', 'возле',
|
|||
|
'и', 'но', 'да', 'или', 'либо', 'ни', 'как', 'то', 'не', 'что',
|
|||
|
'ведь', 'вот', 'вон', 'именно', 'лишь', 'просто', 'прямо', 'только', 'даже', 'уже', 'еще', 'все',
|
|||
|
'однако', 'хоть', 'хотя', 'будто', 'словно', 'точно', 'ровно', 'так', 'если', 'чтобы',
|
|||
|
'вдруг', 'опять', 'снова', 'вновь', 'тоже', 'также',
|
|||
|
'почти', 'едва', 'чуть', 'совсем', 'совершенно', 'абсолютно',
|
|||
|
'мол', 'дескать', 'якобы',
|
|||
|
'авось', 'небось', 'никак', 'неужели', 'разве', 'ужели',
|
|||
|
'вряд', 'пусть', 'пускай', 'давай', 'давайте',
|
|||
|
'нет', 'конечно', 'несомненно', 'безусловно',
|
|||
|
'итак', 'следовательно', 'значит', 'поэтому', 'потому',
|
|||
|
'вообще', 'кстати', 'кроме', 'впрочем', 'однако',
|
|||
|
'это', 'эта', 'этот', 'эти', 'та', 'тот', 'те',
|
|||
|
'ну', 'аж', 'вплоть', 'ведь',
|
|||
|
'весьма', 'крайне', 'очень', 'слишком',
|
|||
|
'всего', 'всего-навсего', 'лишь', 'только', 'исключительно',
|
|||
|
'вроде', 'типа', 'наподобие',
|
|||
|
'когда', 'куда', 'откуда', 'зачем', 'почему', 'отчего',
|
|||
|
'где', 'кто', 'кого', 'кому', 'кем',
|
|||
|
'который', 'которая', 'которое', 'которые',
|
|||
|
'чей', 'чья', 'чье', 'чьи',
|
|||
|
'каков', 'какова', 'каково', 'каковы',
|
|||
|
'сколько', 'насколько', 'настолько',
|
|||
|
'пока', 'пока не', 'едва', 'едва не',
|
|||
|
'чем', 'нежели', 'словно', 'будто',
|
|||
|
'хоть', 'хотя', 'пускай', 'пусть',
|
|||
|
'раз', 'раз уж', 'коли', 'коль',
|
|||
|
'чуть', 'чуть ли не', 'чуть не',
|
|||
|
]
|
|||
|
|
|||
|
export const dictionaryAfter = [
|
|||
|
'ли', 'же', 'бы', 'б', 'ж',
|
|||
|
'таки',
|
|||
|
'как', 'так', 'эдак',
|
|||
|
'эти', 'это', 'эта', 'этот',
|
|||
|
'те', 'то', 'та', 'тот',
|
|||
|
'а', 'и', 'но', 'да', 'нет'
|
|||
|
]
|
|||
|
|
|||
|
export const processPrepositions = (text: string): string => {
|
|||
|
const prepositionRegexBefore = new RegExp(`(^|\\s)(${dictionaryBefore.join('|')})(\\s|$)`, 'gmi')
|
|||
|
const prepositionRegexAfter = new RegExp(`(\\S+)\\s+(${dictionaryAfter.join('|')})(\\s|$)`, 'gmi')
|
|||
|
|
|||
|
return text
|
|||
|
.replace(prepositionRegexBefore, (_match, start, word, _end) => {
|
|||
|
return `${start}${word} `
|
|||
|
})
|
|||
|
.replace(prepositionRegexAfter, (_match, word, particle, end) => {
|
|||
|
return `${word} ${particle}${end}`
|
|||
|
})
|
|||
|
}
|
|||
|
|
|||
|
export function processJSXElement(element: JSX.Element): JSX.Element {
|
|||
|
if (typeof element === 'string') {
|
|||
|
return processPrepositions(element)
|
|||
|
}
|
|||
|
|
|||
|
if (Array.isArray(element)) {
|
|||
|
return element.map(processJSXElement)
|
|||
|
}
|
|||
|
|
|||
|
if (typeof element === 'object' && element !== null && 'props' in element) {
|
|||
|
// biome-ignore lint/suspicious/noExplicitAny: <explanation>
|
|||
|
const newProps = mergeProps({}, element.props) as Record<string, any>
|
|||
|
if (newProps.children) {
|
|||
|
newProps.children = processJSXElement(newProps.children)
|
|||
|
}
|
|||
|
return mergeProps(element, { props: newProps })
|
|||
|
}
|
|||
|
|
|||
|
return element
|
|||
|
}
|