helmich / typo3-typoscript-parser
TYPO3配置语言TypoScript的解析器。
资助包维护!
martin-helmich
donate.helmich.me
Requires
- php: >=8.1
- symfony/config: ^5.4 || ^6.4 || ^7.0
- symfony/dependency-injection: ^5.4 || ^6.4 || ^7.0
- symfony/yaml: ^5.4 || ^6.4 || ^7.0
Requires (Dev)
- php-vfs/php-vfs: ^1.4.2
- phpspec/prophecy-phpunit: ^2.1.0
- phpunit/phpunit: ^10.5.11
- symfony/phpunit-bridge: ^5.4 || ^6.4 || ^7.0
- vimeo/psalm: ^5.22.0
- dev-master
- v2.6.1
- v2.6.0
- v2.5.0
- v2.4.1
- v2.4.0
- v2.3.1
- v2.3.0
- v2.2.1
- v2.2.0
- v2.1.4
- v2.1.3
- v2.1.2
- v2.1.1
- v2.1.0
- v2.0.1
- v2.0.0
- v1.2.2
- v1.2.1
- v1.2.0
- v1.1.2
- v1.1.1
- v1.1.0
- v1.0.6
- v1.0.5
- v1.0.4
- v1.0.3
- v1.0.2
- v1.0.1
- v1.0.0
- dev-bugfix/fix-psalm-errors
- dev-dependabot/add-v2-config-file
- dev-task/appease-codeclimate
- dev-bugfix/fix-typechecker-issues
- dev-task/maint2019
- dev-bugfix/allow-expr-conditions
- dev-chore/upgrade-php72
This package is auto-updated.
Last update: 2024-09-03 14:39:43 UTC
README
作者
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();