📄 asciimathml.js
字号:
//arrows{input:"uarr", tag:"mo", output:"\u2191", tex:"uparrow", ttype:CONST},{input:"darr", tag:"mo", output:"\u2193", tex:"downarrow", ttype:CONST},{input:"rarr", tag:"mo", output:"\u2192", tex:"rightarrow", ttype:CONST},{input:"->", tag:"mo", output:"\u2192", tex:"to", ttype:CONST},{input:"|->", tag:"mo", output:"\u21A6", tex:"mapsto", ttype:CONST},{input:"larr", tag:"mo", output:"\u2190", tex:"leftarrow", ttype:CONST},{input:"harr", tag:"mo", output:"\u2194", tex:"leftrightarrow", ttype:CONST},{input:"rArr", tag:"mo", output:"\u21D2", tex:"Rightarrow", ttype:CONST},{input:"lArr", tag:"mo", output:"\u21D0", tex:"Leftarrow", ttype:CONST},{input:"hArr", tag:"mo", output:"\u21D4", tex:"Leftrightarrow", ttype:CONST},//commands with argumentAMsqrt, AMroot, AMfrac, AMdiv, AMover, AMsub, AMsup,{input:"hat", tag:"mover", output:"\u005E", tex:null, ttype:UNARY, acc:true},{input:"bar", tag:"mover", output:"\u00AF", tex:"overline", ttype:UNARY, acc:true},{input:"vec", tag:"mover", output:"\u2192", tex:null, ttype:UNARY, acc:true},{input:"dot", tag:"mover", output:".", tex:null, ttype:UNARY, acc:true},{input:"ddot", tag:"mover", output:"..", tex:null, ttype:UNARY, acc:true},{input:"ul", tag:"munder", output:"\u0332", tex:"underline", ttype:UNARY, acc:true},AMtext, AMmbox, AMquote,{input:"bb", tag:"mstyle", atname:"fontweight", atval:"bold", output:"bb", tex:null, ttype:UNARY},{input:"mathbf", tag:"mstyle", atname:"fontweight", atval:"bold", output:"mathbf", tex:null, ttype:UNARY},{input:"sf", tag:"mstyle", atname:"fontfamily", atval:"sans-serif", output:"sf", tex:null, ttype:UNARY},{input:"mathsf", tag:"mstyle", atname:"fontfamily", atval:"sans-serif", output:"mathsf", tex:null, ttype:UNARY},{input:"bbb", tag:"mstyle", atname:"mathvariant", atval:"double-struck", output:"bbb", tex:null, ttype:UNARY, codes:AMbbb},{input:"mathbb", tag:"mstyle", atname:"mathvariant", atval:"double-struck", output:"mathbb", tex:null, ttype:UNARY, codes:AMbbb},{input:"cc", tag:"mstyle", atname:"mathvariant", atval:"script", output:"cc", tex:null, ttype:UNARY, codes:AMcal},{input:"mathcal", tag:"mstyle", atname:"mathvariant", atval:"script", output:"mathcal", tex:null, ttype:UNARY, codes:AMcal},{input:"tt", tag:"mstyle", atname:"fontfamily", atval:"monospace", output:"tt", tex:null, ttype:UNARY},{input:"mathtt", tag:"mstyle", atname:"fontfamily", atval:"monospace", output:"mathtt", tex:null, ttype:UNARY},{input:"fr", tag:"mstyle", atname:"mathvariant", atval:"fraktur", output:"fr", tex:null, ttype:UNARY, codes:AMfrk},{input:"mathfrak", tag:"mstyle", atname:"mathvariant", atval:"fraktur", output:"mathfrak", tex:null, ttype:UNARY, codes:AMfrk}];function compareNames(s1,s2) { if (s1.input > s2.input) return 1 else return -1;}var AMnames = []; //list of input symbolsfunction AMinitSymbols() { var texsymbols = [], i; for (i=0; i<AMsymbols.length; i++) if (AMsymbols[i].tex) texsymbols[texsymbols.length] = {input:AMsymbols[i].tex, tag:AMsymbols[i].tag, output:AMsymbols[i].output, ttype:AMsymbols[i].ttype}; AMsymbols = AMsymbols.concat(texsymbols); AMsymbols.sort(compareNames); for (i=0; i<AMsymbols.length; i++) AMnames[i] = AMsymbols[i].input;}var AMmathml = "http://www.w3.org/1998/Math/MathML";function AMcreateElementMathML(t) { if (isIE) return document.createElement("mml:"+t); else return document.createElementNS(AMmathml,t);}function AMcreateMmlNode(name,frag) { var node = AMcreateElementMathML(name); node.appendChild(frag); return node;}function AMremoveCharsAndBlanks(str,n) {//remove n characters and any following blanks var st; if (str.charAt(n)=="\\" && str.charAt(n+1)!="\\" && str.charAt(n+1)!=" ") st = str.slice(n+1); else st = str.slice(n); for (var i=0; i<st.length && st.charCodeAt(i)<=32; i=i+1); return st.slice(i);}function AMposition(arr, str, n) { // return position >=n where str appears or would be inserted// assumes arr is sorted if (n==0) { var h,m; n = -1; h = arr.length; while (n+1<h) { m = (n+h) >> 1; if (arr[m]<str) n = m; else h = m; } return h; } else for (var i=n; i<arr.length && arr[i]<str; i++); return i; // i=arr.length || arr[i]>=str}var AMseparated = true;function AMgetSymbol(str) {//return maximal initial substring of str that appears in names//return null if there is none var k = 0; //new pos var j = 0; //old pos var mk; //match pos var st; var tagst; var match = ""; var more = true; for (var i=1; i<=str.length && more; i++) { st = str.slice(0,i); //initial substring of length i j = k; k = AMposition(AMnames, st, j); if (k<AMnames.length && str.slice(0,AMnames[k].length)==AMnames[k]){ match = AMnames[k]; mk = k; i = match.length; } more = k<AMnames.length && str.slice(0,AMnames[k].length)>=AMnames[k]; } if (match!="") if (separatetokens) { i = match.length; if ("a">str.charAt(0) || str.charAt(0)>"z" || "a">str.charAt(i-1) || str.charAt(i-1)>"z") { AMseparated = true; return AMsymbols[mk]; } st = str.charAt(i); AMseparated = AMseparated && ("a">st || st>"z"); if (AMseparated) return AMsymbols[mk]; } else return AMsymbols[mk]; // if str[0] is a digit or - return maxsubstring of digits.digits k = 1; st = str.slice(0,1); var pos = true; var integ = true; if (st == "-") { pos = false; st = str.slice(k,k+1); k++; } while ("0"<=st && st<="9" && k<=str.length) { st = str.slice(k,k+1); k++; } if (st == ".") { integ = false; st = str.slice(k,k+1); k++; while ("0"<=st && st<="9" && k<=str.length) { st = str.slice(k,k+1); k++; } } if ((pos && integ && k>1) || ((pos || integ) && k>2) || k>3) { st = str.slice(0,k-1); tagst = "mn"; AMseparated = true; } else { k = 2; st = str.slice(0,1); //take 1 character AMseparated = ("A">st || st>"Z") && ("a">st || st>"z"); tagst = (AMseparated?"mo":"mi"); AMseparated = AMseparated || str.charAt(1)<"a" || str.charAt(1)>"z"; } return {input:str.slice(0,k-1), tag:tagst, output:st, ttype:CONST};}function AMremoveBrackets(node) { var st; if (node.nodeName=="mrow") { st = node.firstChild.firstChild.nodeValue; if (st=="(" || st=="[" || st=="{") node.removeChild(node.firstChild); } if (node.nodeName=="mrow") { st = node.lastChild.firstChild.nodeValue; if (st==")" || st=="]" || st=="}") node.removeChild(node.lastChild); }}/*Parsing ASCII math expressions with the following grammarV ::= [A-Za-z] | greek letters | numbers | other constant symbolsU ::= sqrt | text | bb | other unary symbols for font commandsB ::= frac | root | stackrel binary symbolsL ::= ( | [ | { | (: | {: left bracketsR ::= ) | ] | } | :) | :} right bracketsS ::= V | LER | US | BSS simple expressionE ::= SE | S/S | S_S | S^S | S_S^S expressionEach terminal symbol is translated into a corresponding mathml node.*/var AMnestingDepth;function AMparseSexpr(str) { //parses str and returns [node,tailstr] var symbol, node, result, i, st, newFrag = document.createDocumentFragment(); str = AMremoveCharsAndBlanks(str,0); symbol = AMgetSymbol(str); //either a token or a bracket or empty if (symbol == null || symbol.ttype == RIGHTBRACKET && AMnestingDepth > 0) return [null,str]; if (symbol.ttype == DEFINITION) { str = symbol.output+AMremoveCharsAndBlanks(str,symbol.input.length); symbol = AMgetSymbol(str); } switch (symbol.ttype) { case UNDEROVER: case CONST: str = AMremoveCharsAndBlanks(str,symbol.input.length); if (symbol.tag=="mn" && symbol.output.charAt(0)=="-") { node = AMcreateMmlNode("mo",document.createTextNode("-")); node = AMcreateMmlNode("mrow",node); node.appendChild(AMcreateMmlNode(symbol.tag, //its a constant document.createTextNode(symbol.output.slice(1)))); return [node,str]; } else return [AMcreateMmlNode(symbol.tag, //its a constant document.createTextNode(symbol.output)),str]; case LEFTBRACKET: //read (expr+) AMnestingDepth++; str = AMremoveCharsAndBlanks(str,symbol.input.length); result = AMparseExpr(str); if (typeof symbol.invisible == "boolean" && symbol.invisible) node = AMcreateMmlNode("mrow",result[0]); else { node = AMcreateMmlNode("mo",document.createTextNode(symbol.output)); node = AMcreateMmlNode("mrow",node); node.appendChild(result[0]); } return [node,result[1]]; case UNARY: if (symbol == AMtext || symbol == AMmbox || symbol == AMquote) { if (symbol!=AMquote) str = AMremoveCharsAndBlanks(str,symbol.input.length); if (str.charAt(0)=="{") i=str.indexOf("}"); else if (str.charAt(0)=="(") i=str.indexOf(")"); else if (str.charAt(0)=="[") i=str.indexOf("]"); else if (symbol==AMquote) i=str.slice(1).indexOf("\"")+1; else i = 0; if (i==-1) i = str.length; st = str.slice(1,i); if (st.charAt(0) == " ") { node = AMcreateElementMathML("mspace"); node.setAttribute("width","1ex"); newFrag.appendChild(node); } newFrag.appendChild( AMcreateMmlNode(symbol.tag,document.createTextNode(st))); if (st.charAt(st.length-1) == " ") { node = AMcreateElementMathML("mspace"); node.setAttribute("width","1ex"); newFrag.appendChild(node); } str = AMremoveCharsAndBlanks(str,i+1); return [AMcreateMmlNode("mrow",newFrag),str]; } else { str = AMremoveCharsAndBlanks(str,symbol.input.length); result = AMparseSexpr(str); if (result[0]==null) return [AMcreateMmlNode("mo", document.createTextNode(symbol.input)),str]; AMremoveBrackets(result[0]); if (symbol == AMsqrt) { // sqrt return [AMcreateMmlNode(symbol.tag,result[0]),result[1]]; } else if (typeof symbol.acc == "boolean" && symbol.acc) { // accent node = AMcreateMmlNode(symbol.tag,result[0]); node.appendChild(AMcreateMmlNode("mo",document.createTextNode(symbol.output))); return [node,result[1]]; } else { // font change command
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -