chore(ckeditor5/plugins): integrate reference link

This commit is contained in:
Elian Doran 2025-05-03 17:00:24 +03:00
parent a54d8ed811
commit 2dcd37001f
No known key found for this signature in database
7 changed files with 45 additions and 25 deletions

View File

@ -20,5 +20,8 @@
}, },
"dependencies": { "dependencies": {
"ckeditor5": "43.2.0" "ckeditor5": "43.2.0"
},
"devDependencies": {
"@types/jquery": "3.5.32"
} }
} }

View File

@ -1,14 +1,22 @@
import "ckeditor5"; import "ckeditor5";
declare global { declare global {
interface Component {
triggerCommand(command: string): void;
}
interface EditorComponent extends Component {
loadReferenceLinkTitle($el: JQuery<HTMLElement>, href: string): Promise<void>;
}
var glob: { var glob: {
getComponentByEl(el: unknown): { getComponentByEl<T extends Component>(el: unknown): T;
triggerCommand(command: string): void;
};
getActiveContextNote(): { getActiveContextNote(): {
noteId: string; noteId: string;
}; };
getHeaders(): Promise<Record<string, string>>; getHeaders(): Promise<Record<string, string>>;
getReferenceLinkTitle(href: string): Promise<string>;
getReferenceLinkTitleSync(href: string): string;
} }
} }

View File

