Files
StudyDiary/.obsidian/plugins/calculite/main.js
T
2026-07-23 20:36:13 +08:00

9 lines
20 KiB
JavaScript

/*
THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
If you want to view the source, please visit the GitHub repository of this plugin:
https://github.com/gfxholo/calculite
*/
var B=Object.defineProperty;var G=Object.getOwnPropertyDescriptor;var z=Object.getOwnPropertyNames;var F=Object.prototype.hasOwnProperty;var U=(h,r)=>{for(var t in r)B(h,t,{get:r[t],enumerable:!0})},Y=(h,r,t,s)=>{if(r&&typeof r=="object"||typeof r=="function")for(let e of z(r))!F.call(h,e)&&e!==t&&B(h,e,{get:()=>r[e],enumerable:!(s=G(r,e))||s.enumerable});return h};var q=h=>Y(B({},"__esModule",{value:!0}),h);var K={};U(K,{default:()=>b});module.exports=q(K);var w=require("obsidian");var p=require("obsidian"),d="calculite",X="Calculite",$="lucide-calculator",m=30,W=new Intl.NumberFormat(localStorage.language),Z=W.format(1e3).toString()[1],g=W.format(.1).toString()[1],j=new RegExp("[^-0-9"+g+"]","g"),I="C",E="CE",y="\u232B",D="0",O="1",R="2",C="3",L="4",M="5",H="6",x="7",N="8",A="9",_=g,k="\xB1",l="+",a="\u2212",u="\xD7",c="\xF7",S="=",T=class extends p.ItemView{constructor(t){super(t);this.previousResult=null;this.previousOperator=null;this.previousInput=null;this.currentResult=null;this.currentOperator=null;this.currentInput=null;this.currentError=null;this.currentClickTarget=null;this.hotkeyButtonMap=new Map;this.currentHotkeyButtonId=null}getViewType(){return d}getDisplayText(){return X}getIcon(){return $}async onOpen(){this.contentEl.empty(),this.contentEl.addClass("calculite"),this.createScreens(),this.createButtons(),this.registerHotkeys(),this.onResize()}getState(){return{previousResult:this.previousResult,previousOperator:this.previousOperator,previousInput:this.previousInput,currentResult:this.currentResult,currentOperator:this.currentOperator,currentInput:this.currentInput,currentError:this.currentError}}setState(t,s){var e,i,n,o,v,f,P,V;return(t===null||typeof t!="object")&&(t={}),this.previousResult=(e=t.previousResult)!=null?e:null,this.previousOperator=(i=t.previousOperator)!=null?i:null,this.previousInput=(n=t.previousInput)!=null?n:null,this.currentResult=(o=t.currentResult)!=null?o:null,this.currentOperator=(v=t.currentOperator)!=null?v:null,this.currentInput=(f=t.currentInput)!=null?f:null,this.currentOperator?this.updateSubscreen([this.currentResult,this.currentOperator]):this.previousOperator?this.updateSubscreen([this.previousResult,this.previousOperator,this.previousInput,"="]):this.previousInput!==null&&this.updateSubscreen([this.previousInput,"="]),this.updateScreen((V=(P=this.currentError)!=null?P:this.currentInput)!=null?V:this.currentResult,this.currentError!==null),super.setState(t,s)}onResize(){let t=Math.min(this.contentEl.clientHeight,this.contentEl.clientWidth*1.618),s=p.Platform.isMobile?35:25,e=Math.max(8,t/s);this.contentEl.style.fontSize=e+"px",this.condenseScreen(this.subscreenEl),this.condenseScreen(this.screenEl)}createScreens(){this.subscreenEl=this.contentEl.createDiv({cls:"calculite-subscreen"}),this.screenEl=this.contentEl.createDiv({cls:"calculite-screen"}),this.updateSubscreen(null),this.updateScreen(null),this.canvasCtx=document.createElement("canvas").getContext("2d");let t=new MutationObserver(s=>{for(let e of s)e.target instanceof HTMLDivElement&&this.condenseScreen(e.target)});t.observe(this.subscreenEl,{childList:!0}),t.observe(this.screenEl,{childList:!0}),this.app.workspace.on("css-change",()=>{this.condenseScreen(this.subscreenEl),this.condenseScreen(this.screenEl)}),this.registerDomEvent(this.containerEl,"copy",s=>{this.getScreenSelection(this.subscreenEl)?this.copyScreen(this.subscreenEl,s):this.copyScreen(this.screenEl,s)}),this.registerDomEvent(this.containerEl,"paste",s=>{this.pasteScreen(s)}),this.registerScreenListeners(this.subscreenEl),this.registerScreenListeners(this.screenEl)}registerScreenListeners(t){this.registerDomEvent(t,"contextmenu",s=>{s.preventDefault();let e=new p.Menu(this.app);e.addItem(i=>i.setTitle(this.getScreenSelection(t)?"Copy selection":"Copy").setIcon("lucide-copy").onClick(()=>this.copyScreen(t))),t===this.screenEl&&e.addItem(i=>i.setTitle("Paste").setIcon("lucide-clipboard-check").onClick(()=>this.pasteScreen())),e.addItem(i=>i.setTitle("Select all").setIcon("lucide-box-select").onClick(()=>this.selectScreen(t))),e.showAtMouseEvent(s)}),this.registerDomEvent(t,"animationend",s=>{switch(s.animationName){case"copied":t.removeClass("calculite-copied");break;case"pasted":t.removeClass("calculite-pasted");break}})}createButtons(){this.contentEl.createEl("button",{cls:"calculite-delete",text:I},t=>{this.registerButtonListeners(t,()=>this.pressClear()),this.hotkeyButtonMap.set(I,t)}),this.contentEl.createEl("button",{cls:"calculite-delete",text:E},t=>{this.registerButtonListeners(t,()=>this.pressClearEntry()),this.hotkeyButtonMap.set(E,t)}),this.contentEl.createEl("button",{cls:"calculite-delete",text:y},t=>{this.registerButtonListeners(t,s=>this.pressBack(s.shiftKey)),this.hotkeyButtonMap.set(y,t)}),this.contentEl.createEl("button",{cls:"calculite-operator",text:c},t=>{this.registerButtonListeners(t,()=>this.pressOperator(c)),this.hotkeyButtonMap.set(c,t)}),this.contentEl.createEl("button",{cls:"calculite-numeric",text:x},t=>{this.registerButtonListeners(t,()=>this.pressDigit(7)),this.hotkeyButtonMap.set(x,t)}),this.contentEl.createEl("button",{cls:"calculite-numeric",text:N},t=>{this.registerButtonListeners(t,()=>this.pressDigit(8)),this.hotkeyButtonMap.set(N,t)}),this.contentEl.createEl("button",{cls:"calculite-numeric",text:A},t=>{this.registerButtonListeners(t,()=>this.pressDigit(9)),this.hotkeyButtonMap.set(A,t)}),this.contentEl.createEl("button",{cls:"calculite-operator",text:u},t=>{this.registerButtonListeners(t,()=>this.pressOperator(u)),this.hotkeyButtonMap.set(u,t)}),this.contentEl.createEl("button",{cls:"calculite-numeric",text:L},t=>{this.registerButtonListeners(t,()=>this.pressDigit(4)),this.hotkeyButtonMap.set(L,t)}),this.contentEl.createEl("button",{cls:"calculite-numeric",text:M},t=>{this.registerButtonListeners(t,()=>this.pressDigit(5)),this.hotkeyButtonMap.set(M,t)}),this.contentEl.createEl("button",{cls:"calculite-numeric",text:H},t=>{this.registerButtonListeners(t,()=>this.pressDigit(6)),this.hotkeyButtonMap.set(H,t)}),this.contentEl.createEl("button",{cls:"calculite-operator",text:a},t=>{this.registerButtonListeners(t,()=>this.pressOperator(a)),this.hotkeyButtonMap.set(a,t)}),this.contentEl.createEl("button",{cls:"calculite-numeric",text:O},t=>{this.registerButtonListeners(t,()=>this.pressDigit(1)),this.hotkeyButtonMap.set(O,t)}),this.contentEl.createEl("button",{cls:"calculite-numeric",text:R},t=>{this.registerButtonListeners(t,()=>this.pressDigit(2)),this.hotkeyButtonMap.set(R,t)}),this.contentEl.createEl("button",{cls:"calculite-numeric",text:C},t=>{this.registerButtonListeners(t,()=>this.pressDigit(3)),this.hotkeyButtonMap.set(C,t)}),this.contentEl.createEl("button",{cls:"calculite-operator",text:l},t=>{this.registerButtonListeners(t,()=>this.pressOperator(l)),this.hotkeyButtonMap.set(l,t)}),this.contentEl.createEl("button",{cls:"calculite-numeric",text:k},t=>{this.registerButtonListeners(t,()=>this.pressNegate()),this.hotkeyButtonMap.set(k,t)}),this.contentEl.createEl("button",{cls:"calculite-numeric",text:D},t=>{this.registerButtonListeners(t,()=>this.pressDigit(0)),this.hotkeyButtonMap.set(D,t)}),this.contentEl.createEl("button",{cls:"calculite-numeric",text:_},t=>{this.registerButtonListeners(t,()=>this.pressDecimal()),this.hotkeyButtonMap.set(_,t)}),this.contentEl.createEl("button",{cls:"calculite-operator",text:S},t=>{this.registerButtonListeners(t,()=>this.pressEquals()),this.hotkeyButtonMap.set(S,t)})}registerButtonListeners(t,s){let e=i=>{this.currentTouchTimerId=window.setInterval(()=>{if(p.Platform.isMobile){let n=this.leaf.parent.containerEl;if(n instanceof HTMLElement&&n.style.transform.includes("translateX")){window.clearTimeout(this.currentTouchTimerId);return}}window.navigator.vibrate(100),s(i)!==!0&&window.clearTimeout(this.currentTouchTimerId)},50)};this.registerDomEvent(t,"pointerdown",i=>{i.pointerType==="mouse"?this.currentClickTarget=i.target:i.pointerType==="touch"&&(window.navigator.vibrate(100),window.clearTimeout(this.currentTouchTimerId),s(i)===!0&&(this.currentTouchTimerId=window.setTimeout(()=>e(i),300)))}),this.registerDomEvent(t,"pointerup",i=>{i.pointerType==="mouse"&&i.target===this.currentClickTarget?(s(i),this.currentClickTarget=null):i.pointerType==="touch"&&window.clearTimeout(this.currentTouchTimerId)}),this.registerDomEvent(t,"touchend",()=>{window.clearTimeout(this.currentTouchTimerId)}),this.registerDomEvent(t,"touchcancel",()=>{window.clearTimeout(this.currentTouchTimerId)})}registerHotkeys(){this.scope=new p.Scope(this.app.scope),this.scope.register([],"C",()=>{this.pressClear(),this.flashHotkeyButton(I)}),this.scope.register([],"Escape",()=>{this.pressClear(),this.flashHotkeyButton(I)}),this.scope.register([],"Delete",()=>{this.pressClearEntry(),this.flashHotkeyButton(E)}),this.scope.register([],"Backspace",()=>{this.pressBack(),this.flashHotkeyButton(y)}),this.scope.register([],"0",()=>{this.pressDigit(0),this.flashHotkeyButton(D)}),this.scope.register([],"1",()=>{this.pressDigit(1),this.flashHotkeyButton(O)}),this.scope.register([],"2",()=>{this.pressDigit(2),this.flashHotkeyButton(R)}),this.scope.register([],"3",()=>{this.pressDigit(3),this.flashHotkeyButton(C)}),this.scope.register([],"4",()=>{this.pressDigit(4),this.flashHotkeyButton(L)}),this.scope.register([],"5",()=>{this.pressDigit(5),this.flashHotkeyButton(M)}),this.scope.register([],"6",()=>{this.pressDigit(6),this.flashHotkeyButton(H)}),this.scope.register([],"7",()=>{this.pressDigit(7),this.flashHotkeyButton(x)}),this.scope.register([],"8",()=>{this.pressDigit(8),this.flashHotkeyButton(N)}),this.scope.register([],"9",()=>{this.pressDigit(9),this.flashHotkeyButton(A)}),this.scope.register([],g,()=>{this.pressDecimal(),this.flashHotkeyButton(_)}),this.scope.register([],"F9",()=>{this.pressNegate(),this.flashHotkeyButton(k)}),this.scope.register(null,"+",()=>{this.pressOperator(l),this.flashHotkeyButton(l)}),this.scope.register(null,"-",()=>{this.pressOperator(a),this.flashHotkeyButton(a)}),this.scope.register(null,"*",()=>{this.pressOperator(u),this.flashHotkeyButton(u)}),this.scope.register(null,"/",()=>{this.pressOperator(c),this.flashHotkeyButton(c)}),this.scope.register(null,"=",()=>{this.pressEquals(),this.flashHotkeyButton(S)}),this.scope.register([],"P",()=>{this.pressOperator(l),this.flashHotkeyButton(l)}),this.scope.register([],"O",()=>{this.pressOperator(a),this.flashHotkeyButton(a)}),this.scope.register([],"X",()=>{this.pressOperator(u),this.flashHotkeyButton(u)}),this.scope.register([],"T",()=>{this.pressOperator(u),this.flashHotkeyButton(u)}),this.scope.register([],"Y",()=>{this.pressOperator(c),this.flashHotkeyButton(c)}),this.scope.register([],"Enter",()=>{this.pressEquals(),this.flashHotkeyButton(S)}),this.scope.register(["Shift"],"Escape",()=>{this.pressClearEntry(),this.flashHotkeyButton(E)}),this.scope.register(["Shift"],"Backspace",()=>{this.pressBack(!0),this.flashHotkeyButton(y)}),this.scope.register(["Alt"],"-",()=>{this.pressNegate(),this.flashHotkeyButton(k)})}flashHotkeyButton(t){if(this.currentHotkeyTimerId&&(window.clearTimeout(this.currentHotkeyTimerId),this.currentHotkeyTimerId=void 0,this.currentHotkeyButtonId&&this.currentHotkeyButtonId!==t)){let e=this.hotkeyButtonMap.get(this.currentHotkeyButtonId);e==null||e.removeClass("calculite-hotkey-pressed")}let s=this.hotkeyButtonMap.get(t);s==null||s.addClass("calculite-hotkey-pressed"),this.currentHotkeyButtonId=t,this.currentHotkeyTimerId=window.setTimeout(()=>{s==null||s.removeClass("calculite-hotkey-pressed"),this.currentHotkeyTimerId=void 0},150)}pressClear(){this.previousResult=null,this.previousOperator=null,this.previousInput=null,this.currentResult=null,this.currentOperator=null,this.currentInput=null,this.currentError=null,this.updateSubscreen(null),this.updateScreen(this.currentInput)}pressClearEntry(){if(!this.currentOperator){this.pressClear();return}this.currentInput=null,this.updateScreen(this.currentInput)}pressBack(t){return this.currentError?(this.pressClear(),!1):this.currentInput?(this.currentInput=t?this.currentInput.slice(1):this.currentInput.slice(0,-1),(!this.currentInput||this.currentInput==="-")&&(this.currentInput=null),this.updateScreen(this.currentInput),this.currentInput!==null):!1}pressDigit(t){if(!this.currentInput)this.currentOperator||this.pressClear(),this.currentInput=String(t);else{if(this.countDigits(this.currentInput)>=m)return!1;(this.currentInput==="0"||this.currentInput==="-0")&&(this.currentInput=this.currentInput.slice(0,-1)),this.currentInput+=t}return this.updateScreen(this.currentInput),this.countDigits(this.currentInput)<m}pressDecimal(){this.currentInput?this.currentInput.includes(".")||(this.currentInput+="."):(this.currentOperator||this.pressClear(),this.currentInput="0."),this.updateScreen(this.currentInput)}pressNegate(){this.currentError&&this.pressClear();let t;this.currentInput?(this.currentInput.startsWith("-")?this.currentInput=this.currentInput.slice(1):this.currentInput="-"+this.currentInput,t=this.currentInput):this.currentResult!==null&&!this.currentOperator?(this.currentResult=-this.currentResult,t=String(this.currentResult)):(this.currentInput="-0",t=this.currentInput),this.updateScreen(t)}pressOperator(t){this.currentError||(this.previousResult=this.currentResult,this.currentInput?this.currentOperator?this.currentResult=this.calculate(this.currentResult,this.currentOperator,Number(this.currentInput)):this.currentResult=Number(this.currentInput):this.currentResult===null&&(this.currentResult=0),this.previousInput=Number(this.currentInput),this.currentOperator&&(this.previousOperator=this.currentOperator),!(this.isDividingByZero()||this.isTooSmall()||this.isTooLarge())&&(this.currentInput=null,this.currentOperator=t,this.updateSubscreen([this.currentResult,this.currentOperator]),this.updateScreen(this.currentResult)))}pressEquals(){var o;if(this.currentError||(this.previousResult=this.currentResult,this.currentOperator?((o=this.currentInput)!=null||(this.currentInput=String(this.previousResult)),this.currentResult=this.calculate(this.previousResult,this.currentOperator,Number(this.currentInput))):this.currentInput?this.currentResult=Number(this.currentInput):this.previousInput&&this.previousOperator?this.currentResult=this.calculate(this.previousResult,this.previousOperator,this.previousInput):this.currentResult===null&&(this.currentInput="0",this.currentResult=0),(this.currentInput||this.currentOperator)&&(this.previousInput=Number(this.currentInput),this.previousOperator=this.currentOperator),this.isDividingByZero()||this.isTooSmall()||this.isTooLarge()))return!1;this.currentOperator=null,this.currentInput=null,this.previousOperator?this.updateSubscreen([this.previousResult,this.previousOperator,this.previousInput,"="]):this.updateSubscreen([this.previousInput,"="]),this.updateScreen(this.currentResult);let t=this.previousResult===0,s=this.previousInput===0,e=this.previousInput===1,i=this.previousOperator===l||this.previousOperator===a,n=this.previousOperator===u||this.previousOperator===c;return i&&!s||n&&!t&&!s&&!e}calculate(t,s,e){switch(t!=null||(t=0),e!=null||(e=0),s){case l:return t+e;case a:return t-e;case u:return t*e;case c:return t/e;default:return 0}}isDividingByZero(){if(this.currentOperator===c&&this.currentInput&&Number(this.currentInput)===0){let t=[this.previousResult,this.previousOperator,this.previousInput,"="];return this.pressClear(),this.updateSubscreen(t),this.currentError="Cannot divide by zero",this.updateScreen(this.currentError,!0),!0}else return!1}isTooSmall(){if(this.currentResult!==0)return!1;let t=this.previousResult!==0&&Number(this.previousInput)!==0,s=this.previousOperator===u||this.previousOperator===c;if(t&&s){let e=[this.previousResult,this.previousOperator,this.previousInput,"="];return this.pressClear(),this.updateSubscreen(e),this.currentError="Number too small",this.updateScreen(this.currentError,!0),!0}else return!1}isTooLarge(){if(this.currentResult!==null&&Math.abs(this.currentResult)>Number.MAX_VALUE){let t=[this.previousResult,this.previousOperator,this.previousInput,"="];return this.pressClear(),this.updateSubscreen(t),this.currentError="Number too large",this.updateScreen(this.currentError,!0),!0}else return!1}updateSubscreen(t){let s;t===null?s="0":s=t.join(" ").replace(/\./g,g).replace(/-/g,"\u2212").replace("*","\xD7").replace("/","\xF7"),this.subscreenEl.setText(s),this.subscreenEl.toggleClass("calculite-invisible",t===null),this.app.workspace.requestSaveLayout()}updateScreen(t,s=!1){if(s)t=String(t);else if(t===null)t="0";else if(t=String(t).replace("-","\u2212").replace(".",g),!t.includes("e")){let e=t.startsWith("\u2212")?1:0,i=t.includes(g)?t.indexOf(g):t.length;for(let n=i-3;n>e;n-=3)t=t.slice(0,n)+Z+t.slice(n)}this.screenEl.setText(t),this.screenEl.toggleClass("calculite-error",s),this.app.workspace.requestSaveLayout()}condenseScreen(t){if(!this.canvasCtx||t.hasClass("calculite-blank"))return;t.removeAttribute("style");let{fontWeight:s,fontSize:e,fontFamily:i}=getComputedStyle(t);this.canvasCtx.font=`${s} ${e} ${i}`;let o=this.canvasCtx.measureText(t.getText()).width/t.clientWidth;o>1&&t.style.setProperty("transform",`scaleX(${1/o})`)}copyScreen(t,s){var n;s==null||s.preventDefault();let e=this.getScreenSelection(t),i=(n=e==null?void 0:e.toString())!=null?n:t.getText();navigator.clipboard.writeText(i),t.addClass("calculite-copied")}async pasteScreen(t){t==null||t.preventDefault(),this.currentOperator===null&&this.pressClear();let e=(await navigator.clipboard.readText()).replace(j,"")||"NaN",i=Number(e);Number.isFinite(i)?this.countDigits(e)>m?(this.currentInput=null,this.updateScreen(`Maximum of ${m} digits`,!0)):(this.currentInput=e,this.updateScreen(this.currentInput)):(this.currentInput=null,this.updateScreen("Invalid number",!0)),this.screenEl.addClass("calculite-pasted")}selectScreen(t){var n;let s=(n=window.activeDocument)!=null?n:document,e=s.getSelection(),i=s.createRange();i.selectNode(t),e==null||e.removeAllRanges(),e==null||e.addRange(i)}getScreenSelection(t){var n,o;let e=((n=window.activeDocument)!=null?n:document).getSelection(),i=(o=t.firstChild)!=null?o:t;return e!=null&&e.containsNode(i)?e:null}countDigits(t){var e;return((e=t.match(/\d/g))!=null?e:[]).length}};var b=class extends w.Plugin{async onload(){this.registerView(d,r=>new T(r)),this.addRibbonIcon("calculator","Show calculator",()=>this.showCalculator()),this.addCommand({id:"show-calculator",name:"Show calculator",callback:()=>this.showCalculator()}),this.addCommand({id:"toggle-between-sidebars",name:"Toggle between sidebars",callback:()=>this.toggleBetweenSidebars()}),w.Platform.isDesktopApp&&window.activeWindow&&this.addCommand({id:"toggle-floating-calculator",name:"Toggle floating calculator",callback:()=>this.toggleFloatingCalculator()})}showCalculator(){var t;let r=(t=this.app.workspace.getLeavesOfType(d).first())!=null?t:null;r||(r=this.app.workspace.getRightLeaf(!0),r==null||r.setViewState({type:d})),r&&this.app.workspace.revealLeaf(r)}toggleBetweenSidebars(){var t;let r=(t=this.app.workspace.getLeavesOfType(d).first())!=null?t:null;if(!r)r=this.app.workspace.getRightLeaf(!0),r==null||r.setViewState({type:d});else{let s=r.getViewState(),e=(r==null?void 0:r.getRoot())===this.app.workspace.leftSplit.getRoot();r.detach(),r=e?this.app.workspace.getRightLeaf(!0):this.app.workspace.getLeftLeaf(!0),r==null||r.setViewState(s)}r&&this.app.workspace.revealLeaf(r)}toggleFloatingCalculator(){var v;let r=(v=this.app.workspace.getLeavesOfType(d).first())!=null?v:null,t=(r==null?void 0:r.getContainer())===this.app.workspace.rootSplit.getContainer();if(!r)r=this.app.workspace.openPopoutLeaf(),r.setViewState({type:d});else if(t)this.app.workspace.moveLeafToPopout(r);else{let f=r.getViewState();r.detach(),r=this.app.workspace.getRightLeaf(!0),r==null||r.setViewState(f);return}let s=r.getContainer().win,{electronWindow:e}=s,{documentElement:i}=s.document,n=247,o=400;s.resizeTo(n,o),s.moveTo(window.innerWidth/1.5-n/2,window.innerHeight/2-o/2),e.setAlwaysOnTop(!0),e.setMinimizable(!1),e.setMaximizable(!1),e.setFullScreenable(!1),i.addClass("calculite-floating")}onUserEnable(){this.showCalculator()}};
/* nosourcemap */