Files
xrpl-dev-portal/@theme/helpers.ts
Mayukha Vadari 0b247281eb run prettier
2026-01-12 14:19:31 -05:00

71 lines
2.0 KiB
TypeScript

/**
* Slugify function, has to match the formula used in interactive-tutorial.js
*/
import { useEffect, useState } from 'react'
export const useThemeFromClassList = (classNames) => {
const [currentTheme, setCurrentTheme] = useState(null)
useEffect(() => {
// Function to update the theme based on the class list
const updateTheme = () => {
for (const className of classNames) {
if (document.documentElement.classList.contains(className)) {
setCurrentTheme(className)
return
}
}
}
// Initial update
updateTheme()
// Create an observer instance linked to the callback function
const observer = new MutationObserver(() => {
updateTheme()
})
// Start observing the target node for configured mutations
observer.observe(document.documentElement, {
attributes: true, // Listen for attribute changes
attributeFilter: ['class'], // Specifically, listen only to "class" attribute changes
})
// Cleanup: Disconnect the observer
return () => {
observer.disconnect()
}
}, [classNames])
return currentTheme
}
export function slugify(s) {
const unacceptable_chars = /[^A-Za-z0-9._ ]+/g
const whitespace_regex = /\s+/g
s = s.replace(unacceptable_chars, '')
s = s.replace(whitespace_regex, '_')
s = s.toLowerCase()
if (!s) {
s = '_'
}
return s
}
export function idify(s: string) {
// like slugify, but more unicode-friendly.
// for some reason the better version using \p gives an "s12 is undefined" TypeError sometimes,
// so it's disabled for now. With that fixed, we could use localized step names in interactive tutorials.
//s = s.replace(/[^\p{Alphabetic}\p{Mark}\p{Decimal_Number}\p{Connector_Punctuation}\p{Join_Control}]/gu, '').trim().toLowerCase()
//s = s.replace(/[^\w\s-]/gu, '').trim().toLowerCase()
s = s
.replace(/([^\w]|[\s-])/gu, '')
.trim()
.toLowerCase()
s = s.replace(/[\s-]+/gu, '-')
if (!s) {
s = '_'
}
return s
}