Spaces:
Running
on
CPU Upgrade
Running
on
CPU Upgrade
| export class Utils { | |
| private static escapeMap = { | |
| /// From underscore.js | |
| '&': '&', | |
| '<': '<', | |
| '>': '>', | |
| '"': '"', | |
| "'": ''', | |
| '`': '`' | |
| }; | |
| /** | |
| * Escape a message's content for insertion into html. | |
| */ | |
| static escape(s: string): string { | |
| let x = s; | |
| for (const [k, v] of Object.entries(this.escapeMap)) { | |
| x = x.replace(new RegExp(k, 'g'), v); | |
| } | |
| return x.replace(/\n/g, '<br>'); | |
| } | |
| /** | |
| * Opposite of escape. | |
| */ | |
| static unescape(s: string): string { | |
| let x = s.replace(/<br>/g, '\n'); | |
| for (const [k, v] of Object.entries(this.escapeMap)) { | |
| x = x.replace(new RegExp(v, 'g'), k); | |
| } | |
| return x; | |
| } | |
| /** | |
| * "Real" modulo (always >= 0), not remainder. | |
| */ | |
| static mod(a: number, n: number): number { | |
| return ((a % n) + n) % n; | |
| } | |
| /** | |
| * Noop object with arbitrary number of nested attributes that are also noop. | |
| */ | |
| static deepNoop() { | |
| const noop = new Proxy(() => {}, { | |
| get: () => noop | |
| }); | |
| return noop; | |
| } | |
| /** | |
| * Capitalize | |
| */ | |
| static capitalize(s: string): string { | |
| return s.charAt(0).toUpperCase() + s.slice(1); | |
| } | |
| /** | |
| * Returns a promise that will resolve after the specified time | |
| * @param ms Number of ms to wait | |
| */ | |
| static delay(ms: number): Promise<void> { | |
| return new Promise((resolve, reject) => { | |
| setTimeout(() => resolve(), ms); | |
| }); | |
| } | |
| /** | |
| * Random element from array | |
| */ | |
| static randomItem<T>(arr: T[]): T { | |
| return arr[Math.floor(Math.random()*arr.length)]; | |
| } | |
| } | |