mirror of
https://github.com/smogon/pokemon-showdown.git
synced 2026-04-21 18:17:28 -05:00
51 lines
1.6 KiB
TypeScript
51 lines
1.6 KiB
TypeScript
/**
|
|
* 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)}
|
|
} />;
|
|
}
|
|
}
|