Last active
January 7, 2019 08:19
-
-
Save chucksupport/c51a59a0d94d41baa186891db9833c38 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
function onInstall(e) { | |
onOpen(e); | |
} | |
function onOpen(e) { | |
DocumentApp.getUi().createAddonMenu() | |
.addItem('Add Rules', 'showSidebar') | |
.addToUi(); | |
currentSet("Default"); | |
} | |
function showSidebar() { | |
var ui = HtmlService.createTemplateFromFile('Sidebar').evaluate(); | |
ui.setSandboxMode(HtmlService.SandboxMode.IFRAME); | |
ui.setTitle('Conditional Text Highlighter Pro'); | |
DocumentApp.getUi().showSidebar(ui); | |
} | |
function currentSet(setName) { | |
// Load the current saved set | |
var currentSet = PropertiesService.getUserProperties().getProperty("currentSet"); | |
if (currentSet) { | |
return PropertiesService.getUserProperties().setProperty("currentSet", setName); | |
} else { | |
return PropertiesService.getUserProperties().setProperty("currentSet", "Default"); | |
} | |
} | |
function clearHighlights() { | |
var body = DocumentApp.getActiveDocument().getBody(); | |
var text = body.editAsText(); | |
if (text.getText().length != 0) { | |
text.setBackgroundColor(0, text.getText().length - 1, '#FFFFFF') | |
} else { | |
DocumentApp.getUi().alert('There is nothing to clear'); | |
} | |
} | |
function resetRules() { | |
PropertiesService.getDocumentProperties().deleteAllProperties(); | |
return PropertiesService.getDocumentProperties().setProperty("currentSet", "Default"); | |
} | |
function deleteRule(n) { | |
var docProps = PropertiesService.getDocumentProperties(); | |
var ruleSetName = docProps.getProperty("currentSet"); | |
var set = JSON.parse(docProps.getProperty(ruleSetName)); | |
set.rules.textArray.splice(n, 1); | |
set.rules.colorArray.splice(n, 1); | |
var setStringify = JSON.stringify(set); | |
docProps.setProperty(ruleSetName, setStringify); | |
} | |
function addRules(text, color) { | |
var docProps = PropertiesService.getDocumentProperties(); | |
var ruleSetName = docProps.getProperty("currentSet"); | |
var set = JSON.parse(docProps.getProperty(ruleSetName)); | |
if (!set) { | |
set = { | |
"rules": { | |
"textArray": [], | |
"colorArray": [] | |
} | |
} | |
} | |
if (set.rules.textArray.length == set.rules.colorArray.length) | |
set.rules.textArray.push(text); | |
set.rules.colorArray.push(color); | |
var objString = JSON.stringify(set); | |
docProps.setProperty(ruleSetName, objString); | |
} | |
function highlightText() { | |
var docProps = PropertiesService.getDocumentProperties(); | |
var ruleSetName = docProps.getProperty("currentSet"); | |
var set = JSON.parse(docProps.getProperty(ruleSetName)); | |
if (set) { | |
for (var rule in set.rules.textArray) { | |
var text = escapeRegExp(set.rules.textArray[rule]); | |
var background = set.rules.colorArray[rule]; | |
Logger.log(set.rules.colorArray[rule]); | |
var bodyElement = DocumentApp.getActiveDocument().getBody().editAsText(); | |
var searchResult = bodyElement.findText(text); | |
while (searchResult !== null) { | |
var thisElement = searchResult.getElement(); | |
var thisElementText = thisElement.asText(); | |
thisElementText.setBackgroundColor(searchResult.getStartOffset(), searchResult.getEndOffsetInclusive(), background); | |
searchResult = bodyElement.findText(text, searchResult); | |
} | |
} | |
} | |
} | |
function escapeRegExp(str) { | |
return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&"); | |
} | |
function showRules() { | |
var docProps = PropertiesService.getDocumentProperties(); | |
var currentSet = docProps.getProperty("currentSet"); | |
var set = JSON.parse(docProps.getProperty(currentSet)); | |
var display = "<div class='rules'><h3><b>Active Rules</b></h3></div><div class='table'><table><tr><th></th><th><b>Text</b></th><th><b>Color</b></th></tr>"; | |
if (set) { | |
for (var i in set.rules.textArray) { | |
display += "<tr>"; | |
display += "<td><a id='delete' onclick='deleteRule(" + i + ")' class='deleteIcon' name='delete' title='Delete rule' href='#'>X</a></td><td class='textcell'> " + set.rules.textArray[i] + "</td> <td class='colorcell' style='background-color:" + set.rules.colorArray[i] + "'>" + set.rules.colorArray[i] + "</td>"; | |
} | |
} else { | |
display = "<div style='margin-top:5px;'><h1><center>Create a rule!</center></h1></div>"; | |
} | |
display += "</tr></table></div>"; | |
var output = HtmlService.createHtmlOutput(display); | |
return output.getContent(); | |
} | |
//-----Saved and Load Rule Sets----------// | |
function saveRules() { | |
var ui = DocumentApp.getUi(); | |
var docProps = PropertiesService.getDocumentProperties(); | |
var userProps = PropertiesService.getUserProperties(); | |
var currentSet = docProps.getProperty("currentSet"); | |
var response = ui.prompt('Give this rule set a name', ui.ButtonSet.OK_CANCEL) | |
var setName; | |
var rules = docProps.getProperty(currentSet); | |
if (response.getSelectedButton() == ui.Button.OK) { | |
setName = response.getResponseText(); | |
userProps.setProperty(setName, rules); | |
} | |
} | |
function loadRules() { | |
var userProps = PropertiesService.getUserProperties(); | |
var docProps = PropertiesService.getDocumentProperties(); | |
var currentSet = docProps.getProperty("currentSet"); | |
var set = JSON.parse(docProps.getProperty(currentSet)); | |
var savedSets = userProps.getKeys(); | |
var currentSetIndex = savedSets.indexOf("currentSet"); | |
var removeLast = savedSets.splice(currentSetIndex, 1); | |
var display = "<div class='rules'><h3><b>Saved Sets</b></h3></div><div class='table'><table><tr><th></th><th><b>Name of Set</b></th></tr>"; | |
if (set) { | |
for (var i = 0; i < savedSets.length; i++) { | |
display += "<tr>"; | |
display += "<td><a id='delete' onclick='deleteSet(\"" + savedSets[i] + "\")' class='deleteIcon' name='delete' title='Delete set' href='#'>X</a></td><td class='textcell'> " + savedSets[i] + "</td><td class='buttoncell'><button class='grey' onclick='loadSet(\"" + savedSets[i] + "\")'>Load Set</button></td>"; | |
} | |
} else { | |
display = "<div style='margin-top:5px;'><h1><center>No saved sets exist!</center></h1></div>"; | |
} | |
display += "</tr></table></div>"; | |
var output = HtmlService.createHtmlOutput(display); | |
return output.getContent(); | |
} | |
function deleteSet(setName) { | |
return PropertiesService.getUserProperties().deleteProperty(setName); | |
} | |
function loadSet(setName) { | |
currentSet(setName); | |
showRules(); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment