helmich/typo3-typoscript-parser

TYPO3配置语言TypoScript的解析器。

v2.6.1 2024-03-03 13:38 UTC

README

Build Status Code Climate Test Coverage Dependabot Status

作者

Martin Helmich (typo3 at martin-helmich dot de)

摘要

此包包含一个库,提供对TYPO3配置语言"TypoScript"的标记化和解析功能。

为什么?

就像typoscript-lint一样,这个项目最初只是一个简单的编程练习。标记化和解析器可能以更好的方式实现(它是开源的,欢迎改进!)。

用法

解析TypoScript

您可以使用Helmich\TypoScriptParser\Parser\Parser类从源代码输入生成语法树。该类需要一个Helmich\TypoScriptParser\Tokenizer\Tokenizer类的实例作为依赖项。当使用Symfony DependencyInjection组件时,您可以直接使用服务parser

use Helmich\TypoScriptParser\Parser\Parser,
    Helmich\TypoScriptParser\Tokenizer\Tokenizer;

$typoscript = file_get_contents('path/to/typoscript.ts');
$parser     = new Parser(new Tokenizer());
$statements = $parser->parse($typoscript);

分析TypoScript

您可以通过实现访问者来分析生成的语法树。例如,让我们实现一个检查非CGL兼容变量名的检查(可能没有实际用途,仅作为简单示例)

首先,我们需要相应的访问者实现

use Helmich\TypoScriptParser\Parser\Traverser\Visitor,
    Helmich\TypoScriptParser\Parser\AST\Statement,
    Helmich\TypoScriptParser\Parser\AST\Operator\Assignment,
    Helmich\TypoScriptParser\Parser\AST\NestedAssignment;

class VariableNamingCheckVisitor implements Visitor {
    public function enterTree(array $statements) {}
    public function enterNode(Statement $statement) {
        if ($statement instanceof Assignment || $statement instanceof NestedAssignment) {
            if (!preg_match(',^[0-9]+$,', $statement->object->relativePath)) {
                throw new \Exception('Variable names must be numbers only!');
            }
        }
    }
    public function exitNode(Statement $statement) {}
    public function exitTree(array $statements) {}
}

然后遍历语法树

use Helmich\TypoScriptParser\Parser\Traverser\Traverser;

$traverser = new Traverser($statements);
$traverser->addVisitor(new VariableNamingCheckVisitor());
$traverser->walk();