Skip to content

Commit

Permalink
Merge pull request #689 from mathjax/mhchem-es5
Browse files Browse the repository at this point in the history
Move mhchem files to ts/input/tex/mhchem and down-compile to ES5 (mathjax/MathJax#2673)
  • Loading branch information
dpvc committed Apr 23, 2021
2 parents 056f9c3 + 2c02f8e commit 59212ff
Show file tree
Hide file tree
Showing 6 changed files with 1,876 additions and 15 deletions.
15 changes: 2 additions & 13 deletions package-lock.json

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

1 change: 0 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,6 @@
},
"dependencies": {
"esm": "^3.2.25",
"mhchemparser": "^4.0.0",
"mj-context-menu": "^0.6.1",
"speech-rule-engine": "^3.2.0"
}
Expand Down
2 changes: 1 addition & 1 deletion ts/input/tex/mhchem/MhchemConfiguration.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ import TexError from '../TexError.js';
import TexParser from '../TexParser.js';
import BaseMethods from '../base/BaseMethods.js';
import {AmsMethods} from '../ams/AmsMethods.js';
import {mhchemParser} from 'mhchemparser/dist/mhchemParser.js';
import {mhchemParser} from './mhchemparser/mhchemParser.js';

// Namespace
let MhchemMethods: Record<string, ParseMethod> = {};
Expand Down
250 changes: 250 additions & 0 deletions ts/input/tex/mhchem/mhchemparser/mhchemParser.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,250 @@
interface MhchemParser {
go: { (input: string | undefined, stateMachine: StateMachineName): Parsed[]; };
concatArray: { (a: any[], b: any): void };
patterns: {
patterns: {
[pattern in PatternNameReturningString]?:
RegExp | PatternFunction<string>
} & {
[pattern in PatternNameReturningArray]?:
RegExp | PatternFunction<string[]>
};
findObserveGroups: {
(
input: string,
begExcl: string | RegExp,
begIncl: string | RegExp,
endIncl: string | RegExp,
endExcl: string | RegExp,
beg2Excl?: string | RegExp,
beg2Incl?: string | RegExp,
end2Incl?: string | RegExp,
end2Excl?: string | RegExp,
combine?: boolean
): MatchResult<string | string[]>
};
match_: { (m: PatternName, input: string): MatchResult<string | string[]> | null };
},
actions: ActionList;
stateMachines: { [key in StateMachineName]: StateMachine };
}

type PatternFunction<T> = (input: string) => MatchResult<T> | null;
type StateMachineName = "tex" | "ce" | "a" | "o" | "text" | "pq" | "bd" | "oxidation" | "tex-math" | "tex-math tight" | "9,9" | "pu" | "pu-2" | "pu-9,9";
type MatchResult<T> = {
match_: T;
remainder: string;
}
type StateName =
"0" | // begin of main part (arrow/operator unlikely)
"1" | // next entity
"2" | // next entity (arrow/operator unlikely)
"3" | // next atom
"c" | // macro
"a" | // amount
"o" | // element
"b" | // left-side superscript
"p" | // left-side subscript
"q" | // right-side subscript
"d" | "D" | // right-side superscript
"r" | // arrow
"rd" | // arrow, script above
"f" | "*";
type StateNameCombined = StateName | "0|1|2" | "0|1|2|3" | "0|1|2|3|a|as|b|p|bp" | "0|1|2|3|a|as|b|p|bp|o" | "0|1|2|3|a|as|b|p|bp|o|c0" | "0|1|2|3|a|as|o" | "0|1|2|3|a|as|o|q|d|D|qd|qD|dq" | "0|1|2|3|as|b|p|bp|o" | "0|1|2|3|b|p|bp|o" | "0|1|2|a|as" | "0|1|2|as" | "0|2" | "0|a" | "0|d" | "1|2" | "1|3" | "3|o" | "a|as" | "a|as|d|D|q|qd|qD|dq" | "a|as|o" | "as" | "as|o" | "b|p|bp" | "d|D" | "d|D|q|qd|qD|dq" | "d|D|qd|qD" | "d|D|qd|qD|dq" | "d|qd|D|qD" | "d|qd|dq" | "D|qD|p" | "dq" | "o|d|D|dq|qd|qD" | "o|d|D|q|qd|qD|dq" | "o|q" | "q|d|D|qd|qD|dq" | "q|dq" | "q|qd|qD|dq" | "qd" | "qD|dq" | "qd|qD" | "r|rt" | "r|rt|rd|rdt|rdq" | "rd|rdt" | "/|q";

type ActionList = {
[key in ActionNameUsingMNone]?: ActionFunction<string>
} & {
[key in ActionNameUsingMString]?: ActionFunction<string>
} & {
[key in ActionNameUsingMStringOption]?: ActionFunction<string>
} & {
[key in ActionNameUsingMArray]?: ActionFunction<string[]>
}
interface ActionFunction<T> {
(buffer: Buffer, m?: T, option?: string | number | boolean): undefined | Parsed | Parsed[];
}

