mirror of
				https://github.com/excalidraw/excalidraw.git
				synced 2025-10-31 19:04:35 +01:00 
			
		
		
		
	feat: subset font glyphs for SVG export (#8384)
Co-authored-by: dwelle <5153846+dwelle@users.noreply.github.com>
This commit is contained in:
		
							
								
								
									
										75
									
								
								scripts/buildWasm.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										75
									
								
								scripts/buildWasm.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,75 @@ | ||||
| /** | ||||
|  * This script is used to convert the wasm modules into js modules, with the binary converted into base64 encoded strings. | ||||
|  */ | ||||
| const fs = require("fs"); | ||||
| const path = require("path"); | ||||
|  | ||||
| const wasmModules = [ | ||||
|   { | ||||
|     pkg: `../node_modules/fonteditor-core`, | ||||
|     src: `./wasm/woff2.wasm`, | ||||
|     dest: `../packages/excalidraw/fonts/wasm/woff2.wasm.ts`, | ||||
|   }, | ||||
|   { | ||||
|     pkg: `../node_modules/harfbuzzjs`, | ||||
|     src: `./wasm/hb-subset.wasm`, | ||||
|     dest: `../packages/excalidraw/fonts/wasm/hb-subset.wasm.ts`, | ||||
|   }, | ||||
| ]; | ||||
|  | ||||
| for (const { pkg, src, dest } of wasmModules) { | ||||
|   const packagePath = path.resolve(__dirname, pkg, "package.json"); | ||||
|   const licensePath = path.resolve(__dirname, pkg, "LICENSE"); | ||||
|   const sourcePath = path.resolve(__dirname, src); | ||||
|   const destPath = path.resolve(__dirname, dest); | ||||
|  | ||||
|   const { | ||||
|     name, | ||||
|     version, | ||||
|     author, | ||||
|     license, | ||||
|     authors, | ||||
|     licenses, | ||||
|   } = require(packagePath); | ||||
|  | ||||
|   const licenseContent = fs.readFileSync(licensePath, "utf-8") || ""; | ||||
|   const base64 = fs.readFileSync(sourcePath, "base64"); | ||||
|   const content = `// GENERATED CODE -- DO NOT EDIT! | ||||
| /* eslint-disable prettier/prettier */ | ||||
| // @ts-nocheck | ||||
|  | ||||
| /** | ||||
| * The following wasm module is generated with \`scripts/buildWasm.js\` and encoded as base64. | ||||
| * | ||||
| * The source of this content is taken from the package "${name}", which contains the following metadata: | ||||
| *  | ||||
| * @author ${author || JSON.stringify(authors)}  | ||||
| * @license ${license || JSON.stringify(licenses)} | ||||
| * @version ${version} | ||||
|  | ||||
| ${licenseContent} | ||||
| */ | ||||
|  | ||||
| // faster atob alternative - https://github.com/evanw/esbuild/issues/1534#issuecomment-902738399 | ||||
| const __toBinary = /* @__PURE__ */ (() => { | ||||
|   const table = new Uint8Array(128); | ||||
|   for (let i = 0; i < 64; i++) | ||||
|     {table[i < 26 ? i + 65 : i < 52 ? i + 71 : i < 62 ? i - 4 : i * 4 - 205] = i;} | ||||
|   return (base64) => { | ||||
|     const n = base64.length; const bytes = new Uint8Array((n - (base64[n - 1] == "=") - (base64[n - 2] == "=")) * 3 / 4 | 0); | ||||
|     for (let i2 = 0, j = 0; i2 < n; ) { | ||||
|       const c0 = table[base64.charCodeAt(i2++)]; const c1 = table[base64.charCodeAt(i2++)]; | ||||
|       const c2 = table[base64.charCodeAt(i2++)]; const c3 = table[base64.charCodeAt(i2++)]; | ||||
|       bytes[j++] = c0 << 2 | c1 >> 4; | ||||
|       bytes[j++] = c1 << 4 | c2 >> 2; | ||||
|       bytes[j++] = c2 << 6 | c3; | ||||
|     } | ||||
|     return bytes; | ||||
|   }; | ||||
| })(); | ||||
|  | ||||
| export default __toBinary(\`${base64}\`); | ||||
| `; | ||||
|  | ||||
|   fs.writeFileSync(destPath, content); | ||||
| } | ||||
		Reference in New Issue
	
	Block a user
	 Marcel Mraz
					Marcel Mraz