UNPKG

ngx-tiptap-editor

Version:

[![Build and Publish](https://github.com/HuiiBuh/ngx-tiptap-editor/actions/workflows/publish.yml/badge.svg)](https://github.com/HuiiBuh/ngx-tiptap-editor/actions/workflows/publish.yml) [![Deploy to Github Pages](https://github.com/HuiiBuh/ngx-tiptap-edito

102 lines 15.3 kB
import { from as rxFrom, Observable, pipe } from 'rxjs'; import { concatMap, filter, map } from 'rxjs/operators'; const findExtension = (editor, name) => { return editor.extensionManager.extensions.find(e => e.name === name); }; export const getHeadingsExtension = (editor) => { return findExtension(editor, 'heading'); }; export const sleep = (ms) => new Promise(resolve => setTimeout(resolve, ms)); export const fromEditorEvent = (editor, event, once = false) => { return new Observable((observer) => { const callback = (...params) => { observer.next(...params); if (once) editor.off(event, callback); }; editor.on(event, callback); return () => { editor.off(event, callback); }; }); }; export const asyncFilter = (predicate) => { let count = 0; return pipe( // Convert the predicate Promise<boolean> to an observable (which resolves the promise, // Then combine the boolean result of the promise with the input data to a container object concatMap((data) => { return rxFrom(predicate(data, count++)) .pipe(map((isValid) => ({ filterResult: isValid, entry: data }))); }), // Filter the container object synchronously for the value in each data container object filter(data => data.filterResult), // remove the data container object from the observable chain map(data => data.entry)); }; export const getSelectedTextPosition = () => { const selection = document.getSelection(); if (!selection) return null; const range = selection.getRangeAt(0); return range.getBoundingClientRect(); }; export const getLinkFromCursorPosition = (editor) => { const link = editor.getAttributes('link'); return link && link.href ? link.href : null; }; export const getLinkDOMFromCursorPosition = ({ state: { selection: { from } }, view }, link = null) => { const dom = view.domAtPos(from); let selector = 'a'; if (link) selector = `a[href="${link}"]`; return dom.node.parentElement.closest(selector); }; export const getSelectedEditorTextPosition = ({ state, view }) => { const { from, to } = state.selection; const start = view.coordsAtPos(from); const end = view.coordsAtPos(to); return { start, end, topCenter: { y: start.top, x: start.left + (end.left - start.left) / 2 } }; }; export const topCenterOfRect = (rect) => { return { y: rect.y, x: rect.x + rect.width / 2 }; }; export const getDuplicates = (list, getKey) => { const hashMap = {}; for (const item of list) { const key = getKey(item); if (!(key in hashMap)) hashMap[key] = []; hashMap[key].push(item); } const duplicates = {}; for (const hashKey of Object.keys(hashMap)) { if (hashMap[hashKey].length > 1) duplicates[hashKey] = hashMap[hashKey]; } return Object.keys(duplicates).length > 0 ? duplicates : null; }; export const isObject = (o) => typeof o === 'object' && !Array.isArray(o); export const deepMerge = (target, source) => { const targetCopy = { ...target }; for (const key of Object.keys(source)) { if (isObject(source[key])) { const newTarget = isObject(target[key]) ? target[key] : {}; targetCopy[key] = deepMerge(newTarget, source[key]); } else { targetCopy[key] = source[key]; } } return targetCopy; }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVscGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL25neC10aXB0YXAtZWRpdG9yL3NyYy9saWIvaGVscGVycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsSUFBSSxJQUFJLE1BQU0sRUFBNEIsVUFBVSxFQUFFLElBQUksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNsRixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUl4RCxNQUFNLGFBQWEsR0FBRyxDQUFDLE1BQWMsRUFBRSxJQUFZLEVBQUUsRUFBRTtJQUNyRCxPQUFPLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsQ0FBQztBQUN2RSxDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxvQkFBb0IsR0FBRyxDQUFDLE1BQWMsRUFBcUIsRUFBRTtJQUN4RSxPQUFPLGFBQWEsQ0FBQyxNQUFNLEVBQUUsU0FBUyxDQUFzQixDQUFDO0FBQy9ELENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLEtBQUssR0FBRyxDQUFDLEVBQVUsRUFBRSxFQUFFLENBQUMsSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFFckYsTUFBTSxDQUFDLE1BQU0sZUFBZSxHQUFHLENBQXdCLE1BQWMsRUFBRSxLQUFRLEVBQUUsSUFBSSxHQUFHLEtBQUssRUFBb0MsRUFBRTtJQUNqSSxPQUFPLElBQUksVUFBVSxDQUFNLENBQUMsUUFBUSxFQUFFLEVBQUU7UUFDdEMsTUFBTSxRQUFRLEdBQUcsQ0FBQyxHQUFHLE1BQWEsRUFBRSxFQUFFO1lBQ3BDLFFBQVEsQ0FBQyxJQUFJLENBQUMs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TyxDQUFDLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0tBQ3pFO0lBRUQsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0FBQ2hFLENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLFFBQVEsR0FBRyxDQUFDLENBQU0sRUFBVyxFQUFFLENBQUMsT0FBTyxDQUFDLEtBQUssUUFBUSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUV4RixNQUFNLENBQUMsTUFBTSxTQUFTLEdBQUcsQ0FBeUMsTUFBUyxFQUFFLE1BQXdCLEVBQUssRUFBRTtJQUMxRyxNQUFNLFVBQVUsR0FBaUMsRUFBQyxHQUFHLE1BQU0sRUFBQyxDQUFDO0lBQzdELEtBQUssTUFBTSxHQUFHLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRTtRQUVyQyxJQUFJLFFBQVEsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRTtZQUN6QixNQUFNLFNBQVMsR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQzNELFVBQVUsQ0FBQyxHQUFHLENBQUMsR0FBRyxTQUFTLENBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1NBQ3JEO2FBQU07WUFDTCxVQUFVLENBQUMsR0FBRyxDQUFDLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQy9CO0tBQ0Y7SUFDRCxPQUFPLFVBQWUsQ0FBQztBQUN6QixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IEVkaXRvciB9IGZyb20gJ0B0aXB0YXAvY29yZSc7XG5pbXBvcnQgeyBmcm9tIGFzIHJ4RnJvbSwgTW9ub1R5cGVPcGVyYXRvckZ1bmN0aW9uLCBPYnNlcnZhYmxlLCBwaXBlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBjb25jYXRNYXAsIGZpbHRlciwgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgRWRpdG9yRXZlbnQsIEVkaXRvckV2ZW50UmV0dXJuLCBIZWFkaW5nc0V4dGVuc2lvbiB9IGZyb20gJy4vbW9kZWxzL3R5cGVzJztcblxuXG5jb25zdCBmaW5kRXh0ZW5zaW9uID0gKGVkaXRvcjogRWRpdG9yLCBuYW1lOiBzdHJpbmcpID0+IHtcbiAgcmV0dXJuIGVkaXRvci5leHRlbnNpb25NYW5hZ2VyLmV4dGVuc2lvbnMuZmluZChlID0+IGUubmFtZSA9PT0gbmFtZSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0SGVhZGluZ3NFeHRlbnNpb24gPSAoZWRpdG9yOiBFZGl0b3IpOiBIZWFkaW5nc0V4dGVuc2lvbiA9PiB7XG4gIHJldHVybiBmaW5kRXh0ZW5zaW9uKGVkaXRvciwgJ2hlYWRpbmcnKSBhcyBIZWFkaW5nc0V4dGVuc2lvbjtcbn07XG5cbmV4cG9ydCBjb25zdCBzbGVlcCA9IChtczogbnVtYmVyKSA9PiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgbXMpKTtcblxuZXhwb3J0IGNvbnN0IGZyb21FZGl0b3JFdmVudCA9IDxUIGV4dGVuZHMgRWRpdG9yRXZlbnQ+KGVkaXRvcjogRWRpdG9yLCBldmVudDogVCwgb25jZSA9IGZhbHNlKTogT2JzZXJ2YWJsZTxFZGl0b3JFdmVudFJldHVybltUXT4gPT4ge1xuICByZXR1cm4gbmV3IE9ic2VydmFibGU8YW55Pigob2JzZXJ2ZXIpID0+IHtcbiAgICBjb25zdCBjYWxsYmFjayA9ICguLi5wYXJhbXM6IGFueVtdKSA9PiB7XG4gICAgICBvYnNlcnZlci5uZXh0KC4uLnBhcmFtcyk7XG4gICAgICBpZiAob25jZSkgZWRpdG9yLm9mZihldmVudCwgY2FsbGJhY2spO1xuICAgIH07XG4gICAgZWRpdG9yLm9uKGV2ZW50LCBjYWxsYmFjayk7XG5cbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgZWRpdG9yLm9mZihldmVudCwgY2FsbGJhY2spO1xuICAgIH07XG4gIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGFzeW5jRmlsdGVyID0gPFQ+KHByZWRpY2F0ZTogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyKSA9PiBQcm9taXNlPGJvb2xlYW4+KTogTW9ub1R5cGVPcGVyYXRvckZ1bmN0aW9uPFQ+ID0+IHtcbiAgbGV0IGNvdW50ID0gMDtcbiAgcmV0dXJuIHBpcGUoXG4gICAgLy8gQ29udmVydCB0aGUgcHJlZGljYXRlIFByb21pc2U8Ym9vbGVhbj4gdG8gYW4gb2JzZXJ2YWJsZSAod2hpY2ggcmVzb2x2ZXMgdGhlIHByb21pc2UsXG4gICAgLy8gVGhlbiBjb21iaW5lIHRoZSBib29sZWFuIHJlc3VsdCBvZiB0aGUgcHJvbWlzZSB3aXRoIHRoZSBpbnB1dCBkYXRhIHRvIGEgY29udGFpbmVyIG9iamVjdFxuICAgIGNvbmNhdE1hcCgoZGF0YTogVCkgPT4ge1xuICAgICAgcmV0dXJuIHJ4RnJvbShwcmVkaWNhdGUoZGF0YSwgY291bnQrKykpXG4gICAgICAgIC5waXBlKG1hcCgoaXNWYWxpZCkgPT4gKHtmaWx0ZXJSZXN1bHQ6IGlzVmFsaWQsIGVudHJ5OiBkYXRhfSkpKTtcbiAgICB9KSxcbiAgICAvLyBGaWx0ZXIgdGhlIGNvbnRhaW5lciBvYmplY3Qgc3luY2hyb25vdXNseSBmb3IgdGhlIHZhbHVlIGluIGVhY2ggZGF0YSBjb250YWluZXIgb2JqZWN0XG4gICAgZmlsdGVyKGRhdGEgPT4gZGF0YS5maWx0ZXJSZXN1bHQpLFxuICAgIC8vIHJlbW92ZSB0aGUgZGF0YSBjb250YWluZXIgb2JqZWN0IGZyb20gdGhlIG9ic2VydmFibGUgY2hhaW5cbiAgICBtYXAoZGF0YSA9PiBkYXRhLmVudHJ5KVxuICApO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFNlbGVjdGVkVGV4dFBvc2l0aW9uID0gKCk6IG51bGwgfCBET01SZWN0ID0+IHtcbiAgY29uc3Qgc2VsZWN0aW9uID0gZG9jdW1lbnQuZ2V0U2VsZWN0aW9uKCk7XG4gIGlmICghc2VsZWN0aW9uKSByZXR1cm4gbnVsbDtcbiAgY29uc3QgcmFuZ2UgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKTtcbiAgcmV0dXJuIHJhbmdlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xufTtcblxuXG5leHBvcnQgY29uc3QgZ2V0TGlua0Zyb21DdXJzb3JQb3NpdGlvbiA9IChlZGl0b3I6IEVkaXRvcikgPT4ge1xuICBjb25zdCBsaW5rID0gZWRpdG9yLmdldEF0dHJpYnV0ZXMoJ2xpbmsnKTtcbiAgcmV0dXJuIGxpbmsgJiYgbGluay5ocmVmID8gbGluay5ocmVmIDogbnVsbDtcbn07XG5cblxuZXhwb3J0IGNvbnN0IGdldExpbmtET01Gcm9tQ3Vyc29yUG9zaXRpb24gPSAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZToge3NlbGVjdGlvbjoge2Zyb219fSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlld1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTogRWRpdG9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluazogbnVsbCB8IHN0cmluZyA9IG51bGwpID0+IHtcbiAgY29uc3QgZG9tID0gdmlldy5kb21BdFBvcyhmcm9tKTtcbiAgbGV0IHNlbGVjdG9yID0gJ2EnO1xuICBpZiAobGluaykgc2VsZWN0b3IgPSBgYVtocmVmPVwiJHtsaW5rfVwiXWA7XG4gIHJldHVybiBkb20ubm9kZS5wYXJlbnRFbGVtZW50IS5jbG9zZXN0PEhUTUxBbmNob3JFbGVtZW50PihzZWxlY3Rvcik7XG59O1xuXG5cbmV4cG9ydCBjb25zdCBnZXRTZWxlY3RlZEVkaXRvclRleHRQb3NpdGlvbiA9ICh7c3RhdGUsIHZpZXd9OiBFZGl0b3IpID0+IHtcbiAgY29uc3Qge2Zyb20sIHRvfSA9IHN0YXRlLnNlbGVjdGlvbjtcbiAgY29uc3Qgc3RhcnQgPSB2aWV3LmNvb3Jkc0F0UG9zKGZyb20pO1xuICBjb25zdCBlbmQgPSB2aWV3LmNvb3Jkc0F0UG9zKHRvKTtcbiAgcmV0dXJuIHtcbiAgICBzdGFydCwgZW5kLFxuICAgIHRvcENlbnRlcjoge1xuICAgICAgeTogc3RhcnQudG9wLFxuICAgICAgeDogc3RhcnQubGVmdCArIChlbmQubGVmdCAtIHN0YXJ0LmxlZnQpIC8gMlxuICAgIH1cbiAgfTtcbn07XG5cbmV4cG9ydCBjb25zdCB0b3BDZW50ZXJPZlJlY3QgPSAocmVjdDogRE9NUmVjdCk6IHsgeDogbnVtYmVyOyB5OiBudW1iZXIgfSA9PiB7XG4gIHJldHVybiB7XG4gICAgeTogcmVjdC55LFxuICAgIHg6IHJlY3QueCArIHJlY3Qud2lkdGggLyAyXG4gIH07XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0RHVwbGljYXRlcyA9IDxUPihsaXN0OiBUW10sIGdldEtleTogKGl0ZW06IFQpID0+IHN0cmluZyk6IHsgW2tleTogc3RyaW5nXTogVFtdIH0gfCBudWxsID0+IHtcbiAgY29uc3QgaGFzaE1hcDogUmVjb3JkPHN0cmluZywgVFtdPiA9IHt9O1xuICBmb3IgKGNvbnN0IGl0ZW0gb2YgbGlzdCkge1xuICAgIGNvbnN0IGtleSA9IGdldEtleShpdGVtKTtcbiAgICBpZiAoIShrZXkgaW4gaGFzaE1hcCkpIGhhc2hNYXBba2V5XSA9IFtdO1xuICAgIGhhc2hNYXBba2V5XS5wdXNoKGl0ZW0pO1xuICB9XG5cbiAgY29uc3QgZHVwbGljYXRlczogUmVjb3JkPHN0cmluZywgVFtdPiA9IHt9O1xuICBmb3IgKGNvbnN0IGhhc2hLZXkgb2YgT2JqZWN0LmtleXMoaGFzaE1hcCkpIHtcbiAgICBpZiAoaGFzaE1hcFtoYXNoS2V5XS5sZW5ndGggPiAxKSBkdXBsaWNhdGVzW2hhc2hLZXldID0gaGFzaE1hcFtoYXNoS2V5XTtcbiAgfVxuXG4gIHJldHVybiBPYmplY3Qua2V5cyhkdXBsaWNhdGVzKS5sZW5ndGggPiAwID8gZHVwbGljYXRlcyA6IG51bGw7XG59O1xuXG5leHBvcnQgY29uc3QgaXNPYmplY3QgPSAobzogYW55KTogYm9vbGVhbiA9PiB0eXBlb2YgbyA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkobyk7XG5cbmV4cG9ydCBjb25zdCBkZWVwTWVyZ2UgPSA8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcgfCBudW1iZXIsIGFueT4+KHRhcmdldDogVCwgc291cmNlOiBSZWNvcmQ8YW55LCBhbnk+KTogVCA9PiB7XG4gIGNvbnN0IHRhcmdldENvcHk6IFJlY29yZDxzdHJpbmcgfCBudW1iZXIsIGFueT4gPSB7Li4udGFyZ2V0fTtcbiAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoc291cmNlKSkge1xuXG4gICAgaWYgKGlzT2JqZWN0KHNvdXJjZVtrZXldKSkge1xuICAgICAgY29uc3QgbmV3VGFyZ2V0ID0gaXNPYmplY3QodGFyZ2V0W2tleV0pID8gdGFyZ2V0W2tleV0gOiB7fTtcbiAgICAgIHRhcmdldENvcHlba2V5XSA9IGRlZXBNZXJnZShuZXdUYXJnZXQsIHNvdXJjZVtrZXldKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGFyZ2V0Q29weVtrZXldID0gc291cmNlW2tleV07XG4gICAgfVxuICB9XG4gIHJldHVybiB0YXJnZXRDb3B5IGFzIFQ7XG59O1xuIl19