75 lines
2.4 KiB
JavaScript
75 lines
2.4 KiB
JavaScript
// Rôle : regroupe les constantes et helpers DOM du bloc-notes riche.
|
|
export const TEXT_COLORS = ["#f5f7ff", "#b4bdd3", "#f6c453", "#22d3ee", "#8b5cf6", "#d946ef"];
|
|
export const HIGHLIGHT_COLORS = ["#f6c453", "#22d3ee", "#8b5cf6", "#d946ef", "#202745"];
|
|
export const DRAWING_WIDTHS = [2, 4, 8, 12];
|
|
|
|
export function getPlainText(element) {
|
|
return (element?.innerText || "").replace(/\n{3,}/g, "\n\n").trim();
|
|
}
|
|
|
|
export function getSelectionTextOffset(container) {
|
|
const selection = document.getSelection();
|
|
if (!container || !selection?.rangeCount || !container.contains(selection.anchorNode)) return null;
|
|
const range = selection.getRangeAt(0);
|
|
const prefix = range.cloneRange();
|
|
prefix.selectNodeContents(container);
|
|
prefix.setEnd(range.startContainer, range.startOffset);
|
|
return prefix.toString().length;
|
|
}
|
|
|
|
export function restoreSelectionTextOffset(container, offset) {
|
|
if (!container || offset == null) return;
|
|
const walker = document.createTreeWalker(container, NodeFilter.SHOW_TEXT);
|
|
let remaining = offset;
|
|
let node = walker.nextNode();
|
|
while (node) {
|
|
const length = node.textContent.length;
|
|
if (remaining <= length) {
|
|
const range = document.createRange();
|
|
range.setStart(node, remaining);
|
|
range.collapse(true);
|
|
const selection = document.getSelection();
|
|
selection.removeAllRanges();
|
|
selection.addRange(range);
|
|
return;
|
|
}
|
|
remaining -= length;
|
|
node = walker.nextNode();
|
|
}
|
|
const range = document.createRange();
|
|
range.selectNodeContents(container);
|
|
range.collapse(false);
|
|
const selection = document.getSelection();
|
|
selection.removeAllRanges();
|
|
selection.addRange(range);
|
|
}
|
|
|
|
export function isHtmlEmpty(html, text) {
|
|
return !text && !String(html || "").replace(/<br\s*\/?>/gi, "").replace(/<[^>]*>/g, "").replace(/ /gi, " ").trim();
|
|
}
|
|
|
|
export function formatUpdatedAt(value) {
|
|
if (!value) return "";
|
|
const date = new Date(value);
|
|
if (Number.isNaN(date.getTime())) return "";
|
|
return new Intl.DateTimeFormat("fr-FR", {
|
|
dateStyle: "short",
|
|
timeStyle: "short"
|
|
}).format(date);
|
|
}
|
|
|
|
export function queryCommandState(command) {
|
|
try {
|
|
return document.queryCommandState(command);
|
|
} catch {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
export function queryBlockFormat() {
|
|
try {
|
|
return String(document.queryCommandValue("formatBlock") || "").replace(/[<>]/g, "").toLowerCase();
|
|
} catch {
|
|
return "";
|
|
}
|
|
}
|