@tiptap/extension-image
Version:
image extension for tiptap
159 lines (158 loc) • 4.09 kB
JavaScript
// src/image.ts
import { mergeAttributes, Node, nodeInputRule, ResizableNodeView } from "@tiptap/core";
var inputRegex = /(?:^|\s)(!\[(.+|:?)]\((\S+)(?:(?:\s+)["'](\S+)["'])?\))$/;
var Image = Node.create({
name: "image",
addOptions() {
return {
inline: false,
allowBase64: false,
HTMLAttributes: {},
resize: false
};
},
inline() {
return this.options.inline;
},
group() {
return this.options.inline ? "inline" : "block";
},
draggable: true,
addAttributes() {
return {
src: {
default: null
},
alt: {
default: null
},
title: {
default: null
},
width: {
default: null
},
height: {
default: null
}
};
},
parseHTML() {
return [
{
tag: this.options.allowBase64 ? "img[src]" : 'img[src]:not([src^="data:"])'
}
];
},
renderHTML({ HTMLAttributes }) {
return ["img", mergeAttributes(this.options.HTMLAttributes, HTMLAttributes)];
},
parseMarkdown: (token, helpers) => {
return helpers.createNode("image", {
src: token.href,
title: token.title,
alt: token.text
});
},
renderMarkdown: (node) => {
var _a, _b, _c, _d, _e, _f;
const src = (_b = (_a = node.attrs) == null ? void 0 : _a.src) != null ? _b : "";
const alt = (_d = (_c = node.attrs) == null ? void 0 : _c.alt) != null ? _d : "";
const title = (_f = (_e = node.attrs) == null ? void 0 : _e.title) != null ? _f : "";
return title ? `` : ``;
},
addNodeView() {
if (!this.options.resize || !this.options.resize.enabled || typeof document === "undefined") {
return null;
}
const { directions, minWidth, minHeight, alwaysPreserveAspectRatio } = this.options.resize;
return ({ node, getPos, HTMLAttributes, editor }) => {
const el = document.createElement("img");
Object.entries(HTMLAttributes).forEach(([key, value]) => {
if (value != null) {
switch (key) {
case "width":
case "height":
break;
default:
el.setAttribute(key, value);
break;
}
}
});
el.src = HTMLAttributes.src;
const nodeView = new ResizableNodeView({
element: el,
editor,
node,
getPos,
onResize: (width, height) => {
el.style.width = `${width}px`;
el.style.height = `${height}px`;
},
onCommit: (width, height) => {
const pos = getPos();
if (pos === void 0) {
return;
}
this.editor.chain().setNodeSelection(pos).updateAttributes(this.name, {
width,
height
}).run();
},
onUpdate: (updatedNode, _decorations, _innerDecorations) => {
if (updatedNode.type !== node.type) {
return false;
}
return true;
},
options: {
directions,
min: {
width: minWidth,
height: minHeight
},
preserveAspectRatio: alwaysPreserveAspectRatio === true
}
});
const dom = nodeView.dom;
dom.style.visibility = "hidden";
dom.style.pointerEvents = "none";
el.onload = () => {
dom.style.visibility = "";
dom.style.pointerEvents = "";
};
return nodeView;
};
},
addCommands() {
return {
setImage: (options) => ({ commands }) => {
return commands.insertContent({
type: this.name,
attrs: options
});
}
};
},
addInputRules() {
return [
nodeInputRule({
find: inputRegex,
type: this.type,
getAttributes: (match) => {
const [, , alt, src, title] = match;
return { src, alt, title };
}
})
];
}
});
// src/index.ts
var index_default = Image;
export {
Image,
index_default as default,
inputRegex
};
//# sourceMappingURL=index.js.map