深入解析 @directus/format-title:把 camelCase、下划线与普通句子统一规范化为 Title Case 的字符串格式化工具

发布时间:2026/9/10 13:52:52

深入解析 @directus/format-title:把 camelCase、下划线与普通句子统一规范化为 Title Case 的字符串格式化工具 深入解析 directus/format-title把 camelCase、下划线与普通句子统一规范化为 Title Case 的字符串格式化工具【免费下载链接】directusThe flexible backend for all your projects Turn your DB into a headless CMS, admin panels, or apps with a custom UI, instant APIs, auth more.项目地址: https://gitcode.com/GitHub_Trending/di/directusdirectus/format-title 是 Directus 开源仓库中独立发布的字符串格式化子包其核心使命是把 camelCase、PascalCase、snake_case 乃至普通英文句子统一转换为符合出版规范的 Title Case标题大小写。本文将从该包的 README 出发结合 核心实现、词表常量 与 测试用例讲清它的安装方式、调用签名、默认分隔符规则以及底层那套专有大小写词 首尾词 短词小写的 APA 风格判定管线帮助你在自己的数据展示、字段名美化或 UI 文案场景中直接用上这套能力。包定位解决机器命名 → 人类可读标题的最后一公里在真实业务中数据库字段往往叫snowWhiteAndTheSevenDwarfs、NewcastleUponTyne、apple_releases_new_ipad这类便于代码引用的标识符而展示给用户时却希望看到 Snow White and the Seven Dwarfs 这样自然、规范的标题。directus/format-title 就是为此设计的定制格式化器custom formatter。按 README 的定位它默认可以把四种输入风格转换为 Title CasecamelCase如snowWhiteAndTheSevenDwarfsPascalCase如NewcastleUponTyneunderscore/snake_case如brighton_on_sea以及常规句子regular sentences。转换遵循美国心理学会发布的 Title Case 规范 明确援引主要词汇使用大写而定冠词、连词与介词除非出现在标题开头或结尾否则一律不大写。例如and、on、the这些词在标题中部保持小写这就是 Snow Whiteandthe Seven Dwarfs 而不是 Snow White And The Seven Dwarfs 的原因。转换效果速览README 给出了一组直观的输入/输出对照这些样例同时被固化在 src/index.test.ts 中作为 vitest 断言用例保证行为可回归验证InputOutputsnowWhiteAndTheSevenDwarfsSnow White and the Seven DwarfsNewcastleUponTyneNewcastle Upon Tynebrighton_on_seaBrighton on Seaapple_releases_new_ipadApple Releases New iPad7-food-trends7 Food Trends从这张表能读出三条关键行为数字开头会被完整保留7-food-trends中的7不会被吞掉输出首词 7 Food Trends专有大小写词不随规则被纠正ipad最终输出为 iPad而不是被粗暴首字母大写成 Ipad介词/连词按位置决定大小写brighton_on_sea→ BrightononSea中部的on保持小写。安装与基础用法作为一个可通过 npm 单独安装的独立子包directus/format-title 的安装命令如下npm install directus/format-title从 packages/format-title/package.json 可以看到该包是 ESMtype: module入口为./dist/index.js构建工具使用 tsdown因此引入方式为 ES importformatTitle(string, [separator]); formatTitle(snowWhiteAndTheSevenDwarfs); // Snow White and the Seven DwarfsformatTitle同时支持具名导出与默认导出两种方式见 src/index.ts 末尾方便不同引入风格import formatTitle, { formatTitle as namedFormatTitle } from directus/format-title; // 两者指向同一个实现separator 参数自定义切分字符第二个可选参数separator是一个正则表达式用来控制在哪些字符处把字符串拆成单词。按 README 说明其默认值为/\s|-|_/g也就是同时支持按空白、连字符、下划线三种字符切分formatTitle(hello_world); formatTitle(hello-world); formatTitle(hello world); // 三者均输出 Hello World默认值对应的实现可以在 src/index.ts 的函数签名 中看到export function formatTitle(title: string, separator: RegExp new RegExp(\\s|-|_, g)): string { return decamelize(title).split(separator).map(capitalize).map(handleSpecialWords).reduce(combine); }传入自定义正则即可扩展切分字符集例如希望额外按/或.切分formatTitle(admin/users/manage, /[/\s\-_.]/g); // 需要说明切分后每个片段都会经过独立的大小写判定值得强调的是camelCase/PascalCase 并不是靠 separator 拆开的而是由管线最前端的decamelize统一先转换为下划线形式详见下文随后才交给separator正则切分。这意味着即使你传入了自定义 separatorcamelCase 的拆分能力依然有效。工作原理五步处理管线的源码级拆解formatTitle的实现只有一行却是一条非常清晰的数据处理管线src/index.ts#L6-L8decamelize → split(separator) → map(capitalize) → map(handleSpecialWords) → reduce(combine)第一步decamelize —— 拆开驼峰并把所有字符转小写utils/decamelize.ts 用两条正则完成驼峰拆分随后统一.toLowerCase()export function decamelize(string: string): string { return string .replace(/([a-z\d])([A-Z])/g, $1_$2) // 小写/数字 大写之间补下划线 .replace(/([A-Z])([A-Z][a-z\d])/g, $1_$2) // 连续大写后接大写小写处补下划线 .toLowerCase(); }第一条正则处理snowWhite→snow_White这类小写/数字后紧跟大写的边界第二条正则处理连续缩写场景例如iPhoneXSupport中的XSupport边界可正确拆出IPHONE_X_SUPPORT随后统一转小写。因为拆完后已经全部转为小写后续的切分与大小写判定就可以基于统一的小写词根进行。第二步split(separator) —— 按默认正则切词拆完驼峰并转小写后的字符串通过String.prototype.split以默认正则/\s|-|_/g切成单词数组供后续逐词处理。第三步capitalize —— 每个词首字母大写utils/capitalize.ts 只做一件事把每个词的首字母转大写、其余保持不变export function capitalize(word: string): string { return word.charAt(0).toUpperCase() word.substring(1); }此时snow_white_and_the_seven_dwarfs已被拆成词并逐词大写为Snow、White、And、The……但这还是全首字母大写版本需要下一步按标题规范修正小词。第四步handleSpecialWords —— APA Title Case 的核心判定这是整个包的灵魂所在。utils/handle-special-words.ts 对每个词按以下优先级依次判定专有大小写词special-case命中直接返回原样遍历specialCase列表只要不区分大小写地命中如输入ipad命中原词iPad就返回词表中书写形式即输出iPad而非Ipad首字母缩写acronym命中则整体大写若str.toUpperCase()存在于acronyms列表中如api、sql、pdf返回全大写形式位于标题首位/末位的词即使它是介词或连词也保持当前已大写形式返回对应 README 中除非它们位于标题开头或结尾的规则长度 ≥ 4 的词保持大写因此Seven、Dwarfs这类 4 个字母以上的主要词汇不会被误伤介词表命中转为小写返回连词表命中转为小写返回冠词表命中转为小写返回兜底其余情况保持首字母大写后的形态。第五步combine —— 用空格拼接回完整标题utils/combine.ts 是最朴素的一步把处理完的单词用单个空格连接export function combine(acc: string, str: string): string { return ${acc} ${str}; }支撑判定的五大词表常量上述判定逻辑不写死在代码里而是高度数据化地维护在 src/constants 目录下便于持续扩充词表文件内容说明覆盖量以仓库实际内容为准articles.ts英语冠词3 个a、an、theconjunctions.ts连词and、but、or、that、when等 20 个prepositions.ts介词含复合介词of、on、in front of、with respect to等 60 个acronyms.ts输出时应保持全大写的缩写API、SQL、HTML、PDF、URL、2FA等 80 个special-case.ts有独特大小写拼写方式的专有名词McDonalds、iPhone、YouTube、PostgreSQL、macOS等 40 个README 特别举出的例子正是这些表存在的意义这个包里包含一份使用某种特殊大小写的词汇清单例如 McDonalds、iPhone 和 YouTube。 例如apple_releases_new_ipad之所以输出Apple Releases New iPad正是因为处理ipad时命中了 special-case.ts 中的iPad从而保留厂商官方的拼写方式。同时注意判定顺序上 special-case 优先于 acronym例如sql若同时出现在两表special-case 先命中则不再进入 acronym 分支当前词表中二者并不冲突但顺序设计保证了扩展安全性。从源码结构看这几个词表均为默认导出数组常量若要为本仓库之外的项目扩展词表可直接 fork 后追加条目无需改动判定逻辑本身。测试与工程化保障这个包的测试由 vitest 驱动主测试文件 src/index.test.ts 以输入→期望输出的二维数组形式组织用例并逐条生成测试名const tests: [string, string][] [ [snowWhiteAndTheSevenDwarfs, Snow White and the Seven Dwarfs], [NewcastleUponTyne, Newcastle Upon Tyne], [brighton_on_sea, Brighton on Sea], [apple_releases_new_ipad, Apple Releases New iPad], [7-food-trends, 7 Food Trends], ];此外还有针对各内部工具与常量的单测constants.test.ts校验词表数据capitalize.test.ts、combine.test.ts、decamelize.test.ts、handle-special-words.test.ts则分别锁定四个工具函数的边界行为。在 package.json 的 scripts 中可用pnpm testvitest run执行全部测试用pnpm build完成tsdown src/index.ts --dts的打包同时生成类型声明。版本与许可该包当前版本为 13.0.0以 package.json 的 version 字段 为准作者为 Directus 核心开发者采用 MIT License详见仓库内的 license 文件。作为 Directus 开源 monorepo 的一个独立发布包你既可以随 Directus 生态一并使用也可以作为通用字符串工具单独安装到任意 JS/TS 项目中。适合的应用场景小结综合 README 与源码directus/format-title 最适合用在以下位置字段名/集合名的人性化展示把数据库里的snowWhiteAndTheSevenDwarfs变为界面标题 Snow White and the Seven DwarfsURL slug 与文件名美化如 README 示例中的7-food-trends→ 7 Food Trends以及连字符/下划线/空格混排文本的归一化配置键名、枚举值等机器标识符的阅读化输出借助内置的 acronym 与 special-case 词表apple_releases_new_ipad这类包含品牌词的输入也能得到品牌官方拼写任何需要主要词大写、冠词介词连词小写的标题排版需求判定规则完整对齐 APA Title Case可直接复用。使用时只需记住一个 API 签名formatTitle(string, separator?)与一个默认行为camelCase 由内置decamelize先行拆解空白/连字符/下划线由默认正则/\s|-|_/g切分最终输出遵循首尾词大写、3 字以内虚词小写、4 字以上实词大写、缩写与专有名词特殊处理的规范结果。【免费下载链接】directusThe flexible backend for all your projects Turn your DB into a headless CMS, admin panels, or apps with a custom UI, instant APIs, auth more.项目地址: https://gitcode.com/GitHub_Trending/di/directus创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/9/10 13:52:52

