Skip to content

Commit

Permalink
Merge branch 'develop'
Browse files Browse the repository at this point in the history
  • Loading branch information
marihachi committed Jan 10, 2023
2 parents d5e0f65 + 11fefdf commit 59039a9
Show file tree
Hide file tree
Showing 8 changed files with 34 additions and 7 deletions.
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,10 @@
-->

## 0.23.2
### Features
- Supports whitelisting of emoji code names. (#130)

## 0.23.1
### Improvements
- improve emoji code parsing
Expand Down
11 changes: 10 additions & 1 deletion docs/api.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ console.log(JSON.stringify(nodes));
// => [{"type":"text","props":{"text":"hello "}},{"type":"fn","props":{"name":"tada","args":{}},"children":[{"type":"text","props":{"text":"world"}}]}]
```

### 利用可能なMFM関数のリストを設定する
### 利用可能なMFM関数やカスタム絵文字のリストを設定する
MFM関数の名前をホワイトリストに登録して、登録されたMFM関数以外を通常のテキストノードとして解釈するように設定できます。
デフォルトではすべてのMFM関数名を受け入れるように設定されています。

Expand All @@ -26,6 +26,15 @@ console.log(JSON.stringify(nodes));
// => [{"type":"text","props":{"text":"hello $[pope world]"}}]
```

同様に、カスタム絵文字の名前もホワイトリスト制にできます。

例:
```ts
const nodes = mfm.parse(':bap:', { emojiCodeList: ['polarbear', 'bap'] });
console.log(JSON.stringify(nodes));
// => [{"type":"emojiCode","props":{"name":"bap"}}]
```

### 最大のネストの深さを変更する
デフォルトで20に設定されています。

Expand Down
1 change: 1 addition & 0 deletions etc/mfm-js.api.md
Original file line number Diff line number Diff line change
Expand Up @@ -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[];

Expand Down
4 changes: 2 additions & 2 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "mfm-js",
"version": "0.23.1",
"version": "0.23.2",
"description": "An MFM parser implementation with TypeScript",
"main": "./built/index.js",
"types": "./built/index.d.ts",
Expand Down
3 changes: 2 additions & 1 deletion src/api.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
2 changes: 2 additions & 0 deletions src/internal/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,15 @@ import * as P from './core';

export type FullParserOpts = {
fnNameList?: string[];
emojiCodeList?: string[];
nestLimit?: number;
};

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,
Expand Down
14 changes: 12 additions & 2 deletions src/internal/parser.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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 => {
Expand Down

0 comments on commit 59039a9

Please sign in to comment.