@yozora/tokenizer-footnote 2.0.3 → 2.0.5-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -80,18 +80,17 @@ const uniqueName = '@yozora/tokenizer-footnote';
80
80
 
81
81
  class FootnoteTokenizer extends coreTokenizer.BaseInlineTokenizer {
82
82
  constructor(props = {}) {
83
- var _a, _b;
84
83
  super({
85
- name: (_a = props.name) !== null && _a !== void 0 ? _a : uniqueName,
86
- priority: (_b = props.priority) !== null && _b !== void 0 ? _b : coreTokenizer.TokenizerPriority.LINKS,
84
+ name: props.name ?? uniqueName,
85
+ priority: props.priority ?? coreTokenizer.TokenizerPriority.LINKS,
87
86
  });
88
- this.match = match;
89
- this.parse = parse;
90
87
  }
88
+ match = match;
89
+ parse = parse;
91
90
  }
92
91
 
93
92
  exports.FootnoteTokenizer = FootnoteTokenizer;
94
93
  exports.FootnoteTokenizerName = uniqueName;
95
- exports["default"] = FootnoteTokenizer;
94
+ exports.default = FootnoteTokenizer;
96
95
  exports.footnoteMatch = match;
97
96
  exports.footnoteParse = parse;
@@ -76,14 +76,13 @@ const uniqueName = '@yozora/tokenizer-footnote';
76
76
 
77
77
  class FootnoteTokenizer extends BaseInlineTokenizer {
78
78
  constructor(props = {}) {
79
- var _a, _b;
80
79
  super({
81
- name: (_a = props.name) !== null && _a !== void 0 ? _a : uniqueName,
82
- priority: (_b = props.priority) !== null && _b !== void 0 ? _b : TokenizerPriority.LINKS,
80
+ name: props.name ?? uniqueName,
81
+ priority: props.priority ?? TokenizerPriority.LINKS,
83
82
  });
84
- this.match = match;
85
- this.parse = parse;
86
83
  }
84
+ match = match;
85
+ parse = parse;
87
86
  }
88
87
 
89
88
  export { FootnoteTokenizer, uniqueName as FootnoteTokenizerName, FootnoteTokenizer as default, match as footnoteMatch, parse as footnoteParse };
@@ -1,18 +1,18 @@
1
1
  import { IPartialYastInlineToken, ITokenizer, IBaseInlineTokenizerProps, IYastTokenDelimiter, IMatchInlineHookCreator, IParseInlineHookCreator, BaseInlineTokenizer, IInlineTokenizer } from '@yozora/core-tokenizer';
2
2
  import { FootnoteType, Footnote } from '@yozora/ast';
3
3
 
4
- declare type T = FootnoteType;
5
- declare type INode = Footnote;
4
+ type T = FootnoteType;
5
+ type INode = Footnote;
6
6
  declare const uniqueName = "@yozora/tokenizer-footnote";
7
- declare type IToken = IPartialYastInlineToken<T>;
7
+ type IToken = IPartialYastInlineToken<T>;
8
8
  interface IDelimiter extends IYastTokenDelimiter {
9
9
  /**
10
10
  * IDelimiter type.
11
11
  */
12
12
  type: 'opener' | 'closer';
13
13
  }
14
- declare type IThis = ITokenizer;
15
- declare type ITokenizerProps = Partial<IBaseInlineTokenizerProps>;
14
+ type IThis = ITokenizer;
15
+ type ITokenizerProps = Partial<IBaseInlineTokenizerProps>;
16
16
 
17
17
  /**
18
18
  * An inline footnote consists of a footnote text followed immediately by a right
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@yozora/tokenizer-footnote",
3
- "version": "2.0.3",
3
+ "version": "2.0.5-alpha.0",
4
4
  "author": {
5
5
  "name": "guanghechen",
6
6
  "url": "https://github.com/guanghechen/"
@@ -11,34 +11,38 @@
11
11
  "directory": "tokenizers/footnote"
12
12
  },
13
13
  "homepage": "https://github.com/yozorajs/yozora/tree/release-2.x.x/tokenizers/footnote",
14
- "main": "lib/cjs/index.js",
15
- "module": "lib/esm/index.js",
16
- "types": "lib/types/index.d.ts",
17
- "source": "src/index.ts",
14
+ "type": "module",
15
+ "exports": {
16
+ "types": "./lib/types/index.d.ts",
17
+ "import": "./lib/esm/index.mjs",
18
+ "require": "./lib/cjs/index.cjs"
19
+ },
20
+ "source": "./src/index.ts",
21
+ "types": "./lib/types/index.d.ts",
22
+ "main": "./lib/cjs/index.cjs",
23
+ "module": "./lib/esm/index.mjs",
18
24
  "license": "MIT",
19
25
  "engines": {
20
26
  "node": ">= 16.0.0"
21
27
  },
22
28
  "files": [
23
29
  "lib/",
24
- "!lib/**/*.js.map",
25
- "!lib/**/*.d.ts.map",
30
+ "src/",
26
31
  "package.json",
27
32
  "CHANGELOG.md",
28
33
  "LICENSE",
