clthck /slimphp
Ruby风格的PHP 5.4+模板引擎
Requires
- php: >=5.4.0
Requires (Dev)
- phpunit/phpunit: 4.8.*
This package is not auto-updated.
Last update: 2024-09-14 18:26:11 UTC
README
SlimPHP 是一个高性能的模板编译器,受到 Slim 的强烈影响,专为 PHP 5.4 或更高版本实现。
特性
- 高性能解析器
- 良好的可读性
- 编译和运行时上下文错误报告
- HTML5模式(使用 doctype html)
- 结合动态和静态标签类
- 无标签前缀
- 清晰美观的HTML输出
- 过滤器
- :php
- :cdata
- :css
- :javascript
- 您甚至可以通过API编写和添加自己的过滤器
公共API
$dumper = new PHPDumper([
'tabSize' => 4 // Tab size for output. Default value: 2
]);
$dumper->registerVisitor('tag', new AutotagsVisitor());
$dumper->registerFilter('javascript', new JavaScriptFilter());
$dumper->registerFilter('cdata', new CDATAFilter());
$dumper->registerFilter('php', new PHPFilter());
$dumper->registerFilter('css', new CSSFilter());
// Initialize parser & SlimPHP
$parser = new Parser(new Lexer([
'tabSize' => 2 // Tab size for input. Default value: 2
]));
$slim = new SlimPHP($parser, $dumper);
// Parse a template (either filename or content string)
echo $slim->render($template);
语法
行结束符
CRLF 和 CR 在解析前会被转换为 LF。
缩进
正如其名,SlimPHP支持任意长度的缩进。只需在整个Slim模板文件中保持一致的缩进树即可。
标签
标签简单地是一个开头的单词
html
例如会转换为 <html></html>
标签也可以有id
div#container
这将渲染 <div id="container"></div>
关于类呢?
div.user-details
渲染 <div class="user-details"></div>
多个类?和一个id?当然
div#foo.bar.baz
渲染 <div id="foo" class="bar baz"></div>
div div div 真的很烦人,试试这个
#foo
.bar
这是一个我们之前已经做过的语法的简写,输出
<div id="foo"></div><div class="bar"></div>
SlimPHP有一个名为“autotags”的特性。它只是标签的片段。Autotags将扩展为具有自定义属性的默认标签。例如
input:text
会扩展为 <input type="text" />
& 它与 input( type="text" )
相同,但更短。另一个例子
input:submit( value="Send" )
将变成 <input type="submit" value="Send" />
。
它还支持新的HTML5标签,如(input:email
> <input type="email"/>
)。
标签文本
只需在标签后放置一些内容
p wahoo!
渲染 <p>wahoo!</p>
太酷了,但是关于大量文本怎么办
p
| foo bar baz
rawr rawr
super cool
go Slim go
渲染 <p>foo bar baz rawr.....</p>
实际上想 <?= $something ?>
出于某种原因?使用 #{}
代替
p #{$something}
现在我们有 <p><?= $something ?></p>
如果你想输出 #{}
只是这样?在这种情况下,您可以转义井号(#)字符
p \#{$notSoSpecial}
然后我们有 <p>#{$notSoSpecial}</p>
直接文本
管道告诉SlimPHP直接复制该行。它实际上跳过了任何处理。任何缩进大于管道的后续行都将被复制。
body
p
| This line is on the left margin.
This line will have one space in front of it.
This line will have two spaces in front of it.
And so on...
内联HTML <
您可以直接在SlimPHP中编写HTML标签,这允许您以更HTML的方式编写模板,使用闭合标签或混合HTML和Slim样式。开头的 < 与隐式的 | 一样
<html>
head
title Example
<body>
- if ($articles):
- else:
table
- foreach ($articles as $a):
<tr><td>#{$a->name}</td><td>#{$a->description}</td></tr>
</body>
</html>
嵌套
ul
li one
li two
li three
属性
SlimPHP当前支持 '(' 和 ')' 作为属性指示符,冒号(,) 或空格作为分隔符。
a (href='/login', title='View login page' data-id="13") Login
如果开括号出现在文本节点的非常第一个字符,则需要转义它,否则不需要转义
a (href='/login', title='View login page') \(Login)
a (href='/login', title='View login page') Login (with Twitter)
布尔属性也受支持
input(type="checkbox", checked)
具有代码的布尔属性仅在 true
时输出属性
input(type="checkbox", checked=someValue)
另一个可能很酷的特性在这里
input:checkbox (#{$user->isAdmin() ? 'checked' : ''} name=is_admin)
将按照如下方式渲染
<input <?= $user->isAdmin() ? 'checked' : '' ?> name="is_admin" type="checkbox" />
注意:对于属性对,忽略前导和尾随空白。
文档类型
要添加文档类型,只需使用 doctype
后跟一个可选的值
doctype
将输出过渡文档类型,然而
doctype html
(或简称为doctype 5
)
将输出HTML5的文档类型。以下是由默认定义的文档类型,可以轻松扩展
$doctypes = array(
'xml' => '<?xml version="1.0" encoding="utf-8" ?>',
'xml ISO-8859-1' => '<?xml version="1.0" encoding="iso-8859-1" ?>',
'html' => '<!DOCTYPE html>',
'5' => '<!DOCTYPE html>',
'1.1' => '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">',
'strict' => '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">',
'frameset' => '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">',
'mobile' => '<!DOCTYPE html PUBLIC "-//WAPFORUM//DTD XHTML Mobile 1.2//EN" "http://www.openmobilealliance.org/tech/DTD/xhtml-mobile12.dtd">',
'basic' => '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML Basic 1.1//EN" "http://www.w3.org/TR/xhtml-basic/xhtml-basic11.dtd">',
'transitional' => '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">'
);
注释
SlimPHP注释
SlimPHP支持尖括号注释(/ COMMENT
)。所以SlimPHP块
/ SLIMPHP
- $foo = "<script>";
p
- switch ($foo):
- case 2:
p.foo= $foo
/- case 'strong':
- strong#name= $foo * 2
- case 5:
p some text
将被编译成
<?php $foo = "<script>"; ?>
<p>
<?php switch ($foo): ?>
<?php case 2: ?>
<p class="foo"><?= $foo ?></p>
<?php break; ?>
<?php case 5: ?>
<p>some text</p>
<?php break; ?>
<?php endswitch; ?>
</p>
HTML注释
SlimPHP支持HTML注释(/! comment
)。所以块
peanutbutterjelly
/! This is the peanutbutterjelly element
| I like sandwiches!
将变成
<peanutbutterjelly>
<!-- This is the peanutbutterjelly element -->
I like sandwiches!
</peanutbutterjelly>
与多行注释类似
/!
p This doesn't render...
div
h1 Because it's commented out!
它们编译成
<!--
<p>This doesn't render...</p>
<div>
<h1>Because it's commented out!</h1>
</div>
-->
IE条件注释
此外,SlimPHP也支持IE条件注释,所以
/! [if IE]
a( href = 'http://www.mozilla.com/en-US/firefox/' )
h1 Get Firefox
将被解析为
<!--[if IE]>
<a href="http://www.mozilla.com/en-US/firefox/">
<h1>Get Firefox</h1>
</a>
<![endif]-->
过滤器
过滤器以:
开头,例如:javascript
或:cdata
,并将以下文本块传递给任意函数进行处理。请参阅文档顶部的功能部分以获取可用的过滤器。
body
:php
$data = 40;
$data /= 2;
echo $data;
渲染
<body>
<?php
$data = 40;
$data /= 2;
echo $data;
?>
</body>
代码
缓冲/非缓冲输出
SlimPHP目前支持两种可执行代码的分类。第一种是以-
开头,并且是不缓冲的
- var $foo = 'bar';
这可以用于条件或迭代
- foreach ($items as $item):
p= $item
由于SlimPHP的缓冲技术,以下也是有效的
- if ($foo):
ul
li yay
li foo
li worked
- else:
p hey! didnt work
第二种是回显代码,用于回显返回值,以=
开头
- $foo = 'bar'
= $foo
h1= $foo
这将输出
<?php $foo = 'bar' ?>
<?= $foo ?>
<h1><?= $foo ?></h1>
代码块
此外,SlimPHP具有代码块,支持基本的PHP模板语法
ul
- while (true):
li item
将被渲染为
<ul>
<?php while (true): ?>
<li>item</li>
<?php endwhile; ?>
</ul>
但是,别忘了在指令开始后使用冒号:
(例如- if(true) :
)。
有一些默认的:if
、else
、elseif
、while
、for
、foreach
、switch
、case
。
这是编写多行PHP代码块的另一种便捷方式
- $user = [ \
'username' => 'clthck',
'first_name' => 'Joey',
];
这将被解释为
<?php
$user = [
'username' => 'clthck',
'first_name' => 'Joey',
];
?>