X-Git-Url: http://source.bookstackapp.com/bookstack/blobdiff_plain/b3d3b14f79552299ce558083383cf05c2f1a7d90..refs/pull/5681/head:/resources/js/wysiwyg/utils/dom.ts diff --git a/resources/js/wysiwyg/utils/dom.ts b/resources/js/wysiwyg/utils/dom.ts index 7426ac592..8bacd1002 100644 --- a/resources/js/wysiwyg/utils/dom.ts +++ b/resources/js/wysiwyg/utils/dom.ts @@ -29,4 +29,71 @@ export function formatSizeValue(size: number | string, defaultSuffix: string = ' } return size; +} + +export function sizeToPixels(size: string): number { + if (/^-?\d+$/.test(size)) { + return Number(size); + } + + if (/^-?\d+\.\d+$/.test(size)) { + return Math.round(Number(size)); + } + + if (/^-?\d+px\s*$/.test(size)) { + return Number(size.trim().replace('px', '')); + } + + return 0; +} + +export type StyleMap = Map; + +/** + * Creates a map from an element's styles. + * Uses direct attribute value string handling since attempting to iterate + * over .style will expand out any shorthand properties (like 'padding') + * rather than being representative of the actual properties set. + */ +export function extractStyleMapFromElement(element: HTMLElement): StyleMap { + const styleText= element.getAttribute('style') || ''; + return styleStringToStyleMap(styleText); +} + +/** + * Convert string-formatted styles into a StyleMap. + */ +export function styleStringToStyleMap(styleText: string): StyleMap { + const map: StyleMap = new Map(); + + const rules = styleText.split(';'); + for (const rule of rules) { + const [name, value] = rule.split(':'); + if (!name || !value) { + continue; + } + + map.set(name.trim().toLowerCase(), value.trim()); + } + + return map; +} + +/** + * Convert a StyleMap into inline string style text. + */ +export function styleMapToStyleString(map: StyleMap): string { + const parts = []; + for (const [style, value] of map.entries()) { + parts.push(`${style}:${value}`); + } + return parts.join(';'); +} + +export function setOrRemoveAttribute(element: HTMLElement, name: string, value: string|null|undefined) { + if (value) { + element.setAttribute(name, value); + } else { + element.removeAttribute(name); + } } \ No newline at end of file