Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions insert-moc/info.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
{
"name": "Insert Table of Contents II (M.O.C. Map of Contents)",
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Best remove the Insert, just the name is enough

"identifier": "insert-moc",
"script": "insert-moc.qml",
"authors": ["@netlimpopo"],
"platforms": ["linux", "macos", "windows"],
"version": "0.0.1",
"minAppVersion": "25.12.7",
"description": "This script generates a list of clickable links which map to every single <code>.md</code> note within the active note folder (= "Map of contents (M.O.C.)"). It displays the links in a table format along with the <em>relative filepaths of the files</em>. Furthermore it sorts the links in alphabetical order. \n The difference to the "Table of Contents" script lies in the fact, that the T.O.C script creates links to headings of the same document whereas this M.O.C. script creates references to every single notename in the active note folder.\n <strong>Usage</strong> \n. <ol> <li>Select the highest folder hierachy <strong>(!)</strong>.</li> <li>Create a new note with an arbitrary name in the highest note hierachy (note level).</li><li>Click the M.O.C button in the script menu. Then the script will overwrite all of the current note content and will insert the linkslist.</li> </ol> \n\n <strong>Warning</strong> \n Note that <strong>all of the content</strong> of the selcted note <strong>will be replaced</strong> by the table of contents link list. Therefore it is essential to create a new note and exclusively use this note for the M.O.C list.\n <strong>automatic updates</strong>\n In case you rename a note, the markdown links in the M.O.C will be automatically updated too, as QOwnNotes watches all markdownlinks and checks links for necessary updates. \n However, if <strong>one creates a new note anywhere, the script must be excecuted again</strong>, as it will otherwise not watch for file additions nor will it add a new link to the list.\n Also if you want to move the M.O.C file to a different location, all the links will be updated accordingly thanks to the QOwnNotes logic. \n An M.O.C. can act as a navitational site (especially when all files are exported as static .html pages) and provide an overview of all available notes. The idea is strongly influenced by the Obsidian plugin 'Waypoint' see <a href="https://github.com/IdreesInc/Waypoint">Waypoint Obsidian</a>. "
}
56 changes: 56 additions & 0 deletions insert-moc/insert-moc.qml
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
import QtQml 2.2
import QOwnNotesTypes 1.0

Script {
function init() {
// Register custom action for MOC index generation
script.registerCustomAction("MOC", "Generate MOC", "MOC");
}

function customActionInvoked(action) {
if (action !== "indexpage") {
return;
}

var currentNote = script.currentNote;
var noteIds = script.fetchNoteIdsByNoteTextPart(""); // get all note IDs

// Build each link line and collect into array
var listedLinks = [];
for (var i = 0; i < noteIds.length; i++) {
var noteId = noteIds[i];
var noteObj = script.fetchNoteById(noteId);
var name = noteObj.name;
var fullPath = noteObj.fullNoteFilePath;
var parts = fullPath.split('.');
var ext = parts[parts.length - 1];
var relDir = noteObj.relativeNoteFileDirPath;

// Construct filePath and encoded path
var filePath = relDir && relDir.length > 0
? relDir + "/" + name + "." + ext
: name + "." + ext;
var rawLink = (relDir && relDir.length > 0
? relDir + "/" + name
: name);
var encoded = encodeURIComponent(rawLink)
.replace(/%2F/g, "/")
.replace(/%2E/g, ".") + "." + ext;

// Format line
var line = "|" + filePath + " | ---> [" + name + "." + ext + "](" + encoded + ")| ";
listedLinks.push(line);
}

// Sort lines alphabetically
listedLinks.sort();

// Assemble new note text
var noteTextstring = "# Map of Content \n\n|path |filelink | \n|---|---| \n" + listedLinks.join("\n") + "\n";

// Replace entire note content
script.noteTextEditSelectAll();
script.noteTextEditWrite(noteTextstring);
script.log("MOC index generated and sorted successfully.");
}
}