@zodiac-ui/editor
Version:
A rich text editor for Angular based on `@atlaskit/editor-core`.
102 lines • 16.3 kB
JavaScript
import { Selection } from 'prosemirror-state';
import { filterCommands } from "../../lib/utils/filter";
import { normalizeUrl } from "./utils";
import { canLinkBeCreatedInRange, LinkAction, pluginKey } from "./pm/hyperlink";
export function isTextAtPos(pos) {
return (state) => {
const node = state.doc.nodeAt(pos);
return !!node && node.isText;
};
}
export function isLinkAtPos(pos) {
return (state) => {
const node = state.doc.nodeAt(pos);
return !!node && state.schema.marks.link.isInSet(node.marks);
};
}
export function setLinkHref(href, pos, to) {
return filterCommands(isTextAtPos(pos), (state, dispatch) => {
const $pos = state.doc.resolve(pos);
const node = state.doc.nodeAt(pos);
const linkMark = state.schema.marks.link;
const mark = linkMark.isInSet(node.marks);
const url = normalizeUrl(href);
if (mark && mark.attrs.href === url) {
return false;
}
const rightBound = to && pos !== to ? to : pos - $pos.textOffset + node.nodeSize;
const tr = state.tr.removeMark(pos, rightBound, linkMark);
if (href.trim()) {
tr.addMark(pos, rightBound, linkMark.create(Object.assign({}, ((mark && mark.attrs) || {}), { href: url })));
tr.setMeta(pluginKey, LinkAction.HIDE_TOOLBAR);
}
if (dispatch) {
dispatch(tr);
}
return true;
});
}
export function setLinkText(text, pos, to) {
return filterCommands(isLinkAtPos(pos), (state, dispatch) => {
const $pos = state.doc.resolve(pos);
const node = state.doc.nodeAt(pos);
const mark = state.schema.marks.link.isInSet(node.marks);
if (node && text.length > 0 && text !== node.text) {
const rightBound = to && pos !== to ? to : pos - $pos.textOffset + node.nodeSize;
const tr = state.tr;
tr.insertText(text, pos, rightBound);
tr.addMark(pos, pos + text.length, mark);
tr.setMeta(pluginKey, LinkAction.HIDE_TOOLBAR);
if (dispatch) {
dispatch(tr);
}
return true;
}
return false;
});
}
export function insertLink(from, to, href, text) {
return filterCommands(canLinkBeCreatedInRange(from, to), (state, dispatch) => {
const link = state.schema.marks.link;
if (href.trim()) {
const { tr } = state;
if (from === to) {
const textContent = text || href;
tr.insertText(textContent, from, to);
tr.addMark(from, from + textContent.length, link.create({ href: normalizeUrl(href) }));
}
else {
tr.addMark(from, to, link.create({ href: normalizeUrl(href) }));
tr.setSelection(Selection.near(tr.doc.resolve(to)));
}
// queueCardsFromChangedTr(state, tr);
if (dispatch) {
tr.setMeta(pluginKey, LinkAction.HIDE_TOOLBAR);
dispatch(tr);
}
return true;
}
return false;
});
}
export function removeLink(pos) {
return setLinkHref('', pos);
}
export function showLinkToolbar(inputMethod = "toolbar" /* TOOLBAR */) {
return function (state, dispatch) {
if (dispatch) {
const tr = state.tr.setMeta(pluginKey, LinkAction.SHOW_INSERT_TOOLBAR);
dispatch(tr);
}
return true;
};
}
export function hideLinkToolbar() {
return function (state, dispatch) {
if (dispatch) {
dispatch(state.tr.setMeta(pluginKey, LinkAction.HIDE_TOOLBAR));
}
return true;
};
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGluay5jb21tYW5kcy5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0B6b2RpYWMtdWkvZWRpdG9yLyIsInNvdXJjZXMiOlsicGx1Z2lucy9saW5rL2xpbmsuY29tbWFuZHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFlLFNBQVMsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRTNELE9BQU8sRUFBRSxjQUFjLEVBQWEsTUFBTSx3QkFBd0IsQ0FBQTtBQUVsRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sU0FBUyxDQUFBO0FBQ3RDLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUE7QUFHL0UsTUFBTSxVQUFVLFdBQVcsQ0FBQyxHQUFXO0lBQ25DLE9BQU8sQ0FBQyxLQUFrQixFQUFFLEVBQUU7UUFDMUIsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDbkMsT0FBTyxDQUFDLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUM7SUFDakMsQ0FBQyxDQUFDO0FBQ04sQ0FBQztBQUVELE1BQU0sVUFBVSxXQUFXLENBQUMsR0FBVztJQUNuQyxPQUFPLENBQUMsS0FBa0IsRUFBRSxFQUFFO1FBQzFCLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ25DLE9BQU8sQ0FBQyxDQUFDLElBQUksSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNqRSxDQUFDLENBQUM7QUFDTixDQUFDO0FBRUQsTUFBTSxVQUFVLFdBQVcsQ0FBQyxJQUFZLEVBQUUsR0FBVyxFQUFFLEVBQVc7SUFDOUQsT0FBTyxjQUFjLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENB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R0FBRyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDdkQ7WUFFRCxzQ0FBc0M7WUFFdEMsSUFBSSxRQUFRLEVBQUU7Z0JBQ1YsRUFBRSxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDO2dCQUMvQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUM7YUFDaEI7WUFDRCxPQUFPLElBQUksQ0FBQztTQUNmO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDakIsQ0FBQyxDQUFDLENBQUM7QUFDUCxDQUFDO0FBRUQsTUFBTSxVQUFVLFVBQVUsQ0FBQyxHQUFXO0lBQ2xDLE9BQU8sV0FBVyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztBQUNoQyxDQUFDO0FBRUQsTUFBTSxVQUFVLGVBQWUsQ0FDM0IscUNBR2tEO0lBRWxELE9BQU8sVUFBUyxLQUFLLEVBQUUsUUFBUTtRQUMzQixJQUFJLFFBQVEsRUFBRTtZQUNWLE1BQU0sRUFBRSxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxVQUFVLENBQUMsbUJBQW1CLENBQUMsQ0FBQztZQUN2RSxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUM7U0FDaEI7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDLENBQUM7QUFDTixDQUFDO0FBRUQsTUFBTSxVQUFVLGVBQWU7SUFDM0IsT0FBTyxVQUFTLEtBQUssRUFBRSxRQUFRO1FBQzNCLElBQUksUUFBUSxFQUFFO1lBQ1YsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQztTQUNsRTtRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUMsQ0FBQztBQUNOLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJcclxuaW1wb3J0IHsgRWRpdG9yU3RhdGUsIFNlbGVjdGlvbiB9IGZyb20gJ3Byb3NlbWlycm9yLXN0YXRlJztcclxuaW1wb3J0IHsgTWFyaywgTm9kZSB9IGZyb20gJ3Byb3NlbWlycm9yLW1vZGVsJztcclxuaW1wb3J0IHsgZmlsdGVyQ29tbWFuZHMsIFByZWRpY2F0ZSB9IGZyb20gXCIuLi8uLi9saWIvdXRpbHMvZmlsdGVyXCJcclxuaW1wb3J0IHsgQ29tbWFuZCB9IGZyb20gXCIuLi8uLi9saWIvaW50ZXJmYWNlcy9jb21tYW5kXCJcclxuaW1wb3J0IHsgbm9ybWFsaXplVXJsIH0gZnJvbSBcIi4vdXRpbHNcIlxyXG5pbXBvcnQgeyBjYW5MaW5rQmVDcmVhdGVkSW5SYW5nZSwgTGlua0FjdGlvbiwgcGx1Z2luS2V5IH0gZnJvbSBcIi4vcG0vaHlwZXJsaW5rXCJcclxuaW1wb3J0IHsgSU5QVVRfTUVUSE9EIH0gZnJvbSBcIi4uL2Jsb2NrLXR5cGUva2V5bWFwXCJcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBpc1RleHRBdFBvcyhwb3M6IG51bWJlcik6IFByZWRpY2F0ZSB7XHJcbiAgICByZXR1cm4gKHN0YXRlOiBFZGl0b3JTdGF0ZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IG5vZGUgPSBzdGF0ZS5kb2Mubm9kZUF0KHBvcyk7XHJcbiAgICAgICAgcmV0dXJuICEhbm9kZSAmJiBub2RlLmlzVGV4dDtcclxuICAgIH07XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBpc0xpbmtBdFBvcyhwb3M6IG51bWJlcik6IFByZWRpY2F0ZSB7XHJcbiAgICByZXR1cm4gKHN0YXRlOiBFZGl0b3JTdGF0ZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IG5vZGUgPSBzdGF0ZS5kb2Mubm9kZUF0KHBvcyk7XHJcbiAgICAgICAgcmV0dXJuICEhbm9kZSAmJiBzdGF0ZS5zY2hlbWEubWFya3MubGluay5pc0luU2V0KG5vZGUubWFya3MpO1xyXG4gICAgfTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHNldExpbmtIcmVmKGhyZWY6IHN0cmluZywgcG9zOiBudW1iZXIsIHRvPzogbnVtYmVyKTogQ29tbWFuZCB7XHJcbiAgICByZXR1cm4gZmlsdGVyQ29tbWFuZHMoaXNUZXh0QXRQb3MocG9zKSwgKHN0YXRlLCBkaXNwYXRjaCkgPT4ge1xyXG4gICAgICAgIGNvbnN0ICRwb3MgPSBzdGF0ZS5kb2MucmVzb2x2ZShwb3MpO1xyXG4gICAgICAgIGNvbnN0IG5vZGUgPSBzdGF0ZS5kb2Mubm9kZUF0KHBvcykgYXMgTm9kZTtcclxuICAgICAgICBjb25zdCBsaW5rTWFyayA9IHN0YXRlLnNjaGVtYS5tYXJrcy5saW5rO1xyXG4gICAgICAgIGNvbnN0IG1hcmsgPSBsaW5rTWFyay5pc0luU2V0KG5vZGUubWFya3MpIGFzIE1hcmsgfCB1bmRlZmluZWQ7XHJcbiAgICAgICAgY29uc3QgdXJsID0gbm9ybWFsaXplVXJsKGhyZWYpO1xyXG4gICAgICAgIGlmIChtYXJrICYmIG1hcmsuYXR0cnMuaHJlZiA9PT0gdXJsKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IHJpZ2h0Qm91bmQgPVxyXG4gICAgICAgICAgICB0byAmJiBwb3MgIT09IHRvID8gdG8gOiBwb3MgLSAkcG9zLnRleHRPZmZzZXQgKyBub2RlLm5vZGVTaXplO1xyXG5cclxuICAgICAgICBjb25zdCB0ciA9IHN0YXRlLnRyLnJlbW92ZU1hcmsocG9zLCByaWdodEJvdW5kLCBsaW5rTWFyayk7XHJcblxyXG4gICAgICAgIGlmIChocmVmLnRyaW0oKSkge1xyXG4gICAgICAgICAgICB0ci5hZGRNYXJrKFxyXG4gICAgICAgICAgICAgICAgcG9zLFxyXG4gICAgICAgICAgICAgICAgcmlnaHRCb3VuZCxcclxuICAgICAgICAgICAgICAgIGxpbmtNYXJrLmNyZWF0ZSh7XHJcbiAgICAgICAgICAgICAgICAgICAgLi4uKChtYXJrICYmIG1hcmsuYXR0cnMpIHx8IHt9KSxcclxuICAgICAgICAgICAgICAgICAgICBocmVmOiB1cmwsXHJcbiAgICAgICAgICAgICAgICB9KSxcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgdHIuc2V0TWV0YShwbHVnaW5LZXksIExpbmtBY3Rpb24uSElERV9UT09MQkFSKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChkaXNwYXRjaCkge1xyXG4gICAgICAgICAgICBkaXNwYXRjaCh0cik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBzZXRMaW5rVGV4dCh0ZXh0OiBzdHJpbmcsIHBvczogbnVtYmVyLCB0bz86IG51bWJlcik6IENvbW1hbmQge1xyXG4gICAgcmV0dXJuIGZpbHRlckNvbW1hbmRzKGlzTGlua0F0UG9zKHBvcyksIChzdGF0ZSwgZGlzcGF0Y2gpID0+IHtcclxuICAgICAgICBjb25zdCAkcG9zID0gc3RhdGUuZG9jLnJlc29sdmUocG9zKTtcclxuICAgICAgICBjb25zdCBub2RlID0gc3RhdGUuZG9jLm5vZGVBdChwb3MpIGFzIE5vZGU7XHJcbiAgICAgICAgY29uc3QgbWFyayA9IHN0YXRlLnNjaGVtYS5tYXJrcy5saW5rLmlzSW5TZXQobm9kZS5tYXJrcykgYXMgTWFyaztcclxuICAgICAgICBpZiAobm9kZSAmJiB0ZXh0Lmxlbmd0aCA+IDAgJiYgdGV4dCAhPT0gbm9kZS50ZXh0KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJpZ2h0Qm91bmQgPVxyXG4gICAgICAgICAgICAgICAgdG8gJiYgcG9zICE9PSB0byA/IHRvIDogcG9zIC0gJHBvcy50ZXh0T2Zmc2V0ICsgbm9kZS5ub2RlU2l6ZTtcclxuICAgICAgICAgICAgY29uc3QgdHIgPSBzdGF0ZS50cjtcclxuXHJcbiAgICAgICAgICAgIHRyLmluc2VydFRleHQodGV4dCwgcG9zLCByaWdodEJvdW5kKTtcclxuICAgICAgICAgICAgdHIuYWRkTWFyayhwb3MsIHBvcyArIHRleHQubGVuZ3RoLCBtYXJrKTtcclxuICAgICAgICAgICAgdHIuc2V0TWV0YShwbHVnaW5LZXksIExpbmtBY3Rpb24uSElERV9UT09MQkFSKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChkaXNwYXRjaCkge1xyXG4gICAgICAgICAgICAgICAgZGlzcGF0Y2godHIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9KTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGluc2VydExpbmsoXHJcbiAgICBmcm9tOiBudW1iZXIsXHJcbiAgICB0bzogbnVtYmVyLFxyXG4gICAgaHJlZjogc3RyaW5nLFxyXG4gICAgdGV4dD86IHN0cmluZyxcclxuKTogQ29tbWFuZCB7XHJcbiAgICByZXR1cm4gZmlsdGVyQ29tbWFuZHMoY2FuTGlua0JlQ3JlYXRlZEluUmFuZ2UoZnJvbSwgdG8pLCAoc3RhdGUsIGRpc3BhdGNoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgbGluayA9IHN0YXRlLnNjaGVtYS5tYXJrcy5saW5rO1xyXG4gICAgICAgIGlmIChocmVmLnRyaW0oKSkge1xyXG4gICAgICAgICAgICBjb25zdCB7IHRyIH0gPSBzdGF0ZTtcclxuICAgICAgICAgICAgaWYgKGZyb20gPT09IHRvKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB0ZXh0Q29udGVudCA9IHRleHQgfHwgaHJlZjtcclxuICAgICAgICAgICAgICAgIHRyLmluc2VydFRleHQodGV4dENvbnRlbnQsIGZyb20sIHRvKTtcclxuICAgICAgICAgICAgICAgIHRyLmFkZE1hcmsoXHJcbiAgICAgICAgICAgICAgICAgICAgZnJvbSxcclxuICAgICAgICAgICAgICAgICAgICBmcm9tICsgdGV4dENvbnRlbnQubGVuZ3RoLFxyXG4gICAgICAgICAgICAgICAgICAgIGxpbmsuY3JlYXRlKHsgaHJlZjogbm9ybWFsaXplVXJsKGhyZWYpIH0pLFxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRyLmFkZE1hcmsoZnJvbSwgdG8sIGxpbmsuY3JlYXRlKHsgaHJlZjogbm9ybWFsaXplVXJsKGhyZWYpIH0pKTtcclxuICAgICAgICAgICAgICAgIHRyLnNldFNlbGVjdGlvbihTZWxlY3Rpb24ubmVhcih0ci5kb2MucmVzb2x2ZSh0bykpKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gcXVldWVDYXJkc0Zyb21DaGFuZ2VkVHIoc3RhdGUsIHRyKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChkaXNwYXRjaCkge1xyXG4gICAgICAgICAgICAgICAgdHIuc2V0TWV0YShwbHVnaW5LZXksIExpbmtBY3Rpb24uSElERV9UT09MQkFSKTtcclxuICAgICAgICAgICAgICAgIGRpc3BhdGNoKHRyKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVMaW5rKHBvczogbnVtYmVyKTogQ29tbWFuZCB7XHJcbiAgICByZXR1cm4gc2V0TGlua0hyZWYoJycsIHBvcyk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBzaG93TGlua1Rvb2xiYXIoXHJcbiAgICBpbnB1dE1ldGhvZDpcclxuICAgICAgICB8IElOUFVUX01FVEhPRC5UT09MQkFSXHJcbiAgICAgICAgfCBJTlBVVF9NRVRIT0QuUVVJQ0tfSU5TRVJUXHJcbiAgICAgICAgfCBJTlBVVF9NRVRIT0QuU0hPUlRDVVQgPSBJTlBVVF9NRVRIT0QuVE9PTEJBUixcclxuKTogQ29tbWFuZCB7XHJcbiAgICByZXR1cm4gZnVuY3Rpb24oc3RhdGUsIGRpc3BhdGNoKSB7XHJcbiAgICAgICAgaWYgKGRpc3BhdGNoKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHRyID0gc3RhdGUudHIuc2V0TWV0YShwbHVnaW5LZXksIExpbmtBY3Rpb24uU0hPV19JTlNFUlRfVE9PTEJBUik7XHJcbiAgICAgICAgICAgIGRpc3BhdGNoKHRyKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gaGlkZUxpbmtUb29sYmFyKCk6IENvbW1hbmQge1xyXG4gICAgcmV0dXJuIGZ1bmN0aW9uKHN0YXRlLCBkaXNwYXRjaCkge1xyXG4gICAgICAgIGlmIChkaXNwYXRjaCkge1xyXG4gICAgICAgICAgICBkaXNwYXRjaChzdGF0ZS50ci5zZXRNZXRhKHBsdWdpbktleSwgTGlua0FjdGlvbi5ISURFX1RPT0xCQVIpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9O1xyXG59XHJcbiJdfQ==