29
34
  "README.md"
30
35
  ],
31
36
  "scripts": {
32
- "build": "cross-env NODE_ENV=production rollup -c ../../rollup.config.js",
33
- "prebuild": "rimraf lib/",
37
+ "build": "rimraf lib/ && cross-env NODE_ENV=production rollup -c ../../rollup.config.mjs",
34
38
  "prepublishOnly": "cross-env ROLLUP_SHOULD_SOURCEMAP=false yarn build",
35
- "test": "cross-env TS_NODE_FILES=true jest --config ../../jest.config.js --rootDir ."
39
+ "test": "cross-env TS_NODE_FILES=true NODE_OPTIONS=--experimental-vm-modules jest --config ../../jest.config.mjs --rootDir ."
36
40
  },
37
41
  "dependencies": {
38
- "@yozora/ast": "^2.0.3",
39
- "@yozora/character": "^2.0.3",
40
- "@yozora/core-tokenizer": "^2.0.3",
41
- "@yozora/tokenizer-link": "^2.0.3"
42
+ "@yozora/ast": "^2.0.5-alpha.0",
43
+ "@yozora/character": "^2.0.5-alpha.0",
44
+ "@yozora/core-tokenizer": "^2.0.5-alpha.0",
45
+ "@yozora/tokenizer-link": "^2.0.5-alpha.0"
42
46
  },
43
- "gitHead": "8cc8f95cfebc8d752bc3272cdd24965f540c130b"
47
+ "gitHead": "8bf941fe4ef82947165b0f3cc123cd493665e13b"
44
48
  }
