'use strict' const fs = require('fs') const path = require('path') const mimeType = require('mime-types') const sizeOf = require('image-size') const themePath = path.resolve(__dirname, '../assets/theme') const themeList = {} fs.readdirSync(themePath).forEach(theme => { if (!(theme in themeList)) themeList[theme] = {} const imgList = fs.readdirSync(path.resolve(themePath, theme)) imgList.forEach(img => { const imgPath = path.resolve(themePath, theme, img) const num = path.parse(img).name const { width, height } = sizeOf(imgPath) themeList[theme][num] = { width, height, data: convertToDatauri(imgPath) } }) }) function convertToDatauri(path) { const mime = mimeType.lookup(path) const base64 = fs.readFileSync(path).toString('base64') return `data:${mime};base64,${base64}` } function getCountImage(params) { let { count, theme = 'moebooru', padding = 7, offset = 0, scale = 1, pixelated = '1', darkmode = 'auto' } = params if (!(theme in themeList)) theme = 'moebooru' padding = parseInt(padding, 10) offset = parseInt(offset, 10) // This is not the greatest way for generating an SVG but it'll do for now const countArray = count.toString().padStart(padding, '0').split('') const uniqueChar = [...new Set(countArray)] let x = 0, y = 0 const defs = uniqueChar.reduce((ret, cur) => { let { width, height, data } = themeList[theme][cur] width *= scale height *= scale if (height > y) y = height ret = `${ret} ` return ret }, '') const parts = countArray.reduce((ret, cur) => { let { width } = themeList[theme][cur] width *= scale const image = `${ret} ` x += width + offset return image }, '') // Fix the last image offset x -= offset const style = ` svg { ${pixelated === '1' ? 'image-rendering: pixelated;' : ''} ${darkmode === '1' ? 'filter: brightness(.6);' : ''} } ${darkmode === 'auto' ? `@media (prefers-color-scheme: dark) { svg { filter: brightness(.6); } }` : ''} ` return ` Moe Counter! ${defs} ${parts} ` } module.exports = { themeList, getCountImage }