@yozora/tokenizer-emphasis 1.2.1 → 2.0.0-alpha.1

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.
package/README.md CHANGED
@@ -84,14 +84,14 @@ so you can use `YozoraParser` / `GfmExParser` / `GfmParser` directly.
84
84
  registered in *YastParser* as a plugin-in before it can be used.
85
85
 
86
86
  ```typescript {4,9}
87
- import { DefaultYastParser } from '@yozora/core-parser'
87
+ import { DefaultParser } from '@yozora/core-parser'
88
88
  import ParagraphTokenizer from '@yozora/tokenizer-paragraph'
89
89
  import TextTokenizer from '@yozora/tokenizer-text'
90
90
  import EmphasisTokenizer from '@yozora/tokenizer-emphasis'
91
91
 
92
- const parser = new DefaultYastParser()
93
- .useBlockFallbackTokenizer(new ParagraphTokenizer())
94
- .useInlineFallbackTokenizer(new TextTokenizer())
92
+ const parser = new DefaultParser()
93
+ .useFallbackTokenizer(new ParagraphTokenizer())
94
+ .useFallbackTokenizer(new TextTokenizer())
95
95
  .useTokenizer(new EmphasisTokenizer())
96
96
 
97
97
  // parse source markdown content
@@ -265,7 +265,6 @@ Name | Type | Required | Default
265
265
  [@yozora/tokenizer-link]: https://github.com/yozorajs/yozora/tree/main/tokenizers/link#readme
266
266
  [@yozora/tokenizer-link-reference]: https://github.com/yozorajs/yozora/tree/main/tokenizers/link-reference#readme
267
267
  [@yozora/tokenizer-list]: https://github.com/yozorajs/yozora/tree/main/tokenizers/list#readme
268
- [@yozora/tokenizer-list-item]: https://github.com/yozorajs/yozora/tree/main/tokenizers/list-item#readme
269
268
  [@yozora/tokenizer-math]: https://github.com/yozorajs/yozora/tree/main/tokenizers/math#readme
270
269
  [@yozora/tokenizer-paragraph]: https://github.com/yozorajs/yozora/tree/main/tokenizers/paragraph#readme
271
270
  [@yozora/tokenizer-setext-heading]: https://github.com/yozorajs/yozora/tree/main/tokenizers/setext-heading#readme
@@ -325,7 +324,6 @@ Name | Type | Required | Default
325
324
  [doc-@yozora/tokenizer-definition]: https://yozora.guanghechen.com/docs/package/tokenizer-definition
326
325
  [doc-@yozora/tokenizer-link-reference]: https://yozora.guanghechen.com/docs/package/tokenizer-link-reference
327
326
  [doc-@yozora/tokenizer-list]: https://yozora.guanghechen.com/docs/package/tokenizer-list
328
- [doc-@yozora/tokenizer-list-item]: https://yozora.guanghechen.com/docs/package/tokenizer-list-item
329
327
  [doc-@yozora/tokenizer-math]: https://yozora.guanghechen.com/docs/package/tokenizer-math
330
328
  [doc-@yozora/tokenizer-paragraph]: https://yozora.guanghechen.com/docs/package/tokenizer-paragraph
331
329
  [doc-@yozora/tokenizer-setext-heading]: https://yozora.guanghechen.com/docs/package/tokenizer-setext-heading
package/lib/cjs/index.js CHANGED
@@ -6,21 +6,23 @@ var ast = require('@yozora/ast');
6
6
  var character = require('@yozora/character');
7
7
  var coreTokenizer = require('@yozora/core-tokenizer');
8
8
 
9
- const uniqueName = '@yozora/tokenizer-emphasis';
10
-
11
- class EmphasisTokenizer extends coreTokenizer.BaseInlineTokenizer {
12
- constructor(props = {}) {
13
- var _a, _b;
14
- super({
15
- name: (_a = props.name) !== null && _a !== void 0 ? _a : uniqueName,
16
- priority: (_b = props.priority) !== null && _b !== void 0 ? _b : coreTokenizer.TokenizerPriority.CONTAINING_INLINE,
17
- });
18
- }
19
- _findDelimiter(startIndex, endIndex, nodePoints) {
9
+ const match = function (api) {
10
+ return {
11
+ findDelimiter: () => coreTokenizer.genFindDelimiter(_findDelimiter),
12
+ isDelimiterPair,
13
+ processDelimiterPair,
14
+ };
15
+ function _findDelimiter(startIndex, endIndex) {
16
+ const nodePoints = api.getNodePoints();
17
+ const blockStartIndex = api.getBlockStartIndex();
18
+ const blockEndIndex = api.getBlockEndIndex();
20
19
  const isOpenerDelimiter = (delimiterStartIndex, delimiterEndIndex) => {
21
- const nextCodePosition = delimiterEndIndex >= endIndex ? null : nodePoints[delimiterEndIndex];
22
- if (nextCodePosition == null ||
23
- character.isUnicodeWhitespaceCharacter(nextCodePosition.codePoint))
20
+ if (delimiterEndIndex === blockEndIndex)
21
+ return false;
22
+ if (delimiterEndIndex === endIndex)
23
+ return true;
24
+ const nextCodePosition = nodePoints[delimiterEndIndex];
25
+ if (character.isUnicodeWhitespaceCharacter(nextCodePosition.codePoint))
24
26
  return false;
25
27
  if (!character.isPunctuationCharacter(nextCodePosition.codePoint))
26
28
  return true;
@@ -31,13 +33,15 @@ class EmphasisTokenizer extends coreTokenizer.BaseInlineTokenizer {
31
33
  character.isPunctuationCharacter(prevCodePosition.codePoint));
32
34
  };
33
35
  const isCloserDelimiter = (delimiterStartIndex, delimiterEndIndex) => {
34
- if (delimiterStartIndex > startIndex) {
35
- const prevCodePosition = nodePoints[delimiterStartIndex - 1];
36
- if (character.isUnicodeWhitespaceCharacter(prevCodePosition.codePoint))
37
- return false;
38
- if (!character.isPunctuationCharacter(prevCodePosition.codePoint))
39
- return true;
40
- }
36
+ if (delimiterStartIndex === blockStartIndex)
37
+ return false;
38
+ if (delimiterStartIndex === startIndex)
39
+ return true;
40
+ const prevCodePosition = nodePoints[delimiterStartIndex - 1];
41
+ if (character.isUnicodeWhitespaceCharacter(prevCodePosition.codePoint))
42
+ return false;
43
+ if (!character.isPunctuationCharacter(prevCodePosition.codePoint))
44
+ return true;
41
45
  if (delimiterEndIndex >= endIndex)
42
46
  return true;
43
47
  const nextCodePosition = nodePoints[delimiterEndIndex];
@@ -86,25 +90,23 @@ class EmphasisTokenizer extends coreTokenizer.BaseInlineTokenizer {
86
90
  }
87
91
  return null;
88
92
  }
89
- isDelimiterPair(openerDelimiter, closerDelimiter, internalTokens, nodePoints) {
93
+ function isDelimiterPair(openerDelimiter, closerDelimiter) {
94
+ const nodePoints = api.getNodePoints();
90
95
  if (nodePoints[openerDelimiter.startIndex].codePoint !==
91
96
  nodePoints[closerDelimiter.startIndex].codePoint ||
92
97
  ((openerDelimiter.type === 'both' || closerDelimiter.type === 'both') &&
93
- (openerDelimiter.originalThickness +
94
- closerDelimiter.originalThickness) %
95
- 3 ===
96
- 0 &&
98
+ (openerDelimiter.originalThickness + closerDelimiter.originalThickness) % 3 === 0 &&
97
99
  openerDelimiter.originalThickness % 3 !== 0)) {
98
100
  return { paired: false, opener: true, closer: true };
99
101
  }
100
102
  return { paired: true };
101
103
  }
102
- processDelimiterPair(openerDelimiter, closerDelimiter, internalTokens, nodePoints, api) {
104
+ function processDelimiterPair(openerDelimiter, closerDelimiter, internalTokens) {
103
105
  let thickness = 1;
104
106
  if (openerDelimiter.thickness > 1 && closerDelimiter.thickness > 1) {
105
107
  thickness = 2;
106
108
  }
107
- internalTokens = api.resolveInternalTokens(internalTokens, openerDelimiter.endIndex, closerDelimiter.startIndex, nodePoints);
109
+ internalTokens = api.resolveInternalTokens(internalTokens, openerDelimiter.endIndex, closerDelimiter.startIndex);
108
110
  const token = {
109
111
  nodeType: thickness === 1 ? ast.EmphasisType : ast.StrongType,
110
112
  startIndex: openerDelimiter.endIndex - thickness,
@@ -136,15 +138,36 @@ class EmphasisTokenizer extends coreTokenizer.BaseInlineTokenizer {
136
138
  remainCloserDelimiter,
137
139
  };
138
140
  }
139
- processToken(token, children) {
140
- const result = {
141
- type: token.nodeType,
142
- children: children !== null && children !== void 0 ? children : [],
143
- };
144
- return result;
141
+ };
142
+
143
+ const parse = function () {
144
+ return {
145
+ parse: (token, children) => {
146
+ const result = {
147
+ type: token.nodeType,
148
+ children,
149
+ };
150
+ return result;
151
+ },
152
+ };
153
+ };
154
+
155
+ const uniqueName = '@yozora/tokenizer-emphasis';
156
+
157
+ class EmphasisTokenizer extends coreTokenizer.BaseInlineTokenizer {
158
+ constructor(props = {}) {
159
+ var _a, _b;
160
+ super({
161
+ name: (_a = props.name) !== null && _a !== void 0 ? _a : uniqueName,
162
+ priority: (_b = props.priority) !== null && _b !== void 0 ? _b : coreTokenizer.TokenizerPriority.CONTAINING_INLINE,
163
+ });
164
+ this.match = match;
165
+ this.parse = parse;
145
166
  }
146
167
  }
147
168
 
148
169
  exports.EmphasisTokenizer = EmphasisTokenizer;
149
170
  exports.EmphasisTokenizerName = uniqueName;
150
- exports['default'] = EmphasisTokenizer;
171
+ exports["default"] = EmphasisTokenizer;
172
+ exports.emphasisMatch = match;
173
+ exports.emphasisParse = parse;
package/lib/esm/index.js CHANGED
@@ -1,22 +1,24 @@
1
1
  import { EmphasisType, StrongType } from '@yozora/ast';
2
2
  import { AsciiCodePoint, isPunctuationCharacter, isUnicodeWhitespaceCharacter } from '@yozora/character';
3
- import { BaseInlineTokenizer, TokenizerPriority, eatOptionalCharacters } from '@yozora/core-tokenizer';
3
+ import { genFindDelimiter, eatOptionalCharacters, BaseInlineTokenizer, TokenizerPriority } from '@yozora/core-tokenizer';
4
4
 
5
- const uniqueName = '@yozora/tokenizer-emphasis';
6
-
7
- class EmphasisTokenizer extends BaseInlineTokenizer {
8
- constructor(props = {}) {
9
- var _a, _b;
10
- super({
11
- name: (_a = props.name) !== null && _a !== void 0 ? _a : uniqueName,
12
- priority: (_b = props.priority) !== null && _b !== void 0 ? _b : TokenizerPriority.CONTAINING_INLINE,
13
- });
14
- }
15
- _findDelimiter(startIndex, endIndex, nodePoints) {
5
+ const match = function (api) {
6
+ return {
7
+ findDelimiter: () => genFindDelimiter(_findDelimiter),
8
+ isDelimiterPair,
9
+ processDelimiterPair,
10
+ };
11
+ function _findDelimiter(startIndex, endIndex) {
12
+ const nodePoints = api.getNodePoints();
13
+ const blockStartIndex = api.getBlockStartIndex();
14
+ const blockEndIndex = api.getBlockEndIndex();
16
15
  const isOpenerDelimiter = (delimiterStartIndex, delimiterEndIndex) => {
17
- const nextCodePosition = delimiterEndIndex >= endIndex ? null : nodePoints[delimiterEndIndex];
18
- if (nextCodePosition == null ||
19
- isUnicodeWhitespaceCharacter(nextCodePosition.codePoint))
16
+ if (delimiterEndIndex === blockEndIndex)
17
+ return false;
18
+ if (delimiterEndIndex === endIndex)
19
+ return true;
20
+ const nextCodePosition = nodePoints[delimiterEndIndex];
21
+ if (isUnicodeWhitespaceCharacter(nextCodePosition.codePoint))
20
22
  return false;
21
23
  if (!isPunctuationCharacter(nextCodePosition.codePoint))
22
24
  return true;
@@ -27,13 +29,15 @@ class EmphasisTokenizer extends BaseInlineTokenizer {
27
29
  isPunctuationCharacter(prevCodePosition.codePoint));
28
30
  };
29
31
  const isCloserDelimiter = (delimiterStartIndex, delimiterEndIndex) => {
30
- if (delimiterStartIndex > startIndex) {
31
- const prevCodePosition = nodePoints[delimiterStartIndex - 1];
32
- if (isUnicodeWhitespaceCharacter(prevCodePosition.codePoint))
33
- return false;
34
- if (!isPunctuationCharacter(prevCodePosition.codePoint))
35
- return true;
36
- }
32
+ if (delimiterStartIndex === blockStartIndex)
33
+ return false;
34
+ if (delimiterStartIndex === startIndex)
35
+ return true;
36
+ const prevCodePosition = nodePoints[delimiterStartIndex - 1];
37
+ if (isUnicodeWhitespaceCharacter(prevCodePosition.codePoint))
38
+ return false;
39
+ if (!isPunctuationCharacter(prevCodePosition.codePoint))
40
+ return true;
37
41
  if (delimiterEndIndex >= endIndex)
38
42
  return true;
39
43
  const nextCodePosition = nodePoints[delimiterEndIndex];
@@ -82,25 +86,23 @@ class EmphasisTokenizer extends BaseInlineTokenizer {
82
86
  }
83
87
  return null;
84
88
  }
85
- isDelimiterPair(openerDelimiter, closerDelimiter, internalTokens, nodePoints) {
89
+ function isDelimiterPair(openerDelimiter, closerDelimiter) {
90
+ const nodePoints = api.getNodePoints();
86
91
  if (nodePoints[openerDelimiter.startIndex].codePoint !==
87
92
  nodePoints[closerDelimiter.startIndex].codePoint ||
88
93
  ((openerDelimiter.type === 'both' || closerDelimiter.type === 'both') &&
89
- (openerDelimiter.originalThickness +
90
- closerDelimiter.originalThickness) %
91
- 3 ===
92
- 0 &&
94
+ (openerDelimiter.originalThickness + closerDelimiter.originalThickness) % 3 === 0 &&
93
95
  openerDelimiter.originalThickness % 3 !== 0)) {
94
96
  return { paired: false, opener: true, closer: true };
95
97
  }
96
98
  return { paired: true };
97
99
  }
98
- processDelimiterPair(openerDelimiter, closerDelimiter, internalTokens, nodePoints, api) {
100
+ function processDelimiterPair(openerDelimiter, closerDelimiter, internalTokens) {
99
101
  let thickness = 1;
100
102
  if (openerDelimiter.thickness > 1 && closerDelimiter.thickness > 1) {
101
103
  thickness = 2;
102
104
  }
103
- internalTokens = api.resolveInternalTokens(internalTokens, openerDelimiter.endIndex, closerDelimiter.startIndex, nodePoints);
105
+ internalTokens = api.resolveInternalTokens(internalTokens, openerDelimiter.endIndex, closerDelimiter.startIndex);
104
106
  const token = {
105
107
  nodeType: thickness === 1 ? EmphasisType : StrongType,
106
108
  startIndex: openerDelimiter.endIndex - thickness,
@@ -132,13 +134,32 @@ class EmphasisTokenizer extends BaseInlineTokenizer {
132
134
  remainCloserDelimiter,
133
135
  };
134
136
  }
135
- processToken(token, children) {
136
- const result = {
137
- type: token.nodeType,
138
- children: children !== null && children !== void 0 ? children : [],
139
- };
140
- return result;
137
+ };
138
+
139
+ const parse = function () {
140
+ return {
141
+ parse: (token, children) => {
142
+ const result = {
143
+ type: token.nodeType,
144
+ children,
145
+ };
146
+ return result;
147
+ },
148
+ };
149
+ };
150
+
151
+ const uniqueName = '@yozora/tokenizer-emphasis';
152
+
153
+ class EmphasisTokenizer extends BaseInlineTokenizer {
154
+ constructor(props = {}) {
155
+ var _a, _b;
156
+ super({
157
+ name: (_a = props.name) !== null && _a !== void 0 ? _a : uniqueName,
158
+ priority: (_b = props.priority) !== null && _b !== void 0 ? _b : TokenizerPriority.CONTAINING_INLINE,
159
+ });
160
+ this.match = match;
161
+ this.parse = parse;
141
162
  }
142
163
  }
143
164
 
144
- export { EmphasisTokenizer, uniqueName as EmphasisTokenizerName, EmphasisTokenizer as default };
165
+ export { EmphasisTokenizer, uniqueName as EmphasisTokenizerName, EmphasisTokenizer as default, match as emphasisMatch, parse as emphasisParse };
@@ -1,5 +1,5 @@
1
- import { EmphasisTokenizer } from './tokenizer';
2
- export { EmphasisTokenizer } from './tokenizer';
1
+ export { match as emphasisMatch } from './match';
2
+ export { parse as emphasisParse } from './parse';
3
+ export { EmphasisTokenizer, EmphasisTokenizer as default } from './tokenizer';
3
4
  export { uniqueName as EmphasisTokenizerName } from './types';
4
- export type { Token as EmphasisToken, TokenizerProps as EmphasisTokenizerProps, } from './types';
5
- export default EmphasisTokenizer;
5
+ export type { IThis as IEmphasisHookContext, IToken as IEmphasisToken, ITokenizerProps as IEmphasisTokenizerProps, } from './types';
@@ -0,0 +1,7 @@
1
+ import type { IMatchInlineHookCreator } from '@yozora/core-tokenizer';
2
+ import type { IDelimiter, IThis, IToken, T } from './types';
3
+ /**
4
+ * @see https://github.com/syntax-tree/mdast#strong
5
+ * @see https://github.github.com/gfm/#emphasis-and-strong-emphasis
6
+ */
7
+ export declare const match: IMatchInlineHookCreator<T, IDelimiter, IToken, IThis>;
@@ -0,0 +1,3 @@
1
+ import type { IParseInlineHookCreator } from '@yozora/core-tokenizer';
2
+ import type { INode, IThis, IToken, T } from './types';
3
+ export declare const parse: IParseInlineHookCreator<T, IToken, INode, IThis>;
@@ -1,34 +1,13 @@
1
- import type { YastNode } from '@yozora/ast';
2
- import type { NodePoint } from '@yozora/character';
3
- import type { MatchInlinePhaseApi, ResultOfIsDelimiterPair, ResultOfProcessDelimiterPair, Tokenizer, TokenizerMatchInlineHook, TokenizerParseInlineHook, YastInlineToken } from '@yozora/core-tokenizer';
1
+ import type { IInlineTokenizer, IMatchInlineHookCreator, IParseInlineHookCreator } from '@yozora/core-tokenizer';
4
2
  import { BaseInlineTokenizer } from '@yozora/core-tokenizer';
5
- import type { Delimiter, Node, T, Token, TokenizerProps } from './types';
3
+ import type { IDelimiter, INode, IThis, IToken, ITokenizerProps, T } from './types';
6
4
  /**
7
5
  * Lexical Analyzer for Emphasis and Strong Emphasis.
8
- *
9
6
  * @see https://github.com/syntax-tree/mdast#strong
10
7
  * @see https://github.github.com/gfm/#emphasis-and-strong-emphasis
11
8
  */
12
- export declare class EmphasisTokenizer extends BaseInlineTokenizer<Delimiter> implements Tokenizer, TokenizerMatchInlineHook<T, Delimiter, Token>, TokenizerParseInlineHook<T, Token, Node> {
13
- constructor(props?: TokenizerProps);
14
- /**
15
- * @override
16
- * @see BaseInlineTokenizer
17
- */
18
- protected _findDelimiter(startIndex: number, endIndex: number, nodePoints: ReadonlyArray<NodePoint>): Delimiter | null;
19
- /**
20
- * @override
21
- * @see TokenizerMatchInlineHook
22
- */
23
- isDelimiterPair(openerDelimiter: Delimiter, closerDelimiter: Delimiter, internalTokens: ReadonlyArray<YastInlineToken>, nodePoints: ReadonlyArray<NodePoint>): ResultOfIsDelimiterPair;
24
- /**
25
- * @override
26
- * @see TokenizerMatchInlineHook
27
- */
28
- processDelimiterPair(openerDelimiter: Delimiter, closerDelimiter: Delimiter, internalTokens: ReadonlyArray<YastInlineToken>, nodePoints: ReadonlyArray<NodePoint>, api: Readonly<MatchInlinePhaseApi>): ResultOfProcessDelimiterPair<T, Token, Delimiter>;
29
- /**
30
- * @override
31
- * @see TokenizerParseInlineHook
32
- */
33
- processToken(token: Token, children?: YastNode[]): Node;
9
+ export declare class EmphasisTokenizer extends BaseInlineTokenizer<T, IDelimiter, IToken, INode, IThis> implements IInlineTokenizer<T, IDelimiter, IToken, INode, IThis> {
10
+ constructor(props?: ITokenizerProps);
11
+ readonly match: IMatchInlineHookCreator<T, IDelimiter, IToken, IThis>;
12
+ readonly parse: IParseInlineHookCreator<T, IToken, INode, IThis>;
34
13
  }
@@ -1,15 +1,15 @@
1
- import type { Emphasis, EmphasisType, Strong, StrongType } from '@yozora/ast';
2
- import type { BaseInlineTokenizerProps, PartialYastInlineToken, YastTokenDelimiter } from '@yozora/core-tokenizer';
1
+ import type { EmphasisType, IEmphasis, IStrong, StrongType } from '@yozora/ast';
2
+ import type { IBaseInlineTokenizerProps, IPartialYastInlineToken, ITokenizer, IYastTokenDelimiter } from '@yozora/core-tokenizer';
3
3
  export declare type T = EmphasisType | StrongType;
4
- export declare type Node = Emphasis | Strong;
4
+ export declare type INode = IEmphasis | IStrong;
5
5
  export declare const uniqueName = "@yozora/tokenizer-emphasis";
6
- export interface Token extends PartialYastInlineToken<T> {
6
+ export interface IToken extends IPartialYastInlineToken<T> {
7
7
  /**
8
- * Delimiter thickness.
8
+ * IDelimiter thickness.
9
9
  */
10
10
  thickness: number;
11
11
  }
12
- export interface Delimiter extends YastTokenDelimiter {
12
+ export interface IDelimiter extends IYastTokenDelimiter {
13
13
  /**
14
14
  * Thickness of the delimiter.
15
15
  */
@@ -19,4 +19,5 @@ export interface Delimiter extends YastTokenDelimiter {
19
19
  */
20
20
  originalThickness: number;
21
21
  }
22
- export declare type TokenizerProps = Partial<BaseInlineTokenizerProps>;
22
+ export declare type IThis = ITokenizer;
23
+ export declare type ITokenizerProps = Partial<IBaseInlineTokenizerProps>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@yozora/tokenizer-emphasis",
3
- "version": "1.2.1",
3
+ "version": "2.0.0-alpha.1",
4
4
  "author": {
5
5
  "name": "guanghechen",
6
6
  "url": "https://github.com/guanghechen/"
@@ -35,9 +35,9 @@
35
35
  "test": "cross-env TS_NODE_FILES=true jest --config ../../jest.config.js --rootDir ."
36
36
  },
37
37
  "dependencies": {
38
- "@yozora/ast": "^1.2.1",
39
- "@yozora/character": "^1.2.1",
40
- "@yozora/core-tokenizer": "^1.2.1"
38
+ "@yozora/ast": "^2.0.0-alpha.1",
39
+ "@yozora/character": "^2.0.0-alpha.1",
40
+ "@yozora/core-tokenizer": "^2.0.0-alpha.1"
41
41
  },
42
- "gitHead": "d98d07d7c56dd9f6bb60149b2b0a4be2787e1046"
42
+ "gitHead": "86202e1d2b03ccfc2ab030517d9d314f7aee7666"
43
43
  }