package/src/index.ts ADDED
@@ -0,0 +1,9 @@
1
+ export { match as footnoteMatch } from './match'
2
+ export { parse as footnoteParse } from './parse'
3
+ export { FootnoteTokenizer, FootnoteTokenizer as default } from './tokenizer'
4
+ export { uniqueName as FootnoteTokenizerName } from './types'
5
+ export type {
6
+ IThis as IFootnoteHookContext,
7
+ IToken as IFootnoteToken,
8
+ ITokenizerProps as IFootnoteTokenizerProps,
9
+ } from './types'
package/src/match.ts ADDED
@@ -0,0 +1,102 @@
1
+ import { FootnoteType } from '@yozora/ast'
2
+ import type { INodePoint } from '@yozora/character'
3
+ import { AsciiCodePoint } from '@yozora/character'
4
+ import type {
5
+ IMatchInlineHookCreator,
6
+ IResultOfIsDelimiterPair,
7
+ IResultOfProcessDelimiterPair,
8
+ IYastInlineToken,
9
+ } from '@yozora/core-tokenizer'
10
+ import { genFindDelimiter } from '@yozora/core-tokenizer'
11
+ import { checkBalancedBracketsStatus } from '@yozora/tokenizer-link'
12
+ import type { IDelimiter, IThis, IToken, T } from './types'
13
+
14
+ /**
15
+ * An inline footnote consists of a footnote text followed immediately by a right
16
+ * square bracket ']'.
17
+ *
18
+ * Like the inline links, footnote could not be contained by other footnote.
19
+ *
20
+ * @see https://github.com/syntax-tree/mdast-util-footnote
21
+ * @see https://github.com/remarkjs/remark-footnotes
22
+ * @see https://github.com/syntax-tree/mdast#link
23
+ * @see https://github.github.com/gfm/#links
24
+ * @see https://www.markdownguide.org/extended-syntax/#footnotes
25
+ */
26
+ export const match: IMatchInlineHookCreator<T, IDelimiter, IToken, IThis> = function (api) {
27
+ return {
28
+ findDelimiter: () => genFindDelimiter<IDelimiter>(_findDelimiter),
29
+ isDelimiterPair,
30
+ processDelimiterPair,
31
+ }
32
+
33
+ function _findDelimiter(startIndex: number, endIndex: number): IDelimiter | null {
34
+ const nodePoints: ReadonlyArray<INodePoint> = api.getNodePoints()
35
+
36
+ for (let i = startIndex; i < endIndex; ++i) {
37
+ const c = nodePoints[i].codePoint
38
+ switch (c) {
39
+ case AsciiCodePoint.BACKSLASH:
40
+ i += 1
41
+ break
42
+ case AsciiCodePoint.CARET: {
43
+ if (i + 1 < endIndex && nodePoints[i + 1].codePoint === AsciiCodePoint.OPEN_BRACKET) {
44
+ return {
45
+ type: 'opener',
46
+ startIndex: i,
47
+ endIndex: i + 2,
48
+ }
49
+ }
50
+ break
51
+ }
52
+ case AsciiCodePoint.CLOSE_BRACKET:
53
+ return {
54
+ type: 'closer',
55
+ startIndex: i,
56
+ endIndex: i + 1,
57
+ }
58
+ }
59
+ }
60
+ return null
61
+ }
62
+
63
+ function isDelimiterPair(
64
+ openerDelimiter: IDelimiter,
65
+ closerDelimiter: IDelimiter,
66
+ internalTokens: ReadonlyArray<IYastInlineToken>,
67
+ ): IResultOfIsDelimiterPair {
68
+ const nodePoints: ReadonlyArray<INodePoint> = api.getNodePoints()
69
+ const balancedBracketsStatus: -1 | 0 | 1 = checkBalancedBracketsStatus(
70
+ openerDelimiter.endIndex,
71
+ closerDelimiter.startIndex,
72
+ internalTokens,
73
+ nodePoints,
74
+ )
75
+ switch (balancedBracketsStatus) {
76
+ case -1:
77
+ return { paired: false, opener: false, closer: true }
78
+ case 0:
79
+ return { paired: true }
80
+ case 1:
81
+ return { paired: false, opener: true, closer: false }
82
+ }
83
+ }
84
+
85
+ function processDelimiterPair(
86
+ openerDelimiter: IDelimiter,
87
+ closerDelimiter: IDelimiter,
88
+ internalTokens: ReadonlyArray<IYastInlineToken>,
89
+ ): IResultOfProcessDelimiterPair<T, IToken, IDelimiter> {
90
+ const token: IToken = {
91
+ nodeType: FootnoteType,
92
+ startIndex: openerDelimiter.startIndex,
93
+ endIndex: closerDelimiter.endIndex,
94
+ children: api.resolveInternalTokens(
95
+ internalTokens,
96
+ openerDelimiter.endIndex,
97
+ closerDelimiter.startIndex,
98
+ ),
99
+ }
100
+ return { tokens: [token] }
101
+ }
102
+ }
package/src/parse.ts ADDED
@@ -0,0 +1,17 @@
1
+ import type { Node } from '@yozora/ast'
2
+ import { FootnoteType } from '@yozora/ast'
3
+ import type { IParseInlineHookCreator } from '@yozora/core-tokenizer'
4
+ import type { INode, IThis, IToken, T } from './types'
5
+
6
+ export const parse: IParseInlineHookCreator<T, IToken, INode, IThis> = function (api) {
7
+ return {
8
+ parse: tokens =>
9
+ tokens.map(token => {
10
+ const children: Node[] = api.parseInlineTokens(token.children)
11
+ const node: INode = api.shouldReservePosition
12
+ ? { type: FootnoteType, position: api.calcPosition(token), children }
13
+ : { type: FootnoteType, children }
14
+ return node
15
+ }),
16
+ }
17
+ }
@@ -0,0 +1,35 @@
1
+ import type {
2
+ IInlineTokenizer,
3
+ IMatchInlineHookCreator,
4
+ IParseInlineHookCreator,
5
+ } from '@yozora/core-tokenizer'
6
+ import { BaseInlineTokenizer, TokenizerPriority } from '@yozora/core-tokenizer'
7
+ import { match } from './match'
8
+ import { parse } from './parse'
9
+ import type { IDelimiter, INode, IThis, IToken, ITokenizerProps, T } from './types'
10
+ import { uniqueName } from './types'
11
+
12
+ /**
13
+ * Lexical Analyzer for inline footnote.
14
+ * @see https://github.com/syntax-tree/mdast-util-footnote
15
+ * @see https://github.com/remarkjs/remark-footnotes
16
+ * @see https://github.com/syntax-tree/mdast#link
17
+ * @see https://github.github.com/gfm/#links
18
+ * @see https://www.markdownguide.org/extended-syntax/#footnotes
19
+ */
20
+ export class FootnoteTokenizer
21
+ extends BaseInlineTokenizer<T, IDelimiter, IToken, INode, IThis>
22
+ implements IInlineTokenizer<T, IDelimiter, IToken, INode, IThis>
23
+ {
24
+ /* istanbul ignore next */
25
+ constructor(props: ITokenizerProps = {}) {
26
+ super({
27
+ name: props.name ?? uniqueName,
28
+ priority: props.priority ?? TokenizerPriority.LINKS,
29
+ })
30
+ }
31
+
32
+ public override readonly match: IMatchInlineHookCreator<T, IDelimiter, IToken, IThis> = match
33
+
34
+ public override readonly parse: IParseInlineHookCreator<T, IToken, INode, IThis> = parse
35
+ }
package/src/types.ts ADDED
@@ -0,0 +1,24 @@
1
+ import type { Footnote, FootnoteType } from '@yozora/ast'
2
+ import type {
3
+ IBaseInlineTokenizerProps,
4
+ IPartialYastInlineToken,
5
+ ITokenizer,
6
+ IYastTokenDelimiter,
7
+ } from '@yozora/core-tokenizer'
8
+
9
+ export type T = FootnoteType
10
+ export type INode = Footnote
11
+ export const uniqueName = '@yozora/tokenizer-footnote'
12
+
13
+ export type IToken = IPartialYastInlineToken<T>
14
+
15
+ export interface IDelimiter extends IYastTokenDelimiter {
16
+ /**
17
+ * IDelimiter type.
18
+ */
19
+ type: 'opener' | 'closer'
20
+ }
21
+
22
+ export type IThis = ITokenizer
23
+
24
+ export type ITokenizerProps = Partial<IBaseInlineTokenizerProps>