chaostangent / php-ass
用于读取高级子站阿尔法字幕文件的库
Requires
- php: >=5.3.3
This package is not auto-updated.
Last update: 2021-03-05 22:54:59 UTC
README
用于读取高级子站阿尔法字幕文件的库。
规格说明
ASS文件规格在多个地方以多个部分提供
简而言之:ASS文件是原始SSA(子站阿尔法)字幕文件的先进版本,并在样式和效果方面进行了多项改进。
一个有效的脚本文件以[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 文件
- 更多行类型支持
- 更多块类型支持
- 测试完成