php-token-stream 版本演进全解析:从 ChangeLog 到源码,深入 tokenizer 封装库的架构与修复脉络
测试【免费下载链接】php-token-streamWrapper around PHPs tokenizer extension.项目地址https://gitcode.com/gh_mirrors/ph/php-token-stream点击查看免费下载本指南以 ChangeLog.md 为主线逐版本还原 php-token-stream 从 2.0.0 到 4.0.4 的演进脉络并结合 src/ 目录下的核心源码与 tests/ 中的回归测试讲清楚每一个Added / Fixed / Removed背后的架构设计与实现原理。读完本文你将理解该库如何把 PHP 原生token_get_all()的输出封装成面向对象的 token 流掌握作用域追踪、匿名类/匿名函数识别、代码行统计等关键机制并能独立解读 PHP 版本升级对静态分析类工具的影响。一、项目定位ChangeLog 记录的到底是什么php-token-stream 是围绕 PHP 扩展ext-tokenizer的封装库composer.json 中description为 Wrapper around PHPs tokenizer extension。它的核心价值在于把token_get_all()返回的数组或字符串混杂的原始 token 序列统一转换成一组面向对象的 token 类实例并提供类、方法、接口、trait、include 依赖等高层结构信息的提取能力。因此ChangeLog.md 中每一次 Added新增 token 支持都对应 PHP 语言层面的新语法每一次 Fixed 都对应 token 序列解析中的边界情况每一次 Removed 都对应运行时环境的收缩。理解了这条对应关系就能从版本历史中读出语言演进与解析器维护的双重脉络。二、版本时间线总览ChangeLog 共记录了 13 个版本跨度从 2017-08 到 2020-08。下表是完整梳理版本日期变更类型核心内容4.0.42020-08-04Added支持NAME_FULLY_QUALIFIED、NAME_QUALIFIED、NAME_RELATIVEtoken4.0.32020-06-27Added支持 PHP 84.0.22020-06-16Fixed修复 4.0.1 引入的向后兼容性破坏4.0.12020-05-06Fixedissue #93含匿名类方法的类处理不正确4.0.02020-02-07Removed不再支持 PHP 7.1 与 PHP 7.23.1.12019-09-17Fixedissue #84名为class的方法处理不正确3.1.02019-07-25Added支持 PHP 7.4 引入的FN与COALESCE_EQUALtoken3.0.22019-07-08Changedissue #82确保组件在 php-scoper 前缀化类名后仍可工作3.0.12018-10-30Fixedissue #78getEndTokenId()未处理字符串美元符号插值${var}3.0.02018-02-01Removedissue #71移除 Hack 语言特有代码issue #72放弃 PHP 7.02.0.22017-11-27Fixedissue #69PHP_Token_USE_FUNCTION序列化不正确2.0.12017-08-20Fixedissue #68名为empty的方法被误判为匿名函数2.0.02017-08-03—首个 2.x 版本无具体条目说明三、4.x 系列迈入 PHP 8 时代3.1 4.0.4新增 PHP 8 的 NAME_* tokenPHP 8 的 tokenizer 扩展新增了三个名称类 tokenT_NAME_FULLY_QUALIFIED、T_NAME_QUALIFIED、T_NAME_RELATIVE分别对应\Foo\Bar、Foo\Bar、namespace\Foo\Bar三种名称写法。4.0.4 为此新增了三个 token 类src/NameFullyQualified.phpPHP_Token_NAME_FULLY_QUALIFIEDsrc/NameQualified.phpPHP_Token_NAME_QUALIFIEDsrc/NameRelative.phpPHP_Token_NAME_RELATIVE这三个类目前都是空壳子类仅继承PHP_Token但它们的存在至关重要在 src/Stream.php 的scan()方法中token 类名是通过substr(\token_name($token[0]), 2)剥离T_前缀后拼接PHP_Token_得到的因此只要 PHP 8 的 tokenizer 吐出了新 tokenPHP_Token_命名空间下就必须有对应的类可供实例化否则解析会直接失败。这正是 4.0.4 作为Added条目被记录的根本原因。3.2 4.0.3正式支持 PHP 8PHP 8 对 tokenizer 的破坏性改动不止 NAME_* token。4.0.3 声明组件支持 PHP 8其配套工作可从 composer.json 得到印证php: ^7.3 || ^8.0的约束同时覆盖了 7.3 与 8.0。此外src/Stream.php 中有一段专门注释see https://github.com/sebastianbergmann/php-token-stream/issues/95的 PHP 8 兼容逻辑当PHP_MAJOR_VERSION 8、当前 token 是T_WHITESPACE、前一个 token 是T_COMMENT且注释以#或//开头不含/*、且该空白以换行开头时会把换行合并进注释 token避免 PHP 8 下//、#注释与换行的 token 切分方式变化导致的行号错乱。对应回归测试见 tests/Token/CommentTest.php 与 fixture tests/_fixture/issue_95.php。3.3 4.0.1修复匿名类方法处理issue #934.0.1 修复了类中的方法声明了匿名类时处理不正确的问题。根因在于PHP_Token_Stream::parse()依赖遇到}就弹出类栈的朴素逻辑而匿名类有自己的{...}作用域会干扰外层类的结束判断。修复思路从源码看是双重的匿名类命名src/Class.php 的getName()在类名 token 之后紧跟{、extends或implements时判定为匿名类并生成AnonymousClass:{行号}#{tokenId}形式的稳定标识。作用域栈追踪src/Stream.php 的parse()用$classEndLine/$class两个栈记录嵌套类只有当前}的行号与栈顶类的endLine一致时才弹栈从而保证外层类不会被内层匿名类的}提前关闭。回归测试 tests/Token/ClassTest.php 对 tests/_fixture/issue93.php 断言类PhpAnonym的endLine为 34而不是被内部匿名类截断且其三个方法__construct、funcOne、funcTwo的行号范围都正确其中funcTwo16–33 行内恰好嵌有一个匿名类18–30 行是最典型的压测用例。类似的匿名类场景还覆盖了 tests/Token/ClassTest.php 中的多个 fixture如class_with_method_that_declares_anonymous_class.php、class_with_multiple_anonymous_classes_and_functions.php。3.4 4.0.0移除 PHP 7.1 / 7.2 支持4.0.0 将最低 PHP 版本提升到 7.3。这与 composer.json 的require: { php: ^7.3 || ^8.0 }完全一致。对使用者而言这意味着 PHP 7.1/7.2 项目若要继续使用该库必须锁定在 3.x 系列。四、3.x 系列PHP 7.4 新语法与稳定性加固4.1 3.1.0新增FN与COALESCE_EQUALtokenPHP 7.4 引入了箭头函数fn与空合并赋值运算符??tokenizer 相应新增T_FN、T_COALESCE_EQUAL。3.1.0 为其建立了 src/Fn.phpPHP_Token_FN与 src/CoalesceEqual.phpPHP_Token_COALESCE_EQUAL两个 token 类。借助scan()中T_前缀剥离 类名映射的机制PHP 7.4 环境下这两类 token 即可自动获得面向对象封装。这里值得注意一个细节箭头函数本质仍是函数。在PHP_Token_FUNCTION的逻辑中匿名函数会被命名为anonymousFunction:{行号}#{tokenId}见 src/Function.php而getCCN()圈复杂度对if / elseif / for / foreach / while / case / catch / 逻辑与或 / 三元等 token 逐一计数src/Function.php这套统计机制同样适用于箭头函数体内的判断结构。4.2 3.1.1修复名为class的方法issue #84public function class()这类以保留字命名的方法在 PHP 7 中合法但 tokenizer 会为class一词输出T_CLASS而非T_STRING导致解析器在识别这是方法名还是这是::class常量时出现歧义。src/Stream.php 中有一段专门处理当lastNonWhitespaceTokenWasDoubleColon为真且当前 token 名为CLASS时改写为CLASS_NAME_CONSTANT对应 src/ClassNameConstant.php 的PHP_Token_CLASS_NAME_CONSTANT而在方法声明场景下class前没有::则保持T_CLASS语义从而正确区分Foo::class与function class()。4.3 3.0.2兼容 php-scoper 类名前缀化issue #82php-scoper 会在打包时给所有类名加上前缀如PHP_Token_→ScopedPHP_Token_传统上依赖硬编码类名的代码会因此失效。3.0.2 的Changed正是为了让组件在类名前缀化后仍能正常工作。从源码结构看src/Stream.php 通过protected static $customTokens数组把(、)、{、}、;、.等 28 个单字符映射到对应 token 类并通过PHP_Token_Util::getClass()等工具方法动态获取类名这类间接引用设计为前缀化场景留出了兼容空间。4.4 3.0.1修复${var}字符串插值issue #78getEndTokenId()是PHP_TokenWithScope的核心方法src/TokenWithScope.php它通过花括号配对来定位类/函数/命名空间作用域的结束 token。但${var}这种字符串插值在 tokenizer 中会生成T_DOLLAR_OPEN_CURLY_BRACES${与T_CURLY_OPEN{$等特殊 token若只统计普通{/}就会破坏配对。修复后的getEndTokenId()把PHP_Token_OPEN_CURLY、PHP_Token_DOLLAR_OPEN_CURLY_BRACES、PHP_Token_CURLY_OPEN三类 token 都计入$block从而正确处理插值字符串。fixture tests/_fixture/source.php 中的buzz()方法体内恰好包含echo ${foo};对应的行号断言见 tests/Token/FunctionTest.php。4.5 3.0.0移除 Hack 语言代码与 PHP 7.0 支持3.0.0 做了两件事移除 Hack 语言特有代码issue #71早期版本为兼容 HHVM 的 Hack 语法保留了专用逻辑进入 3.0 后彻底清除。放弃 PHP 7.0issue #72最低版本提升到 7.1后续 4.0.0 又提升到 7.3。这两项Removed表明组件完全聚焦 PHP 官方运行时不再为第三方方言付出维护成本。五、2.x 系列早期边界修复5.1 2.0.2修复PHP_Token_USE_FUNCTION序列化issue #69use function Foo\bar;这类导入语句会被 src/Stream.php 的scan()特殊识别当检测到USEtoken 且其后第二个 token 是T_FUNCTION时合并生成PHP_Token_USE_FUNCTIONsrc/UseFunction.php。2.0.2 修复了该 token 在序列化场景下的问题。测试 tests/Token/ClassTest.php 验证了classUsesNamespacedFunction.php这类 fixture包含use function导入的文件不应产生顶层函数条目类数量应为 1。5.2 2.0.1修复名为empty的方法issue #68empty是 PHP 语言结构tokenizer 会输出T_EMPTY对应 src/Empty.php 的PHP_Token_EMPTY。当类中存在public function empty()时旧版解析器会把该方法误判为匿名函数。修复后tests/Token/ClassTest.php 断言 tests/_fixture/class_with_method_named_empty.php 中的empty被正确收录到类的方法表中。六、从版本历史反观核心架构ChangeLog 中大量条目issue #68、#78、#84、#93都集中在作用域识别与名称识别两类问题上这正对应着该库最核心的三大机制。6.1 三级 token 类层次src/Token.php 定义了抽象基类PHP_Token持有text原始文本、line起始行号、tokenStream所属流、id流内序号四个属性并暴露__toString()、getLine()、getId()。其上两级抽象类体现了按能力分层的设计PHP_TokenWithScopesrc/TokenWithScope.php为具有代码块的 token类、函数、命名空间等提供getDocblock()向上回溯查找紧邻的文档注释、getEndTokenId()花括号配对定位结束、getEndLine()。PHP_TokenWithScopeAndVisibilitysrc/TokenWithScopeAndVisibility.php在其上追加getVisibility()向前最多 7 个 token 内查找public/protected/private见 src/TokenWithScopeAndVisibility.php与getKeywords()收集static/final/abstract修饰符。例如PHP_Token_CLASSsrc/Class.php继承自PHP_Token_INTERFACEsrc/Interface.php后者继承自PHP_TokenWithScopeAndVisibility从而获得getParent()、getInterfaces()、getPackage()从 docblock 解析category/package/subpackage并回溯命名空间等类级能力。6.2 Stream一次扫描多维度索引src/Stream.php 的PHP_Token_Stream是整个库的枢纽实现ArrayAccess、Countable、SeekableIterator接口并支持用文件路径或源码字符串直接构造$stream new PHP_Token_Stream(/path/to/source.php); // 或 $stream new PHP_Token_Stream($sourceCodeString);构造时scan()src/Stream.php调用token_get_all()完成一次词法扫描随后建立四类索引tokens顺序 token 数组也是迭代器与数组访问的数据源tokensByLine行号 → token 列表的倒排索引供注释行统计与getDocblock()使用linesOfCodeloc总行数、cloc纯注释行数、ncloc非注释代码行数三要素统计其中cloc只在整行仅含注释/空白时计入src/Stream.phplineToFunctionMap由parse()通过addFunctionToMap()建立行号 → 函数/方法名映射支撑getFunctionForLine($line)查询src/Stream.php。parse()src/Stream.php是延迟执行的第二遍扫描负责组装高层结构通过getClasses()、getFunctions()、getInterfaces()、getTraits()暴露返回的每个类/函数条目都包含docblock、keywords、visibility、startLine、endLine、file等元数据对方法还会额外计算signaturesrc/Function.php 截取从函数名到{或;的完整签名文本与ccn圈复杂度。6.3 include 依赖提取getIncludes()src/Stream.php专门扫描require_once、require、include_once、include四类 tokensrc/Includes.php 的process()会提取引号内的文件名并记录类型支持$categorize参数按类型分组输出。测试 tests/Token/IncludeTest.php 对source3.php验证了三种调用形态合并列表、按类型分组、按单类型过滤。这一能力在依赖分析工具中非常实用。6.4 性能设计CachingFactorysrc/CachingFactory.php 提供静态缓存工厂PHP_Token_Stream_CachingFactoryget($filename)对同一文件只解析一次重复调用直接返回缓存实例clear($filename)支持清空单个文件或全部缓存。在需要反复分析同一批文件的场景如覆盖率计算下可显著减少重复的token_get_all()开销。七、安装与验证README 给出了标准 Composer 安装方式README.md# 作为项目依赖 composer require phpunit/php-token-stream # 仅作为开发期依赖如运行测试套件 composer require --dev phpunit/php-token-stream运行环境约束以 composer.json 为准PHP^7.3 || ^8.0且必须启用ext-tokenizer。仓库自带 PHPUnit 测试套件phpunit.xml 配置了tests目录与 tests/bootstrap.php 引导可执行vendor/bin/phpunit运行全部测试其中 tests/Token/ 下的 ClassTest、ClosureTest、CommentTest、FunctionTest、IncludeTest、InterfaceTest、NamespaceTest 恰好覆盖了 ChangeLog 中多个历史 issue 的回归场景。八、总结从 ChangeLog 读出维护策略纵观 13 个版本可以提炼出 php-token-stream 的三条维护主线跟随语言演进每个 PHP 新版本7.4 的fn/??、8.0 的 NAME_* token 与注释切分变化都会触发对应的 token 类新增与兼容修复这是Added条目的主要来源死磕边界情况方法名撞上保留字empty、class、匿名类/匿名函数嵌套、${var}插值等词法歧义是Fixed条目的高频主题每次修复都配套了 fixture 与回归测试果断收缩环境逐步移除 PHP 7.0、7.1、7.2 与 Hack 支持把维护成本集中到主流运行时。对使用者而言这份 ChangeLog 既是一份升级前必读的兼容性清单——例如从 3.x 升到 4.x 前必须确认 PHP ≥ 7.3——也是一份理解 tokenizer 封装库内部机制的绝佳教材每一条看似简单的版本记录背后都对应着 src/Stream.php 中一段具体的扫描/解析逻辑与一组可运行的测试用例。赞分享测试【免费下载链接】php-token-streamWrapper around PHPs tokenizer extension.项目地址https://gitcode.com/gh_mirrors/ph/php-token-stream点击查看免费下载相关推荐Leaf 框架演进全解从 CHANGELOG 到源码的版本脉络与技术要点Leaf 框架演进全解从 CHANGELOG 到源码的版本脉络与技术要点 本文以 LeafRust 编写的开源机器学习框架仓库中的 CHANGELOG.m机器学习深度学习LOOT 版本历史深度解析从 v0.5 到 v0.29 的功能演进、架构重构与修复脉络LOOT 版本历史深度解析从 v0.5 到 v0.29 的功能演进、架构重构与修复脉络 LOOTLoad Order Optimisation Tool是游戏开发开发工具Expo Web Browser 演进全解析从 CHANGELOG 到源码的 57 版功能脉络Expo Web Browser 演进全解析从 CHANGELOG 到源码的 57 版功能脉络 Expo Web Browser expo web brow移动开发前端跨平台原生移动上一篇如何用TMSpeech实现完全免费的Windows离线语音转文字终极指南下一篇TMSpeech你的Windows离线实时语音转文字助手创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

