Skip to content
Snippets Groups Projects
Select Git revision
  • 8b2ded8a0eec2fe5b86dbfc70d6c6766995d0717
  • master default protected
  • hughns/rust-send-to-device
  • hughns/rtc-to-device-key-distribution
  • develop
  • rav/token_encryption_improvements
  • actions/playwright-image-updates
  • staging
  • hs/timezone-publish-to-profile
  • renovate/all-minor-patch
  • florianduros/pinned-messages/unpin-timeline-event
  • florianduros/pinned-messages/link-timeline-fix
  • renovate/major-testing-library-monorepo
  • langleyd/new_memberlist_ux
  • dbkr/token_incorrect
  • renovate/lock-file-maintenance
  • florianduros/fix/spotlight-click
  • backport-12906-to-staging
  • rav/remove_dead_package_json_stuff
  • florianduros/pinned-messages/timeline-separator
  • dbkr/threepid_medium_unsupported
  • v3.109.0
  • v3.109.0-rc.0
  • v3.108.0
  • v3.108.0-rc.0
  • v3.107.0
  • v3.106.0
  • v3.106.0-rc.1
  • v3.106.0-rc.0
  • v3.105.1
  • v3.105.0
  • v3.104.0
  • v3.104.0-rc.1
  • v3.104.0-rc.0
  • v3.103.0
  • v3.103.0-rc.1
  • v3.103.0-rc.0
  • v3.102.0
  • v3.102.0-rc.1
  • v3.102.0-rc.0
  • v3.101.0
41 results

docker-entrypoint.sh

Blame
  • logos.js 3.20 KiB
    import Joi from 'joi'
    import {
      toSvgColor,
      brightness,
      normalizeColor,
    } from '../badge-maker/lib/color.js'
    import coalesce from '../core/base-service/coalesce.js'
    import { svg2base64 } from './svg-helpers.js'
    import loadLogos from './load-logos.js'
    import loadSimpleIcons from './load-simple-icons.js'
    const logos = loadLogos()
    const simpleIcons = loadSimpleIcons()
    
    // for backwards-compatibility with deleted logos
    const logoAliases = {
      azuredevops: 'azure-devops',
      eclipse: 'eclipse-ide',
      'gitter-white': 'gitter',
      scrutinizer: 'scrutinizer-ci',
      stackoverflow: 'stack-overflow',
      tfs: 'azure-devops',
    }
    const lightThreshold = 0.4
    const darkThreshold = 0.6
    
    function prependPrefix(s, prefix) {
      if (s === undefined) {
        return undefined
      }
    
      s = `${s}`
    
      if (s.startsWith(prefix)) {
        return s
      } else {
        return prefix + s
      }
    }
    
    function isDataUrl(s) {
      try {
        Joi.assert(s, Joi.string().dataUri())
        return true
      } catch (e) {
        return false
      }
    }
    
    // +'s are replaced with spaces when used in query params, this returns them
    // to +'s, then removes remaining whitespace.
    // https://github.com/badges/shields/pull/1546
    function decodeDataUrlFromQueryParam(value) {
      if (typeof value !== 'string') {
        return undefined
      }
      const maybeDataUrl = prependPrefix(value, 'data:')
        .replace(/ /g, '+')
        .replace(/\s/g, '')
      return isDataUrl(maybeDataUrl) ? maybeDataUrl : undefined
    }
    
    function getShieldsIcon({ name, color }) {
      if (!(name in logos)) {
        return undefined
      }
    
      const { svg, base64, isMonochrome } = logos[name]
      const svgColor = toSvgColor(color)
      if (svgColor && isMonochrome) {
        return svg2base64(svg.replace(/fill="(.+?)"/g, `fill="${svgColor}"`))
      } else {
        return base64
      }
    }
    
    function getSimpleIconStyle({ icon, style }) {
      const { hex } = icon
      if (style !== 'social' && brightness(normalizeColor(hex)) <= lightThreshold) {
        return 'light'
      }
      if (style === 'social' && brightness(normalizeColor(hex)) >= darkThreshold) {
        return 'dark'
      }
      return 'default'
    }
    
    function getSimpleIcon({ name, color, style }) {
      const key = name.replace(/ /g, '-')
    
      if (!(key in simpleIcons)) {
        return undefined
      }
    
      const svgColor = toSvgColor(color)
      if (svgColor) {
        return svg2base64(
          simpleIcons[key].svg.replace('<svg', `<svg fill="${svgColor}"`)
        )
      } else {
        const iconStyle = getSimpleIconStyle({ icon: simpleIcons[key], style })
        return simpleIcons[key].base64[iconStyle]
      }
    }
    
    function prepareNamedLogo({ name, color, style }) {
      if (typeof name !== 'string') {
        return undefined
      }
    
      name = name.toLowerCase()
    
      if (name in logoAliases) {
        name = logoAliases[name]
      }
    
      return (
        getShieldsIcon({ name, color }) || getSimpleIcon({ name, color, style })
      )
    }
    
    function makeLogo(defaultNamedLogo, overrides) {
      const maybeDataUrl = decodeDataUrlFromQueryParam(overrides.logo)
      if (maybeDataUrl) {
        return maybeDataUrl
      } else {
        return prepareNamedLogo({
          name: coalesce(overrides.logo, defaultNamedLogo),
          color: overrides.logoColor,
          style: overrides.style,
        })
      }
    }
    
    export {
      prependPrefix,
      isDataUrl,
      decodeDataUrlFromQueryParam,
      prepareNamedLogo,
      getShieldsIcon,
      getSimpleIcon,
      makeLogo,
    }