fontTools.misc.testTools 测试工具深度指南:用 TTX 片段与 FakeFont 为字体代码编写单元测试
开发工具【免费下载链接】fonttoolsA library to manipulate font files from Python.项目地址https://gitcode.com/gh_mirrors/fo/fonttools点击查看免费下载fontTools.misc.testTools是 fontTools 项目内置的单元测试辅助模块API 文档见 Doc/source/misc/testTools.rst它为TTFont、OpenType 表格、CFF CharString 等字体对象的测试提供了 XML 片段解析、虚拟字体对象、TTX 输出捕获与易变属性清洗等一整套基础设施。读完本文你将掌握如何在 fontTools 源码测试中以及你自己的字体工具项目中用几行代码完成“XML ↔ 表格对象”的往返测试、构造不含真实字体文件的字体替身并写出可跨版本稳定比对 TTX 输出的断言。一、模块定位misc 工具族中的“测试弹药库”在 Doc/source/misc/index.rst 中fontTools.misc被定位为“Miscellaneous libraries helpful for font engineering”——绝大多数模块是 fontTools 内部实现的支持工具但其中一部分具有通用价值。testTools正是这类“可复用性极高”的模块它虽以fontTools.misc.testTools命名实际作用是helpers for writing unit tests源码模块 docstring 原话见 Lib/fontTools/misc/testTools.py。它的核心成员包括API作用parseXML(xmlSnippet)解析一段 TTX 风格的 XML 片段返回与XMLReader相同的(name, attrs, content)元素结构parseXmlInto(font, parseInto, xmlSnippet)把解析出的 XML 元素逐一喂给对象的fromXML方法完成“XML 片段 → 表格对象”的构建FakeFont(glyphs)以给定的字形名列表构造一个轻量、可查表、可写表的字体替身MockFont()更“懒”的字体替身任何被查询的字形名都会自动加入glyphOrdergetXML(func, ttFont)/makeXMLWriter()捕获toXML写入的内容剥离 XML 声明与 OS 换行符返回字符串行列表stripVariableItemsFromTTX(string, ...)用正则剥离ttLibVersion、校验和、时间戳等易变属性使 TTX 文本可比对TestCase(_TestCase)/DataFilesHandler(TestCase)兼容旧版 unittest 断言的测试基类以及数据文件定位 临时文件管理的基类二、parseXML在无根约束下解析 TTX 片段2.1 为什么需要它真实 TTX 文件只有一个根元素通常是ttFont但测试时往往只关心某个表格内部的一小段 XML。parseXML特意不对根元素施加任何约束“the parser imposes no constraints on the root element”见 Lib/fontTools/misc/testTools.py因此可以传入多个并列元素的小片段。2.2 输入形式与返回值输入可以是单个strunicode 字符串或 UTF-8 编码的bytes或由多个字符串组成的序列sequence序列中的每个字符串都会被拼接后统一解析其他类型会抛出TypeError异常信息为expected string or sequence of strings; found %r见 Lib/fontTools/misc/testTools.py。返回结果与XMLReader的输出格式一致一个由(name, attrs, content)三元组组成的列表其中attrs是属性字典content是子元素与文本片段字符串的混合列表。2.3 底层实现假根 expat实现上Lib/fontTools/misc/testTools.py会用broot和b/root包裹输入再交给基于xml.parsers.expat.ParserCreate的私有类TestXMLReader_解析Lib/fontTools/misc/testTools.py。该 reader 注册了StartElementHandler、EndElementHandler、CharacterDataHandler三个回调用一个栈结构把元素组装成(name, attrs, [children])树最终返回reader.root[2]即假根之下的全部子元素。因为用了 expat多字节 UTF-8 文本如测试中的ünıcòðe也能正确处理。2.4 实测示例Tests/misc/testTools_test.py 验证了字符串输入与多个并列元素import fontTools.misc.testTools as testTools result testTools.parseXML( Foo n1/ Foo n2 some ünıcòðe text Bar colorred/ some more text /Foo Foo n3/ ) # result [ # (Foo, {n: 1}, []), # (Foo, {n: 2}, [ # some ünıcòðe text , # (Bar, {color: red}, []), # some more text, # ]), # (Foo, {n: 3}, []), # ]bytes 输入、字符串列表输入、bytes 列表输入分别由 Tests/misc/testTools_test.py 与 Tests/misc/testTools_test.py 覆盖四种输入形式等价。2.5 仓库中的典型用法CFF 测试中parseXML直接配合CharStrings.fromXML使用——Tests/cffLib/cffLib_test.py 用一段包含.notdef、foo、bar、baz四个 CharString 的 XML 片段填充TopDict.CharStrings随后验证recalcFontBBox()计算出[-56, -100, 300, 200]。可见 parseXML 的价值在于不需要构造完整 TTFont 文件就能测试某个子对象的 XML 反序列化逻辑。三、parseXmlInto一站式完成“XML 片段 → 表格对象”3.1 工作原理parseXmlInto(font, parseInto, xmlSnippet)Lib/fontTools/misc/testTools.py是parseXML的高层封装流程为对片段调用parseXML并过滤掉纯文本节点只保留(name, attrs, content)元组对每个元素调用parseInto.fromXML(name, attrs, content, font)若目标对象实现了populateDefaults则补一次默认值填充许多 OpenType 表格在从 XML 构建后需要此项返回填充后的parseInto对象。3.2 实战示例EBSC 表格Tests/ttLib/tables/E_B_S_C__test.py 展示了把EBSC_XML常量导入全新表格并验证字段ttFont TTFont() table table_E_B_S_C_() parseXmlInto(ttFont, table, EBSC_XML) assert table.version 2.0 assert table.numSizes 1 assert len(table.bitmapScaleTables) 1同一测试文件中的test_fromxml_accepts_bitmap_scale_table_before_headerTests/ttLib/tables/E_B_S_C__test.py还证明了parseXmlInto支持元素顺序与头结构不完全一致的片段——它先把bitmapScaleTable传入再处理其他部分这正是“小片段自由组合”能力的体现。3.3 实战示例GPOS 与 COLR v1OpenType 布局表测试大量使用该函数Tests/ttLib/tables/otTables_test.py 用一个包含CursivePos、EntryAnchor、XDeviceTable等结构的 GPOS 片段构造otTables.GPOS()对象随后断言anchor.XDeviceTable.DeltaValue [1, 2]再走一遍compile/decompile往返Tests/ttLib/tables/otTables_test.py 用parseXmlInto(self.font, otTables.COLR(), ...)构造带PaintColrLayers的 COLR v1 对象并验证空图层列表的traverse不会崩溃。parseXmlInto是“TTX 内容驱动测试”的关键入口它让开发者把表格测试数据写成可读的 XML 字面量而无需预先准备.ttx文件或经过完整importXML流程。四、FakeFont不读文件、不写文件的轻量字体替身4.1 设计目标很多表格测试只依赖字体的字形映射与表容器能力不需要真实的TTFont。FakeFont(glyphs)Lib/fontTools/misc/testTools.py用构造函数传入的字形名列表一次性搭建出最小的字体接口维护glyphOrder_与reverseGlyphOrderDict_字形名 → ID 的字典提供getGlyphID/getGlyphIDMany、getGlyphName/getGlyphNameMany、getGlyphOrder、getReverseGlyphMap、getGlyphNamesgetGlyphName对超出列表范围的 ID 会返回glyph%.5d形式的合成名如glyph00042支持in判断__contains__与font[tag] table式读写__getitem__/__setitem__/get内部挂在self.tables字典上附带self.lazy False与一个Config()实例来自 Lib/fontTools/config/init.py模拟 TTFont 的常见属性。4.2 仓库中的典型用法表格 decompile 测试几乎离不开 FakeFontTests/ttLib/tables/S_T_A_T_test.py 用FakeFont([.notdef])对 STAT 表的二进制数据调用table.decompile(STAT_DATA, font...)Tests/ttLib/tables/_a_n_k_r_test.py 用FakeFont([.notdef, A, B, C, D])建立锚点类测试的字形环境Tests/ttLib/tables/_m_o_r_x_test.py 甚至构造了 909 个字形的FakeFont来覆盖 morx 表的字形范围边界Tests/ttLib/tables/_k_e_r_n_test.py 分别用 52 个字母字形和glyph%i批量命名构造两类 kerning 测试字体。从源码结构可以推断FakeFont的目标就是实现TTFont的“glyph 查询 表存取”子集让表格测试完全脱离磁盘文件。五、MockFont自动扩增字形表的“懒字体”MockFontLib/fontTools/misc/testTools.py与 FakeFont 的差异在于字形名自动分配初始glyphOrder只有[.notdef]内部的_reverseGlyphOrder是一个自定义AllocatingDict(dict)重写了__missing__一旦查询到不存在的字形名就把它追加进glyphOrder并分配新 gid等于当前映射长度因此getGlyphID(glyph)永远不会抛 KeyError适合测试那些“输入字形名不可预知、但输出必须稳定”的场景。它暴露的接口与 FakeFont 基本一致getGlyphID、getReverseGlyphMap、getGlyphName、getGlyphOrder并同样设置self.lazy False。虽然当前仓库测试中MockFont的直接使用较少但从实现看它非常适合在合并器merger、布局构建器等“动态发现新字形”的测试中充当字体替身。六、getXML 与 makeXMLWriter捕获并规范化 toXML 输出6.1 为什么需要专门的 writertoXML方法通常用XMLWriter来自 Lib/fontTools/misc/xmlWriter.py写 TTX。直接比较 writer 的字节输出有两个麻烦一是会带上 XML 声明?xml version1.0 ...?二是换行符会随操作系统变化Windows 的\r\nvs Unix 的\n。makeXMLWriter(newlinestr\n)Lib/fontTools/misc/testTools.py固定使用\n并抹掉 XML 声明它在XMLWriter(BytesIO())创建后立即seek(0)truncate()把已写入的声明字节清空。6.2 getXML 的行为与断言约定getXML(func, ttFontNone)Lib/fontTools/misc/testTools.py调用传入的func(writer, ttFont)随后把 BytesIO 内容解码为 UTF-8 文本断言输出必须以换行结尾——源码注释明确要求“toXMLmethods must always end with awriter.newline()”这是 fontTools 对每个toXML实现的硬性约定用splitlines()返回 unicode 字符串行列表便于与期望行列表直接assertEqual。6.3 实测示例Tests/misc/testTools_test.py 演示了完整模式def toXML(writer, ttFont): writer.simpletag(simple) writer.newline() writer.begintag(tag, attrvalue) writer.newline() writer.write(hello world) writer.newline() writer.endtag(tag) writer.newline() # toXML always ends with a newline assert testTools.getXML(toXML) [ simple/, tag attrvalue, hello world, /tag, ]注意子元素文本被自动缩进两个空格XMLWriter 的行为期望行列表需与此一致。6.4 仓库中的典型用法Tests/ttLib/tables/C_O_L_R_test.py 用getXML(colr.toXML, font)与期望的COLR_V0_XML行列表比较再用parseXML反查字段形成完整的“写→比→读”闭环Tests/ttLib/tables/E_B_S_C__test.py 在 compile/decompile 往返后断言getXML(table2.toXML, ttFont) EBSC_XML.splitlines()Tests/otlLib/builder_test.py 与 Tests/subset/svg_test.py 同样从 testTools 导入getXML用于输出比对。七、stripVariableItemsFromTTX剥离易变属性实现稳定比对stripVariableItemsFromTTX(string, ...)Lib/fontTools/misc/testTools.py是一个基于正则的文本清洗器用于删除 TTX 文本中随环境变化的属性使不同机器/不同 fontTools 版本上的输出可以逐行比对。其参数与清洗规则如下参数默认值清洗内容对应正则ttLibVersionTrue删除ttLibVersion...随 fontTools 版本变化 ttLibVersion[^]checkSumAdjustmentTrue删除 head 表的checkSumAdjustment随每次保存变化checkSumAdjustment value[^]/modifiedTrue删除 head 表的modified时间戳modified value[^]/createdTrue删除 head 表的created时间戳created value[^]/sfntVersionFalse可选删除sfntVersion...用于不关心 TTF/OTF 差异的场景默认关闭 sfntVersion[^]源码注释给出了每项清洗的动机ttLibVersion 随 fontTools 版本变化head 表的校验和、创建/修改时间随每次保存变化见 Lib/fontTools/misc/testTools.py。仓库中的典型用法Tests/subset/subset_test.py 的read_ttx在读取保存的 TTX 后调用stripVariableItemsFromTTX(ttx, sfntVersionTrue)明确注释“dont care whether TTF or OTF, thus strip sfntVersion as well”——这是sfntVersion参数存在的典型场景Tests/fontBuilder/fontBuilder_test.py 对实际输出与期望参考数据都做清洗后再比较Tests/varLib/instancer/instancer_test.py 在可变字体实例化的回归测试中用该函数对齐s.getvalue()与期望 TTX。八、TestCase 与 DataFilesHandler测试基类与数据文件管理8.1 TestCase兼容旧版断言名TestCaseLib/fontTools/misc/testTools.py继承自unittest.TestCase唯一的增强是当运行环境没有assertRaisesRegex时Python 3 之前叫assertRaisesRegexp把它别名到旧方法名上从而兼容仍使用旧断言名的测试代码。8.2 DataFilesHandlerdata 目录定位 临时文件DataFilesHandler(TestCase)Lib/fontTools/misc/testTools.py提供两件套能力定位测试数据文件getpath(testfile)把testfile拼到“当前测试模块所在目录下的data子目录”中os.path.join(folder, data, testfile)其中folder取自sys.modules[self.__module__].__file__的目录名。这正对应仓库里每个测试包都带data/目录的组织约定例如 Tests/cffLib/data 下的.ttx/.otf/.cff文件。管理临时文件setUp初始化tempdir None、num_tempfiles 0temp_dir()在首次调用时用tempfile.mkdtemp()创建临时目录temp_font(font_path, file_name)把某个字体文件copy2到临时目录返回临时路径——这样测试修改字体时不会污染原始数据tearDown用shutil.rmtree清理临时目录。典型用法见 Tests/cffLib/cffLib_test.pyCffLibTest(DataFilesHandler)中通过self.getpath(LinLibertine_RBI.otf)读取测试字体、通过self.getpath(TestOTF.ttx)读取期望 TTXTests/cffLib/specializer_test.py 的CFF2VFTestSpecialize也继承它来定位TestSparseCFF2VF.ttx等数据。九、组合实战一条完整的 TTX 往返测试模板综合上述 API一个典型的 fontTools 表格往返测试可以这样组织结构参考 Tests/ttLib/tables/E_B_S_C__test.py 与 Tests/ttLib/tables/C_O_L_R_test.pyfrom fontTools.misc.testTools import ( DataFilesHandler, FakeFont, getXML, parseXML, parseXmlInto, ) MY_XML \ Foo value1/ Bar colorredBaz n2//Bar class MyTableTest(DataFilesHandler): def test_from_xml(self): font FakeFont([.notdef, A]) table MyTable() parseXmlInto(font, table, MY_XML) # XML → 表格对象 assert table.value 1 def test_to_xml(self): font FakeFont([.notdef, A]) table MyTable() parseXmlInto(font, table, MY_XML) # toXML 必须写入 func(writer, ttFont) 且以 newline() 结尾 assert getXML(table.toXML, font) MY_XML.splitlines() def test_data_file(self): path self.getpath(sample.ttx) # 读取本测试包 data/ 下的文件 with open(path, encodingutf-8) as f: content f.read() for name, attrs, children in parseXML(content): ...这套组合回答了字体开发中最常见的三个测试需求如何不落盘地反序列化 XMLparseXmlIntoFakeFont、如何稳定断言 XML 序列化结果getXML、如何管理随版本漂移的 TTX 元数据stripVariableItemsFromTTX。十、小结fontTools.misc.testTools虽小却是 fontTools 自身几十个测试模块从 CFF、CFF2 到 COLR/GPOS/STAT 等 OpenType 表格再到 subsetter、instancer、merger共同的测试地基。它把字体测试中最琐碎、最容易出错的环节——XML 片段解析、虚拟字体构造、换行与声明规范化、易变属性清洗、数据文件定位与临时目录管理——全部收敛为可直接 import 的工具函数与基类。理解这些 API不仅能帮助你读懂 Tests 目录下数百个测试文件也能让你为自己的字体处理代码写出同样干净、稳定、可复现的单元测试。赞分享开发工具【免费下载链接】fonttoolsA library to manipulate font files from Python.项目地址https://gitcode.com/gh_mirrors/fo/fonttools点击查看免费下载相关推荐BullshitGenerator单元测试完整指南如何为测试工具编写测试BullshitGenerator是一个专门用于生成测试文本的开源项目主要帮助开发者在GUI开发时测试文本渲染效果。这个有趣的文章生成工具通过预定义的模板开发工具测试Dexter单元测试指南如何为权限代码编写有效测试Dexter单元测试指南如何为权限代码编写有效测试 Dexter是一个强大的Android权限管理库它简化了运行时权限请求的复杂过程。在Android开发中移动开发认证鉴权AssemblyScript测试策略如何为WebAssembly代码编写单元测试AssemblyScript测试策略如何为WebAssembly代码编写单元测试 AssemblyScript作为TypeScript到WebAssembly编译器编程语言语言运行时标准库上一篇使用 AWS SDK for Python (boto3) 实现 Amazon S3 条件请求Conditional Requests完整实战指南下一篇本地 AI 内容推荐 Agent 走向何方OpenBiliClaw 2026 路线图前瞻与 7 大趋势解读创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

