ngx-tiptap-editor
Version:
[](https://github.com/HuiiBuh/ngx-tiptap-editor/actions/workflows/publish.yml) [ => {
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