type TransitionsRaw = {
[pattern in PatternNameReturningString]?: {
[state in StateNameCombined]?: {
action_:
ActionNameUsingMString | ActionNameUsingMStringOption | ActionNameUsingMNone |
ActionNameWithParameter<ActionNameUsingMString> | ActionNameWithParameter<ActionNameUsingMStringOption> | ActionNameWithParameter<ActionNameUsingMNone> |
(ActionNameUsingMString | ActionNameUsingMStringOption | ActionNameUsingMNone |
ActionNameWithParameter<ActionNameUsingMString> | ActionNameWithParameter<ActionNameUsingMStringOption> | ActionNameWithParameter<ActionNameUsingMNone>)[];
nextState?: string;
revisit?: boolean;
toContinue?: boolean;
stateArray?: StateName[];
}
}
} & {
[pattern in PatternNameReturningArray2]?: {
[state in StateNameCombined]?: {
action_:
ActionNameUsingMArray2 | (ActionNameUsingMArray2 | ActionNameUsingMString | ActionNameUsingMNone | ActionNameWithParameter<ActionNameUsingMNone>)[]; // ... list ist not complete
nextState?: string;
revisit?: boolean;
toContinue?: boolean;
stateArray?: StateName[];
}
}
} & {
[pattern in PatternNameReturningArray3]?: {
[state in StateNameCombined]?: {
action_: ActionNameUsingMArray3 | ActionNameUsingMArray3[];
nextState?: string;
revisit?: boolean;
toContinue?: boolean;
stateArray?: StateName[];
}
}
} & {
[pattern in PatternNameReturningArray6]?: {
[state in StateNameCombined]?: {
action_: ActionNameUsingMArray6 | ActionNameUsingMArray6[];
nextState?: string;
revisit?: boolean;
toContinue?: boolean;
stateArray?: StateName[];
}
}
}
type PatternNameReturningString =
"empty" | "else" | "else2" | "space" | "space A" | "space$" | "a-z" | "x" | "x$" | "i$" | "letters" | "\\greek" | "one lowercase latin letter $" | "$one lowercase latin letter$ $" | "one lowercase greek letter $" | "digits" | "-9.,9" | "-9.,9 no missing 0" | "state of aggregation $" | "{[(" | ")]}" | ", " | "," | "." | ". __* " | "..." | "^{(...)}" | "^($...$)" | "^a" | "^\\x{}" | "^\\x" | "^(-1)" | "\'" | "_{(...)}" | "_($...$)" | "_9" | "_\\x{}{}" | "_\\x{}" | "_\\x" | "^_" | "{}" | "{...}" | "{(...)}" | "$...$" | "${(...)}$__$(...)$" | "=<>" | "#" | "+" | "-$" | "-9" | "- orbital overlap" | "-" | "pm-operator" | "operator" | "arrowUpDown" | "\\bond{(...)}" | "->" | "CMT" | "[(...)]" | "1st-level escape" | "\\," | "\\x{}" | "\\ca" | "\\x" | "orbital" | "others" | "\\color{(...)}" | "\\ce{(...)}" | "\\pu{(...)}" | "oxidation$" | "d-oxidation$" | "roman numeral" | "1/2$" | "amount" | "amount2" | "(KV letters)," | "formula$" | "uprightEntities" | "/" | "//" | "*" | "\\x{}{}" | "^\\x{}{}" |
"^{(...)}|^($...$)" | "^a|^\\x{}{}|^\\x{}|^\\x|\'" | "_{(...)}|_($...$)|_9|_\\x{}{}|_\\x{}|_\\x" | "\\,|\\x{}{}|\\x{}|\\x" | "{...}|\\,|\\x{}{}|\\x{}|\\x" | "\\x{}{}|\\x{}|\\x" | "-|+" | "{[(|)]}" | "{...}|else" | "^{(...)}|^(-1)";
type PatternNameReturningArray2 = "_{(state of aggregation)}$" | "\\frac{(...)}" | "\\overset{(...)}" | "\\underset{(...)}" | "\\underbrace{(...)}" | "\\color{(...)}{(...)}";
type PatternNameReturningArray3 = "(-)(9)^(-9)";
type PatternNameReturningArray6 = "(-)(9.,9)(e)(99)";
type PatternName = PatternNameReturningString | PatternNameReturningArray2 | PatternNameReturningArray3 | PatternNameReturningArray6;
type PatternNameReturningArray = PatternNameReturningArray2 | PatternNameReturningArray3 | PatternNameReturningArray6;
type ActionNameUsingMNone = "a to o" | "sb=true" | "sb=false" | "beginsWithBond=true" | "beginsWithBond=false" | "parenthesisLevel++" | "parenthesisLevel--" | "output" | "space" | "cdot" | "output-0" | "output-o" | "tight operator";
type ActionNameUsingMString = "a=" | "b=" | "p=" | "o=" | "q=" | "d=" | "rm=" | "text=" | "copy" | "rm" | "text" | "tex-math" | "tex-math tight" | "ce" | "pu" | "1/2" | "9,9" | "o after d" | "d= kv" | "charge or bond" | "state of aggregation" | "comma" | "oxidation-output" | "r=" | "rdt=" | "rd=" | "rqt=" | "rq=" | "operator" | "bond" | "color0-output" | "roman-numeral" | "^(-1)";
type ActionNameUsingMStringOption = "insert" | "insert+p1" | "write" | "bond" | "- after o/d";
type ActionNameUsingMArray2 = "insert+p1+p2" | "frac-output" | "overset-output" | "underset-output" | "underbrace-output" | "color-output";
type ActionNameUsingMArray3 = "number^";
type ActionNameUsingMArray6 = "enumber";
type ActionName = ActionNameUsingMNone | ActionNameUsingMString | ActionNameUsingMStringOption | ActionNameUsingMArray2 | ActionNameUsingMArray3 | ActionNameUsingMArray6;
type ActionNameUsingMArray = ActionNameUsingMArray2 | ActionNameUsingMArray3 | ActionNameUsingMArray6;