多智能体队列控制:基于状态契约与PID反馈的实时协同算法

多智能体队列控制:基于状态契约与PID反馈的实时协同算法

1. 项目概述:这不是军训,是用算法解构“人形像素点”的队列控制问题“士兵队列训练”这五个字一出来,很多人第一反应是操场、口令、正步、汗水——但如果你真把它当成一个纯体力活来处理,那在实际项目落地时大概率会卡在第三天。我…

2026/10/13 9:34:21 阅读更多 →
开源时间序列标注工具TimeTagger部署与优化指南

开源时间序列标注工具TimeTagger部署与优化指南

1. 项目背景与核心价值时间序列数据标注是数据分析领域的基础工作,但市面上成熟的标注工具往往存在两个痛点:一是需要将敏感数据上传到第三方平台,二是缺乏针对时间序列特性的专业标注功能。TimeTagger作为开源的时间序列标注工具&#xff0c…

2026/10/13 9:34:21 阅读更多 →
aiogram 中的 MessageOriginChat 类型详解:掌握“以聊天名义转发“的消息来源机制

aiogram 中的 MessageOriginChat 类型详解:掌握“以聊天名义转发“的消息来源机制

后端即时通讯API设计 【免费下载链接】aiogram aiogram is a modern and fully asynchronous framework for Telegram Bot API written in Python using asyncio 项目地址: https://gitcode.com/gh_mirrors/ai/aiogram 点击查看 免费下载 导读 本文围绕 aiogram 的…

