Spaces:
Paused
Paused
| /** | |
| * PS custom HTML elements and Preact handling. | |
| * By Mia and Zarel | |
| */ | |
| import preact from 'preact'; | |
| import render from 'preact-render-to-string'; | |
| import { Utils } from '../lib'; | |
| /** For easy concenation of Preact nodes with strings */ | |
| export function html( | |
| strings: TemplateStringsArray, ...args: (preact.VNode | string | number | null | undefined)[] | |
| ) { | |
| let buf = strings[0]; | |
| let i = 0; | |
| while (i < args.length) { | |
| buf += typeof args[i] === 'string' || typeof args[i] === 'number' ? | |
| Utils.escapeHTML(args[i] as string | number) : | |
| render(args[i] as preact.VNode); | |
| buf += strings[++i]; | |
| } | |
| return buf; | |
| } | |
| /** client-side custom elements */ | |
| export interface PSElements extends preact.JSX.IntrinsicElements { | |
| youtube: { src: string }; | |
| twitch: { src: string, width?: number, height?: number }; | |
| spotify: { src: string }; | |
| username: { name?: string, class?: string, children?: preact.VNode | string }; | |
| psicon: { pokemon: string } | { item: string } | { type: string } | { category: string }; | |
| center: { class?: string }; | |
| } | |
| export { render }; | |
| export type VNode = preact.VNode; | |
| export const h = preact.h; | |
| export const Fragment = preact.Fragment; | |
| export const Component = preact.Component; | |
| export class FormatText extends preact.Component<{ isTrusted?: boolean, replaceLinebreaks?: boolean }> { | |
| render() { | |
| const child = this.props.children; | |
| if (typeof child !== 'string') throw new Error(`Invalid props.children type: ${!child ? child : typeof child}`); | |
| return <span | |
| dangerouslySetInnerHTML={{ __html: Chat.formatText(child, this.props.isTrusted, this.props.replaceLinebreaks) }} | |
| />; | |
| } | |
| } | |