首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP-Parser:漂亮的打印多行数组

PHP-Parser:漂亮的打印多行数组
EN

Stack Overflow用户
提问于 2020-12-16 20:56:28
回答 1查看 77关注 0票数 0

使用nikic/php-parser,我试图读取一个现有的配置文件,在其中找到一个数组节点,向该节点追加一个新项,然后将所有内容写回该文件。

理想情况下,这不应该修改文件的其余部分,包括注释和空格。

我使用的方法是格式化-保留漂亮的打印outlined in the documentation

节点访问器大致如下所示(为清楚起见,将其截断):

代码语言:javascript
复制
$traverser = new NodeTraverser();
$traverser->addVisitor(new class extends Visitor {
    public function leaveNode(Node $node): ?Node
    {
        if ($this->isParentNodeIAmLookingFor($node)) {

            // Check whether the new item exists
            if ($this->nodeAlreadyHasChild($node, $node->value->items)) {
                throw new RuntimeException('Item exists');
            }

            // The structure I'd like to add
            $newChild = new Expr\Array_();
            $newChild->setAttribute( 'kind', Expr\Array_::KIND_SHORT);

            // Adding a new item with my desired key into the target array here
            $node->value->items[] = new Expr\ArrayItem(
                $newChild,
                new Scalar\String_('<<NEWLY_INSERTED_ITEM>>')
            );

            return $node;
        }

        return null;
    }
});

原始配置文件大致如下所示:

代码语言:javascript
复制
<?php
return [
    'important stuff' => [
        'with multiple lines',
        /* ... */
    ],

    // A comment I'd like to keep
    'items' => [
        'an existing item' => [ /* with stuff */ ],

        # <------ this is where I'd like to add my new item
    ],
];

PHP-Parser输出的内容如下:

代码语言:javascript
复制
<?php
return [
    'important stuff' => ['with multiple lines', /* ... */ ],
    // A comment I'd like to keep
    'items' => ['an existing item' => [ /* with stuff */ ], '<<NEWLY_INSERTED_ITEM>>' => []],
];

因此,看起来保留格式的漂亮打印确实删除了文件中所有项之间的空行,即使我没有接触它们,也将我现有的数组从多行转换为单行。

我知道保留格式的选项仍然是实验性的和不完整的,但从我在文档中读到的内容来看,issuescode多行数组实际上应该已经可以工作了,因此我希望其他项至少保持不变。

有没有办法强制数组结构使用多行输出?我错过了什么吗?我对AST的操作还不是很深入。

EN

回答 1

Stack Overflow用户

发布于 2021-03-15 10:04:30

您可以通过节点属性中的Comment类添加空格。(您可以只在注释文本中指定空格,而不是注释字符。)例如,这里插入一个新的备用节点

代码语言:javascript
复制
return new Node\Stmt\Property(
        8,
        [new Node\Stmt\PropertyProperty(
            new Node\VarLikeIdentifier($ident),
            static::valueNode($value)
        )],
        ['comments'=>[new Comment("\n")]]
    );
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65323747

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档