mirror of
https://github.com/cinnyapp/cinny.git
synced 2025-11-12 02:00:28 +03:00
* emojify msg txt find&replace instead of recursion * move findAndReplace func in its own file * improve find and replace * move markdown file to plugins * make find and replace work without g flag regex * fix pagination stop on msg arrive * render blurhash in small size
28 lines
978 B
TypeScript
28 lines
978 B
TypeScript
export type ReplaceCallback<R> = (
|
|
match: RegExpExecArray | RegExpMatchArray,
|
|
pushIndex: number
|
|
) => R;
|
|
export type ConvertPartCallback<R> = (text: string, pushIndex: number) => R;
|
|
|
|
export const findAndReplace = <ReplaceReturnType, ConvertReturnType>(
|
|
text: string,
|
|
regex: RegExp,
|
|
replace: ReplaceCallback<ReplaceReturnType>,
|
|
convertPart: ConvertPartCallback<ConvertReturnType>
|
|
): Array<ReplaceReturnType | ConvertReturnType> => {
|
|
const result: Array<ReplaceReturnType | ConvertReturnType> = [];
|
|
let lastEnd = 0;
|
|
|
|
let match: RegExpExecArray | RegExpMatchArray | null = regex.exec(text);
|
|
while (match !== null && typeof match.index === 'number') {
|
|
result.push(convertPart(text.slice(lastEnd, match.index), result.length));
|
|
result.push(replace(match, result.length));
|
|
|
|
lastEnd = match.index + match[0].length;
|
|
if (regex.global) match = regex.exec(text);
|
|
}
|
|
|
|
result.push(convertPart(text.slice(lastEnd), result.length));
|
|
|
|
return result;
|
|
};
|