184 lines
4.8 KiB
QML
184 lines
4.8 KiB
QML
|
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)
|
||
|
}
|
||
|
}
|