feat(alias): filename -> snake_case alias converter
This commit is contained in:
30
src/alias.js
Normal file
30
src/alias.js
Normal file
@@ -0,0 +1,30 @@
|
||||
// src/alias.js
|
||||
// Pure functions for deriving snake_case aliases from sprite filenames.
|
||||
// No I/O.
|
||||
|
||||
const path = require('node:path');
|
||||
const SUPPORTED_EXT = ['.png', '.webp', '.jpg', '.jpeg'];
|
||||
|
||||
function stripPrefix(name, prefix) {
|
||||
if (!prefix) return name;
|
||||
if (name.startsWith(prefix)) return name.slice(prefix.length);
|
||||
return name;
|
||||
}
|
||||
|
||||
// CamelCase -> snake_case. Boundary: lowercase/digit -> uppercase.
|
||||
function camelToSnakeCase(s) {
|
||||
return s
|
||||
.replace(/([a-z0-9])([A-Z])/g, '$1_$2')
|
||||
.toLowerCase();
|
||||
}
|
||||
|
||||
function aliasFromFilename(filename, opts = {}) {
|
||||
const ext = path.extname(filename).toLowerCase();
|
||||
let base = SUPPORTED_EXT.includes(ext)
|
||||
? filename.slice(0, -ext.length)
|
||||
: filename;
|
||||
if (opts.stripPrefix) base = stripPrefix(base, opts.stripPrefix);
|
||||
return camelToSnakeCase(base);
|
||||
}
|
||||
|
||||
module.exports = { stripPrefix, camelToSnakeCase, aliasFromFilename };
|
||||
Reference in New Issue
Block a user