infureal / php-ass
用于读取高级Sub Station Alpha字幕文件的库
Requires
- php: >=5.3.3
README
用于读取高级Substation Alpha字幕文件的库。
规范
ASS文件规范分散在不同的地方
简而言之:ASS文件是原始SSA(Sub Station Alpha)字幕文件的高级版本,在样式和效果方面包含几个改进。
有效的脚本文件以[Script Info]开始,并包含多个以INI风格格式编写的部分。
快速开始
使用composer安装
composer require chaostangent/php-ass
然后开始使用
require __DIR__.'/vendor/autoload.php'; use ChaosTangent\ASS\Reader; $reader = new Reader(); $script = $reader->fromFile(__DIR__.'/examples/example.ass'); foreach ($script as $block) { echo $block->getId().PHP_EOL; foreach ($block as $line) { echo $line->getKey().': '.$line->getValue(); } }
部分
脚本
ChaosTangent\ASS\Script
类代表ASS脚本的根对象。
您可以使用脚本的内容以及可选的文件名来实例化一个 Script
$script = new Script('[Script Info]', 'mytestscript.ass');
一旦实例化,您就可以检查传递的内容是否看起来像有效的ASS脚本
if ($script->isASSScript()) { // do more processing }
这仅检查前几个字节中的"[Script Info]"字符串,不能保证传递的脚本有效或可读。
要解析传递的脚本
$script->parse();
这将遍历创建脚本时传递的内容,并将其解析为块和行。
要获取当前块集合,您可以调用 getBlocks()
或将脚本视为迭代器
foreach ($script as $block) { // block processing }
要检查脚本是否有块
if ($script->hasBlock('Script Info')) { $script->getBlock('Script Info'); }
块
每个ASS脚本都由几个不同的块组成。 ChaosTangent\ASS\Block\Block
抽象类代表这些块之一。
目前php-ass支持以下块
- 脚本信息作为
ChaosTangent\ASS\Block\ScriptInfo
- V4+ 样式作为
ChaosTangent\ASS\Block\Styles
- 事件作为
ChaosTangent\ASS\Block\Events
解析时,任何其他类型的块(例如“Aegisub Project Garbage”,“字体”)都将被静默忽略。
ScriptInfo
块提供了对常用字段的函数
$scriptInfoBlock->getTitle(); $scriptInfoBlock->getWrapStyle(); $scriptInfoBlock->getScriptType();
否则,您只需将块视为行的容器。您可以使用数组访问来获取特定的行
$scriptInfoBlock[123]; // line 124 of this block
或将块视为迭代器
foreach ($scriptInfoBlock as $line) { // line processing }
行
行是脚本文件的核心。任何非注释行(不要与注释事件行混淆)都使用基类 ChaosTangent\ASS\Line\Line
。
某些块中的行根据特殊的“格式”行进行映射。这些由 ChaosTangent\ASS\Line\Format
表示。格式行有一个特殊的 getMapping()
方法,该方法返回一个可以用于解析其他行的数组。
如果这一切听起来有点复杂,您大多数时候不必担心,因为解析文件时一切都会为您处理。这意味着对于对话和样式行,您可以使用方法来获取不同的部分
$styleLine->getName(); $styleLine->getPrimaryColour(); $dialogueLine->getLayer(); $dialogueLine->getText();
对话行还有一个额外的方法来获取没有样式覆盖代码的行的文本
$dialogueLine->getTextWithoutStyleOverrides();
对于所有行,您可以使用通用的 getKey()
和 getValue()
方法,这些方法将返回行的键(例如,“Dialogue”,“Format”,“Style”)和未解析的值。
$dialogueLine->getKey(); // == 'Dialogue' $dialogueLine->getValue(); // e.g. 0,0:00:00.98,0:00:05.43,ED_English,,0,0,0,,{\fad(100,200)\blur5\c&H000010&\3c&H80A0C0&}My destiny,
如果您只想获取特定类型的行,只需在迭代时进行 instanceof
检查即可。
foreach ($block as $line) { if ($line instanceof Dialogue) { echo $line->getTextWithoutStyleOverrides().PHP_EOL; } }
测试
这个库有一个不断增长的测试套件,您可以使用 phpunit 来验证。任何古怪或已知的损坏脚本都将是受欢迎的补充。
待办事项
- 允许读取嵌入的信息(图像、字体等)。
- 允许构建和写入 ASS 文件。
- 更多行类型支持。
- 更多块类型支持。
- 测试完成。