CANN/ge内存查询模型信息API

aclmdlBundleQueryInfoFromMem 【免费下载链接】ge GE(Graph Engine)是面向昇腾的图编译器和执行器,提供了计算图优化、多流并行、内存复用和模型下沉等技术手段,加速模型执行效率,减少模型内存占用。 GE 提供对 PyTor…

2026/9/10 13:47:51

Decision: Static site on one server

Decision: Static site on one server 【免费下载链接】US.KG Free domain registration and practical DNS learning resources for everyone. 项目地址: https://gitcode.com/GitHub_Trending/us/US.KG Context The site publishes documentation and has no account…

2026/9/10 14:58:28

高效多窗口管理工具与配置指南

1. 多窗口办公的痛点与效率革命每天面对十几个重叠交错的窗口,你是不是也经常陷入这样的困境:找一份文档要在任务栏来回切换五六次,写报告时参考网页和编辑器永远对不齐位置,视频会议时重要资料总被遮挡......这种低效的窗口管理方…

2026/9/10 14:58:28

STM32F407驱动DHT11单总线温湿度传感器实战指南

简介:本资源是面向STM32嵌入式初学者与课程实践者的DHT11温湿度传感器驱动开发实验包,聚焦STM32F407微控制器与单总线数字传感器的底层通信实现。资源完整覆盖GPIO推挽输出配置、精确延时控制、One-Wire协议模拟、40位数据解析及校验和验证等核心环节&am…

