emsifa/power-stub

一个支持控制语句和循环而不破坏缩进的占位符引擎。

dev-master 2019-05-14 02:40 UTC

This package is auto-updated.

Last update: 2024-09-14 15:12:59 UTC


README

Build Status License: MIT

Power Stub 是一个 占位符引擎,支持控制语句、循环和几个其他特性,使您更容易从占位符文件生成代码。

占位符文件是一个包含多个参数的原始代码文件,这些参数将被特定文本替换。

我们使用“占位符引擎”这个术语,因为 Power Stub 不仅能够用给定文本替换参数,还支持控制语句(if-elseif-else-endif)、循环(foreach-endforeachwhile-endwhile)等。它就像一个 模板引擎,同时保持您的缩进正确,因此生成的代码将保持整洁。

理解问题

在常见的模板引擎,如 Blade、Twig 等,它们会将您的视图文件渲染成下面的 PHP 代码

<div>
    <?php foreach($a as $b): ?>
    <p>
        lorem ipsum <?= $b ?>
    </p>
    <?php endforeach; ?>
</div>

当我们用 $a = [1,2,3] 渲染该文件时,结果会像这样混乱

<div>
        <p>
        lorem ipsum 1
    </p>
        <p>
        lorem ipsum 2
    </p>
        <p>
        lorem ipsum 3
    </p>
    </div>

这是可以的,因为模板引擎的结果是针对浏览器,浏览器不关心缩进。

但如果我们要制作代码生成器,这是不可接受的。

所以使用 Power Stub,我们的占位符文件会看起来像这样

<div>
    |# foreach($a as $b) #|
    <p>
        lorem ipsum [# $b #]
    </p>
    |# endforeach #|
</div>

当我们用 $a = [1,2,3] 渲染这个占位符时,结果会像这样

<div>
    <p>
        lorem ipsum 1
    </p>
    <p>
        lorem ipsum 2
    </p>
    <p>
        lorem ipsum 3
    </p>
</div>

现在大家都很开心 :D

其他特性

包含

我们还处理了包含函数,以保持相对于定义的缩进。例如,您有两个占位符文件如下

main.js.stub

import something from 'something';

[# include("timeout.js", ['message' => 'first', 'delay' => 1000]) #]

something.on('event', () => {
    something.asyncStuff(() => {
        // timeout 2 seconds
        [# include("timeout.js", ['message' => 'second', 'delay' => 2000]) #]
    });
});

timeout.js.stub

setTimeout(() => {
    console.log("[# $message #]");
}, [# $delay #]);

如果我们渲染 main.js.stub,结果会像这样

import something from 'something';

setTimeout(() => {
    console.log("first");
}, 1000);

something.on('event', () => {
    something.asyncStuff(() => {
        // timeout 2 seconds
        setTimeout(() => {
            console.log("second");
        }, 2000);
    });
});

开始使用

Power Stub 仍然是实验性的。我们已经进行了一些简单的测试。您可以使用它,但可能会有一些破坏性变更。

要求

  • PHP >= 7.1

安装

在您想放置代码的目录中创建一个目录。

使用您的 cmd/终端进入该目录,并运行下面的 composer 命令

composer require emsifa/power-stub:dev-master

准备

在我们开始使用 Power Stub 之前,我们需要创建两个目录。

您可以使用以下命令

  • mkdir stubs
  • mkdir compiled

渲染

首先,让我们创建第一个占位符。在我们的 stubs 目录中创建文件 app.js.stub

在这个例子中,我们将创建一个包含动态路由的 express 应用占位符。

const express = require('express');
const app = express();

|# foreach($routes as $r) #|
app.[# strtolower($r['method']) #]('[# $r['path'] #]', function (req, res) {
    return res.send('OK');
});
|# endforeach #|

app.listen(3000);

现在让我们创建一个 PHP 脚本来渲染这个占位符。创建一个名为 render.php 的文件。

<?php

require("vendor/autoload.php");

$powerStub = new Factory(
    __DIR__.'/stubs',       // our stubs directory
    __DIR__.'/compiled',    // compiled directory
    'stub'                  // extension (optional, default 'stub')
);

// Render app.js.stub
$rendered = $powerStub->render("app.js", [
    'routes' => [
        [
            'path' => '/',
            'method' => 'GET',
        ],
        [
            'path' => '/login',
            'method' => 'POST',
        ],
        [
            'path' => '/register',
            'method' => 'POST',
        ]
    ]
]);

echo $rendered;

现在,当您调用 php render.php 时,输出将看起来像这样

const express = require('express');
const app = express();

app.get('/', function (req, res) {
    return res.send('OK');
});
app.post('/login', function (req, res) {
    return res.send('OK');
});
app.register('/register', function (req, res) {
    return res.send('OK');
});

app.listen(3000);