add emojiCodeList option

This commit is contained in:
marihachi 2023-01-10 23:16:33 +09:00
parent 8915998c02
commit 56002e86ec
4 changed files with 17 additions and 3 deletions

View file

@ -243,6 +243,7 @@ export type NodeType<T extends MfmNode['type']> = T extends 'quote' ? MfmQuote :
// @public (undocumented) // @public (undocumented)
export function parse(input: string, opts?: Partial<{ export function parse(input: string, opts?: Partial<{
fnNameList: string[]; fnNameList: string[];
emojiCodeList: string[];
nestLimit: number; nestLimit: number;
}>): MfmNode[]; }>): MfmNode[];

View file

@ -5,9 +5,10 @@ import { MfmNode, MfmSimpleNode } from './node';
/** /**
* Generates a MfmNode tree from the MFM string. * Generates a MfmNode tree from the MFM string.
*/ */
export function parse(input: string, opts: Partial<{ fnNameList: string[]; nestLimit: number; }> = {}): MfmNode[] { export function parse(input: string, opts: Partial<{ fnNameList: string[]; emojiCodeList: string[]; nestLimit: number; }> = {}): MfmNode[] {
const nodes = fullParser(input, { const nodes = fullParser(input, {
fnNameList: opts.fnNameList, fnNameList: opts.fnNameList,
emojiCodeList: opts.emojiCodeList,
nestLimit: opts.nestLimit, nestLimit: opts.nestLimit,
}); });
return nodes; return nodes;

View file

@ -5,6 +5,7 @@ import * as P from './core';
export type FullParserOpts = { export type FullParserOpts = {
fnNameList?: string[]; fnNameList?: string[];
emojiCodeList?: string[];
nestLimit?: number; nestLimit?: number;
}; };
@ -12,6 +13,7 @@ export function fullParser(input: string, opts: FullParserOpts): M.MfmNode[] {
const result = language.fullParser.handler(input, 0, { const result = language.fullParser.handler(input, 0, {
nestLimit: (opts.nestLimit != null) ? opts.nestLimit : 20, nestLimit: (opts.nestLimit != null) ? opts.nestLimit : 20,
fnNameList: opts.fnNameList, fnNameList: opts.fnNameList,
emojiCodeList: opts.emojiCodeList,
depth: 0, depth: 0,
linkLabel: false, linkLabel: false,
trace: false, trace: false,

View file

@ -628,13 +628,23 @@ export const language = P.createLanguage({
emojiCode: r => { emojiCode: r => {
const side = P.notMatch(P.regexp(/[a-z0-9]/i)); const side = P.notMatch(P.regexp(/[a-z0-9]/i));
const mark = P.str(':'); const mark = P.str(':');
return P.seq([ const parser = P.seq([
P.alt([P.lineBegin, side]), P.alt([P.lineBegin, side]),
mark, mark,
P.regexp(/[a-z0-9_+-]+/i), P.regexp(/[a-z0-9_+-]+/i),
mark, mark,
P.alt([P.lineEnd, side]), P.alt([P.lineEnd, side]),
], 2).map(name => M.EMOJI_CODE(name as string)); ], 2);
return new P.Parser((input, index, state) => {
const result = parser.handler(input, index, state);
if (!result.success) {
return P.failure();
}
if (state.emojiCodeList != null && !state.emojiCodeList.includes(result.value)) {
return P.failure();
}
return P.success(result.index, M.EMOJI_CODE(result.value as string));
});
}, },
link: r => { link: r => {