diff --git a/in-note-text-tagging/in-note-text-tagging.qml b/in-note-text-tagging/in-note-text-tagging.qml
index a1dd244..765cba8 100644
--- a/in-note-text-tagging/in-note-text-tagging.qml
+++ b/in-note-text-tagging/in-note-text-tagging.qml
@@ -6,8 +6,11 @@ import QOwnNotesTypes 1.0
* @tag1 @tag2 @tag3
* @tag_one would tag the note with "tag one" tag.
*/
+
Script {
property string tagMarker
+ property bool putToBeginning
+ property string tagHighlightColor
property variant settingsVariables: [
{
@@ -16,7 +19,21 @@ Script {
"description": "A word that starts with this characters is recognized as tag",
"type": "string",
"default": "@",
- }
+ },
+ {
+ "identifier": "putToBeginning",
+ "name": "Put tags to beginning of note rather than to end",
+ "description": "If enabled tags, added by UI, will be put to the first line of note or right after top headline",
+ "type": "boolean",
+ "default": "false",
+ },
+ {
+ "identifier": "tagHighlightColor",
+ "name": "The color for tag highlighting in note preview",
+ "description": "Put a color name or a supported color code here. Leave empty to disable tag highlighting in preview.",
+ "type": "string",
+ "default": "purple",
+ },
]
/**
@@ -33,7 +50,7 @@ Script {
*/
function noteTaggingHook(note, action, tagName, newTagName) {
var noteText = note.noteText;
- var tagRegExp = RegExp("\\B%1(?=($|\\s|\\b))".arg(escapeRegExp(tagMarker + tagName).replace(/ /g, "_")));
+ var tagRegExp = RegExp("\\B%1(?=($|\\s|\\b)) ?".arg(escapeRegExp(tagMarker + tagName).replace(/ /g, "_")));
switch (action) {
// adds the tag "tagName" to the note
@@ -44,27 +61,63 @@ Script {
if (noteText.search(tagRegExp) > 0) {
return "";
}
+
+ const tag = tagMarker + tagName.replace(/ /g, "_");
+
+ // add the tag to the beginning or to the end of the note
+ if (putToBeginning) {
+
+ // make an array of up to 3 first lines and other text as last item
+ var textLines = [];
+ for (var lineCount = 0, lineStart = 0, lineEnd = 0; lineCount != 3; lineCount++) {
+ lineEnd = noteText.indexOf("\n", lineStart + 1);
- // add the tag at the end of the note
- noteText += "\n" + tagMarker + tagName.replace(/ /g, "_");
+ if (lineEnd == -1)
+ continue;
+
+ textLines.push(noteText.substring(lineStart, lineEnd));
+ lineStart = lineEnd;
+ }
+
+ textLines.push(noteText.substring(lineStart));
+
+ // if line after headline is a line for tags add tag there,
+ // or make a new line for tags after headline
+ function appendTag(text, tag, prepend) {
+ if (text.substring(0, tagMarker.length) == tagMarker ||
+ text.substring(1, tagMarker.length + 1) == tagMarker)
+ return text + " " + tag;
+ else
+ return prepend + tag + "\n" + text;
+ }
+
+ // use different tag line number depending on a headline type
+ if (textLines[0].substring(0, 1) == "#")
+ textLines[1] = appendTag(textLines[1], tag, "\n");
+ else if (textLines[1].search(/=+/) != -1)
+ textLines[2] = appendTag(textLines[2], tag, "\n");
+ else
+ textLines[0] = appendTag(textLines[0], tag, "");
+
+ noteText = textLines.join("");
+ }
+
+ else
+ noteText += "\n" + tag;
+
return noteText;
- break;
// 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":
- noteText = noteText.replace(tagRegExp, "");
- return noteText;
- break;
+ return noteText.replace(tagRegExp, "");
// 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":
- noteText = noteText.replace(tagRegExp, tagMarker + newTagName.replace(/ /g, "_"));
- return noteText;
- break;
+ return noteText.replace(tagRegExp, tagMarker + newTagName.replace(/ /g, "_"));
// returns a list of all tag names of the note
case "list":
@@ -72,7 +125,7 @@ Script {
result, tagNameList = [];
while ((result = re.exec(noteText)) !== null) {
- var tagName = result[1].replace(/_/g, " ");
+ tagName = result[1].replace(/_/g, " ");
// add the tag if it wasn't in the list
if (tagNameList.indexOf(tagName) == -1) {
@@ -80,15 +133,25 @@ Script {
}
}
return tagNameList;
- break;
}
return "";
}
- /**
- * Escapes a string for regular expressions
- */
+ // Removes tag marker in note preview and highlights tag name with set color
+ function noteToMarkdownHtmlHook(note, html) {
+ if (tagHighlightColor == "")
+ return;
+
+ var re = new RegExp("\\B%1([^\\s,;]+)".arg(escapeRegExp(tagMarker)), "gi"), result;
+
+ while ((result = re.exec(html)) !== null)
+ html = html.replace(result[0], '%2'.arg(tagHighlightColor).arg(result[1]));
+
+ return html;
+ }
+
+ // Escapes a string for regular expressions
function escapeRegExp(str) {
return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&");
}