"Drafts Directory: Process Template"


// See online documentation for examples // https://docs.getdrafts.com/docs/actions/scripting var text = editor.getText() var unNamedKeys = [] var allKeys = [] // MARK: Apply Template var matches = text.match(/«.+?»/g) function applyTemplate() { if(matches) { const result = evaluateValues() if (!result) { return false } replaceValues(result) } processTemplate() } // Mark: Create Draft function createDraft(results) { var d = new Draft() d.content = d.processTemplate(results['content'] ?? '') d.isFlagged = results['flagged'] ?? false results['tags'].split(',').forEach(newTag => { d.addTag(newTag.trim()) }) d.isArchived = results['archived'] ?? false d.update() } // Mark: Crate Conent function createContent(title, content) { const newTitle = '# ' + title let newContent = [] if(content != undefined) { content.split('\n').forEach(newLine => { newContent.push(newLine.trim()) }) } return newTitle + '\n' + newContent.join('\n') } // Mark: Process Template function processTemplate() { const templateRegex = /(.*):\s(@[\w].*[\w\)] ?)(?:\{([\s\S]+?)\})?/g let draftMatch while(draftMatch = templateRegex.exec(text)) { let results = decodeTags(draftMatch[2]) results['content'] = createContent(draftMatch[1], draftMatch[3]) createDraft(results) } } // Mark: Process Tags function decodeTags(stringed) { const tagRegex = /@(\w*)(?:\(([\s\S]+?)\))?/g const tagMatches = stringed.match(tagRegex) var thisTagMatch var results = {} while(thisTagMatch = tagRegex.exec(stringed)) { const thisTagKey = thisTagMatch[1] const thisTagValue = thisTagMatch[2] results[thisTagKey] = thisTagValue ?? true } return results } // Mark: Evaluate Values function evaluateValues() { const matches = askValues() if(!matches) { return false } const matchedValues = Object.values(matches) if(unNamedKeys.length != 0) { app.displayWarningMessage('Please fill All the Values or Cancel the Operation') evaluateValues() } return matches } // MARK: Replace values function replaceValues(matches) { allKeys.forEach(key => { text = text.replaceAll(key, matches[key]) }) } // MARK: Create Prompt and Add Values function askValues() { matches.forEach(match => { if (!unNamedKeys.includes(match)) { unNamedKeys.push(match) } }) allKeys = unNamedKeys var result = readFromTemplate() if(unNamedKeys == '') { return result } var p = new Prompt() p.title = "Add Values" p.message = "Chage the default values to something" unNamedKeys.forEach(value => { p.addTextField(value, value, "") }) p.addButton("Confirm") if(p.show()) { unNamedKeys.forEach(value => { const writtenValue = p.fieldValues[value].trim() if (writtenValue == '') { return } result[value] = writtenValue let index = unNamedKeys.indexOf(value) unNamedKeys = unNamedKeys.splice(index, 0) }) return result } else { return false } } // Mark: Read from Template Tag function readFromTemplate() { let result = {} unNamedKeys.forEach(value => { let newValue = value.replaceAll('«', '').replaceAll('»', '') let taggedValue = draft.getTemplateTag(newValue) if(taggedValue != '') { result[value] = taggedValue let index = unNamedKeys.indexOf(value) unNamedKeys = unNamedKeys.splice(index, 0) } }) return result } function callError(message) { app.displayErrorMessage(message) } applyTemplate()

-"Drafts Directory: Process Template"