-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathmctp.min.js
1 lines (1 loc) · 5.7 KB
/
mctp.min.js
1
(function(){"use strict";$(document).on(":passageinit",()=>{CTP.Logs.forEach((a,b)=>{CTP.Repository.get(b)?.persist||CTP.Logs.delete(b)}),CTP.Repository.forEach(({persist:a},b)=>{a||CTP.Repository.delete(b)})}),window.CTP=class a{constructor(b,c=!1){if(this.stack=[],this.clears=[],this.options={},!b?.trim())throw new Error(`No ID specified!`);this.id=State.temporary.ctp=b,this.persist=c,a.Repository.set(b,this)}static get Options(){return["clear","id","next","t8n","persist","transition","wait","advance","back","redo","append"]}static get Repository(){return setup["@CTP/Repository"]||(setup["@CTP/Repository"]=new Map),setup["@CTP/Repository"]}static get Logs(){return variables()["@CTP/Logs"]||(variables()["@CTP/Logs"]=new Map),variables()["@CTP/Logs"]}get log(){return a.Logs.get(this.id)||a.Logs.set(this.id,{lastClear:-1,index:-1,seen:[]}),a.Logs.get(this.id)}static getCTP(b){return a.Repository.get(b)}static nextArgs(a){const b={},c=["clear","t8n","transition","wait","redo","append"];for(let d=0;d<a.length;d+=1)c.includes(a[d])?b[a[d]]=!0:(b[a[d].replace(/[^a-zA-Z0-9_]/g,"")]=a[d+1],d++);return b.t8n&&(b.transition=!0),b.append&&(b.clear=!1),b}add(a,b={}){return b={...this.options,...b},b.clear&&this.clears.push(this.stack.length),this.stack.push({options:b,content:a,index:this.stack.length,element:$()}),this}print(a){const{content:b,options:c}=this.stack[a],d={...this.options,...c},e=$(document.createElement(d.element||"span")).addClass("--macro-ctp-hidden").attr({"data-macro-ctp-id":this.id,"data-macro-ctp-next-id":d.id,"data-macro-ctp-index":a}).on("update-internal.macro-ctp",(c,f)=>{$(c.target).is(e)&&(a===this.log.index?((f||d.redo)&&(d.redo&&e.empty(),"string"==typeof b?e.wiki(b):e.append(b),e.addClass(d.transition?"--macro-ctp-t8n":"")),d.back&&!d.wait&&0<a&&e.append($(`<button>${d.back}</button>`).addClass("ctp-auto-button").ariaClick(a=>{this.back(),a.stopPropagation()})),d.advance&&!d.wait&&a!==this.stack.length-1&&e.append($(`<button>${d.advance}</button>`).addClass("ctp-auto-button").ariaClick(a=>{this.advance(),a.stopPropagation()})),e.removeClass("--macro-ctp-hidden")):(this.log.seen.includes(a)&&e.removeClass("--macro-ctp-t8n"),e.toggleClass("--macro-ctp-hidden",a>this.log.index||a<this.log.lastClear),e.toggleClass("--macro-ctp-older",a<this.log.index)))});return this.stack[a].element=e,e}output(){const a=document.createDocumentFragment();for(let b=0;b<this.stack.length;b++)this.print(b).appendTo(a);return a}advance(){if(this.stack[this.log.index]&&this.stack[this.log.index].options.next)return this.goto(this.stack[this.log.index].options.next);if(this.log.index<this.stack.length-1){this.log.index++;const a=!this.log.seen.includes(this.log.index);this.log.seen.pushUnique(this.log.index),this.log.lastClear=this.clears.slice().reverse().find(a=>a<=this.log.index)??-1,$(document).trigger("update.macro-ctp",["advance",this.id,this.log.index]),this.stack.forEach(({element:b})=>b.trigger("update-internal.macro-ctp",[a,"advance",this.id,this.log.index]))}return this}goto(a){const b=this.stack.findIndex(b=>b.options.id==a);if(b){console.log("going to index",b),this.log.index=b;const a=!this.log.seen.includes(this.log.index);this.log.seen.pushUnique(this.log.index),this.log.lastClear=this.clears.slice().reverse().find(a=>a<=this.log.index)??-1,$(document).trigger("update.macro-ctp",["goto",this.id,this.log.index]),this.stack.forEach(({element:b})=>b.trigger("update-internal.macro-ctp",[a,"goto",this.id,this.log.index]))}return this}back(){if(0<this.log.index){this.log.index--,this.log.lastClear=this.clears.slice().reverse().find(a=>a<=this.log.index)??-1;const a=!this.log.seen.includes(this.log.index);this.log.seen.pushUnique(this.log.index),$(document).trigger("update.macro-ctp",["back",this.id,this.log.index]),this.stack.forEach(({element:b})=>b.trigger("update-internal.macro-ctp",[a,"back",this.id,this.log.index]))}return this}},Macro.add("ctp",{tags:["ctpNext"],handler(){setup["@CTP/Options"]||(setup["@CTP/Options"]={});const a=CTP.Options.includes(this.args[0])?"main":this.args[0]??"main",b=this.args.slice(1).includes("persist"),c=new CTP(a,b),d=passage();this.payload.forEach(({args:a,name:b,contents:d})=>{const e=CTP.nextArgs(a);"ctp"===b&&(c.options={...setup["@CTP/Options"],...e}),d.trim().length&&c.add(d,e)}),console.log(c),$(this.output).append(c.output()),$(document).one(":passagedisplay",()=>{if(d===passage()){const a=Math.max(c.log.index,0);for(c.log.index=-1,c.log.seen=[];c.log.index<a;)c.advance()}})}}),Macro.add("ctpAdvance",{handler(){const a=1==this.args.length?this.args[0]:"main";if(a){const b=CTP.getCTP(a);if(b)b.advance();else throw new Error(`No CTP with ID '${a}' found!`)}else throw new Error(`No ID specified!`)}}),Macro.add("ctpGoto",{handler(){const a=2==this.args.length?this.args[1]:"main";if(a){const b=CTP.getCTP(a);if(b)b.goto(this.args[0]);else throw new Error(`No CTP with ID '${a}' found!`)}else throw new Error(`No ID specified!`)}}),Macro.add("ctpLink",{handler(){const a=this.args[0],b=this.args[1],c=3==this.args.length?this.args[2]:"main",d=$("<a class='ctp-internal-link'>");d.ariaClick({one:!1},this.createShadowWrapper(()=>{if(c){const a=CTP.getCTP(c);if(a)a.goto(b);else throw new Error(`No CTP with ID '${c}' found!`)}else throw new Error(`No ID specified!`)})).html(a),d.appendTo(this.output)}}),Macro.add("ctpBack",{handler(){const a=1==this.args.length?this.args[0]:"main";if(a){const b=CTP.getCTP(a);if(b)b.back();else throw new Error(`No CTP with ID '${a}' found!`)}else throw new Error(`No ID specified!`)}}),Macro.add("ctpSetNext",{handler(){const a=2==this.args.length?this.args[0]:"main";if(a){const b=CTP.getCTP(a);if(b)b.stack[b.log.index].options.next=this.args[this.args.length-1];else throw new Error(`No CTP with ID '${a}' found!`)}else throw new Error(`No ID specified!`)}})})();