var Nil=null, Undefined=undefined,_=Undefined; var True=true, False=false; var SERVER=(typeof window)=="undefined", ERRCATCH=False; function errorCatch(CATCH) { ERRCATCH=CATCH; } function errstop(errno) { if (ERRCATCH) throw ""; else if (SERVER) process.exit(errno); else nofunc(); } var ERRLI=-1,ERRCOL=-1,ERRFNAME=Nil; function errlicolSet(LI,COL,FNAME) { ERRLI=LI>0?LI:-1; ERRCOL=COL>0?COL:-1; if (isDefined(FNAME)) ERRFNAME=FNAME; } function error(msg) { if (ERRFNAME!=Nil) msg+=" in "+ERRFNAME; if (ERRLI>0 || ERRCOL>0) msg+=" at ("; if (ERRLI>0) msg+=ERRLI.toString(); if (ERRCOL>0) { if (ERRLI>0) msg+=","; msg+=ERRCOL.toString(); } if (ERRLI>0 || ERRCOL>0) msg+=")"; (SERVER?console.log:alert)(msg); errstop(1); } function prototype(X) { var RES=Object.getPrototypeOf(X); if (RES==Nil) return Object.prototype; return RES; } function constructor(X) { return prototype(X).constructor; } function isa0(O,C,REC) { if (isNil(O)) return False; if (constructor(O)==C) return True; if (isUndefined(REC)) REC=True; if (!REC || constructor(O)==Object) return False; return isa0(prototype(O),C,REC); } function eqNil(O) { return O===Nil; } function isDefined(O) { return O!==Undefined; } function isUndefined(O) { return O===Undefined; } function isNil(O) { return isUndefined(O) || O==BoxedUndefined || eqNil(O) || O==BoxedNil; } function isSymbol(O) { return isa0(O,Symbol); } function isBoolean(O) { return isa0(O,Boolean); } function isNumber(O) { return isa0(O,Number); } function isString(O) { return isa0(O,String); } function isNumStr(O) { return isNumber(O) || strIsNum(O); } function isDate(O) { return isa0(O,Date); } function isAtom(O) { return isNil(O) || isSymbol(O) || isBoolean(O) || isNumber(O) || isString(O) || isDate(O); } function isRootAtom(O) { return typeOf(O).root()==typeOf(O) && isAtom(O); } function isArray(O) { return isa0(O,Array); } function isFunction(O) { return isa0(O,Function); } var _SY={}; function sy(S) { if (isString(S)) { _SY[S]=1;return Symbol.for(S); } else if (isSymbol(S)) return Symbol.keyFor(S); else error("sy"); } function syExists(S) { return isDefined(_SY[S]); } var CharNatNone=0,CharNatUnknown=CharNatNone, CharNatAlf=1,CharNatQuote=2,CharNatDQuote=3, CharNatOmg=4,CharNatDigit=5,CharNatBlank=6 var CharNat=[]; function asc(c) { return c.codePointAt(0); } function chr(i) { return String.fromCharCode(i); } function charnat(c) { return CharNat[asc(c)]; } function charnatSet(c,n) { return CharNat[asc(c)]=n; } function charIsLetter(C) { return asc(C)>=asc("A") && asc(C)<=asc("Z") || asc(C)>=asc("a") && asc(C)<=asc("z"); } function charIsDigit10(C) { return asc(C)>=asc("0") && asc(C)<=asc("9"); } function charIsXDigit(C) { return charIsDigit10(C) || (asc(C)>=asc('A') && asc(C)<=asc('F')) || (asc(C)>=asc('a') && asc(C)<=asc('f')); } function charIsDigitInRadix(C,RADIX) { if (RADIX<2 || RADIX>16) error("charIsDigitInRadix"); if (RADIX<=10) return charIsDigit10(C) && asc(C)<=asc('0')+RADIX-1; return charIsDigit10(C) || (charIsXDigit(C) && ((asc(C)>=asc('A') && asc(C)<=asc('A')+RADIX-11) || (asc(C)>=asc('a') && asc(C)<=asc('a')+RADIX-11))); } function charIsAlpha(C) { return charnat(C)==CharNatAlf; } function charIsOmg(C) { return charnat(C)==CharNatOmg; } function charIsDigit(C) { return charnat(C)==CharNatDigit; } function charIsBlank(C) { return charnat(C)==CharNatBlank; } function charIsUnknown(C) { return charnat(C)==CharNatUnknown; } function charIs(C,N) { return charnat(C)==N; } function strIs(S,N) { if (!isString(S) || length(S)==0) return False; for (var I=0;I=0 && chars.indexOf(a[i])!=-1) { a[i]=null; i--; } } for (i=0;ilength(S) || length(A[1])>length(S)) return False; return startsWith(S,0,A[0]) && endsWith(substring(S,length(A[0]),length(S)),A[1]); } if (length(A)==3) { if (A[0]=="" && A[1]=="" && A[2]=="") return True; if (A[0]=="" && A[1]!="" && A[2]=="") return strFind(S,A[1])!=-1; } error("strMatch"); } function substring(S,I0,I1) { return S.substring(I0,I1); } function splitTrim(s,chars) { var a=s==""?[]:s.split(chars); for (var i=0;iO2[SLOTS]?SIGN:-SIGN; }); return A; } function strEscape(s) { var res=""; for (var i=0;i0) res+="|"; res+=display(o[i]); } res+="]"; displaying.pop(); } else { displaying.push(o); res="{"; var first=true; for (var val in o) { if (!first) { if (val!="parent") res+="|"; } else first=false; if (val!="parent") { res+=val+"="+display(o[val]); } } res+="}"; displaying.pop(); } return res; } var origin; if (SERVER) origin=global; else origin=window; charsInit(); var SymbolLicol=Symbol("licol"); function licolSet(S,LI,COL,FNAME) { if (isUnboxed(S)) S=new String(S); S[SymbolLicol]={ LI:LI, COL:COL, FNAME:FNAME }; return S; } function licol(S) { var LICOL; if (isBoxed(S)) LICOL=S[SymbolLicol]; if (isUndefined(LICOL)) LICOL={ LI:-1, COL:-1, FNAME:Undefined }; return LICOL; } function errlicolSet2(LICOL) { if (isString(LICOL)) LICOL=licol(LICOL); errlicolSet(LICOL.LI,LICOL.COL,LICOL.FNAME); } function fileExists(fname) { if (SERVER) return fs.existsSync(fname); else return httpSend("GET","http://localhost:8080/fileExists?"+fname); } function fileIsDir(fname) { var fd=fs.openSync(fname,"r"); var stats=fs.fstatSync(fd); return stats.isDirectory(); } function fileStats(fname) { if (!fileExists(fname)) return { mtime:new Date("1/1/80") }; var fd=fs.openSync(fname,"r"); return fs.fstatSync(fd); } function fileRead(fname,encoding) { if (SERVER) { if (!fileExists(fname)) error("File not found: "+fname); if (isUndefined(encoding)) encoding="utf8"; var RES=fs.readFileSync(fname,"latin1"); if (encoding=="utf8") RES=Buffer.from(RES,"latin1").toString("utf8"); return licolSet(RES,1,1,fname); } else return httpSend("GET","http://localhost:8080/"+fname); } function filePath(fname) { var a=fnameNormalize(fname).split("/"),s=""; for (var i=0;i1?a[length(a)-1]:Undefined; } function fileWrite(fname,str,encoding) { try { if (isUndefined(encoding)) encoding="utf8"; fs.writeFileSync(fname,str,encoding); } catch (err) { error("Can't write file: "+fname); } } function fileCopy(SRC,DEST,ENC) { if (SRC==DEST) return; var S=fileRead(SRC,ENC); fileWrite(DEST,S,ENC); } function fileMove(SRC,DEST) { fs.renameSync(SRC,DEST); } function fileDelete(fname) { fs.unlinkSync(fname); } function dirCreate(fname) { try { fs.mkdirSync(fname); } catch (err) { error("Can't create directory: "+fname); } } function vfileCreate(dir,fname,isDir,parent,val) { var D=fileStats(dir+"/"+fname).mtime; return {"dir":trim(replaceAll(dir,"//","/"),"/",false,true),"fname":fname, "isDir":isDir, "date":D, "isModified":false,"val":val, "parent":parent}; } _READ={}; function fileReadSet(ext,readFunc) { _READ[ext]=readFunc; } function dirRead(fname,mask,rec,ldf) { function fileRead(fname) { var dir=path.dirname(fname)+"/"; fname=path.basename(fname); var val=""; var readFunc=_READ[fileExt(fname)]; if (readFunc!=undefined) { val=readFunc(dir+fname); val=replaceAll(val,"\r\n","\n"); } return val; } var predir=path.dirname(fname)+"/"; fname=path.basename(fname); if (isUndefined(mask)) mask="*"; var d=vfileCreate(predir,fname,true,null,{}); var dir=fname; if (predir!="") dir=predir+"/"+fname; var a=fs.readdirSync(dir); for (var i=0;i') c=">"; if (c=='&') c="&"; res+=c; } return res; } function htmlEscapeBlanks(html) { var res=""; for (var i=0;i "; res+=c; } return res; } var OUTS=Nil; function startOutS() { OUTS=""; } function stopOutS() { OUTS=Nil; } function getOutS() { return OUTS; } function _out0(S) { if (!isString(S)) { console.log("<"+display(S)+">");error("out0"); } if (OUTS==Nil) if (SERVER) process.stdout.write(S); else document.write(S); else OUTS+=S; } function out0(S) { return _out0(S); } function _out(S) { if (SERVER || OUTS!=Nil) out0(S); else out0(htmlEscapeBlanks(htmlEscapeChars(S))); } function out(O) { return _out(O); } function outd(O) { out(display(O)); } function br(s) { out0("
"); } function hr(s) { out0("
"); } function esc(C) { if (SERVER) return "\x1b["+C+"m"; else { C=HTMLColor[C]; return C==undefined?"":""; } } function color(C) { if (C[0]=="b") out0(esc(ColorBright)),C=substring(C,1,length(C)); else out0(esc(ColorNoBright)); out0(esc(C)); } function cr() { out("\n"); } function spc(N,C) { var RES=""; if (isUndefined(C)) C=" "; while (N--) RES+=C; return RES; } function indent(N) { while (N--) out(" "); } var OUTINDENT=0; function outIndent() { indent(OUTINDENT); } function outIndentInc(N) { OUTINDENT+=N; } function crIndent() { cr(); outIndent(); } function consoleInputMode(RAW) { if (isUndefined(RAW)) RAW=False; process.stdin.setRawMode(RAW); } function consoleMain(FUNC) { process.stdin.on('data',FUNC); } function consoleRepeat(FUNC,ONCE) { FUNC(); consoleMain(function (KEY) { if (ONCE) process.exit(0); FUNC(); }); } function consoleInit() { ColorBlue=env("TERM")=="cygwin"?"37":"34"; ColorWhite=env("TERM")=="cygwin"?"34":"37"; } function env(VAR) { if (SERVER) return process.env[VAR]; else return ""; } function argvRemove(argv,j) { splice(argv,j,1,[]); } function processCwd() { return fnameNormalize(process.cwd()); } function chdir(PATH) { return process.chdir(PATH); } function spawn(EXE,PARM,OPTIONS,ASYNC) { function from(S,KEEP) { if (S==Nil) return ""; return Buffer.from(S).toString(); } if (ASYNC) return child_process.spawn(EXE,PARM,OPTIONS); else { var RES=child_process.spawnSync(EXE,PARM,OPTIONS); if (RES.stderr==Nil || from(RES.stderr).length>0) { throw new Error(from(RES.stderr)); } return from(RES.stdout); } } function scriptFind(CMD) { if (!fnameIsAbsPath(CMD)) { var PATH; if (isDefined(project.cwp())) PATH=project.cwp().CONF.BIN; if (isDefined(project.JIXPROJ) && (isUndefined(PATH) || !fileExists(PATH+"/"+CMD))) PATH=project.JIXPROJ.CONF.BIN; if (isDefined(PATH) && fileExists(PATH+"/"+CMD)) CMD=PATH+"/"+CMD; } if (!fnameIsAbsPath(CMD)) CMD=Nil; return CMD; } function pythonExe() { var PYTHON=env("PYTHON_HOME"); function ex(FP) { return fileExists(FP+"/python") || fileExists(FP+"/python.exe"); } if (!(isDefined(PYTHON) && ex(PYTHON))) { PYTHON=env("PYTHON_PATH"); if (isDefined(PYTHON)) { var L=splitTrim(PYTHON,";").map(fnameNormalize); PYTHON=Undefined; for (var DIR of L) if (ex(DIR)) { PYTHON=DIR;break; } } } if (isDefined(PYTHON) && ex(PYTHON)) PYTHON+="/python"; else PYTHON=Undefined; return PYTHON; } function python(CMD,PARMS) { CMD=scriptFind(CMD); if (!fnameIsAbsPath(CMD)) error("python::script "+CMD+" not found"); var PYTHON=pythonExe(); if (isUndefined(PYTHON)) error("python not found"); return spawn(PYTHON,[CMD].concat(PARMS)); } var fs,path,url,child_process; if (SERVER) { fs=require('fs'); path=require('path'); url=require('url'); child_process=require('child_process'); } consoleInit(); function setprop(O,NAME,VAL,E,W,C) { if (!isString(NAME)) error("setprop"); if (isUndefined(E)) E=False; if (isUndefined(W)) W=False; if (isUndefined(C)) C=False; Object.defineProperty(O,NAME,{ "value": VAL, "enumerable": E, "writable": W, "configurable": C }); } var getPrototypeOf=Object.getPrototypeOf || function (O) { return O.__proto__; } var setPrototypeOf=Object.setPrototypeOf || function (O,PROTO) { O.__proto__=PROTO; return O; } function hasPrototype(O,P) { O=getPrototypeOf(O); while (O!=Nil) { if (O==P) return True; O=getPrototypeOf(O); } return False; } var SymbolType=Symbol("type"); function _mtypeOf() { var OBJ=this; if (!isNil(this.typeOf)) OBJ=prototype(this); return OBJ[SymbolType]; } function jsprotoCreate(JSPROTO,TYPE,JSPARENT) { var CLASS=Object; if (!isNil(JSPARENT)) CLASS=JSPARENT.constructor; var RES=JSPROTO; if (JSPROTO==Nil) RES=(class extends CLASS {}).prototype; RES[SymbolType]=TYPE; setprop(RES,"typeOf",_mtypeOf); setprop(RES,"init0",function () {},False,True); return RES; } function jsprotoIsAtom(PROTO) { return PROTO==Symbol.prototype || PROTO==Boolean.prototype || PROTO==Number.prototype || PROTO==String.prototype; } function jsprotoInheritsAtom(PROTO) { if (PROTO==Nil) return False; if (jsprotoIsAtom(PROTO)) return True; return jsprotoInheritsAtom(Object.getPrototypeOf(PROTO)); } function _createObject(CONT) { var RES=new this.JSPROTO.constructor(); if (!isUndefined(CONT)) { if (!isContainer(CONT)) error("_createObject"); CONT.store(RES); } RES.init0(); return RES; } function _consObject(JSPROTO,VAL,CONT) { if (!isUndefined(VAL) && constructor(VAL)!=Object && constructor(VAL)!=Array) { if (!isContainer(VAL) || !isUndefined(CONT)) error("_consObject"); CONT=VAL; VAL=Undefined; } var RES=({ "_":_createObject, "JSPROTO":JSPROTO })._(CONT); RES.init(); if (isDefined(VAL)) Object.assign(RES,VAL); return RES; } function _createAtom(VAL,CONT) { var RES=new this.JSPROTO.constructor(VAL); if (!isUndefined(CONT)) CONT.store(RES); RES.init0(); return RES; } function _consAtom(JSPROTO,VAL,CONT) { var RES=({ "_":_createAtom, "JSPROTO":JSPROTO })._(VAL,CONT); RES.init(); return RES; } var TYPEPROTO=jsprotoCreate(Nil,Nil); setprop(TYPEPROTO,"init0",function () { this.NAME=Nil; this.PARENT=Nil; this.JSPROTO=Nil; this.ATTRS=[]; setprop(this,"create",_createObject,False,True); }); var TYPES={}; var type=function (CONS,O) { var PARENT=Nil; if (!isNil(O)) PARENT=O.PARENT; var JSPARENT=Nil; if (PARENT!=Nil) JSPARENT=PARENT.JSPROTO; var JSPROTO=Nil; if (CONS==type) JSPROTO=TYPEPROTO; else if (!isNil(O) && !isNil(O.JSPROTO)) JSPROTO=O.JSPROTO; if (isNil(CONS) || CONS!=type) JSPROTO=jsprotoCreate(JSPROTO,CONS,JSPARENT); var CREATE=jsprotoInheritsAtom(JSPROTO) ?_createAtom :_createObject; if (isNil(CONS)) { CONS=CREATE==_createObject ?function (VAL,CONT) { return _consObject(JSPROTO,VAL,CONT); } :function (VAL,CONT) { return _consAtom(JSPROTO,VAL,CONT); }; } JSPROTO[SymbolType]=CONS; Object.setPrototypeOf(CONS,TYPEPROTO); CONS.init0(); CONS.PARENT=PARENT; CONS.JSPROTO=JSPROTO; if (!isNil(O)) { if (!isNil(O.NAME)) { CONS.NAME=O.NAME; TYPES[O.NAME]=CONS; } CONS.ATTRS=[]; if (!isArray(O.ATTRS)) { if (!isNil(O.ATTRS)) error("type::ATTRS"); } else if (!empty(O.ATTRS)) CONS.setAttrs(O.ATTRS); CONS.NOEVAL={}; for (var N in O) if (N!="NAME" && N!="PARENT" && N!="JSPROTO" && N!="ATTRS") CONS[N]=O[N]; } delete CONS.name; if (!empty(CONS.ATTRS)) { setprop(CONS.JSPROTO,"init0",function () { for (var I=0;I")) this.setv(CONS.ATTRS[I].NAME,VAL0); else if (CONS.ATTRS[I].QUALIF.has("v")) this[CONS.ATTRS[I].NAME]=VAL0; } }, False,True); } setprop(CONS,"create",CREATE,False,True); return CONS; } var obj=type(function (VAL,CONT) { if (!isUndefined(VAL) && constructor(VAL)!=Object) { if (!isContainer(VAL)) { if (constructor(VAL)==Array && isDefined(tree)) return tree(VAL,CONT); } else { if (!isUndefined(CONT)) error("obj.cons"); CONT=VAL; VAL=Undefined; } } var RES=obj.create(CONT); if (isDefined(VAL)) Object.assign(RES,VAL); return RES; }, { "NAME":"obj", "PARENT":Nil, "JSPROTO":Object.prototype, "ATTRS":[] }); type=type(type, { "NAME":"type", "PARENT":obj, "ATTRS":[] }); setprop(type,"create",function () { error("type.create"); }); setprop(type,"getByName",function (NAME) { return TYPES[NAME]; }); function isType(O) { return isa(O,type); } setprop(TYPEPROTO,"setMethod",function (NAME,FUNC) { setprop(this.JSPROTO,NAME,FUNC,False,True); }, False,True); obj.setMethod("init",function () {}); type.setMethod("name",function () { return this.NAME; }); type.setMethod("parent",function () { return this.PARENT; }); type.setMethod("inherits",function (T) { var P=this.parent(); if (!isType(T) || P==Nil) return False; if (P==T) return True; else return P.inherits(T); }); type.setMethod("method",function (NAME) { var FUNC=this.JSPROTO[NAME]; return isFunction(FUNC)?FUNC:Undefined; }); type.setMethod("super",function (NAME) { return this.parent().method(NAME); }); obj.setMethod("super",function (NAME,...PARMS) { var M=typeOf(this).super(NAME); if (isNil(M)) error("super::method "+NAME+" doesn't exists in class "+typeOf(this).parent().name()); return M.apply(this,PARMS); }); obj.setMethod("call",function (METHOD,...PARMS) { return METHOD.apply(this,PARMS); }); var nil=type(function (VAL) { var RES=boxit(VAL); if (!isNil(RES.valueOf())) error("nil"); return RES; }, { "NAME":"nil", "PARENT":obj, "ATTRS":[] }); var BoxedNil=nil.create(),BoxedUndefined=nil.create(); nil.setMethod("valueOf",function () { if (this==BoxedUndefined) return Undefined; if (this==BoxedNil) return Nil; error("nil.valueOf"); }); function isUnboxed(O) { if (O==Nil) return True; return isAtom(O) && O.valueOf()===O; } function isBoxed(O) { if (O==Nil) return False; return !isUnboxed(O); } function boxed(O) { if (O==Nil) return boxit(O); if (isUnboxed(O)) return Object(O); return O; } function boxit(O) { if (isUndefined(O)) return BoxedUndefined; if (eqNil(O)) return BoxedNil; return O; } function typeOf(O) { O=boxit(O); if (!isFunction(O.typeOf)) return obj; return O.typeOf(); } var symb=type(function (S) { return Symbol(S); }, { "NAME":"symb", "PARENT":obj, "JSPROTO":Symbol.prototype, "ATTRS":[] }); var bool=type(function (B,CONT) { return bool.create(B,CONT); }, { "NAME":"bool", "PARENT":obj, "JSPROTO":Boolean.prototype, "ATTRS":[] }); var num=type(function (N,CONT) { return num.create(N,CONT); }, { "NAME":"num", "PARENT":obj, "JSPROTO":Number.prototype, "ATTRS":[] }); var str=type(function (S,CONT) { return str.create(S,CONT); }, { "NAME":"str", "PARENT":obj, "JSPROTO":String.prototype, "ATTRS":[] }); var array=type(function (VAL) { if (isString(VAL)) return explode(VAL); var RES=[]; if (isDefined(VAL)) Object.assign(RES,VAL); return RES; }, { "NAME":"array", "PARENT":obj, "JSPROTO":Array.prototype, "ATTRS":[] }); type.setMethod("isAtom",function (STRICT) { if (STRICT) return this==nil || this==symb || this==bool || this==num || this==str; else return this.isAtom(True) || this.inherits(nil) || this.inherits(symb) || this.inherits(bool) || this.inherits(num) || this.inherits(str); }); type.setMethod("root",function () { if (this.isAtom(True) || this==array) return this; else if (this.parent()==Nil) return obj; else return this.parent().root(); }); var set=type(function (VAL) { if (isUndefined(VAL)) VAL=[]; return set.create(implode(VAL)); }, { "NAME":"set", "PARENT":str, "ATTRS":[], "ELEMS":Undefined }); function isSet(O) { return isa(O,set); } set.setMethod("contains",function (ELTS) { if (!isString(ELTS)) error("set.contains"); ; for (var I=0;I", "l" ]); function isQualif(O) { return isa(O,qualif); } var addr=type(function (NAME,TYPE,QUALIF,VAL0) { if (isUndefined(TYPE) && isUndefined(QUALIF)) return addr.obj(NAME); else { var RES=addr.create(); RES.init(NAME,TYPE,QUALIF,VAL0); return RES; } }, { "NAME":"addr", "PARENT":obj, "ATTRS":[] }); addr.setMethod("init",function (NAME,TYPE,QUALIF,VAL0) { if (isUndefined(TYPE)) TYPE=str; if (isString(QUALIF)) QUALIF=qualif(QUALIF); else if (!isQualif(QUALIF)) error("addr.init"); Object.assign(this,{ "NAME":NAME, "TYPE":TYPE, "QUALIF":QUALIF, "VAL0":VAL0 }); }); setprop(addr,"obj",function (S) { S=trim(S," ",True,True); var A=splitOnce(S," ",["v",Undefined]); var Q=qualif(A[0]); if (Q.inter("vci")=="") Q=Q.union("v"); A=splitOnce(A[1],"=",[Undefined,Undefined]); var VAL0=eval("(function () { return "+A[1]+"; })()"); A=splitOnce(A[0],":",[Undefined,"obj"]); var NAME=A[0],TYPE=type.getByName(A[1]); return addr(NAME,TYPE,Q,VAL0); }); function isAddr(O) { return isa(O,addr); } type.setMethod("attr",function (NAME) { return find(this.ATTRS,function (O) { return O.NAME==NAME; }); }); addr.setMethod("has",function (Q) { return this.QUALIF.has(Q); }); type.setMethod("attrHas",function (NAME,Q) { var A=this.attr(NAME); return isDefined(A) && A.has(Q); }); type.setMethod("setAttr",function (A) { if (isString(A)) A=addr(A); if (!isAddr(A)) error("setAttr"); if (!isNil(this.attr(A.NAME))) error("type.setAttr"); this.ATTRS.push(A); if (A.QUALIF.has("c")) { setprop(this.JSPROTO,A.NAME,A.VAL0,False,True); } }); type.setMethod("attrs",function () { return this.ATTRS; }); type.setMethod("setAttrs",function (L) { for (var I=0;I"); if (isBoxed(VAL) && MODE=="flat" && !PO) error("delete(!PO)::"+N); if (isBoxed(VAL) && (MODE=="full" || PO)) { VAL.delete(MODE); } } this.addFlags("d"); }); setprop(obj,"delete",function (O,MODE) { if (isUnboxed(O)) O.delete(MODE); }); function tree(A,CONT) { if (isAtom(A) || constructor(A)!=Array && !isTemplate(A) || length(A)<1 || !isType(A[0])) return A; var O={}; Object.assign(O,length(A)==1?{}:A[1]); if (constructor(O)!=Object) error("tree(1)"); O.$=[]; for (var I=2;I2) error("tree(2)"); return RES; } var mlstr=type(function (VAL,LANG) { var RES; if (!isString(LANG)) LANG=mlstr.DEFAULT; if (isString(VAL)) { RES=mlstr.create(VAL); } else if (typeOf(VAL)==obj) { if (isString(VAL.LANG)) LANG=VAL.LANG; var VAL0=VAL.$; if (isUndefined(VAL0) && isString(LANG)) VAL0=VAL[LANG]; if (isUndefined(VAL0)) VAL0=""; if (!isString(VAL0)) if (isNumber(VAL0)) VAL0=VAL0.toString(); else error("mlstr(1)"); RES=mlstr.create(VAL0); RES.setAttrs(VAL); delete RES.$; if (isString(LANG)) delete RES[LANG]; } else error("mlstr(2)"); RES.LANG=LANG; return RES; }, { "NAME":"mlstr", "PARENT":str, "ATTRS":[], "LANGS":[], "TRANS":{}, "DEFAULT":"en", "LANG":"en", "VOFWE":True }); function isMLStr(O) { return isa(O,mlstr); } setprop(mlstr,"langs",function () { return mlstr.LANGS; }); setprop(mlstr,"isLang",function (LANG) { return contains(mlstr.LANGS,LANG); }); setprop(mlstr,"addLang",function (LANG) { mlstr.addLangs([LANG]); }); setprop(mlstr,"addLangs",function (L) { for (var LANG of L) if (!mlstr.isLang(LANG)) { mlstr.LANGS.push(LANG); mlstr.TRANS[LANG]={}; } mlstr.LANGS.sort(function (O1,O2) { return O1>O2; }); }); setprop(mlstr,"default",function () { return mlstr.DEFAULT; }); setprop(mlstr,"setDefault",function (LANG) { if (!mlstr.isLang(LANG)) error("mlstr.setDefault"); mlstr.DEFAULT=LANG; }); setprop(mlstr,"lang",function () { return mlstr.LANG; }); setprop(mlstr,"setLang",function (LANG) { if (!isString(LANG)) error("mlstr.setLang"); mlstr.LANG=LANG; }); setprop(mlstr,"vofWE",function () { return mlstr.VOFWE; }); setprop(mlstr,"setVofWE",function (B) { if (!mlstr.isLang(LANG)) error("mlstr.setVofWE"); mlstr.VOFWE=B; }); mlstr.setMethod("toString",function (LANG) { if (isUndefined(LANG)) LANG=mlstr.LANG; if (!isString(LANG)) error("mlstr.toString"); if (LANG==this.LANG || empty(this[LANG]) && mlstr.VOFWE) return this.valueOf(); else return this[LANG]; }); mlstr.setMethod("hasValue",function (S,CINS) { var F=isDefined(CINS)?lcase:function (X) { return X; }; for (var LANG of mlstr.LANGS) if (F(this.toString(LANG))==F(S)) return True; return False; }); setprop(mlstr,"trans",function (S,LANG,LANG2) { if (!mlstr.isLang(LANG)) error("mlstr.trans(1)"); if (isMLStr(S)) { if (isDefined(LANG2)) error("mlstr.trans(2)"); var S2=S.toString(LANG); if (isDefined(S2)) return S2; S=S2; } if (!mlstr.isLang(LANG2)) error("mlstr.trans(3)"); if (LANG==LANG2) return S; S=mlstr.TRANS[LANG][S]; if (isUndefined(S)) return Undefined; return S.toString(LANG2); }); setprop(mlstr,"setTrans",function (S,LANG,S2,LANG2) { if (isMLStr(S)) { if (isDefined(LANG) || isDefined(S2) || isDefined(LANG2)) error("mlstr.setTrans(1)"); for (var LS of mlstr.LANGS) for (var LD of mlstr.LANGS) if (LS!=LD) { var SS=S.toString(LS),SD=S.toString(LD); if (isString(SS) && SS!="" && isString(SD) && SS!="") { mlstr.setTrans(SS,LS,SD,LD); } } } else { if (!isString(S) || !mlstr.isLang(LANG) || !isString(S2) || !mlstr.isLang(LANG2)) error("mlstr.setTrans(2)"); var MS=mlstr.TRANS[LANG][S]; if (isUndefined(MS)) MS=mlstr(S,LANG); if (MS.toString(LANG)!=S) error("mlstr.setTrans(3)"); mlstr.TRANS[LANG][S]=MS; if (LANG2!=LANG) { if (isUndefined(mlstr.TRANS[LANG2][S2])) mlstr.TRANS[LANG2][S2]=MS; MS[LANG2]=S2; } else if (S!=S2) error("mlstr.setTrans(4)"); } }); mlstr.addLangs(["en","sp","de","fr","cn","pt","ar","ru"]); function range(O,MIN,MAX,LI,COL) { return { "OBJ":O,"MIN":MIN,"MAX":MAX,"NAT":Nil,"LI":LI,"COL":COL }; } function rangeBOF(RG) { return RG.MIN==0; } function rangeEOF(RG) { return RG.MIN>=length(RG.OBJ); } function rangeValue(RG) { return substring(RG.OBJ,RG.MIN,RG.MAX); } function strNumberLength(S,i) { var i0=i; while (S[i]=='+' || S[i]=='-') i++; if (!charIsDigit10(S[i])) return 0; var DOT=False, RADIX=10; if (S[i+1]=='b' || S[i+1]=='B') RADIX=2,i+=2; if (S[i+1]=='x' || S[i+1]=='X') RADIX=16,i+=2; if (!charIsDigitInRadix(S[i],RADIX)) return 0; while (i=length(S)) error("lexerReadString"); return i; } function lexerReadUntil(S,i,C1,C2,STRICT) { if (STRICT==Undefined) STRICT=True; while (i=length(S)) error("lexerReadUntil"); return i; } function lexerRead(S,i,N1,N2) { while (i=0 && TOKENIZEQUOTES && !(i>0 && S[i-1]=='\\') && (S[i]=='\"' || charIs("'",CharNatQuote) && S[i]=='\'')) { i0=i; i=lexerReadString(S,i+1,S[i]); BEG=i0,END=i+1; NAT=TokenNatStr; } else if (TOKENIZECOMMENTS && i>=0 && i+1=0 && i+1=length(S)?0:1); NAT=TokenNatComment; } else if (TOKENIZEPYCOMMENTS && i>=0 && i=length(S)?0:1); NAT=TokenNatComment; } else if ((S[i]=='+' || S[i]=='-' || charIsDigit10(S[i])) && strNumberLength(S,i)>0) { BEG=i,END=i+strNumberLength(S,i); NAT=TokenNatNum; } else { var j; j=lexerRead(S,i,charnat(S[i]),charIs(S[i],CharNatAlf)?CharNatDigit:-1); BEG=i,END=j; NAT=charnatToToknat(charnat(S[i])); } if (BEG==-1) error("lexerNext"); RG.MIN=BEG; RG.MAX=END; } else { RG.MIN=RG.MAX=length(S); } RG.NAT=NAT; RG.LI=LI; RG.COL=COL; errlicolSet(LI,COL); S=rangeValue(RG); if (RG.NAT==TokenNatOpn) { function findop(I) { var N=length(S),TOK=S; while (N>0) { TOK=substring(S,I,N); if (TOKOPS[TOK]!=Undefined) break; N--; } return N; } var N=findop(0); if (N>0 && N!=length(S)) RG.MAX=RG.MIN+N; else if (N==0) { for (var I=1;I0) { RG.MAX=RG.MIN+I;break; } } } } return NAT; } function lexerStart(TEXT) { errlicolSet(1,1,licol(TEXT).FNAME); var RG=range(TEXT,0,0,1,1); lexerNext(RG); return RG; } function lexerEOF(RG) { return rangeEOF(RG); } function tokenize(SRC,KEEP) { var RES=[], RG=lexerStart(SRC); while (!lexerEOF(RG)) { if (KEEP || RG.NAT!=TokenNatSpc && RG.NAT!=TokenNatComment) RES.push(licolSet(rangeValue(RG),RG.LI,RG.COL)); lexerNext(RG); } errlicolSet(-1,-1,Nil); return RES; } var PRIOR,POSTFIX,MULTI; function tokenizeStart(TOKSPEC,COMMENTS,PYCOMMENTS) { TOKOPS={}; PRIOR={},POSTFIX={},MULTI={}; var T=splitTrim(TOKSPEC," "), P=-1; for (var I in T) { if (T[I]==";;") P--; else { var OP=T[I],POST=False; for (var I=0;I doesn't exists"); charsInit(); FMT.TOKINIT(); return tokenize(TXT,isDefined(KEEP)); } function txtsave(TXT,N,SEP) { var PREVS="",RES="",I=0; for (var S of TXT) { if (isNumber(N) && I>=N) break; if (isDefined(SEP)) { if (N>0) RES+=SEP; } else if (PREVS!="" && charIsAlpha(PREVS[0]) && S!="" && charIsAlpha(S[0])) RES+=" "; RES+=S; PREVS=S; I++; } return RES; } function save(FPATH,TXT) { if (isArray(TXT)) TXT=txtsave(TXT); fileWrite(FPATH,TXT); } var _SERIALIZING=[], SERIALIZEINDENT=0, SERIALIZING=False, _PRETTYID=0, PRETTYSTRID=0,PRETTYINDENT2=False; var SymbolPrettyId=sy("pretty::+o"),SymbolCont=sy("^$"); function prettyGetId(O) { if (isDefined(O[SymbolPrettyId])) return O[SymbolPrettyId]; if (isFunction(O.getId)) return O.getId(); return "^^"; } function prettyStrId(O) { if (PRETTYSTRID && length(O)>0) return "<"+prettyGetId(O)+">"; else return ""; } function prettyStore(O) { O[SymbolPrettyId]=_PRETTYID++; _SERIALIZING.push(O); } function prettyFreeBufs() { if (isArray(_SERIALIZING)) { for (O in _SERIALIZING) if (isDefined(O[SymbolPrettyId])) delete O[SymbolPrettyId]; } _SERIALIZING=[]; _PRETTYID=0; } function prettyBis(O,MODE,SKIN,INDENT) { if (INDENT==Undefined) INDENT=False; var OSERIALIZING=SERIALIZING; if (isFunction(MODE)) return MODE(O); if (isType(O)) return O.NAME; if (isNil(O)) return "Nil"; if (isUndefined(O)) return "Undef"; if (isBoolean(O)) return O?"True":"False"; if (isNumber(O)) return O.toString(); if (isSymbol(O)) return isUndefined(sy(O))?O.toString():sy(O); if (isString(O)) return '"'+strEscape(O)+'"'; if (isDate(O)) return 'd"'+O.toISOString()+'"'; if (isFunction(O)) return ''; if (contains(_SERIALIZING,O)) return "@"+prettyGetId(O); SERIALIZING=True; var RES=""; if (MODE=="name") { if (isArray(O)) RES="[...]"; else { var NAME=O.NAME; if (!isUndefined(NAME)) RES=NAME; else RES="{...}"; } } else { function incIndent(N) { SERIALIZEINDENT+=N; } if (isArray(O)) { prettyStore(O); RES+=prettyStrId(O)+"["; if (INDENT) incIndent(2); var PREVINDENT2=False; for (var I=0;I5) && !isDate(VAL), ISUP=contains(_SERIALIZING,VAL); if (SA||SV) { if (INDENT) RES+="\n"+spc(SERIALIZEINDENT); if (PRETTYINDENT2 && !INDENT && !ISATOM && !ISUP) { incIndent(+2); if (!PREVINDENT2) RES+="\n"+spc(SERIALIZEINDENT); } FIRST=False; } if (SA) RES+=isSymbol(NAME)?pretty(NAME):NAME; if (SA&&SV) RES+=":"; if (SV) RES+=prettyBis(VAL,MODE2[1],SKIN,contains(MODE2[0],"i")); if (SA||SV) { if (PRETTYINDENT2 && !INDENT && !ISATOM && !ISUP) { if (I+1