chaostangent/php-ass

该软件包已被废弃且不再维护。未建议替代软件包。

用于读取高级子站阿尔法字幕文件的库

v1.0.4 2015-08-29 10:42 UTC

This package is not auto-updated.

Last update: 2021-03-05 22:54:59 UTC


README

用于读取高级子站阿尔法字幕文件的库。

规格说明

ASS文件规格在多个地方以多个部分提供

  1. 维基百科有一个很好的概述
  2. 原始格式是Microsoft Word .doc格式
  3. 文件如何融入Matroska (MKV)文件

简而言之: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支持以下块

在解析时,任何其他类型的块(例如,“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 文件
  • 更多行类型支持
  • 更多块类型支持
  • 测试完成