2026/9/9 13:11:35

超人会飞不算本事:系统稳定依赖清晰规则与边界设计

开头先不绕弯子。“#斯坦李吐槽dc 所以超人是无缘无故会飞的嘛哈哈哈哈哈哈哈锤哥真是技术人才啊!#雷神 #复联”这类调侃式短标题,第一波冲击力在于它把两个宇宙的角色塞进同一个吐槽箱里,但细想一下就能发现,它真正碰到的根本不是…

2026/9/10 11:16:38

超人VS蜘蛛侠:拆解超级IP的影响力与传播方法论

把“蜘蛛侠 vs 超人”放在 CSDN 上聊,可能很多人第一反应是走错片场了。但如果把这两个角色看成“两个持续运营了 80 多年的文化产品”,你会发现,这场比较本质上是两个不同 IP 策略的长期结果对比:超人赢在定义了整个超级英雄题材…

2026/9/9 16:31:09

基于CNN的调制信号识别:MATLAB实现时频图分类实战

简介:本资源是一套面向通信工程与信号处理方向学习者、研究者的深度学习实践方案,聚焦调制信号自动检测与识别这一典型无线通信任务,解决传统方法依赖人工特征、低信噪比下性能下降等痛点。压缩包共12个文件(10.73MB)&…

2026/9/10 0:00:55

目录对比去重实战:用哈希算法精准清理重复文件

我电脑里现在还有一块换了三次机的“数据墓地”硬盘,里面存着2016年以前所有旧笔记本的完整备份。平时不觉得有什么,直到前阵子想把它整理归档,发现同一个安装包、同一批照片、同一份论文草稿,在几个不同的备份目录里反复出现。更…

2026/9/10 0:00:55

Leaflet离线地图完整Demo合集:内网部署与坐标纠偏实战

简介:这是一份面向Web GIS开发者的LeafLet离线地图示例合集,帮助开发者快速掌握离线地图从搭建到交互的完整流程。压缩包共723个文件,大小14.06MB,以319个js脚本、175个html页面和29个css样式文件为主体,配合png/svg图…

2026/9/10 0:00:55

MATLAB读取Rinex 3.02观测文件:多系统GNSS数据解析实战

简介:基于MATLAB开发的Rinex3.02版观测文件(o文件)读取代码包,面向卫星定位导航方向的学习者与研究人员,用于解决新版观测文件的数据解析、历元提取与时间转换问题。压缩包共4个文件,包含两个m脚本、一个19…

2026/9/10 12:32:02

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/7 22:46:00

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/9 10:21:54

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码