2026/10/13 9:34:21 阅读更多 →

最新新闻

FFMpeg 4.1音频检测实战:命令详解与批处理自动化

FFMpeg 4.1音频检测实战:命令详解与批处理自动化

做内容生产这一年多,我处理过最多的活儿不是剪辑,而是给一堆音频素材做体检。尤其是接手播客剪辑、视频课程批量转码这类项目时,几十个甚至上百个文件摆在面前,里面哪个有静音、哪个音量忽大忽小、哪个爆音了,光靠耳朵…

2026/10/13 10:15:43 阅读更多 →
DDR Training失败怎么办?从硬件到软件的完整排查指南

DDR Training失败怎么办?从硬件到软件的完整排查指南

做嵌入式硬件开发的人,大概都遇到过这样的噩梦:新板子打回来,上电,串口没有任何输出,系统起不来。查电源,电压都对;查时钟,晶振在振;查复位,复位释放了。最后…

2026/10/13 10:15:43 阅读更多 →
基于CNN的音乐推荐系统设计与实现|大数据专业项目|毕设项目|大数据专业设计|毕设

基于CNN的音乐推荐系统设计与实现|大数据专业项目|毕设项目|大数据专业设计|毕设

一、項目介绍 摘 要 在数字音乐蓬勃发展的当下,音乐库规模急剧膨胀,用户高效获取心仪音乐面临挑战,个性化音乐推荐系统的重要性日益凸显。然而,传统音乐推荐系统存在推荐效果参差不齐、冷启动等诸多问题。卷积神经网络&#xff0…

