66 lines
1.9 KiB
JavaScript
66 lines
1.9 KiB
JavaScript
import SchemaDefinition from "./schema-definition.mjs";
|
|
import {mergeObject} from "../../utils/helpers.mjs";
|
|
|
|
/**
|
|
* A class responsible for encapsulating logic around link marks in the ProseMirror schema.
|
|
* @extends {SchemaDefinition}
|
|
*/
|
|
export default class LinkMark extends SchemaDefinition {
|
|
/** @override */
|
|
static tag = "a";
|
|
|
|
/* -------------------------------------------- */
|
|
|
|
/** @override */
|
|
static get attrs() {
|
|
return {
|
|
href: { default: null },
|
|
title: { default: null }
|
|
}
|
|
}
|
|
|
|
/* -------------------------------------------- */
|
|
|
|
/** @override */
|
|
static getAttrs(el) {
|
|
if ( (el.children.length === 1) && (el.children[0]?.tagName === "IMG") ) return false;
|
|
return { href: el.href, title: el.title };
|
|
}
|
|
|
|
/* -------------------------------------------- */
|
|
|
|
/** @override */
|
|
static toDOM(node) {
|
|
const { href, title } = node.attrs;
|
|
const attrs = {};
|
|
if ( href ) attrs.href = href;
|
|
if ( title ) attrs.title = title;
|
|
return ["a", attrs];
|
|
}
|
|
|
|
/* -------------------------------------------- */
|
|
|
|
/** @inheritdoc */
|
|
static make() {
|
|
return mergeObject(super.make(), {
|
|
inclusive: false
|
|
});
|
|
}
|
|
|
|
/* -------------------------------------------- */
|
|
|
|
/**
|
|
* Handle clicks on link marks while editing.
|
|
* @param {EditorView} view The ProseMirror editor view.
|
|
* @param {number} pos The position in the ProseMirror document that the click occurred at.
|
|
* @param {PointerEvent} event The click event.
|
|
* @param {Mark} mark The Mark instance.
|
|
* @returns {boolean|void} Returns true to indicate the click was handled here and should not be propagated to
|
|
* other plugins.
|
|
*/
|
|
static onClick(view, pos, event, mark) {
|
|
if ( (event.ctrlKey || event.metaKey) && mark.attrs.href ) window.open(mark.attrs.href, "_blank");
|
|
return true;
|
|
}
|
|
}
|