Kiln 评估架构重构:将 Eval Trace 与 Eval Score 彻底分离的实战指南

Kiln 评估架构重构:将 Eval Trace 与 Eval Score 彻底分离的实战指南

人工智能AI 应用AI 评测RAG微调提示工程开发工具桌面应用 【免费下载链接】Kiln Build, Evaluate, and Optimize AI Systems. Includes evals, RAG, agents, fine-tuning, synthetic data generation, dataset management, MCP, and more. 项目地址: https://gitcod…

2026/10/15 3:07:36 阅读更多 →
cas:2242902-55-0,Desthiobiotin-phenol,脱硫生物素-苯酚

cas:2242902-55-0,Desthiobiotin-phenol,脱硫生物素-苯酚

基本理化属性项目信息中文名称脱硫生物素-苯酚英文名称Desthiobiotin-phenol分子式C₁₆H₂₂N₂O₃分子量290.36 g/mol外观通常为白色或类白色固体粉末溶解性可溶于DMSO、甲醇等有机溶剂,部分溶于水结构式:结构特点它是将脱硫生物素(去掉硫原…

2026/10/15 3:07:36 阅读更多 →
Folia 跨设备同步完整教程

Folia 跨设备同步完整教程

Folia 跨设备同步完整教程 【免费下载链接】folia-major 专注于绚丽的歌词动画效果的本地音乐/navidrome/第三方多平台在线音乐播放器 项目地址: https://gitcode.com/GitHub_Trending/fo/folia-major 电脑上把 AI 主题和外观调了半宿,换台设备一切照旧&…

2026/10/15 3:06:36 阅读更多 →

最新新闻

git 源代码里,出现一大堆红色文件的一次思考

git 源代码里,出现一大堆红色文件的一次思考

git 源代码里,出现一大堆红色文件 是因为切换分支的时候,底座导致的。 1.首先要理解rebase是什么意思? rebase是录制本地代码,把最新的代码作为背景,然后把最新修改加在最新代码后面。 2.如何解决呢? git c…

2026/10/15 4:02:46 阅读更多 →
18.从 IP 到 MQTT:STM32 用 AT 指令驱动 ESP-12F 上云的完整链路(含全套实战代码 + 踩坑清单)

18.从 IP 到 MQTT:STM32 用 AT 指令驱动 ESP-12F 上云的完整链路(含全套实战代码 + 踩坑清单)

这是我做 STM32F411 ESP-12F 跑通 MQTT 上云之后的一次系统复盘。上一篇讲了「网络地基 → MQTT 模型 → AT 指令遥控」三层逻辑,有同学说想要能直接抄走跑的代码。这篇我把全套实战代码补上:mqtt.h 头文件、mqtt.c 逐函数实现(每步为什么这…

2026/10/15 4:02:46 阅读更多 →
git 里的 rebase到底是什么?

git 里的 rebase到底是什么?

一句话:rebase-把本地代码录制下来,把背景换成别人的最新代码,然后把本地代码在最新代码基础上播放出来。那么 git pull --rebase origin master 是什么意思呢?意思是什么 取服务器的最新代码作为底座,origin 代码仓库…

2026/10/15 4:02:46 阅读更多 →
从背了就忘到主动复习 江苏一个初中英语班的变化

从背了就忘到主动复习 江苏一个初中英语班的变化

苏南一位初三孩子的妈妈跟我聊起上学期的事。孩子英语卷子拿回来,阅读错一半,完形填空连蒙带猜,最让她头疼的是词汇——今天默写全对,三天后再测,能记住的不到三成。她试过打印单词表、买过卡片、也盯着孩子抄过几遍&a…

2026/10/15 4:02:46 阅读更多 →
GitHub Copilot Chat:用对话方式让 AI 帮你重构代码

GitHub Copilot Chat:用对话方式让 AI 帮你重构代码

GitHub Copilot Chat:用对话方式让 AI 帮你重构代码一、重构——AI 编程的"杀手级场景" 在所有的编程任务中,代码重构是从 AI 辅助中获益最大的场景之一。重构有个特点:它需要理解现有代码的逻辑,然后进行"安全的变…

2026/10/15 4:02:46 阅读更多 →
一种可快速恢复的Zabbix高可用架构设计

一种可快速恢复的Zabbix高可用架构设计

做运维的朋友们可能都有过这样的深夜惊魂:好容器完成了监控的Server、Proxy的部署、告警的收敛,监控的覆盖率也达标了,结果承载Zabbix Server和PostgreSQL的机器突然宕机。那一刻,不是“少看几张图”的问题,而是整个团…

2026/10/15 4:01:45 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 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/15 0:14:36 阅读更多 →
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/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练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/14 7:53:34 阅读更多 →