the browser-facing portion of osu!
at master 1.8 kB view raw
1// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the GNU Affero General Public License v3.0. 2// See the LICENCE file in the repository root for full licence text. 3 4import GroupJson from 'interfaces/group-json'; 5import { forEach } from 'lodash'; 6import { present } from './string'; 7 8export type Modifiers = (string | null | undefined)[] | Partial<Record<string, boolean | null | undefined>> | string | null | undefined; 9 10const eachModifier = (modifiersArray: Modifiers[], callback: (modifier: string) => void) => { 11 modifiersArray.forEach((modifiers) => { 12 if (Array.isArray(modifiers)) { 13 modifiers.forEach((modifier) => { 14 if (modifier != null) { 15 callback(modifier); 16 } 17 }); 18 } else if (typeof modifiers === 'string') { 19 callback(modifiers); 20 } else { 21 forEach(modifiers, (isActive, modifier) => { 22 if (isActive) { 23 callback(modifier); 24 } 25 }); 26 } 27 }); 28}; 29 30export function classWithModifiers(className: string, ...modifiersArray: Modifiers[]) { 31 let ret = className; 32 33 eachModifier(modifiersArray, (m) => ret += ` ${className}--${m}`); 34 35 return ret; 36} 37 38export function groupColour(group?: GroupJson | null) { 39 return { '--group-colour': group?.colour ?? 'initial' }; 40} 41 42export function mergeModifiers(...modifiersArray: Modifiers[]) { 43 const ret: string[] = []; 44 45 eachModifier(modifiersArray, (m) => ret.push(m)); 46 47 return ret; 48} 49 50export function urlPresence(url?: string | null) { 51 // Wrapping the string with quotes and escaping the used quotes inside 52 // is sufficient. Use double quote as it's easy to figure out with 53 // encodeURI (it doesn't escape single quote). 54 return present(url) ? `url("${String(url).replace(/"/g, '%22')}")` : undefined; 55} 56