diff options
Diffstat (limited to 'client/simple/tools')
| -rw-r--r-- | client/simple/tools/img.ts (renamed from client/simple/tools/img.js) | 38 | ||||
| -rw-r--r-- | client/simple/tools/jinja_svg_catalog.ts (renamed from client/simple/tools/jinja_svg_catalog.js) | 105 | ||||
| -rw-r--r-- | client/simple/tools/plg.js | 44 | ||||
| -rw-r--r-- | client/simple/tools/plg.ts | 43 |
4 files changed, 114 insertions, 116 deletions
diff --git a/client/simple/tools/img.js b/client/simple/tools/img.ts index 0b1b96ed8..db4e08645 100644 --- a/client/simple/tools/img.js +++ b/client/simple/tools/img.ts @@ -1,25 +1,26 @@ import fs from "node:fs"; import path from "node:path"; import sharp from "sharp"; +import type { Config } from "svgo"; import { optimize as svgo } from "svgo"; -/** - * @typedef {object} Src2Dest - Mapping of src to dest - * @property {string} src - Name of the source file. - * @property {string} dest - Name of the destination file. - */ +// Mapping of src to dest +export type Src2Dest = { + // Name of the source file. + src: string; + // Name of the destination file. + dest: string; +}; /** * Convert a list of SVG files to PNG. * - * @param {Src2Dest[]} items - Array of SVG files (src: SVG, dest:PNG) to convert. + * @param items - Array of SVG files (src: SVG, dest:PNG) to convert. */ -async function svg2png(items) { +export const svg2png = async (items: Src2Dest[]) => { for (const item of items) { try { - fs.mkdir(path.dirname(item.dest), { recursive: true }, (err) => { - if (err) throw err; - }); + fs.mkdirSync(path.dirname(item.dest), { recursive: true }); const info = await sharp(item.src) .png({ @@ -35,23 +36,22 @@ async function svg2png(items) { throw err; } } -} +}; /** * Optimize SVG images for WEB. * - * @param {Src2Dest[]} items - Array of SVG files (src:SVG, dest:SVG) to optimize. - * @param {import('svgo').Config} svgo_opts - Options passed to svgo. + * @param items - Array of SVG files (src:SVG, dest:SVG) to optimize. + * @param svgo_opts - Options passed to svgo. */ -async function svg2svg(items, svgo_opts) { +export const svg2svg = (items: Src2Dest[], svgo_opts: Config) => { for (const item of items) { try { - fs.mkdir(path.dirname(item.dest), { recursive: true }, (err) => { - if (err) throw err; - }); + fs.mkdirSync(path.dirname(item.dest), { recursive: true }); const raw = fs.readFileSync(item.src, "utf8"); const opt = svgo(raw, svgo_opts); + fs.writeFileSync(item.dest, opt.data); console.log(`[svg2svg] optimized: ${item.dest} -- src: ${item.src}`); } catch (err) { @@ -59,6 +59,4 @@ async function svg2svg(items, svgo_opts) { throw err; } } -} - -export { svg2png, svg2svg }; +}; diff --git a/client/simple/tools/jinja_svg_catalog.js b/client/simple/tools/jinja_svg_catalog.ts index b7b0347b5..1fa1a6676 100644 --- a/client/simple/tools/jinja_svg_catalog.js +++ b/client/simple/tools/jinja_svg_catalog.ts @@ -2,55 +2,56 @@ import fs from "node:fs"; import { dirname, resolve } from "node:path"; import { fileURLToPath } from "node:url"; import { Edge } from "edge.js"; -import { optimize as svgo } from "svgo"; +import { type Config as SvgoConfig, optimize as svgo } from "svgo"; const __dirname = dirname(fileURLToPath(import.meta.url)); const __jinja_class_placeholder__ = "__jinja_class_placeholder__"; -// -- types - -/** - * @typedef {object} IconSet - A set of icons - * @property {object} set - Object of SVG icons, where property name is the - * name of the icon and value is the src of the SVG (relative to base). - * @property {string} base - Folder in which the SVG src files are located. - * @property {import("svgo").Config} svgo_opts - svgo options for this set. - */ - -/** - * @typedef {object} IconSVG - Mapping of icon name to SVG source file. - * @property {string} name - Name of the icon isource file. - * @property {string} src - Name of the destination file. - * @property {import("svgo").Config} svgo_opts - Options passed to svgo. - */ - -/** - * @typedef {object} JinjaMacro - Arguments to create a jinja macro - * @property {string} name - Name of the jinja macro. - * @property {string} class - SVG's class name (value of XML class attribute) - */ - -// -- functions +// A set of icons +export type IconSet = { + // Object of SVG icons, where property name is the name of the icon and value is the src of the SVG (relative to base) + set: Record<string, string>; + // Folder in which the SVG src files are located + base: string; + // svgo options for this set + svgo_opts: SvgoConfig; +}; + +// Mapping of icon name to SVG source file +type IconSVG = { + // Name of the icon isource file + name: string; + // Name of the destination file + src: string; + // Options passed to svgo + svgo_opts: SvgoConfig; +}; + +// Arguments to create a jinja macro +export type JinjaMacro = { + // Name of the jinja macro + name: string; + // SVG's class name (value of XML class attribute) + class: string; +}; /** * Generate a jinja template with a catalog of SVG icons that can be - * used in in other HTML jinja templates. + * used in other HTML jinja templates. * - * @param {string} dest - filename of the generate jinja template. - * @param {JinjaMacro} macros - Jinja macros to create. - * @param {IconSVG[]} items - Array of SVG items. + * @param dest - filename of the generate jinja template. + * @param macros - Jinja macros to create. + * @param items - Array of SVG items. */ - -function jinja_svg_catalog(dest, macros, items) { - const svg_catalog = {}; +export const jinja_svg_catalog = (dest: string, macros: JinjaMacro[], items: IconSVG[]) => { + const svg_catalog: Record<string, string> = {}; const edge_template = resolve(__dirname, "jinja_svg_catalog.html.edge"); - items.forEach((item) => { - /** @type {import("svgo").Config} */ - // JSON.stringify & JSON.parse are used to create a deep copy of the - // item.svgo_opts object - const svgo_opts = JSON.parse(JSON.stringify(item.svgo_opts)); - svgo_opts.plugins.push({ + for (const item of items) { + // JSON.stringify & JSON.parse are used to create a deep copy of the item.svgo_opts object + const svgo_opts: SvgoConfig = JSON.parse(JSON.stringify(item.svgo_opts)); + + svgo_opts.plugins?.push({ name: "addClassesToSVGElement", params: { classNames: [__jinja_class_placeholder__] @@ -60,12 +61,13 @@ function jinja_svg_catalog(dest, macros, items) { try { const raw = fs.readFileSync(item.src, "utf8"); const opt = svgo(raw, svgo_opts); + svg_catalog[item.name] = opt.data; } catch (err) { console.error(`ERROR: jinja_svg_catalog processing ${item.name} src: ${item.src} -- ${err}`); throw err; } - }); + } fs.mkdir(dirname(dest), { recursive: true }, (err) => { if (err) throw err; @@ -85,35 +87,34 @@ function jinja_svg_catalog(dest, macros, items) { fs.writeFileSync(dest, jinjatmpl); console.log(`[jinja_svg_catalog] created: ${dest}`); -} +}; /** * Calls jinja_svg_catalog for a collection of icon sets where each set has its * own parameters. * - * @param {string} dest - filename of the generate jinja template. - * @param {JinjaMacro} macros - Jinja macros to create. - * @param {IconSet[]} sets - Array of SVG sets. + * @param dest - filename of the generate jinja template. + * @param macros - Jinja macros to create. + * @param sets - Array of SVG sets. */ -function jinja_svg_sets(dest, macros, sets) { - /** @type IconSVG[] */ - const items = []; - const all = []; +export const jinja_svg_sets = (dest: string, macros: JinjaMacro[], sets: IconSet[]) => { + const items: IconSVG[] = []; + const all: string[] = []; + for (const obj of sets) { for (const [name, file] of Object.entries(obj.set)) { if (all.includes(name)) { throw new Error(`ERROR: ${name} has already been defined`); } + + all.push(name); items.push({ name: name, src: resolve(obj.base, file), svgo_opts: obj.svgo_opts }); } - jinja_svg_catalog(dest, macros, items); } -} - -// -- exports -export { jinja_svg_sets, jinja_svg_catalog }; + jinja_svg_catalog(dest, macros, items); +}; diff --git a/client/simple/tools/plg.js b/client/simple/tools/plg.js deleted file mode 100644 index 74e488fc4..000000000 --- a/client/simple/tools/plg.js +++ /dev/null @@ -1,44 +0,0 @@ -/** - * Custom vite plugins to build the web-client components of the simple theme. - * - * HINT: - * - * This is an inital implementation for the migration of the build process - * from grunt to vite. For fully support (vite: build & serve) more work is - * needed. - */ - -import { svg2png, svg2svg } from "./img.js"; - -/** - * Vite plugin to convert a list of SVG files to PNG. - * - * @param {import('./img.js').Src2Dest[]} items - Array of SVG files (src: SVG, dest:PNG) to convert. - */ -function plg_svg2png(items) { - return { - name: "searxng-simple-svg2png", - apply: "build", // or 'serve' - async writeBundle() { - await svg2png(items); - } - }; -} - -/** - * Vite plugin to optimize SVG images for WEB. - * - * @param {import('./img.js').Src2Dest[]} items - Array of SVG files (src:SVG, dest:SVG) to optimize. - * @param {import('svgo').Config} svgo_opts - Options passed to svgo. - */ -function plg_svg2svg(items, svgo_opts) { - return { - name: "searxng-simple-svg2png", - apply: "build", // or 'serve' - async writeBundle() { - await svg2svg(items, svgo_opts); - } - }; -} - -export { plg_svg2png, plg_svg2svg }; diff --git a/client/simple/tools/plg.ts b/client/simple/tools/plg.ts new file mode 100644 index 000000000..2db891d4f --- /dev/null +++ b/client/simple/tools/plg.ts @@ -0,0 +1,43 @@ +/** + * Custom vite plugins to build the web-client components of the simple theme. + * + * HINT: + * This is an inital implementation for the migration of the build process + * from grunt to vite. For fully support (vite: build & serve) more work is + * needed. + */ + +import type { Config } from "svgo"; +import type { Plugin } from "vite"; +import { type Src2Dest, svg2png, svg2svg } from "./img.ts"; + +/** + * Vite plugin to convert a list of SVG files to PNG. + * + * @param items - Array of SVG files (src: SVG, dest:PNG) to convert. + */ +export const plg_svg2png = (items: Src2Dest[]): Plugin => { + return { + name: "searxng-simple-svg2png", + apply: "build", + async writeBundle() { + await svg2png(items); + } + }; +}; + +/** + * Vite plugin to optimize SVG images for WEB. + * + * @param items - Array of SVG files (src:SVG, dest:SVG) to optimize. + * @param svgo_opts - Options passed to svgo. + */ +export const plg_svg2svg = (items: Src2Dest[], svgo_opts: Config): Plugin => { + return { + name: "searxng-simple-svg2svg", + apply: "build", + writeBundle() { + svg2svg(items, svgo_opts); + } + }; +}; |