From c77c58e18143233be042c4980a6ed08ae9beac52 Mon Sep 17 00:00:00 2001 From: Armand Philippot Date: Mon, 16 May 2022 19:40:23 +0200 Subject: chore: adjust and complete missing styles * add logo to topics pages and links * add Prism styles to articles * and a few other adjustements --- src/utils/hooks/use-add-prism-class-attr.tsx | 60 ++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 src/utils/hooks/use-add-prism-class-attr.tsx (limited to 'src/utils/hooks/use-add-prism-class-attr.tsx') diff --git a/src/utils/hooks/use-add-prism-class-attr.tsx b/src/utils/hooks/use-add-prism-class-attr.tsx new file mode 100644 index 0000000..7d33cc2 --- /dev/null +++ b/src/utils/hooks/use-add-prism-class-attr.tsx @@ -0,0 +1,60 @@ +import { useCallback, useEffect, useState } from 'react'; + +export type AttributesMap = { + [key: string]: string; +}; + +export type useAddPrismClassAttrProps = { + attributes?: AttributesMap; + classNames?: string; +}; + +/** + * Add classnames and/or attributes to pre elements. + * + * @param props - An object of attributes and classnames. + */ +const useAddPrismClassAttr = ({ + attributes, + classNames, +}: useAddPrismClassAttrProps) => { + const [elements, setElements] = useState([]); + + useEffect(() => { + const targetElements = document.querySelectorAll('pre'); + setElements(Array.from(targetElements)); + }, []); + + const setClassNameAndAttributes = useCallback( + (array: HTMLElement[]) => { + array.forEach((el) => { + if (classNames) { + const classNamesArray = classNames.split(' '); + const isCommandLine = el.classList.contains('command-line'); + const removedClassName = isCommandLine + ? 'line-numbers' + : 'command-line'; + const filteredClassNames = classNamesArray.filter( + (className) => className !== removedClassName + ); + filteredClassNames.forEach((className) => + el.classList.add(className) + ); + } + + if (attributes) { + for (const [key, value] of Object.entries(attributes)) { + el.setAttribute(key, value); + } + } + }); + }, + [attributes, classNames] + ); + + useEffect(() => { + if (elements.length > 0) setClassNameAndAttributes(elements); + }, [elements, setClassNameAndAttributes]); +}; + +export default useAddPrismClassAttr; -- cgit v1.2.3