OverviewFilesCommitsIssuesDocsReleasesPeers

ollama_semantic_function_calling / ollamatools-new / keet / node_modules / @holepunchto / emojis / index.js

133 lines · javascript ref:
import toArray from 'lodash.toarray'
import rawEmojisBase from './data/raw-emojis-base.js'
import rawEmojisCustom from './data/raw-emojis-custom.js'
import messages from './data/messages.js'
import skinTones from './data/skin-tones.js'

const CATEGORY_RECENTS = 'recents'
const CATEGORY_CUSTOM = 'custom'

const dataByShortCode = new Map()
const dataByEmoji = new Map()
const dataByHex = new Map()
const customEmojisData = []
const allEmojisData = []
const allEmojisDataByTone = {}
const categories = []

const normalizeEmoji = (raw, { emojisPath }) => {
  const { path, pathRiv, ...rest } = raw
  const result = { ...rest }
  if (path) {
    result.url = `${emojisPath}${path}`
  }
  if (pathRiv) {
    result.urlRiv = `${emojisPath}${pathRiv}`
  }
  return result
}

function fill(emojiData) {
  for (const shortCode of emojiData.shortCodes) {
    dataByShortCode.set(shortCode, emojiData)
  }
  dataByEmoji.set(emojiData.emoji, emojiData)
  dataByHex.set(emojiData.hexcode, emojiData)
  emojiData.skins?.forEach(fill)
}

export function initEmojis({ emojisPath = '/assets/emojis/' }) {
  rawEmojisCustom.forEach((raw) => {
    const customEmojiData = normalizeEmoji(raw, { emojisPath })
    const data = { ...customEmojiData, custom: true }    
    fill(data)
    customEmojisData.push(data)
    allEmojisData.push(data)
  })

  rawEmojisBase.forEach((emojiData) => {
    fill(emojiData)
    allEmojisData.push(emojiData)
  })

  categories.push(CATEGORY_RECENTS)
  categories.push(CATEGORY_CUSTOM)
  messages.groups.forEach(({ key }) => categories.push(key))
}

export function getEmojiData (any) {
  return dataByHex.get(any) || dataByShortCode.get(any) || dataByEmoji.get(any)
}

export function getDataOfSkin (tone) {
  if (!tone) return allEmojisData

  if (!allEmojisDataByTone[tone]) {
    allEmojisDataByTone[tone] = allEmojisData.map((emoji) => {
      return emoji.skins?.find(skin => skin.tone === tone) || emoji
    })
  }

  return allEmojisDataByTone[tone]
}

export function emojify (text, format) {
  return text
    .split(/:([a-zA-Z0-9_\-+]+):/g)
    .map((string, index) => {
      if (index % 2 === 0) {
        return string
      }

      if (!dataByShortCode.has(string)) {
        return `:${string}:`
      }
      const emojiData = dataByShortCode.get(string)
      const { emoji, alt } = emojiData

      if (format) {
        return format(emoji, string, emojiData)
      }

      return alt ? alt : emoji
    })
    .join('')
}

export function unemojify (text) {
  return toArray(text)
    .map((char) => {
      if (dataByEmoji.has(char)) {
        return `:${dataByEmoji.get(char).shortCodes[0]}:`
      }

      const hex = char.codePointAt(0).toString(16).toUpperCase()
      if (dataByHex.has(hex)) {
        return `:${dataByHex.get(hex).shortCodes[0]}:`
      }

      return char
    })
    .join('')
}

export function getAllEmojisData () {
  return allEmojisData
}

export function getCustomEmojisData () {
  return customEmojisData
}

export function getEmojiMessages () {
  return messages
}

export function getCategories () {
  return categories
}

export function getSkinTones () {
  return skinTones
}