@sciexpr/parser 0.1.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.
- package/dist/index.cjs +562 -0
- package/dist/index.d.cts +158 -0
- package/dist/index.d.ts +158 -0
- package/dist/index.js +540 -0
- package/package.json +61 -0
package/dist/index.d.cts
ADDED
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
import { ExpressionRoot } from '@sciexpr/core';
|
|
2
|
+
|
|
3
|
+
/** 解析器接口 */
|
|
4
|
+
interface IParser {
|
|
5
|
+
/** 解析器唯一标识 */
|
|
6
|
+
readonly id: string;
|
|
7
|
+
/** 支持的语言/格式 */
|
|
8
|
+
readonly formats: string[];
|
|
9
|
+
/** 解析输入为 AST */
|
|
10
|
+
parse(input: string, options?: ParseOptions): ExpressionRoot;
|
|
11
|
+
/** 检测是否能解析该输入 */
|
|
12
|
+
canParse(input: string): boolean;
|
|
13
|
+
}
|
|
14
|
+
/** 解析选项 */
|
|
15
|
+
interface ParseOptions {
|
|
16
|
+
/** 输入格式提示 */
|
|
17
|
+
hint?: 'latex' | 'chemical' | 'unicode' | 'auto';
|
|
18
|
+
/** 是否为 display 模式 */
|
|
19
|
+
displayMode?: boolean;
|
|
20
|
+
/** 自定义宏 */
|
|
21
|
+
macros?: Record<string, string>;
|
|
22
|
+
/** 严格模式(遇到未知命令是否报错) */
|
|
23
|
+
strict?: boolean;
|
|
24
|
+
}
|
|
25
|
+
/** Token 类型 */
|
|
26
|
+
declare enum TokenType {
|
|
27
|
+
Command = "command",// \alpha, \frac, etc.
|
|
28
|
+
OpenBrace = "openBrace",// {
|
|
29
|
+
CloseBrace = "closeBrace",// }
|
|
30
|
+
OpenBracket = "openBracket",// [
|
|
31
|
+
CloseBracket = "closeBracket",
|
|
32
|
+
OpenParen = "openParen",// (
|
|
33
|
+
CloseParen = "closeParen",
|
|
34
|
+
Superscript = "superscript",// ^
|
|
35
|
+
Subscript = "subscript",// _
|
|
36
|
+
Whitespace = "whitespace",
|
|
37
|
+
Text = "text",// regular text
|
|
38
|
+
Number = "number",
|
|
39
|
+
Ampersand = "ampersand",// & (for matrices)
|
|
40
|
+
Newline = "newline",// \\
|
|
41
|
+
Dollar = "dollar",// $ (inline math delimiter)
|
|
42
|
+
DoubleDollar = "doubleDollar",// $$ (display math delimiter)
|
|
43
|
+
EOF = "eof"
|
|
44
|
+
}
|
|
45
|
+
/** Token 定义 */
|
|
46
|
+
interface Token {
|
|
47
|
+
type: TokenType;
|
|
48
|
+
value: string;
|
|
49
|
+
position: number;
|
|
50
|
+
length: number;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* LaTeX 词法分析器
|
|
55
|
+
* 将 LaTeX 源码分解为 token 流
|
|
56
|
+
*/
|
|
57
|
+
declare class LatexTokenizer {
|
|
58
|
+
private input;
|
|
59
|
+
private pos;
|
|
60
|
+
constructor(input: string);
|
|
61
|
+
/** 获取所有 token */
|
|
62
|
+
tokenize(): Token[];
|
|
63
|
+
/** 获取下一个 token */
|
|
64
|
+
private nextToken;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* LaTeX 表达式解析器
|
|
69
|
+
*
|
|
70
|
+
* 支持的命令:
|
|
71
|
+
* - \frac{num}{den} — 分数
|
|
72
|
+
* - \sqrt[index]{radicand} — 根式
|
|
73
|
+
* - ^{sup} — 上标
|
|
74
|
+
* - _{sub} — 下标
|
|
75
|
+
* - \alpha, \beta, ... — 希腊字母
|
|
76
|
+
* - 括号匹配 ...
|
|
77
|
+
*/
|
|
78
|
+
declare class LatexParser implements IParser {
|
|
79
|
+
readonly id = "latex";
|
|
80
|
+
readonly formats: string[];
|
|
81
|
+
private tokens;
|
|
82
|
+
private pos;
|
|
83
|
+
private displayMode;
|
|
84
|
+
canParse(input: string): boolean;
|
|
85
|
+
parse(input: string, options?: ParseOptions): ExpressionRoot;
|
|
86
|
+
private parseExpressions;
|
|
87
|
+
private parseExpression;
|
|
88
|
+
/** 处理上/下标:检查 ^ 和 _ 后附加到 base 节点 */
|
|
89
|
+
private handleScripts;
|
|
90
|
+
private parseCommand;
|
|
91
|
+
/** 解析 {} 包裹的分组 */
|
|
92
|
+
private parseBraceGroup;
|
|
93
|
+
/** 解析 { expressions } 分组 */
|
|
94
|
+
private parseGroup;
|
|
95
|
+
/** 解析单个表达式(用于上/下标参数) */
|
|
96
|
+
private parseSingleExpression;
|
|
97
|
+
/** 解析上/下标内容 */
|
|
98
|
+
private parseScriptContent;
|
|
99
|
+
private peek;
|
|
100
|
+
private advance;
|
|
101
|
+
private skipType;
|
|
102
|
+
private isEOF;
|
|
103
|
+
/** 根据文本内容判断符号类型 */
|
|
104
|
+
private classifySymbol;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* 化学式解析器
|
|
109
|
+
*
|
|
110
|
+
* 解析化学分子式和反应方程式。
|
|
111
|
+
* 支持格式:
|
|
112
|
+
* - H2O → 水
|
|
113
|
+
* - H2SO4 → 硫酸
|
|
114
|
+
* - NaCl → 食盐
|
|
115
|
+
* - Fe2O3 → 氧化铁
|
|
116
|
+
*/
|
|
117
|
+
declare class ChemicalParser implements IParser {
|
|
118
|
+
readonly id = "chemical";
|
|
119
|
+
readonly formats: string[];
|
|
120
|
+
canParse(input: string): boolean;
|
|
121
|
+
parse(input: string, _options?: ParseOptions): ExpressionRoot;
|
|
122
|
+
/**
|
|
123
|
+
* 解析化学式,如 "H2SO4" → [H, 2, S, O, 4]
|
|
124
|
+
*/
|
|
125
|
+
private parseFormula;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* Parser 注册表
|
|
130
|
+
*
|
|
131
|
+
* 管理所有解析器,支持自动检测和手动选择
|
|
132
|
+
*/
|
|
133
|
+
declare class ParserRegistry {
|
|
134
|
+
private parsers;
|
|
135
|
+
private defaultParsers;
|
|
136
|
+
constructor();
|
|
137
|
+
/** 注册自定义解析器 */
|
|
138
|
+
register(parser: IParser): void;
|
|
139
|
+
/** 移除解析器 */
|
|
140
|
+
unregister(id: string): boolean;
|
|
141
|
+
/** 根据 ID 获取解析器 */
|
|
142
|
+
get(id: string): IParser | undefined;
|
|
143
|
+
/**
|
|
144
|
+
* 自动检测并选择合适的解析器
|
|
145
|
+
*/
|
|
146
|
+
find(input: string): IParser | null;
|
|
147
|
+
/**
|
|
148
|
+
* 解析输入
|
|
149
|
+
* @param input 输入文本
|
|
150
|
+
* @param options 解析选项
|
|
151
|
+
* @returns 解析后的 AST
|
|
152
|
+
*/
|
|
153
|
+
parse(input: string, options?: ParseOptions): ExpressionRoot;
|
|
154
|
+
/** 列出所有已注册的解析器 ID */
|
|
155
|
+
list(): string[];
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
export { ChemicalParser, type IParser, LatexParser, LatexTokenizer, type ParseOptions, ParserRegistry, type Token, TokenType };
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
import { ExpressionRoot } from '@sciexpr/core';
|
|
2
|
+
|
|
3
|
+
/** 解析器接口 */
|
|
4
|
+
interface IParser {
|
|
5
|
+
/** 解析器唯一标识 */
|
|
6
|
+
readonly id: string;
|
|
7
|
+
/** 支持的语言/格式 */
|
|
8
|
+
readonly formats: string[];
|
|
9
|
+
/** 解析输入为 AST */
|
|
10
|
+
parse(input: string, options?: ParseOptions): ExpressionRoot;
|
|
11
|
+
/** 检测是否能解析该输入 */
|
|
12
|
+
canParse(input: string): boolean;
|
|
13
|
+
}
|
|
14
|
+
/** 解析选项 */
|
|
15
|
+
interface ParseOptions {
|
|
16
|
+
/** 输入格式提示 */
|
|
17
|
+
hint?: 'latex' | 'chemical' | 'unicode' | 'auto';
|
|
18
|
+
/** 是否为 display 模式 */
|
|
19
|
+
displayMode?: boolean;
|
|
20
|
+
/** 自定义宏 */
|
|
21
|
+
macros?: Record<string, string>;
|
|
22
|
+
/** 严格模式(遇到未知命令是否报错) */
|
|
23
|
+
strict?: boolean;
|
|
24
|
+
}
|
|
25
|
+
/** Token 类型 */
|
|
26
|
+
declare enum TokenType {
|
|
27
|
+
Command = "command",// \alpha, \frac, etc.
|
|
28
|
+
OpenBrace = "openBrace",// {
|
|
29
|
+
CloseBrace = "closeBrace",// }
|
|
30
|
+
OpenBracket = "openBracket",// [
|
|
31
|
+
CloseBracket = "closeBracket",
|
|
32
|
+
OpenParen = "openParen",// (
|
|
33
|
+
CloseParen = "closeParen",
|
|
34
|
+
Superscript = "superscript",// ^
|
|
35
|
+
Subscript = "subscript",// _
|
|
36
|
+
Whitespace = "whitespace",
|
|
37
|
+
Text = "text",// regular text
|
|
38
|
+
Number = "number",
|
|
39
|
+
Ampersand = "ampersand",// & (for matrices)
|
|
40
|
+
Newline = "newline",// \\
|
|
41
|
+
Dollar = "dollar",// $ (inline math delimiter)
|
|
42
|
+
DoubleDollar = "doubleDollar",// $$ (display math delimiter)
|
|
43
|
+
EOF = "eof"
|
|
44
|
+
}
|
|
45
|
+
/** Token 定义 */
|
|
46
|
+
interface Token {
|
|
47
|
+
type: TokenType;
|
|
48
|
+
value: string;
|
|
49
|
+
position: number;
|
|
50
|
+
length: number;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* LaTeX 词法分析器
|
|
55
|
+
* 将 LaTeX 源码分解为 token 流
|
|
56
|
+
*/
|
|
57
|
+
declare class LatexTokenizer {
|
|
58
|
+
private input;
|
|
59
|
+
private pos;
|
|
60
|
+
constructor(input: string);
|
|
61
|
+
/** 获取所有 token */
|
|
62
|
+
tokenize(): Token[];
|
|
63
|
+
/** 获取下一个 token */
|
|
64
|
+
private nextToken;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* LaTeX 表达式解析器
|
|
69
|
+
*
|
|
70
|
+
* 支持的命令:
|
|
71
|
+
* - \frac{num}{den} — 分数
|
|
72
|
+
* - \sqrt[index]{radicand} — 根式
|
|
73
|
+
* - ^{sup} — 上标
|
|
74
|
+
* - _{sub} — 下标
|
|
75
|
+
* - \alpha, \beta, ... — 希腊字母
|
|
76
|
+
* - 括号匹配 ...
|
|
77
|
+
*/
|
|
78
|
+
declare class LatexParser implements IParser {
|
|
79
|
+
readonly id = "latex";
|
|
80
|
+
readonly formats: string[];
|
|
81
|
+
private tokens;
|
|
82
|
+
private pos;
|
|
83
|
+
private displayMode;
|
|
84
|
+
canParse(input: string): boolean;
|
|
85
|
+
parse(input: string, options?: ParseOptions): ExpressionRoot;
|
|
86
|
+
private parseExpressions;
|
|
87
|
+
private parseExpression;
|
|
88
|
+
/** 处理上/下标:检查 ^ 和 _ 后附加到 base 节点 */
|
|
89
|
+
private handleScripts;
|
|
90
|
+
private parseCommand;
|
|
91
|
+
/** 解析 {} 包裹的分组 */
|
|
92
|
+
private parseBraceGroup;
|
|
93
|
+
/** 解析 { expressions } 分组 */
|
|
94
|
+
private parseGroup;
|
|
95
|
+
/** 解析单个表达式(用于上/下标参数) */
|
|
96
|
+
private parseSingleExpression;
|
|
97
|
+
/** 解析上/下标内容 */
|
|
98
|
+
private parseScriptContent;
|
|
99
|
+
private peek;
|
|
100
|
+
private advance;
|
|
101
|
+
private skipType;
|
|
102
|
+
private isEOF;
|
|
103
|
+
/** 根据文本内容判断符号类型 */
|
|
104
|
+
private classifySymbol;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* 化学式解析器
|
|
109
|
+
*
|
|
110
|
+
* 解析化学分子式和反应方程式。
|
|
111
|
+
* 支持格式:
|
|
112
|
+
* - H2O → 水
|
|
113
|
+
* - H2SO4 → 硫酸
|
|
114
|
+
* - NaCl → 食盐
|
|
115
|
+
* - Fe2O3 → 氧化铁
|
|
116
|
+
*/
|
|
117
|
+
declare class ChemicalParser implements IParser {
|
|
118
|
+
readonly id = "chemical";
|
|
119
|
+
readonly formats: string[];
|
|
120
|
+
canParse(input: string): boolean;
|
|
121
|
+
parse(input: string, _options?: ParseOptions): ExpressionRoot;
|
|
122
|
+
/**
|
|
123
|
+
* 解析化学式,如 "H2SO4" → [H, 2, S, O, 4]
|
|
124
|
+
*/
|
|
125
|
+
private parseFormula;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* Parser 注册表
|
|
130
|
+
*
|
|
131
|
+
* 管理所有解析器,支持自动检测和手动选择
|
|
132
|
+
*/
|
|
133
|
+
declare class ParserRegistry {
|
|
134
|
+
private parsers;
|
|
135
|
+
private defaultParsers;
|
|
136
|
+
constructor();
|
|
137
|
+
/** 注册自定义解析器 */
|
|
138
|
+
register(parser: IParser): void;
|
|
139
|
+
/** 移除解析器 */
|
|
140
|
+
unregister(id: string): boolean;
|
|
141
|
+
/** 根据 ID 获取解析器 */
|
|
142
|
+
get(id: string): IParser | undefined;
|
|
143
|
+
/**
|
|
144
|
+
* 自动检测并选择合适的解析器
|
|
145
|
+
*/
|
|
146
|
+
find(input: string): IParser | null;
|
|
147
|
+
/**
|
|
148
|
+
* 解析输入
|
|
149
|
+
* @param input 输入文本
|
|
150
|
+
* @param options 解析选项
|
|
151
|
+
* @returns 解析后的 AST
|
|
152
|
+
*/
|
|
153
|
+
parse(input: string, options?: ParseOptions): ExpressionRoot;
|
|
154
|
+
/** 列出所有已注册的解析器 ID */
|
|
155
|
+
list(): string[];
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
export { ChemicalParser, type IParser, LatexParser, LatexTokenizer, type ParseOptions, ParserRegistry, type Token, TokenType };
|