Skip to content

Commit

Permalink
Merge pull request #15 from personalizedrefrigerator/master
Browse files Browse the repository at this point in the history
Support CodeMirror 6
  • Loading branch information
roman-r-m committed Feb 2, 2024
2 parents 74f526a + 34f0bd3 commit 571a70a
Show file tree
Hide file tree
Showing 10 changed files with 444 additions and 198 deletions.
32 changes: 18 additions & 14 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,27 +2,31 @@
"name": "joplin-plugin-quick-links",
"version": "1.2.4",
"scripts": {
"dist": "webpack --joplin-plugin-config buildMain && webpack --joplin-plugin-config buildExtraScripts && webpack --joplin-plugin-config createArchive",
"dist": "webpack --env joplin-plugin-config=buildMain && webpack --env joplin-plugin-config=buildExtraScripts && webpack --env joplin-plugin-config=createArchive",
"prepare": "npm run dist",
"update": "npm install -g generator-joplin && yo joplin --update"
"updateVersion": "webpack --env joplin-plugin-config=updateVersion",
"update": "npm install -g generator-joplin && yo joplin --node-package-manager npm --update --force"
},
"license": "MIT",
"keywords": [
"joplin-plugin"
],
"files": [
"publish"
],
"devDependencies": {
"@types/node": "^14.0.14",
"@types/node": "^18.7.13",
"@types/codemirror": "^5.60.7",
"@codemirror/autocomplete": "^6.12.0",
"chalk": "^4.1.0",
"copy-webpack-plugin": "^6.1.0",
"fs-extra": "^9.0.1",
"glob": "^7.1.6",
"on-build-webpack": "^0.1.0",
"tar": "^6.0.5",
"ts-loader": "^7.0.5",
"typescript": "^3.9.3",
"webpack": "^4.43.0",
"webpack-cli": "^3.3.11",
"yargs": "^16.2.0"
"copy-webpack-plugin": "^11.0.0",
"fs-extra": "^10.1.0",
"glob": "^8.0.3",
"tar": "^6.1.11",
"ts-loader": "^9.3.1",
"typescript": "^4.8.2",
"webpack": "^5.74.0",
"webpack-cli": "^4.10.0",
"@joplin/lib": "~2.9"
}
}
}
4 changes: 2 additions & 2 deletions plugin.config.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"extraScripts": [
"QuickLinksPlugin.ts"
"contentScript/index.ts"
]
}
}
139 changes: 0 additions & 139 deletions src/QuickLinksPlugin.ts

This file was deleted.

122 changes: 122 additions & 0 deletions src/contentScript/codeMirror5Plugin.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,122 @@
import type { Editor } from "codemirror";
import { PluginContext } from "./types";

interface Hint {
text: string;
hint: Function;
displayText?: string;
render?: Function;
}

export default function codeMirror5Plugin(context: PluginContext, CodeMirror: any) {
function NewNoteHint(prefix: string, todo: boolean) {
let description = "New Note";

if(todo)
description = "New Task";

const newNoteHint: Hint = {
text: prefix,
hint: async (cm: Editor, data, completion) => {
const from = completion.from || data.from;
from.ch -= 2;

const response = await context.postMessage({command: 'createNote', title: prefix, todo: todo});
cm.replaceRange(`[${prefix}](:/${response.newNote.id})`, from, cm.getCursor(), "complete");
},
};

newNoteHint.render = (elem, _data, _completion) => {
const p = elem.ownerDocument.createElement('div');
p.setAttribute('style', 'width: 100%; display:table;');
elem.appendChild(p);
p.innerHTML = `
<div style="display:table-cell; padding-right: 5px">${prefix}</div>
<div style="display:table-cell; text-align: right;"><small><em>${description}</em></small></div>
`
};
return newNoteHint;
}

const buildHints = async (prefix: string) =>{
const response = await context.postMessage({ command: 'getNotes', prefix: prefix });

let hints: Hint[] = [];

const notes = response.notes;
for (let i = 0; i < notes.length; i++) {
const note = notes[i];
const hint: Hint = {
text: note.title,
hint: async (cm: Editor, data, completion) => {
const from = completion.from || data.from;
from.ch -= 2;
cm.replaceRange(`[${note.title}](:/${note.id})`, from, cm.getCursor(), "complete");
if (response.selectText) {
const selectionStart = Object.assign({}, from);
const selectionEnd = Object.assign({}, from);
selectionStart.ch += 1;
selectionEnd.ch += 1 + note.title.length;
cm.setSelection(selectionStart, selectionEnd)
}
},
};
if (response.showFolders) {
const folder = !!note.folder ? note.folder : "unknown";
hint.render = (elem, _data, _completion) => {
const p = elem.ownerDocument.createElement('div');
p.setAttribute('style', 'width: 100%; display:table;');
elem.appendChild(p);
p.innerHTML = `
<div style="display:table-cell; padding-right: 5px">${note.title}</div>
<div style="display:table-cell; text-align: right;"><small><em>In ${folder}</em></small></div>
`
};
} else {
hint.displayText = note.title;
}
hints.push(hint);
}

if(response.allowNewNotes && prefix) {
hints.push(NewNoteHint(prefix, false));
hints.push(NewNoteHint(prefix, true));
}

return hints;
}

CodeMirror.defineOption('quickLinks', false, function(cm, value, prev) {
if (!value) return;

cm.on('inputRead', async function (cm1, change) {
if (!cm1.state.completionActive && cm.getTokenAt(cm.getCursor()).string === '@@') {
const start = {line: change.from.line, ch: change.from.ch + 1};

const hint = function(cm, callback) {
const cursor = cm.getCursor();
let prefix = cm.getRange(start, cursor) || '';

buildHints(prefix).then(hints => {
callback({
list: hints,
from: {line: change.from.line, ch: change.from.ch + 1},
to: {line: change.to.line, ch: change.to.ch + 1},
});
});
};

setTimeout(function () {
CodeMirror.showHint(cm, hint, {
completeSingle: false,
closeOnUnfocus: true,
async: true,
closeCharacters: /[()\[\]{};:>,]/
});
}, 10);
}
});
});
}


Loading

0 comments on commit 571a70a

Please sign in to comment.