Added a function to calculate math on notes

This commit is contained in:
Max G 2020-02-19 00:31:18 +00:00
parent aded72928c
commit 7fe702cb1b

View File

@ -158,12 +158,18 @@
Uncheck all Checked items Uncheck all Checked items
</div> </div>
</div> </div>
<div class="sixteen wide column"> <div class="eight wide column">
<div class="ui labeled icon fluid basic button" v-on:click="undoCustom"> <div class="ui labeled icon fluid basic button" v-on:click="undoCustom">
<i class="undo icon"></i> <i class="undo icon"></i>
Undo last change Undo last change
</div> </div>
</div> </div>
<div class="eight wide column">
<div class="ui labeled icon fluid basic button" v-on:click="calculateMath" data-tooltip="Calculates algebra before '='">
<i class="calculator icon"></i>
Simple Math
</div>
</div>
<div class="sixteen wide column" v-if="rawTextId > 0"> <div class="sixteen wide column" v-if="rawTextId > 0">
<share-note-component <share-note-component
:note-id="noteid" :note-id="noteid"
@ -561,6 +567,57 @@
} }
}) })
}, },
calculateMath(){
//
// Find math in note and calculate the outcome
//
//Close menu if user is on mobile, then sort list
if(this.$store.getters.getIsUserOnMobile){
this.showNoteOptions = false
}
//Fetch the container
let container = document.getElementById('squire-id')
// simple function that trys to evaluate javascript
const shittyMath = (string) => {
try {
return Function('"use strict"; return (' + string + ')')();
} catch (error) {
console.log('Math Error: ', string)
return null
}
}
//Go through each item, on first level, look for Unordered Lists
container.childNodes.forEach( (node) => {
const line = node.innerText.trim()
// = sign exists and its the last character in the string
let equalLocation = line.indexOf('=')
if(equalLocation != -1 && (line.length-1) == equalLocation ){
//Pull out everything before the formula and try to evaluate it
const formula = line.split('=').shift()
const output = shittyMath(formula)
//If its a number and didn't throw an error, update the line
if(!isNaN(output) && output != null){
//Since there is HTML in the line, splice in the number after the = sign
let newLine = node.innerHTML.slice(0, equalLocation+1).trim()
newLine += ` ${output}`
newLine += node.innerHTML.slice(equalLocation+1).trim()
//Slam in that new HTML with the output
node.innerHTML = newLine
}
}
})
},
setText(inText){ setText(inText){
this.editor.setHTML(inText) this.editor.setHTML(inText)