Spaces:
Runtime error
Runtime error
| /* eslint-disable import/no-commonjs */ | |
| const SansSerif = require('./NotoSans-Medium.ttf'); | |
| const Serif = require('./SourceSerifPro-Regular.otf'); | |
| const Handwriting = require('./handlee-regular.ttf'); | |
| const Marker = require('./Knewave.ttf'); | |
| const Curly = require('./Griffy-Regular.ttf'); | |
| const Pixel = require('./Grand9K-Pixel.ttf'); | |
| // Xtraflexidisc is saved as Scratch for backwards-compat, this needs visual renaming | |
| const Scratch = require('./Xtraflexidisc.otf'); | |
| /* PenguinMod Fonts */ | |
| const Technological = require('./MonospaceBold.ttf'); | |
| const Bubbly = require('./QTKooper.otf'); | |
| const Playful = require('./BadComic-Regular.ttf'); | |
| const BitsAndBytes = require('./freecam-v2.ttf'); | |
| const Arcade = require('./PressStart2P.ttf'); | |
| const Archivo = require('./Archivo-Regular.ttf'); | |
| const ArchivoBlack = require('./Archivo-Black.ttf'); | |
| const log = require('../log').default; | |
| const fontSource = { | |
| 'Sans Serif': SansSerif, | |
| 'Serif': Serif, | |
| 'Handwriting': Handwriting, | |
| 'Marker': Marker, | |
| 'Curly': Curly, | |
| 'Pixel': Pixel, | |
| // Xtraflexidisc is saved as Scratch for backwards-compat, this needs visual renaming | |
| 'Scratch': Scratch, | |
| 'Technological': Technological, | |
| 'Bubbly': Bubbly, | |
| 'Bits and Bytes': BitsAndBytes, | |
| 'Playful': Playful, | |
| 'Arcade': Arcade, | |
| 'Archivo': Archivo, | |
| 'Archivo Black': ArchivoBlack | |
| }; | |
| const fontData = {}; | |
| const fetchFonts = () => { | |
| const promises = []; | |
| for (const fontName of Object.keys(fontSource)) { | |
| promises.push(fetch(fontSource[fontName]) | |
| .then(res => { | |
| if (!res.ok) { | |
| throw new Error(`Cannot load font: ${fontName} (invalid HTTP response)`); | |
| } | |
| return res.blob(); | |
| }) | |
| .then(blob => new Promise((resolve, reject) => { | |
| const fr = new FileReader(); | |
| fr.onload = () => resolve(fr.result); | |
| fr.onerror = () => reject(new Error(`Cannot load font: ${fontName} (could not read)`)); | |
| fr.readAsDataURL(blob); | |
| })) | |
| .then(url => { | |
| fontData[fontName] = `@font-face{font-family:"${fontName}";src:url("${url}");}`; | |
| }) | |
| .catch(err => { | |
| log.error(err); | |
| }) | |
| ); | |
| } | |
| return Promise.all(promises); | |
| }; | |
| const addFontsToDocument = () => { | |
| if (document.getElementById('scratch-font-styles')) { | |
| return; | |
| } | |
| let css = ''; | |
| for (const fontName of Object.keys(fontSource)) { | |
| const fontCSS = fontData[fontName]; | |
| if (fontCSS) { | |
| css += fontCSS; | |
| } | |
| } | |
| const documentStyleTag = document.createElement('style'); | |
| documentStyleTag.id = 'scratch-font-styles'; | |
| documentStyleTag.textContent = css; | |
| document.body.insertBefore(documentStyleTag, document.body.firstChild); | |
| }; | |
| const waitForFontsToLoad = () => { | |
| const promises = []; | |
| if (document.fonts && document.fonts.load) { | |
| for (const fontName in fontData) { | |
| promises.push(document.fonts.load(`12px ${fontName}`)); | |
| } | |
| } | |
| return Promise.all(promises); | |
| }; | |
| const loadFonts = () => fetchFonts() | |
| .then(() => { | |
| addFontsToDocument(); | |
| return waitForFontsToLoad(); | |
| }) | |
| .catch(err => { | |
| log.error(err); | |
| }); | |
| const getFonts = () => fontData; | |
| // We have to use legacy module.exports as some parts of Scratch expect require('scratch-render-font') to be a function | |
| module.exports = getFonts; | |
| module.exports.loadFonts = loadFonts; | |
| module.exports.FONTS = fontData; | |