import QtQml 2.0 import QOwnNotesTypes 1.0 import com.qownnotes.noteapi 1.0 QtObject { function init() { script.registerCustomAction("zettelCreate", "Create Zettelkasten Zettel", "Zettel", "address-book-new"); script.registerCustomAction("manualLink", "Insert Zettelkasten Link", "InsertLink", "insert-link"); script.registerCustomAction("jumpToId", "Follow Zettelkasten Link", "Link", "go-next"); } function customActionInvoked(identifier) { switch(identifier) { case "zettelCreate": onZettelCreateClicked(); break; case "jumpToId": onJumpToZettelClicked(); break; case "manualLink": onInsertLinkClicked(); break; } } // ---------------------------- // ----- BUTTON FUNCTIONS ----- // ---------------------------- function onZettelCreateClicked() { let uid = exactDate(); let selected = script.noteTextEditSelectedText(); // Link the from the old Zettel to the new one if anything was selected if(selected !== "") { script.log("selected: " + selected); createLinkInPlace(uid, selected); } // Create a Zettel createZettel(uid, selected); } function onInsertLinkClicked() { let selected = script.noteTextEditSelectedText(); let clipboard = script.clipboard(); let uid = null if (verifyZettelId(clipboard)) { uid = verifyZettelId(clipboard); } else { let otherNote = zettelSelectorDialog(true); uid = extractZettelIdFromString(otherNote.noteText); } if (uid == null) { return; } createLinkInPlace(uid, selected) } function onJumpToZettelClicked() { let selected = verifyZettelId(script.noteTextEditSelectedText()); if(selected == false) { script.setCurrentNote(zettelSelectorDialog(true)); } else { script.setCurrentNote(getNoteByZettelId(selected)); } } // ---------------------------- // --- Autocomplete Linking --- // ---------------------------- function autocompletionHook() { let uid = verifyZettelId(script.noteTextEditCurrentWord(false)); if(uid == false) { return []; } let zettel = getNoteByZettelId(uid); script.log("Autocomplete detected, Switch to §§" + uid + " - " + zettel.name) script.setCurrentNote(zettel); return []; } // ---------------------------- // ---- Internal Functions ---- // ---------------------------- function zettelSelectorDialog(editableTextBox, zettelArray) { if (zettelArray == null) { zettelArray = []; script.fetchNoteIdsByNoteTextPart("§§").forEach(function (noteId){ let note = script.fetchNoteById(noteId); zettelArray.push(note.name + " --id:"+note.id); }); } let selected = script.inputDialogGetItem("Zettel", "Select a Zettel", zettelArray, 0, editableTextBox); return script.fetchNoteById(selected.substring(selected.search(/--id:/)+5)); } function extractZettelIdFromString(text) { let markerpos = text.search(/§§\d{14}\s/) + 2; if (markerpos == -1) { script.log("No Zettel ID Found in text"); return; } return text.substring(markerpos, markerpos+14); } function verifyZettelId(id) { if (id.match(/^§§\d{14}$/) != null) { return id.substring(2); } else if (id.match(/^\d{14}$/) != null) { return id; } else { return false; } } function getNoteByZettelId(uid) { let noteId = script.fetchNoteIdsByNoteTextPart("§§" + uid); if (noteId.length == 0) { script.log("No note found for Zettel ID: §§" + uid); return; } return script.fetchNoteById(noteId[0]); } function createLinkInPlace(uid, selected) { script.noteTextEditWrite("["+selected+"](zettel://"+uid+")"); } function createZettel(uid, headline) { // Create Headline - empty if nothing selected if (headline == "") { headline = "Zettel" } let text = headline.toString() + "\n"; // Create Headline Separator text += "===============\n"; // Create uid tag text += "§§" + uid.toString() + "\n\n"; // Create content unit (i.e. space) text += "\n\n\n\n\n"; // Create Related unit - FIXME add option to automatically link back to the card this was created from text += "## Related\n\n\n\n"; // Create Source unit text += "## Reference\n\n"; script.createNote(text); return script.currentNote(); } function exactDate() { let date = new Date(); return ("" + date.getUTCFullYear().toString() + padToLen2((date.getUTCMonth()+1).toString()) + padToLen2( date.getUTCDate().toString()) + padToLen2( date.getUTCHours().toString()) + padToLen2( date.getUTCMinutes().toString()) + padToLen2( date.getUTCSeconds().toString()) ); } function padToLen2(text) { return ("00" + text).slice(-2) } }