2026/10/13 10:15:43 阅读更多 →
Meta为Personal Agent推出一个新协议PAP

Meta为Personal Agent推出一个新协议PAP

Meta为Personal Agent推出一个新协议PAP1-PAP(Personal Agent Protocol)是一套由Meta和Sierra联合发起的开放标准,它规定了个人AI助理在代表你与商家打交道时,应该如何证明自己的身份、获得你的授权,以及能做什么、不能…

2026/10/13 10:15:43 阅读更多 →
无代码平台:企业数字化转型的新引擎

无代码平台:企业数字化转型的新引擎

1. 无代码平台行业现状与核心价值无代码平台正在重塑企业数字化建设的游戏规则。过去需要专业开发团队耗时数月才能完成的应用搭建,现在业务人员通过拖拽组件就能在几小时内实现。根据最新行业调研数据,2023年全球无代码开发平台市场规模已达到138亿美元…

2026/10/13 10:15:43 阅读更多 →
page_alloc alloc_pages_bulk_noprof

page_alloc alloc_pages_bulk_noprof

alloc_pages_bulk_noprof() 是内核提供的批量页面分配接口。它的核心设计目标是减少锁竞争和函数调用开销:通过一次持有 PCP(Per-CPU Pages)锁,连续分配多个页面填充到调用方提供的数组中,而不是反复调用单页分配接口。…

2026/10/13 10:14:40 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 21:05:09 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 14:48:49 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →