mirror of
https://github.com/cinnyapp/cinny.git
synced 2025-11-14 19:20:28 +03:00
* fix backslash appear in url with inline markdown sequences * fix markdown chars not escaping on edit
83 lines
3.4 KiB
TypeScript
83 lines
3.4 KiB
TypeScript
import { findAndReplace } from '../../utils/findAndReplace';
|
|
import { ESC_BLOCK_SEQ, UN_ESC_BLOCK_SEQ } from './block/rules';
|
|
import { EscapeRule, CAP_INLINE_SEQ } from './inline/rules';
|
|
import { runInlineRule } from './inline/runner';
|
|
import { replaceMatch } from './internal';
|
|
|
|
/**
|
|
* Removes escape sequences from markdown inline elements in the given plain-text.
|
|
* This function unescapes characters that are escaped with backslashes (e.g., `\*`, `\_`)
|
|
* in markdown syntax, returning the original plain-text with markdown characters in effect.
|
|
*
|
|
* @param text - The input markdown plain-text containing escape characters (e.g., `"some \*italic\*"`)
|
|
* @returns The plain-text with markdown escape sequences removed (e.g., `"some *italic*"`)
|
|
*/
|
|
export const unescapeMarkdownInlineSequences = (text: string): string =>
|
|
runInlineRule(text, EscapeRule, (t) => {
|
|
if (t === '') return t;
|
|
return unescapeMarkdownInlineSequences(t);
|
|
}) ?? text;
|
|
|
|
/**
|
|
* Recovers the markdown escape sequences in the given plain-text.
|
|
* This function adds backslashes (`\`) before markdown characters that may need escaping
|
|
* (e.g., `*`, `_`) to ensure they are treated as literal characters and not part of markdown formatting.
|
|
*
|
|
* @param text - The input plain-text that may contain markdown sequences (e.g., `"some *italic*"`)
|
|
* @returns The plain-text with markdown escape sequences added (e.g., `"some \*italic\*"`)
|
|
*/
|
|
export const escapeMarkdownInlineSequences = (text: string): string => {
|
|
const regex = new RegExp(`(${CAP_INLINE_SEQ})`, 'g');
|
|
const parts = findAndReplace(
|
|
text,
|
|
regex,
|
|
(match) => {
|
|
const [, g1] = match;
|
|
return `\\${g1}`;
|
|
},
|
|
(t) => t
|
|
);
|
|
|
|
return parts.join('');
|
|
};
|
|
|
|
/**
|
|
* Removes escape sequences from markdown block elements in the given plain-text.
|
|
* This function unescapes characters that are escaped with backslashes (e.g., `\>`, `\#`)
|
|
* in markdown syntax, returning the original plain-text with markdown characters in effect.
|
|
*
|
|
* @param {string} text - The input markdown plain-text containing escape characters (e.g., `\> block quote`).
|
|
* @param {function} processPart - It takes the plain-text as input and returns a modified version of it.
|
|
* @returns {string} The plain-text with markdown escape sequences removed and markdown formatting applied.
|
|
*/
|
|
export const unescapeMarkdownBlockSequences = (
|
|
text: string,
|
|
processPart: (text: string) => string
|
|
): string => {
|
|
const match = text.match(ESC_BLOCK_SEQ);
|
|
|
|
if (!match) return processPart(text);
|
|
|
|
const [, g1] = match;
|
|
return replaceMatch(text, match, g1, (t) => [processPart(t)]).join('');
|
|
};
|
|
|
|
/**
|
|
* Escapes markdown block elements by adding backslashes before markdown characters
|
|
* (e.g., `\>`, `\#`) that are normally interpreted as markdown syntax.
|
|
*
|
|
* @param {string} text - The input markdown plain-text that may contain markdown elements (e.g., `> block quote`).
|
|
* @param {function} processPart - It takes the plain-text as input and returns a modified version of it.
|
|
* @returns {string} The plain-text with markdown escape sequences added, preventing markdown formatting.
|
|
*/
|
|
export const escapeMarkdownBlockSequences = (
|
|
text: string,
|
|
processPart: (text: string) => string
|
|
): string => {
|
|
const match = text.match(UN_ESC_BLOCK_SEQ);
|
|
|
|
if (!match) return processPart(text);
|
|
|
|
const [, g1] = match;
|
|
return replaceMatch(text, match, `\\${g1}`, (t) => [processPart(t)]).join('');
|
|
};
|