Skip to content

Instantly share code, notes, and snippets.

@chucksupport
Last active January 7, 2019 08:19
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save chucksupport/c51a59a0d94d41baa186891db9833c38 to your computer and use it in GitHub Desktop.
Save chucksupport/c51a59a0d94d41baa186891db9833c38 to your computer and use it in GitHub Desktop.
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