mirror of
https://activitypub.software/TransFem-org/sfm-js
synced 2024-11-21 21:55:09 +00:00
add emojiCodeList option
This commit is contained in:
parent
8915998c02
commit
56002e86ec
4 changed files with 17 additions and 3 deletions
|
@ -243,6 +243,7 @@ export type NodeType<T extends MfmNode['type']> = T extends 'quote' ? MfmQuote :
|
|||
// @public (undocumented)
|
||||
export function parse(input: string, opts?: Partial<{
|
||||
fnNameList: string[];
|
||||
emojiCodeList: string[];
|
||||
nestLimit: number;
|
||||
}>): MfmNode[];
|
||||
|
||||
|
|
|
@ -5,9 +5,10 @@ import { MfmNode, MfmSimpleNode } from './node';
|
|||
/**
|
||||
* 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, {
|
||||
fnNameList: opts.fnNameList,
|
||||
emojiCodeList: opts.emojiCodeList,
|
||||
nestLimit: opts.nestLimit,
|
||||
});
|
||||
return nodes;
|
||||
|
|
|
@ -5,6 +5,7 @@ import * as P from './core';
|
|||
|
||||
export type FullParserOpts = {
|
||||
fnNameList?: string[];
|
||||
emojiCodeList?: string[];
|
||||
nestLimit?: number;
|
||||
};
|
||||
|
||||
|
@ -12,6 +13,7 @@ export function fullParser(input: string, opts: FullParserOpts): M.MfmNode[] {
|
|||
const result = language.fullParser.handler(input, 0, {
|
||||
nestLimit: (opts.nestLimit != null) ? opts.nestLimit : 20,
|
||||
fnNameList: opts.fnNameList,
|
||||
emojiCodeList: opts.emojiCodeList,
|
||||
depth: 0,
|
||||
linkLabel: false,
|
||||
trace: false,
|
||||
|
|
|
@ -628,13 +628,23 @@ export const language = P.createLanguage({
|
|||
emojiCode: r => {
|
||||
const side = P.notMatch(P.regexp(/[a-z0-9]/i));
|
||||
const mark = P.str(':');
|
||||
return P.seq([
|
||||
const parser = P.seq([
|
||||
P.alt([P.lineBegin, side]),
|
||||
mark,
|
||||
P.regexp(/[a-z0-9_+-]+/i),
|
||||
mark,
|
||||
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 => {
|
||||
|
|
Loading…
Reference in a new issue