@ -5,11 +5,13 @@ import UploadimagePlugin from "./plugins/uploadimage.js";
import ItalicAsEmPlugin from "./plugins/italic_as_em.js"; import ItalicAsEmPlugin from "./plugins/italic_as_em.js";
import StrikethroughAsDel from "./plugins/strikethrough_as_del.js"; import StrikethroughAsDel from "./plugins/strikethrough_as_del.js";
import InternalLinkPlugin from "./plugins/internallink.js"; import InternalLinkPlugin from "./plugins/internallink.js";
import ReferenceLink from "./plugins/referencelink.js";
const TRILIUM_PLUGINS: typeof Plugin[] = [ const TRILIUM_PLUGINS: typeof Plugin[] = [
CutToNotePlugin, CutToNotePlugin,
ItalicAsEmPlugin, ItalicAsEmPlugin,
StrikethroughAsDel, StrikethroughAsDel,
ReferenceLink,
UploadimagePlugin, UploadimagePlugin,
InternalLinkPlugin InternalLinkPlugin
]; ];
@ -71,7 +73,6 @@ export const COMMON_PLUGINS: typeof Plugin[] = [
// MarkdownImportPlugin, // MarkdownImportPlugin,
// MentionCustomization, // MentionCustomization,
// IncludeNote, // IncludeNote,
// ReferenceLink,
// indentBlockShortcutPlugin, // indentBlockShortcutPlugin,
// removeFormatLinksPlugin, // removeFormatLinksPlugin,
PageBreak, PageBreak,

View File

@ -1,7 +1,13 @@
import { ButtonView, Plugin } from 'ckeditor5'; import { ButtonView, Plugin } from 'ckeditor5';
import internalLinkIcon from '../icons/trilium.svg?raw'; import internalLinkIcon from '../icons/trilium.svg?raw';
import ReferenceLink from './referencelink';
export default class InternalLinkPlugin extends Plugin { export default class InternalLinkPlugin extends Plugin {
static get requires() {
return [ ReferenceLink ];
}
init() { init() {
const editor = this.editor; const editor = this.editor;

View File

@ -1,7 +1,4 @@
import Plugin from '@ckeditor/ckeditor5-core/src/plugin'; import { Command, Element, Plugin, toWidget, viewToModelPositionOutsideModelElement, Widget } from "ckeditor5";
import { toWidget, viewToModelPositionOutsideModelElement } from '@ckeditor/ckeditor5-widget/src/utils';
import Widget from '@ckeditor/ckeditor5-widget/src/widget';
import Command from '@ckeditor/ckeditor5-core/src/command';
export default class ReferenceLink extends Plugin { export default class ReferenceLink extends Plugin {
static get requires() { static get requires() {
@ -10,7 +7,8 @@ export default class ReferenceLink extends Plugin {
} }
class ReferenceLinkCommand extends Command { class ReferenceLinkCommand extends Command {
execute( { href } ) {
execute({ href }: { href: string }) {
if (!href?.trim()) { if (!href?.trim()) {
return; return;
} }
@ -34,8 +32,7 @@ class ReferenceLinkCommand extends Command {
refresh() { refresh() {
const model = this.editor.model; const model = this.editor.model;
const selection = model.document.selection; const selection = model.document.selection;
this.isEnabled = selection.focus !== null && model.schema.checkChild(selection.focus.parent as Element, 'reference');
this.isEnabled = model.schema.checkChild(selection.focus.parent, 'reference');
} }
} }
@ -92,7 +89,7 @@ class ReferenceLinkEditing extends Plugin {
conversion.for( 'editingDowncast' ).elementToElement( { conversion.for( 'editingDowncast' ).elementToElement( {
model: 'reference', model: 'reference',
view: ( modelItem, { writer: viewWriter } ) => { view: ( modelItem, { writer: viewWriter } ) => {
const href = modelItem.getAttribute( 'href' ); const href = modelItem.getAttribute('href') as string;
const referenceLinkView = viewWriter.createContainerElement( 'a', { const referenceLinkView = viewWriter.createContainerElement( 'a', {
href, href,
@ -106,7 +103,7 @@ class ReferenceLinkEditing extends Plugin {
const domElement = this.toDomElement( domDocument ); const domElement = this.toDomElement( domDocument );
const editorEl = editor.editing.view.getDomRoot(); const editorEl = editor.editing.view.getDomRoot();
const component = glob.getComponentByEl(editorEl); const component = glob.getComponentByEl<EditorComponent>(editorEl);
component.loadReferenceLinkTitle($(domElement), href); component.loadReferenceLinkTitle($(domElement), href);
@ -123,7 +120,7 @@ class ReferenceLinkEditing extends Plugin {
conversion.for( 'dataDowncast' ).elementToElement( { conversion.for( 'dataDowncast' ).elementToElement( {
model: 'reference', model: 'reference',
view: ( modelItem, { writer: viewWriter } ) => { view: ( modelItem, { writer: viewWriter } ) => {
const href = modelItem.getAttribute( 'href' ); const href = modelItem.getAttribute('href') as string;
const referenceLinkView = viewWriter.createContainerElement( 'a', { const referenceLinkView = viewWriter.createContainerElement( 'a', {
href: href, href: href,

View File

@ -11,7 +11,8 @@
"forceConsistentCasingInFileNames": true, "forceConsistentCasingInFileNames": true,
"lib": ["DOM", "ES2015"], "lib": ["DOM", "ES2015"],
"types": [ "types": [
"vite/client" "vite/client",
"jquery"
] ]
}, },
"include": [ "include": [

24
pnpm-lock.yaml generated
View File

@ -374,7 +374,7 @@ importers:
version: 1.0.2 version: 1.0.2
copy-webpack-plugin: copy-webpack-plugin:
specifier: 13.0.0 specifier: 13.0.0
version: 13.0.0(webpack@5.99.7(@swc/core@1.5.29(@swc/helpers@0.5.17))(esbuild@0.25.3)(webpack-cli@6.0.1)) version: 13.0.0(webpack@5.99.7(@swc/core@1.5.29(@swc/helpers@0.5.17))(esbuild@0.25.3)(webpack-cli@6.0.1(webpack@5.98.0)))
electron: electron:
specifier: 35.2.2 specifier: 35.2.2
version: 35.2.2 version: 35.2.2
@ -430,7 +430,7 @@ importers:
version: 11.0.4 version: 11.0.4
copy-webpack-plugin: copy-webpack-plugin:
specifier: 13.0.0 specifier: 13.0.0
version: 13.0.0(webpack@5.99.7(@swc/core@1.5.29(@swc/helpers@0.5.17))(esbuild@0.25.3)(webpack-cli@6.0.1)) version: 13.0.0(webpack@5.99.7(@swc/core@1.5.29(@swc/helpers@0.5.17))(esbuild@0.25.3)(webpack-cli@6.0.1(webpack@5.98.0)))
electron: electron:
specifier: 35.2.2 specifier: 35.2.2
version: 35.2.2 version: 35.2.2
@ -608,7 +608,7 @@ importers:
version: 1.4.7 version: 1.4.7
copy-webpack-plugin: copy-webpack-plugin:
specifier: 13.0.0 specifier: 13.0.0
version: 13.0.0(webpack@5.99.7(@swc/core@1.5.29(@swc/helpers@0.5.17))(esbuild@0.25.3)(webpack-cli@6.0.1)) version: 13.0.0(webpack@5.99.7(@swc/core@1.5.29(@swc/helpers@0.5.17))(esbuild@0.25.3)(webpack-cli@6.0.1(webpack@5.98.0)))
csrf-csrf: csrf-csrf:
specifier: 3.2.2 specifier: 3.2.2
version: 3.2.2 version: 3.2.2
@ -779,7 +779,7 @@ importers:
version: 1.0.1 version: 1.0.1
webpack: webpack:
specifier: 5.99.7 specifier: 5.99.7
version: 5.99.7(@swc/core@1.5.29(@swc/helpers@0.5.17))(esbuild@0.25.3)(webpack-cli@6.0.1) version: 5.99.7(@swc/core@1.5.29(@swc/helpers@0.5.17))(esbuild@0.25.3)(webpack-cli@6.0.1(webpack@5.98.0))
ws: ws:
specifier: 8.18.1 specifier: 8.18.1
version: 8.18.1(bufferutil@4.0.9)(utf-8-validate@6.0.5) version: 8.18.1(bufferutil@4.0.9)(utf-8-validate@6.0.5)
@ -801,6 +801,10 @@ importers:
ckeditor5: ckeditor5:
specifier: 43.2.0 specifier: 43.2.0
version: 43.2.0 version: 43.2.0
devDependencies:
'@types/jquery':
specifier: 3.5.32
version: 3.5.32
packages/commons: packages/commons:
dependencies: dependencies:
@ -16953,14 +16957,14 @@ snapshots:
serialize-javascript: 6.0.2 serialize-javascript: 6.0.2
webpack: 5.98.0(@swc/core@1.5.29(@swc/helpers@0.5.17))(esbuild@0.25.3)(webpack-cli@6.0.1) webpack: 5.98.0(@swc/core@1.5.29(@swc/helpers@0.5.17))(esbuild@0.25.3)(webpack-cli@6.0.1)
copy-webpack-plugin@13.0.0(webpack@5.99.7(@swc/core@1.5.29(@swc/helpers@0.5.17))(esbuild@0.25.3)(webpack-cli@6.0.1)): copy-webpack-plugin@13.0.0(webpack@5.99.7(@swc/core@1.5.29(@swc/helpers@0.5.17))(esbuild@0.25.3)(webpack-cli@6.0.1(webpack@5.98.0))):
dependencies: dependencies:
glob-parent: 6.0.2 glob-parent: 6.0.2
normalize-path: 3.0.0 normalize-path: 3.0.0
schema-utils: 4.3.2 schema-utils: 4.3.2
serialize-javascript: 6.0.2 serialize-javascript: 6.0.2
tinyglobby: 0.2.13 tinyglobby: 0.2.13
webpack: 5.99.7(@swc/core@1.5.29(@swc/helpers@0.5.17))(esbuild@0.25.3)(webpack-cli@6.0.1) webpack: 5.99.7(@swc/core@1.5.29(@swc/helpers@0.5.17))(esbuild@0.25.3)(webpack-cli@6.0.1(webpack@5.98.0))
core-js-compat@3.41.0: core-js-compat@3.41.0:
dependencies: dependencies:
@ -22879,14 +22883,14 @@ snapshots:
'@swc/core': 1.5.29(@swc/helpers@0.5.17) '@swc/core': 1.5.29(@swc/helpers@0.5.17)
esbuild: 0.25.3 esbuild: 0.25.3
terser-webpack-plugin@5.3.14(@swc/core@1.5.29(@swc/helpers@0.5.17))(esbuild@0.25.3)(webpack@5.99.7(@swc/core@1.5.29(@swc/helpers@0.5.17))(esbuild@0.25.3)(webpack-cli@6.0.1)): terser-webpack-plugin@5.3.14(@swc/core@1.5.29(@swc/helpers@0.5.17))(esbuild@0.25.3)(webpack@5.99.7(@swc/core@1.5.29(@swc/helpers@0.5.17))(esbuild@0.25.3)(webpack-cli@6.0.1(webpack@5.98.0))):
dependencies: dependencies:
'@jridgewell/trace-mapping': 0.3.25 '@jridgewell/trace-mapping': 0.3.25
jest-worker: 27.5.1 jest-worker: 27.5.1
schema-utils: 4.3.2 schema-utils: 4.3.2
serialize-javascript: 6.0.2 serialize-javascript: 6.0.2
terser: 5.39.0 terser: 5.39.0
webpack: 5.99.7(@swc/core@1.5.29(@swc/helpers@0.5.17))(esbuild@0.25.3)(webpack-cli@6.0.1) webpack: 5.99.7(@swc/core@1.5.29(@swc/helpers@0.5.17))(esbuild@0.25.3)(webpack-cli@6.0.1(webpack@5.98.0))
optionalDependencies: optionalDependencies:
'@swc/core': 1.5.29(@swc/helpers@0.5.17) '@swc/core': 1.5.29(@swc/helpers@0.5.17)
esbuild: 0.25.3 esbuild: 0.25.3
@ -23668,7 +23672,7 @@ snapshots:
- esbuild - esbuild
- uglify-js - uglify-js
webpack@5.99.7(@swc/core@1.5.29(@swc/helpers@0.5.17))(esbuild@0.25.3)(webpack-cli@6.0.1): webpack@5.99.7(@swc/core@1.5.29(@swc/helpers@0.5.17))(esbuild@0.25.3)(webpack-cli@6.0.1(webpack@5.98.0)):
dependencies: dependencies:
'@types/eslint-scope': 3.7.7 '@types/eslint-scope': 3.7.7
'@types/estree': 1.0.7 '@types/estree': 1.0.7
@ -23691,7 +23695,7 @@ snapshots:
neo-async: 2.6.2 neo-async: 2.6.2
schema-utils: 4.3.2 schema-utils: 4.3.2
tapable: 2.2.1 tapable: 2.2.1
terser-webpack-plugin: 5.3.14(@swc/core@1.5.29(@swc/helpers@0.5.17))(esbuild@0.25.3)(webpack@5.99.7(@swc/core@1.5.29(@swc/helpers@0.5.17))(esbuild@0.25.3)(webpack-cli@6.0.1)) terser-webpack-plugin: 5.3.14(@swc/core@1.5.29(@swc/helpers@0.5.17))(esbuild@0.25.3)(webpack@5.99.7(@swc/core@1.5.29(@swc/helpers@0.5.17))(esbuild@0.25.3)(webpack-cli@6.0.1(webpack@5.98.0)))
watchpack: 2.4.2 watchpack: 2.4.2
webpack-sources: 3.2.3 webpack-sources: 3.2.3
optionalDependencies: optionalDependencies: