prosemirror-link-preview 2.0.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -0
- package/dist/addPreviewNode.d.ts +2 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.es.js +1 -0
- package/dist/index.js +1 -0
- package/dist/previewNodeView.d.ts +9 -0
- package/dist/previewPlugin.d.ts +9 -0
- package/dist/styles/styles.css +40 -0
- package/dist/utils.d.ts +15 -0
- package/package.json +73 -0
package/README.md
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
# prosemirror-link-preview
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { previewPlugin } from "./previewPlugin";
|
|
2
|
+
export { previewNodeView } from "./previewNodeView";
|
|
3
|
+
export { addPreviewNode } from "./addPreviewNode";
|
|
4
|
+
export { createDecorations, createDecorationsYjs, applyYjs, apply, findPlaceholder, findPlaceholderYjs, } from "./utils";
|
package/dist/index.es.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{PluginKey as t,Plugin as e}from"prosemirror-state";import{Fragment as r,Slice as i}from"prosemirror-model";import{DecorationSet as n,Decoration as o}from"prosemirror-view";import{ySyncPluginKey as s,relativePositionToAbsolutePosition as d,absolutePositionToRelativePosition as l}from"y-prosemirror";const a=(t,e,r)=>{const i=document.createElement("div");i.className="preview-root";const n=document.createElement("img");n.classList.add("preview-img"),n.src=t.attrs.src,n.alt=t.attrs.alt;const o=document.createElement("div");o.classList.add("preview-title"),o.textContent=t.attrs.title;const s=document.createElement("div");s.classList.add("preview-description"),s.textContent=t.attrs.description,i.appendChild(n),i.appendChild(o),i.appendChild(s);const d=i;return{dom:d,update:t=>{const e=d.querySelector("img"),r=d.querySelector(".preview-title"),i=d.querySelector(".preview-description");return!!(e&&r&&i)&&(e.src=t.attrs.src,e.alt=t.attrs.alt,i.textContent=t.attrs.description,r.textContent=t.attrs.title,!0)},selectNode:()=>{const{state:t,dispatch:i}=e;i(t.tr.setMeta("selectedNode",r()))},deselectNode:()=>{const{state:t,dispatch:r}=e;r(t.tr.setMeta("selectedNode",null))},destroy:()=>{d.remove()}}},c=new t("previewPlugin"),p=(t,n,o,s,d)=>new e({key:c,state:{init:()=>[],apply:o},props:{decorations:t=>s(t),transformPasted:(e,o)=>{var s;const l={},{tr:a}=o.state,p=null===(s=e.content.firstChild)||void 0===s?void 0:s.textContent;let u=null;try{u=new URL(p||"").origin,a.selection.empty||a.deleteSelection(),a.setMeta(c,{id:l,pos:a.selection.from,type:"add"}),o.dispatch(a)}catch(t){return e}if(p&&u){n(p).then((e=>{const{title:r,description:i,images:n}=e;if(!(null==n?void 0:n[0])){const e=t.text(p);return void o.dispatch(o.state.tr.replaceSelectionWith(e))}const s={title:r,description:i,src:n[0],alt:r,url:p},a=t.nodes.preview.create(s),u=d(o.state,l);u&&o.dispatch(o.state.tr.replaceWith(u,u,a).setMeta(c,{type:"remove",id:l}))}),(()=>{o.dispatch(a.setMeta(c,{type:"remove",id:l}))}));const e=r.empty;return new i(e,0,0)}return e},nodeViews:{preview:a}}}),u=t=>t.addToEnd("preview",{inline:!0,group:"inline",atom:!1,attrs:{src:{default:null},alt:{default:null},title:{default:null},description:{default:null}},parseDOM:[{tag:"div.preview-root",getAttrs(t){var e,r,i,n;return t instanceof HTMLElement?{src:null===(e=t.querySelector(".preview-img"))||void 0===e?void 0:e.getAttribute("src"),alt:null===(r=t.querySelector(".preview-img"))||void 0===r?void 0:r.getAttribute("alt"),title:null===(i=t.querySelector(".preview-title"))||void 0===i?void 0:i.textContent,description:null===(n=t.querySelector(".preview-description"))||void 0===n?void 0:n.textContent}:{}}}],toDOM:t=>["div",{class:"preview-root"},["img",{class:"preview-img",src:t.attrs.src,alt:t.attrs.alt}],["div",{class:"preview-title"},t.attrs.title],["div",{class:"preview-description"},t.attrs.description]]}),m=t=>{const e=c.getState(t);if(!e)return n.empty;const r=s.getState(t),i=e.map((t=>{const e=d(r.doc,r.type,t.pos,r.binding.mapping),i=document.createElement("placeholder");return"number"==typeof e?o.widget(e,i,{id:t.id}):void 0}));return n.create(t.doc,i.filter((t=>t)))||n.empty},v=t=>{const e=c.getState(t);if(!e)return n.empty;const r=e.map((t=>{const e=document.createElement("placeholder");return"number"==typeof t.pos?o.widget(t.pos,e,{id:t.id}):void 0}));return n.create(t.doc,r.filter((t=>t)))||n.empty},g=(t,e,r,i)=>{const n=t.getMeta(c);if(n&&"add"===n.type){const t=s.getState(i),r=l(n.pos,t.type,t.binding.mapping);return[...e,{id:n.id,pos:r}]}return n&&"remove"===n.type?e.filter((t=>t.id!==n.id)):e},y=(t,e)=>{const r=t.getMeta(c),i=e.map((e=>{const r=t.mapping.map(e.pos);return Object.assign(Object.assign({},e),{pos:r})}));return r&&"add"===r.type?[...i,{id:r.id,pos:r.pos}]:r&&"remove"===r.type?i.filter((t=>t.id!==r.id)):i},f=(t,e)=>{const r=c.getState(t);if(!r)return null;const i=s.getState(t),n=r.find((t=>t.id===e));if(!(null==n?void 0:n.pos))return null;return d(i.doc,i.type,n.pos,i.binding.mapping)},w=(t,e)=>{const r=c.getState(t);if(!r)return null;const i=r.find((t=>t.id===e));return(null==i?void 0:i.pos)||null};export{u as addPreviewNode,y as apply,g as applyYjs,v as createDecorations,m as createDecorationsYjs,w as findPlaceholder,f as findPlaceholderYjs,a as previewNodeView,p as previewPlugin};
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";var e=require("prosemirror-state"),t=require("prosemirror-model"),r=require("prosemirror-view"),i=require("y-prosemirror");const o=(e,t,r)=>{const i=document.createElement("div");i.className="preview-root";const o=document.createElement("img");o.classList.add("preview-img"),o.src=e.attrs.src,o.alt=e.attrs.alt;const n=document.createElement("div");n.classList.add("preview-title"),n.textContent=e.attrs.title;const s=document.createElement("div");s.classList.add("preview-description"),s.textContent=e.attrs.description,i.appendChild(o),i.appendChild(n),i.appendChild(s);const a=i;return{dom:a,update:e=>{const t=a.querySelector("img"),r=a.querySelector(".preview-title"),i=a.querySelector(".preview-description");return!!(t&&r&&i)&&(t.src=e.attrs.src,t.alt=e.attrs.alt,i.textContent=e.attrs.description,r.textContent=e.attrs.title,!0)},selectNode:()=>{const{state:e,dispatch:i}=t;i(e.tr.setMeta("selectedNode",r()))},deselectNode:()=>{const{state:e,dispatch:r}=t;r(e.tr.setMeta("selectedNode",null))},destroy:()=>{a.remove()}}},n=new e.PluginKey("previewPlugin");exports.addPreviewNode=e=>e.addToEnd("preview",{inline:!0,group:"inline",atom:!1,attrs:{src:{default:null},alt:{default:null},title:{default:null},description:{default:null}},parseDOM:[{tag:"div.preview-root",getAttrs(e){var t,r,i,o;return e instanceof HTMLElement?{src:null===(t=e.querySelector(".preview-img"))||void 0===t?void 0:t.getAttribute("src"),alt:null===(r=e.querySelector(".preview-img"))||void 0===r?void 0:r.getAttribute("alt"),title:null===(i=e.querySelector(".preview-title"))||void 0===i?void 0:i.textContent,description:null===(o=e.querySelector(".preview-description"))||void 0===o?void 0:o.textContent}:{}}}],toDOM:e=>["div",{class:"preview-root"},["img",{class:"preview-img",src:e.attrs.src,alt:e.attrs.alt}],["div",{class:"preview-title"},e.attrs.title],["div",{class:"preview-description"},e.attrs.description]]}),exports.apply=(e,t)=>{const r=e.getMeta(n),i=t.map((t=>{const r=e.mapping.map(t.pos);return Object.assign(Object.assign({},t),{pos:r})}));return r&&"add"===r.type?[...i,{id:r.id,pos:r.pos}]:r&&"remove"===r.type?i.filter((e=>e.id!==r.id)):i},exports.applyYjs=(e,t,r,o)=>{const s=e.getMeta(n);if(s&&"add"===s.type){const e=i.ySyncPluginKey.getState(o),r=i.absolutePositionToRelativePosition(s.pos,e.type,e.binding.mapping);return[...t,{id:s.id,pos:r}]}return s&&"remove"===s.type?t.filter((e=>e.id!==s.id)):t},exports.createDecorations=e=>{const t=n.getState(e);if(!t)return r.DecorationSet.empty;const i=t.map((e=>{const t=document.createElement("placeholder");return"number"==typeof e.pos?r.Decoration.widget(e.pos,t,{id:e.id}):void 0}));return r.DecorationSet.create(e.doc,i.filter((e=>e)))||r.DecorationSet.empty},exports.createDecorationsYjs=e=>{const t=n.getState(e);if(!t)return r.DecorationSet.empty;const o=i.ySyncPluginKey.getState(e),s=t.map((e=>{const t=i.relativePositionToAbsolutePosition(o.doc,o.type,e.pos,o.binding.mapping),n=document.createElement("placeholder");return"number"==typeof t?r.Decoration.widget(t,n,{id:e.id}):void 0}));return r.DecorationSet.create(e.doc,s.filter((e=>e)))||r.DecorationSet.empty},exports.findPlaceholder=(e,t)=>{const r=n.getState(e);if(!r)return null;const i=r.find((e=>e.id===t));return(null==i?void 0:i.pos)||null},exports.findPlaceholderYjs=(e,t)=>{const r=n.getState(e);if(!r)return null;const o=i.ySyncPluginKey.getState(e),s=r.find((e=>e.id===t));if(!(null==s?void 0:s.pos))return null;return i.relativePositionToAbsolutePosition(o.doc,o.type,s.pos,o.binding.mapping)},exports.previewNodeView=o,exports.previewPlugin=(r,i,s,a,l)=>new e.Plugin({key:n,state:{init:()=>[],apply:s},props:{decorations:e=>a(e),transformPasted:(e,o)=>{var s;const a={},{tr:c}=o.state,d=null===(s=e.content.firstChild)||void 0===s?void 0:s.textContent;let p=null;try{p=new URL(d||"").origin,c.selection.empty||c.deleteSelection(),c.setMeta(n,{id:a,pos:c.selection.from,type:"add"}),o.dispatch(c)}catch(t){return e}if(d&&p){i(d).then((e=>{const{title:t,description:i,images:s}=e;if(!(null==s?void 0:s[0])){const e=r.text(d);return void o.dispatch(o.state.tr.replaceSelectionWith(e))}const c={title:t,description:i,src:s[0],alt:t,url:d},p=r.nodes.preview.create(c),u=l(o.state,a);u&&o.dispatch(o.state.tr.replaceWith(u,u,p).setMeta(n,{type:"remove",id:a}))}),(()=>{o.dispatch(c.setMeta(n,{type:"remove",id:a}))}));const e=t.Fragment.empty;return new t.Slice(e,0,0)}return e},nodeViews:{preview:o}}});
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { EditorView } from "prosemirror-view";
|
|
2
|
+
import { Node } from "prosemirror-model";
|
|
3
|
+
export declare const previewNodeView: (node: Node, view: EditorView, getPos: () => number | undefined) => {
|
|
4
|
+
dom: HTMLDivElement;
|
|
5
|
+
update: (node: Node) => boolean;
|
|
6
|
+
selectNode: () => void;
|
|
7
|
+
deselectNode: () => void;
|
|
8
|
+
destroy: () => void;
|
|
9
|
+
};
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { EditorState, Plugin, PluginKey, Transaction } from "prosemirror-state";
|
|
2
|
+
import { Schema } from "prosemirror-model";
|
|
3
|
+
import { DecorationSet } from "prosemirror-view";
|
|
4
|
+
export type PreviewPluginState = {
|
|
5
|
+
pos: number;
|
|
6
|
+
id: object;
|
|
7
|
+
}[];
|
|
8
|
+
export declare const previewPluginKey: PluginKey<PreviewPluginState>;
|
|
9
|
+
export declare const previewPlugin: (schema: Schema, callback: (url: string) => Promise<any>, apply: (tr: Transaction, value: PreviewPluginState, oldState: EditorState, newState: EditorState) => PreviewPluginState, createDecorations: (state: EditorState) => DecorationSet, findPlaceholder: (state: EditorState, id: object) => number | null) => Plugin<PreviewPluginState>;
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
.preview-img {
|
|
2
|
+
width: 100%;
|
|
3
|
+
height: auto;
|
|
4
|
+
object-fit: cover;
|
|
5
|
+
object-position: center;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
.preview-root {
|
|
9
|
+
border: 1px solid #ccc;
|
|
10
|
+
border-radius: 0.5rem;
|
|
11
|
+
width: 100%;
|
|
12
|
+
max-width: 20rem;
|
|
13
|
+
display: flex;
|
|
14
|
+
flex-direction: column;
|
|
15
|
+
gap: 0.5rem;
|
|
16
|
+
align-items: flex-start;
|
|
17
|
+
justify-content: center;
|
|
18
|
+
box-shadow: rgba(149, 157, 165, 0.2) 0px 8px 24px;
|
|
19
|
+
overflow: hidden;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
.preview-title {
|
|
23
|
+
font-size: 1.5rem;
|
|
24
|
+
font-weight: 700;
|
|
25
|
+
color: #333;
|
|
26
|
+
padding: 0.5rem;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
.preview-description {
|
|
30
|
+
font-size: 1rem;
|
|
31
|
+
font-weight: 500;
|
|
32
|
+
color: #333;
|
|
33
|
+
padding: 0.5rem 0.5rem 1rem 0.5rem;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
.placeholder {
|
|
37
|
+
width: 1rem;
|
|
38
|
+
height: 1rem;
|
|
39
|
+
background: darkgray;
|
|
40
|
+
}
|
package/dist/utils.d.ts
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { EditorState, Transaction } from "prosemirror-state";
|
|
2
|
+
import { DecorationSet } from "prosemirror-view";
|
|
3
|
+
import { PreviewPluginState } from "./previewPlugin";
|
|
4
|
+
export declare const createDecorationsYjs: (state: EditorState) => DecorationSet;
|
|
5
|
+
export declare const createDecorations: (state: EditorState) => DecorationSet;
|
|
6
|
+
export declare const applyYjs: (tr: Transaction, value: PreviewPluginState, oldState: EditorState, newState: EditorState) => {
|
|
7
|
+
id: object;
|
|
8
|
+
pos: any;
|
|
9
|
+
}[];
|
|
10
|
+
export declare const apply: (tr: Transaction, value: PreviewPluginState) => {
|
|
11
|
+
id: object;
|
|
12
|
+
pos: any;
|
|
13
|
+
}[];
|
|
14
|
+
export declare const findPlaceholderYjs: (state: EditorState, id: any) => number | null;
|
|
15
|
+
export declare const findPlaceholder: (state: EditorState, id: any) => number | null;
|
package/package.json
ADDED
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "prosemirror-link-preview",
|
|
3
|
+
"version": "2.0.6",
|
|
4
|
+
"description": "prosemirror-link-preview adds link preview node to your editor",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"module": "dist/index.es.js",
|
|
7
|
+
"types": "dist/index.d.ts",
|
|
8
|
+
"scripts": {
|
|
9
|
+
"prebuild": "rimraf dist",
|
|
10
|
+
"build": "rollup -c --bundleConfigAsCjs",
|
|
11
|
+
"dev": "rollup -c -w --bundleConfigAsCjs",
|
|
12
|
+
"format": "eslint src --ext .ts --fix",
|
|
13
|
+
"prepublishOnly": "npm run build && npm run lint",
|
|
14
|
+
"version": "npm run format && git add -A src",
|
|
15
|
+
"postversion": "git push && git push --tags",
|
|
16
|
+
"lint": "tsc --noEmit && eslint src --ext .ts",
|
|
17
|
+
"test": "echo \"no test specified\" && exit 0",
|
|
18
|
+
"upgrade-interactive": "npm-check --update",
|
|
19
|
+
"publish:np": "np"
|
|
20
|
+
},
|
|
21
|
+
"repository": {
|
|
22
|
+
"type": "git",
|
|
23
|
+
"url": "git+https://github.com/emergence-engineering/prosemirror-link-preview.git"
|
|
24
|
+
},
|
|
25
|
+
"files": [
|
|
26
|
+
"dist/**/*"
|
|
27
|
+
],
|
|
28
|
+
"author": "Emergence Engineering",
|
|
29
|
+
"keywords": [
|
|
30
|
+
"ProseMirror",
|
|
31
|
+
"preview",
|
|
32
|
+
"upload"
|
|
33
|
+
],
|
|
34
|
+
"license": "ISC",
|
|
35
|
+
"bugs": {
|
|
36
|
+
"url": "https://github.com/emergence-engineering/prosemirror-link-preview/issues"
|
|
37
|
+
},
|
|
38
|
+
"homepage": "https://github.com/emergence-engineering/prosemirror-link-preview#readme",
|
|
39
|
+
"peerDependencies": {
|
|
40
|
+
"prosemirror-commands": "^1.1.4",
|
|
41
|
+
"prosemirror-model": "^1.11.0",
|
|
42
|
+
"prosemirror-state": "^1.3.3",
|
|
43
|
+
"prosemirror-view": "^1.15.5",
|
|
44
|
+
"y-prosemirror": "^1.2.1",
|
|
45
|
+
"yjs": "^13.6.1"
|
|
46
|
+
},
|
|
47
|
+
"dependencies": {
|
|
48
|
+
"@typescript-eslint/eslint-plugin": "^5.46.1",
|
|
49
|
+
"@typescript-eslint/parser": "^5.46.1",
|
|
50
|
+
"eslint": "^8.29.0",
|
|
51
|
+
"eslint-config-airbnb": "^19.0.4",
|
|
52
|
+
"eslint-config-prettier": "^8.5.0",
|
|
53
|
+
"eslint-plugin-import": "^2.26.0",
|
|
54
|
+
"eslint-plugin-jest": "^27.1.6",
|
|
55
|
+
"eslint-plugin-jsx-a11y": "^6.6.1",
|
|
56
|
+
"eslint-plugin-prettier": "^4.2.1",
|
|
57
|
+
"eslint-plugin-react": "^7.31.11",
|
|
58
|
+
"prosemirror-model": "^1.11.0",
|
|
59
|
+
"prosemirror-view": "^1.15.5"
|
|
60
|
+
},
|
|
61
|
+
"devDependencies": {
|
|
62
|
+
"np": "^7.6.2",
|
|
63
|
+
"npm-check": "^6.0.1",
|
|
64
|
+
"prettier": "^2.8.1",
|
|
65
|
+
"rollup": "^3.7.4",
|
|
66
|
+
"rollup-plugin-copy": "^3.4.0",
|
|
67
|
+
"rollup-plugin-minification": "^0.2.0",
|
|
68
|
+
"rollup-plugin-peer-deps-external": "^2.2.4",
|
|
69
|
+
"rollup-plugin-typescript2": "^0.34.1",
|
|
70
|
+
"y-prosemirror": "^1.2.1",
|
|
71
|
+
"typescript": "^4.9.4"
|
|
72
|
+
}
|
|
73
|
+
}
|