puml2php / puml-parser
这是一个用于解析 plantuml 文件的 PHP 解析器。
v3.2.1
2022-04-30 02:54 UTC
Requires
- php: >=8
- ext-mbstring: *
Requires (Dev)
- phpunit/phpunit: ^9.5
README
概述
此软件包从 plantuml 文件构建类定义的 AST。此软件包仅支持 PHP。
安装
通过 Composer
composer require puml2php/puml-parser
使用方法
示例 PlantUML 源文件。
@startuml package Lexer { interface Tokenizeable package Lexer/Arrow { abstract class ArrowTokenizer implements Tokenizeable class LeftArrowTokenizer { + publicProperty : array # protectedProperty : string - privateProperty } } enum Enum { CASE1 CASE2 CASE3 } LeftArrowTokenizer--|>ArrowTokenizer NoneDefinitionClass ..|> Tokenizeable } @enduml
基本上,假设每个类定义在转换为 DTO 后将进行操作。
<?php require_once __DIR__ . '/vendor/autoload.php'; use PumlParser\Lexer\Lexer; use PumlParser\Lexer\PumlTokenizer; use PumlParser\Parser\Parser; $lexer = new Lexer(PumlTokenizer::newInstance()); $parser = new Parser($lexer); $ast = $parser->parse(__DIR__ . '/sample.puml'); foreach ($ast->toDtos() as $definition) { echo "----------\n"; echo "name: " . $definition->getName() . "\n"; echo "package: " . $definition->getPackage() . "\n"; if ($definition->getType() === 'enum') { foreach ($definition->getCases() as $case) { echo "case: " . $case . "\n"; } } else { foreach ($definition->getProperties() as $property) { $propertyResult = "property name: " . $property->getName(); $propertyResult .= " , visibility: " . $property->getVisibility(); $propertyResult .= " , type: " . $property->getType(); echo $propertyResult . "\n"; } } }
$ php sample.php ---------- name: Tokenizeable package: Lexer ---------- name: ArrowTokenizer package: Lexer\Arrow ---------- name: LeftArrowTokenizer package: Lexer\Arrow property name: publicProperty , visibility: public , type: array property name: protectedProperty , visibility: protected , type: string property name: privateProperty , visibility: private , type: ---------- name: Enum package: Lexer case: CASE1 case: CASE2 case: CASE3 ---------- name: NoneDefinitionClass package: Lexer
支持三种解析结果。它们是 json、array 和 Dto。
<?php use PumlParser\Lexer\Lexer; use PumlParser\Lexer\PumlTokenizer; use PumlParser\Parser\Parser; $lexer = new Lexer(PumlTokenizer::newInstance()); $parser = new Parser($lexer); $ast = $parser->parse(__DIR__ . '/sample.puml');
dump $ast->toDtos()
array(5) {
[0]=>
object(PumlParser\Dto\Definition)#69 (7) {
["name":"PumlParser\Dto\Definition":private]=>
string(12) "Tokenizeable"
["type":"PumlParser\Dto\Definition":private]=>
string(9) "interface"
["package":"PumlParser\Dto\Definition":private]=>
string(5) "Lexer"
["properties":"PumlParser\Dto\Definition":private]=>
array(0) {
}
["cases":"PumlParser\Dto\Definition":private]=>
array(0) {
}
["parents":"PumlParser\Dto\Definition":private]=>
array(0) {
}
["interfaces":"PumlParser\Dto\Definition":private]=>
array(0) {
}
}
[1]=>
object(PumlParser\Dto\Definition)#72 (7) {
["name":"PumlParser\Dto\Definition":private]=>
string(14) "ArrowTokenizer"
["type":"PumlParser\Dto\Definition":private]=>
string(14) "abstract class"
["package":"PumlParser\Dto\Definition":private]=>
string(11) "Lexer\Arrow"
["properties":"PumlParser\Dto\Definition":private]=>
array(0) {
}
["cases":"PumlParser\Dto\Definition":private]=>
array(0) {
}
["parents":"PumlParser\Dto\Definition":private]=>
array(0) {
}
["interfaces":"PumlParser\Dto\Definition":private]=>
array(1) {
[0]=>
object(PumlParser\Dto\Definition)#53 (7) {
["name":"PumlParser\Dto\Definition":private]=>
string(12) "Tokenizeable"
["type":"PumlParser\Dto\Definition":private]=>
string(9) "interface"
["package":"PumlParser\Dto\Definition":private]=>
string(5) "Lexer"
["properties":"PumlParser\Dto\Definition":private]=>
array(0) {
}
["cases":"PumlParser\Dto\Definition":private]=>
array(0) {
}
["parents":"PumlParser\Dto\Definition":private]=>
array(0) {
}
["interfaces":"PumlParser\Dto\Definition":private]=>
array(0) {
}
}
}
}
[2]=>
object(PumlParser\Dto\Definition)#71 (7) {
["name":"PumlParser\Dto\Definition":private]=>
string(18) "LeftArrowTokenizer"
["type":"PumlParser\Dto\Definition":private]=>
string(5) "class"
["package":"PumlParser\Dto\Definition":private]=>
string(11) "Lexer\Arrow"
["properties":"PumlParser\Dto\Definition":private]=>
array(3) {
[0]=>
object(PumlParser\Dto\PropertyDefinition)#47 (3) {
["name":"PumlParser\Dto\PropertyDefinition":private]=>
string(14) "publicProperty"
["visibility":"PumlParser\Dto\PropertyDefinition":private]=>
string(6) "public"
["type":"PumlParser\Dto\PropertyDefinition":private]=>
string(5) "array"
}
[1]=>
object(PumlParser\Dto\PropertyDefinition)#9 (3) {
["name":"PumlParser\Dto\PropertyDefinition":private]=>
string(17) "protectedProperty"
["visibility":"PumlParser\Dto\PropertyDefinition":private]=>
string(9) "protected"
["type":"PumlParser\Dto\PropertyDefinition":private]=>
string(6) "string"
}
[2]=>
object(PumlParser\Dto\PropertyDefinition)#70 (3) {
["name":"PumlParser\Dto\PropertyDefinition":private]=>
string(15) "privateProperty"
["visibility":"PumlParser\Dto\PropertyDefinition":private]=>
string(7) "private"
["type":"PumlParser\Dto\PropertyDefinition":private]=>
string(0) ""
}
}
["cases":"PumlParser\Dto\Definition":private]=>
array(0) {
}
["parents":"PumlParser\Dto\Definition":private]=>
array(1) {
[0]=>
object(PumlParser\Dto\Definition)#65 (7) {
["name":"PumlParser\Dto\Definition":private]=>
string(14) "ArrowTokenizer"
["type":"PumlParser\Dto\Definition":private]=>
string(14) "abstract class"
["package":"PumlParser\Dto\Definition":private]=>
string(11) "Lexer\Arrow"
["properties":"PumlParser\Dto\Definition":private]=>
array(0) {
}
["cases":"PumlParser\Dto\Definition":private]=>
array(0) {
}
["parents":"PumlParser\Dto\Definition":private]=>
array(0) {
}
["interfaces":"PumlParser\Dto\Definition":private]=>
array(1) {
[0]=>
object(PumlParser\Dto\Definition)#66 (7) {
["name":"PumlParser\Dto\Definition":private]=>
string(12) "Tokenizeable"
["type":"PumlParser\Dto\Definition":private]=>
string(9) "interface"
["package":"PumlParser\Dto\Definition":private]=>
string(5) "Lexer"
["properties":"PumlParser\Dto\Definition":private]=>
array(0) {
}
["cases":"PumlParser\Dto\Definition":private]=>
array(0) {
}
["parents":"PumlParser\Dto\Definition":private]=>
array(0) {
}
["interfaces":"PumlParser\Dto\Definition":private]=>
array(0) {
}
}
}
}
}
["interfaces":"PumlParser\Dto\Definition":private]=>
array(0) {
}
}
[3]=>
object(PumlParser\Dto\Definition)#39 (7) {
["name":"PumlParser\Dto\Definition":private]=>
string(4) "Enum"
["type":"PumlParser\Dto\Definition":private]=>
string(4) "enum"
["package":"PumlParser\Dto\Definition":private]=>
string(5) "Lexer"
["properties":"PumlParser\Dto\Definition":private]=>
array(0) {
}
["cases":"PumlParser\Dto\Definition":private]=>
array(3) {
[0]=>
string(5) "CASE1"
[1]=>
string(5) "CASE2"
[2]=>
string(5) "CASE3"
}
["parents":"PumlParser\Dto\Definition":private]=>
array(0) {
}
["interfaces":"PumlParser\Dto\Definition":private]=>
array(0) {
}
}
[4]=>
object(PumlParser\Dto\Definition)#67 (7) {
["name":"PumlParser\Dto\Definition":private]=>
string(19) "NoneDefinitionClass"
["type":"PumlParser\Dto\Definition":private]=>
string(5) "class"
["package":"PumlParser\Dto\Definition":private]=>
string(5) "Lexer"
["properties":"PumlParser\Dto\Definition":private]=>
array(0) {
}
["cases":"PumlParser\Dto\Definition":private]=>
array(0) {
}
["parents":"PumlParser\Dto\Definition":private]=>
array(0) {
}
["interfaces":"PumlParser\Dto\Definition":private]=>
array(1) {
[0]=>
object(PumlParser\Dto\Definition)#61 (7) {
["name":"PumlParser\Dto\Definition":private]=>
string(12) "Tokenizeable"
["type":"PumlParser\Dto\Definition":private]=>
string(9) "interface"
["package":"PumlParser\Dto\Definition":private]=>
string(5) "Lexer"
["properties":"PumlParser\Dto\Definition":private]=>
array(0) {
}
["cases":"PumlParser\Dto\Definition":private]=>
array(0) {
}
["parents":"PumlParser\Dto\Definition":private]=>
array(0) {
}
["interfaces":"PumlParser\Dto\Definition":private]=>
array(0) {
}
}
}
}
}
dump $ast->toJson()
[
{
"interface": {
"Name": "Tokenizeable",
"Package": "Lexer",
"Propaties": [],
"Parents": [],
"Interfaces": []
}
},
{
"abstract class": {
"Name": "ArrowTokenizer",
"Package": "Lexer/Arrow",
"Propaties": [],
"Parents": [],
"Interfaces": [
{
"interface": {
"Name": "Tokenizeable",
"Package": "Lexer",
"Propaties": [],
"Parents": [],
"Interfaces": []
}
}
]
}
},
{
"class": {
"Name": "LeftArrowTokenizer",
"Package": "Lexer/Arrow",
"Propaties": [
{
"name": "publicProperty",
"visibility": "public",
"type": "array"
},
{
"name": "protectedProperty",
"visibility": "protected",
"type": "string"
},
{
"name": "privateProperty",
"visibility": "private",
"type": ""
}
],
"Parents": [
{
"abstract class": {
"Name": "ArrowTokenizer",
"Package": "Lexer/Arrow",
"Propaties": [],
"Parents": [],
"Interfaces": [
{
"interface": {
"Name": "Tokenizeable",
"Package": "Lexer",
"Propaties": [],
"Parents": [],
"Interfaces": []
}
}
]
}
}
],
"Interfaces": []
}
},
{
"enum": {
"Name": "Enum",
"Package": "Lexer",
"Cases": [
"CASE1",
"CASE2",
"CASE3"
],
"Parents": [],
"Interfaces": []
}
},
{
"class": {
"Name": "NoneDefinitionClass",
"Package": "Lexer",
"Propaties": [],
"Parents": [],
"Interfaces": [
{
"interface": {
"Name": "Tokenizeable",
"Package": "Lexer",
"Propaties": [],
"Parents": [],
"Interfaces": []
}
}
]
}
}
]
dump $ast->toArray()
array(5) {
[0]=>
array(1) {
["interface"]=>
array(5) {
["Name"]=>
string(12) "Tokenizeable"
["Package"]=>
string(5) "Lexer"
["Propaties"]=>
array(0) {
}
["Parents"]=>
array(0) {
}
["Interfaces"]=>
array(0) {
}
}
}
[1]=>
array(1) {
["abstract class"]=>
array(5) {
["Name"]=>
string(14) "ArrowTokenizer"
["Package"]=>
string(11) "Lexer/Arrow"
["Propaties"]=>
array(0) {
}
["Parents"]=>
array(0) {
}
["Interfaces"]=>
array(1) {
[0]=>
array(1) {
["interface"]=>
array(5) {
["Name"]=>
string(12) "Tokenizeable"
["Package"]=>
string(5) "Lexer"
["Propaties"]=>
array(0) {
}
["Parents"]=>
array(0) {
}
["Interfaces"]=>
array(0) {
}
}
}
}
}
}
[2]=>
array(1) {
["class"]=>
array(5) {
["Name"]=>
string(18) "LeftArrowTokenizer"
["Package"]=>
string(11) "Lexer/Arrow"
["Propaties"]=>
array(3) {
[0]=>
array(3) {
["name"]=>
string(14) "publicProperty"
["visibility"]=>
string(6) "public"
["type"]=>
string(5) "array"
}
[1]=>
array(3) {
["name"]=>
string(17) "protectedProperty"
["visibility"]=>
string(9) "protected"
["type"]=>
string(6) "string"
}
[2]=>
array(3) {
["name"]=>
string(15) "privateProperty"
["visibility"]=>
string(7) "private"
["type"]=>
string(0) ""
}
}
["Parents"]=>
array(1) {
[0]=>
array(1) {
["abstract class"]=>
array(5) {
["Name"]=>
string(14) "ArrowTokenizer"
["Package"]=>
string(11) "Lexer/Arrow"
["Propaties"]=>
array(0) {
}
["Parents"]=>
array(0) {
}
["Interfaces"]=>
array(1) {
[0]=>
array(1) {
["interface"]=>
array(5) {
["Name"]=>
string(12) "Tokenizeable"
["Package"]=>
string(5) "Lexer"
["Propaties"]=>
array(0) {
}
["Parents"]=>
array(0) {
}
["Interfaces"]=>
array(0) {
}
}
}
}
}
}
}
["Interfaces"]=>
array(0) {
}
}
}
[3]=>
array(1) {
["enum"]=>
array(5) {
["Name"]=>
string(4) "Enum"
["Package"]=>
string(5) "Lexer"
["Cases"]=>
array(3) {
[0]=>
string(5) "CASE1"
[1]=>
string(5) "CASE2"
[2]=>
string(5) "CASE3"
}
["Parents"]=>
array(0) {
}
["Interfaces"]=>
array(0) {
}
}
}
[4]=>
array(1) {
["class"]=>
array(5) {
["Name"]=>
string(19) "NoneDefinitionClass"
["Package"]=>
string(5) "Lexer"
["Propaties"]=>
array(0) {
}
["Parents"]=>
array(0) {
}
["Interfaces"]=>
array(1) {
[0]=>
array(1) {
["interface"]=>
array(5) {
["Name"]=>
string(12) "Tokenizeable"
["Package"]=>
string(5) "Lexer"
["Propaties"]=>
array(0) {
}
["Parents"]=>
array(0) {
}
["Interfaces"]=>
array(0) {
}
}
}
}
}
}
}
许可证
MIT 许可证(MIT)。更多信息请参阅 LICENSE。