clthck/slimphp

Ruby风格的PHP 5.4+模板引擎

维护者

详细信息

github.com/clthck/slimphp

源代码

问题

安装: 82

依赖: 0

建议者: 0

安全: 0

星星: 3

关注者: 1

分支: 0

类型:项目

v0.0.5 2015-12-28 16:02 UTC

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);

语法

行结束符

CRLFCR 在解析前会被转换为 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) :)。

有一些默认的:ifelseelseifwhileforforeachswitchcase

这是编写多行PHP代码块的另一种便捷方式

- $user = [ \
	'username' 		=> 'clthck',
	'first_name' 	=> 'Joey',
  ];

这将被解释为

<?php
    $user = [ 
      'username'     => 'clthck',
      'first_name'   => 'Joey',
    ];
?>