type StateMachine = {
transitions: Transitions;
actions: ActionList;
}
type Transitions = {
[state in StateName]?: Transition[];
}
interface Transition { // e.g. { pattern: 'letter', task: { '*': { action_: ['output'], nextState: '1' } } }
pattern: PatternName;
task: Action;
}
interface Action {
action_: ActionNameWithParameter<ActionName>[];
nextState?: StateName;
revisit?: boolean;
toContinue?: boolean;
}
interface ActionNameWithParameter<T> {
type_: T;
option?: string | number | boolean;
}




interface Buffer {
a?: string; // amount
o?: string; // element
b?: string; // left-side superscript
p?: string; // left-side subscript
q?: string; // right-side subscript
d?: string; // right-side superscript
dType?: string;

r?: ArrowName; // arrow
rdt?: string; // arrow, script above, type
rd?: string; // arrow, script above, content
rqt?: string; // arrow, script below, type
rq?: string; // arrow, script below, content

text_?: string;
rm?: string;

parenthesisLevel?: number; // starting at 0
sb?: boolean; // space before
beginsWithBond?: boolean;
}




type ParsedWithoutString =
{ type_: "chemfive",
a: Parsed[],
b: Parsed[],
p: Parsed[],
o: Parsed[],
q: Parsed[],
d: Parsed[],
dType: string } |
{ type_: "rm", p1: string } |
{ type_: "text", p1: string } |
{ type_: "roman numeral", p1: string } |
{ type_: "state of aggregation", p1: Parsed[] } |
{ type_: "state of aggregation subscript", p1: Parsed[] } |
{ type_: "bond", kind_: BondName } |
{ type_: "frac", p1: string, p2: string } |
{ type_: "pu-frac", p1: Parsed[], p2: Parsed[] } |
{ type_: "tex-math", p1: string } |
{ type_: "frac-ce", p1: Parsed[], p2: Parsed[] } |
{ type_: "overset", p1: Parsed[], p2: Parsed[] } |
{ type_: "underset", p1: Parsed[], p2: Parsed[] } |
{ type_: "underbrace", p1: Parsed[], p2: Parsed[] } |
{ type_: "color", color1: string, color2: Parsed[] } |
{ type_: "color0", color: string } |
{ type_: "arrow",
r: ArrowName,
rd?: Parsed[],
rq?: Parsed[]} |
{ type_: "operator", kind_: OperatorName } |
{ type_: "1st-level escape", p1: string } |
{ type_: "space" } |
{ type_: "entitySkip" } |
{ type_: "pu-space-1" } |
{ type_: "pu-space-2" } |
{ type_: "1000 separator" } |
{ type_: "commaDecimal" } |
{ type_: "comma enumeration L", p1: string } |
{ type_: "comma enumeration M", p1: string } |
{ type_: "comma enumeration S", p1: string } |
{ type_: "hyphen" } |
{ type_: "addition compound" } |
{ type_: "electron dot" } |
{ type_: "KV x" } |
{ type_: "prime" } |
{ type_: "cdot" } |
{ type_: "tight cdot" } |
{ type_: "times" } |
{ type_: "circa" } |
{ type_: "^" } |
{ type_: "v" } |
{ type_: "ellipsis" } |
{ type_: "/" } |
{ type_: " / " };
type Parsed = ParsedWithoutString | string;
type ArrowName = "->" | "\u2192" | "\u27F6" | "<-" | "<->" | "<-->" | "<=>" | "\u21CC" | "<=>>" | "<<=>"; // keep aligned with definition of pattern '->'
type BondName = "-" | "1" | "=" | "2" | "#" | "3" | "~" | "~-" | "~=" | "~--" | "-~-" | "..." | "...." | "->" | "<-" | "<" | ">";
type OperatorName = "+" | "-" | "=" | "<" | ">" | "<<" | ">>" | "\\pm" | "\\approx" | "$\\approx$" | "v" | "(v)" | "^" | "(^)";




interface MhchemTexify {
go: { (input: Parsed[] | undefined, isInner?: boolean): string; };
_goInner: { (input: Parsed[]): string};
_go2: { (input: ParsedWithoutString): string };
_getArrow: { (input: ArrowName): string };
_getBond: { (input: BondName): string };
_getOperator: { (input: OperatorName): string };
}
Loading

0 comments on commit 59212ff

Please sign in to comment.