156 lines
5.9 KiB
QML
156 lines
5.9 KiB
QML
import QtQml 2.0
|
|
import QOwnNotesTypes 1.0
|
|
|
|
/**
|
|
* After enabling this script internal QOwnNotes tag data will be lost !!!
|
|
*
|
|
* This script makes QOwnNotes read and write note tags to YAML section before note text.
|
|
* This makes tags compatible with Epsilon Notes app for Android.
|
|
*
|
|
* The YAML section must start at the first line of the note.
|
|
* YAML format for tags is:
|
|
* ---
|
|
* tags: tag1 tag2 multi_word_tag
|
|
* ...
|
|
*/
|
|
|
|
Script {
|
|
/**
|
|
* Handles note tagging for a note
|
|
*
|
|
* This function is called when tags are added to, removed from or renamed in
|
|
* a note or the tags of a note should be listed
|
|
*
|
|
* @param note
|
|
* @param action can be "add", "remove", "rename" or "list"
|
|
* @param tagName tag name to be added, removed or renamed
|
|
* @param newTagName tag name to be renamed to if action = "rename"
|
|
* @return string or string-list (if action = "list")
|
|
*/
|
|
|
|
function noteTaggingHook(note, action, tagName, newTagName) {
|
|
const noteText = note.noteText
|
|
var noteYaml = null
|
|
var tagLine = null
|
|
var yamlTags = []
|
|
|
|
if (noteText.substring(0, 4) == '---\n') {
|
|
var yamlEndIndex = noteText.indexOf('\n...\n')
|
|
|
|
// If there's no proper "..." YAML ending "---" is recognized as one
|
|
if (yamlEndIndex == -1)
|
|
yamlEndIndex = noteText.indexOf('\n---\n')
|
|
|
|
if (yamlEndIndex != -1) {
|
|
noteYaml = noteText.substring(0, yamlEndIndex)
|
|
|
|
const tagLineMatch = noteYaml.match(/^tags:(.*)/m)
|
|
|
|
if (tagLineMatch != null) {
|
|
const tagLineStartIndex = tagLineMatch.index
|
|
const tagLineEndIndex = tagLineStartIndex + tagLineMatch[0].length
|
|
tagLine = tagLineMatch[0]
|
|
yamlTags = tagLineMatch[1].trim().split(' ')
|
|
}
|
|
}
|
|
}
|
|
|
|
switch (action) {
|
|
// adds the tag "tagName" to the note
|
|
// the new note text has to be returned so that the note can be updated
|
|
// returning an empty string indicates that nothing has to be changed
|
|
case 'add':
|
|
tagName = tagName.trim()
|
|
tagName = tagName.replace(/ /g, '_')
|
|
|
|
if (yamlTags.indexOf(tagName) != -1)
|
|
return
|
|
|
|
// For some reason newly created JS/QML arrays contain an empty item
|
|
if (yamlTags[0] == '')
|
|
yamlTags.shift()
|
|
|
|
yamlTags.push(tagName)
|
|
yamlTags.sort()
|
|
|
|
if (noteYaml == null)
|
|
return '---\ntags: ' + tagName + '\n...\n\n' + noteText
|
|
else if (tagLine == null)
|
|
return noteText.substring(0, 4) + 'tags: ' + tagName + '\n' + noteText.substring(4)
|
|
else
|
|
return noteText.substring(0, tagLineStartIndex) +
|
|
'tags: ' + yamlTags.join(' ') + noteText.substring(tagLineEndIndex)
|
|
;
|
|
|
|
// removes the tag "tagName" from the note
|
|
// the new note text has to be returned so that the note can be updated
|
|
// returning an empty string indicates that nothing has to be changed
|
|
case 'remove':
|
|
tagName = tagName.replace(/ /g, '_')
|
|
|
|
if (yamlTags.indexOf(tagName) == -1)
|
|
return
|
|
|
|
yamlTags.splice(yamlTags.indexOf(tagName), 1)
|
|
|
|
return noteText.substring(0, tagLineStartIndex) +
|
|
'tags: ' + yamlTags.join(' ') + noteText.substring(tagLineEndIndex)
|
|
;
|
|
|
|
// renames the tag "tagName" in the note to "newTagName"
|
|
// the new note text has to be returned so that the note can be updated
|
|
// returning an empty string indicates that nothing has to be changed
|
|
case 'rename':
|
|
tagName = tagName.replace(/ /g, '_')
|
|
newTagName = newTagName.replace(/ /g, '_')
|
|
|
|
if (yamlTags.indexOf(tagName) == -1)
|
|
return
|
|
|
|
yamlTags.splice(yamlTags.indexOf(tagName), 1)
|
|
yamlTags.push(newTagName)
|
|
yamlTags.sort()
|
|
|
|
return noteText.substring(0, tagLineStartIndex) +
|
|
'tags: ' + yamlTags.join(' ') + noteText.substring(tagLineEndIndex)
|
|
;
|
|
|
|
// returns a list of all tag names of the note
|
|
case 'list':
|
|
if (yamlTags != null) {
|
|
var tagNameList = []
|
|
yamlTags.forEach(function(tagName, index, array) {
|
|
tagName = tagName.replace(/_/g, ' ')
|
|
if (tagName != '' && tagNameList.indexOf(tagName) == -1)
|
|
tagNameList.push(tagName)
|
|
})
|
|
}
|
|
|
|
return tagNameList
|
|
;
|
|
}
|
|
|
|
return ''
|
|
}
|
|
|
|
// Exclude YAML from note preview
|
|
function noteToMarkdownHtmlHook(note, html) {
|
|
|
|
if (note.noteText.substring(0, 4) == '---\n') {
|
|
|
|
// For ---/nYAML/n.../nNote text
|
|
var yamlEndIndex = html.indexOf('\n...\n')
|
|
|
|
// For ---/nYAML/n.../n/nNote text
|
|
if (yamlEndIndex == -1)
|
|
yamlEndIndex = html.indexOf('\n...</p>')
|
|
|
|
if (yamlEndIndex != -1)
|
|
return html.substring(yamlEndIndex+4)
|
|
|
|
// For ---/nYAML/n---/nNote text
|
|
return html.replace(/\<hr\/\>(\n|.)*?\<h2 id=\"toc_0\"\>(\n|.)*?\<\/h2\>/, '')
|
|
}
|
|
}
|
|
}
|