-
Notifications
You must be signed in to change notification settings - Fork 27
Jedi Language White Paper
Emotion, yet peace. Ignorance, yet knowledge. Passion, yet serenity. Chaos, yet harmony. Death, yet the Force. — Jedi Code
# HTML/XML 构造 ## 元素(Element) (1)一个单独的单词就是一个标签: ```jade html ```会被解析为:
<html></html>
(2)包涵ID的标签:
div#container
会被解析为:
<div id="container"></div>
(3)包涵class的标签:
div.user-details
会被解析为:
<div class="user-details"></div>
(4)同时包含class和id:
div.bar.baz#foo
会被解析为:
<div id="foo" class="bar baz"></div>
注意: class(.xxx)必须写在id(#xxx)的前面,class可以有多个,id只能有一个。 不能在这里插值。
## 属性(Attribute) (1)标签的属性可以放置到它下一级子block的任何位置: ```jade div @name1="example" '12345 @name2="text" ```会被解析为:
<div name1="example" name2="text">
12345
</div>
(2)属性可以插入表达式,插入表达式时要使用双引号。
a @href="{url}"
'button
会被解析为:
<a href="<?= $data->url ?>">
button
</a>
'hello!
"world!
会被解析为:
hello!world!
(2)大段文本可以写在子block中:
'
| foo bar baz
| rawr rawr
| super cool
| go jade go
会被解析为
| foo bar baz | rawr rawr | super cool | go jade go
(3)一个单独的'代表一个空格:
'
'hello
会被解析为:
hello
(4)文本开头处的空格会被忽略
' hello
' world
会被解析为:
hello world
(5)单引号开头的文本写在同一行时,可以在末尾加引号 ' ,末尾的引号 ' 不会被输出。
'hello world'
会被解析为:
hello world
(6)以双引号开头的文本可以插入表达式
"12345 {text}
会被解析为:
12345 <?= htmlspecialchars($data->text) ?>
(7)需要输出 {}
时,可以用‘\’转义掉它。
"12345 \{something}
会被解析为:
12345 {something}
(8)不希望把变量的内容转义掉时,可以使用':unsafe'关键字,强制输出变量:
:unsafe adsenseScript
会被解析为:
<?= adsenseScript ?>
会被解释为:
<!--hello world-->
(2)用'!'注释整段:
!
hello
world
会被解释为:
<!--hello world-->
(3)JS代码可以用'!'来写。
script
!
_defer.push('/follow.js');
alert('hello world');
会被解释为:
<script>
_defer.push('/follow.js');
alert('hello world');
</script>
注意:使用'!'写JS代码时,JS中不能插入表达式。
(4)若要在JS中插入表达式,可以用双引号 " 定义好[变量],然后在后面使用。
script
"
var categoryEnglishName = '{category.id}';
!
alert(categoryEnglishName);
会被解释为:
<script>
var categoryEnglishName = '<?= category.id ?>';
alert(categoryEnglishName);
</script>
会被解析为:
<td><div class="linkstd"></div></td>
会被解析为:
<a href="www.baixing.com">
button
</a>
会被解析为:
<div class="text">12345</div>
会被解析为:
<?php
// just some paragraphs
?>
<p>foo</p>
<p>bar</p>
(2)使用字符 '--' 可以简单的注释掉整个block:
--div.test
'example
span
'12345
会被解析为:
<?php
/*
*div.test
* 'example
* span
* '12345
*/
?>
###代码注入 (1)使用字符 '-' 可以向页面中注入PHP代码。
-$varb = 'hello world';
会被解析为:
<?php
$varb = 'hello world';
?>
(2)行末的';'可以省略,Jedi会自动添加分号。
-$varb = 'hello world'
会被解析为:
<?php
$varb = 'hello world';
?>
(3)注入时注意末尾的';',Jedi的自动添加可能会带来Bug。
-for ($i = 0; $i < 10; $i++) {
-$varb = 'hello world';
-}
会被解析为:
<?php
for ($i = 0; $i < 10; $i++) {;
$varb = 'hello world';
};
?>
(4)'-'只会影响本行内容,它的子block会继续按照Jedi语法解析,并会自动添加大括号'{ }'。
-for ($i = 0; $i < 10; $i++)
-$varb = 'hello world'
会被解析为:
<?php
for ($i = 0; $i < 10; $i++)
{
$varb = 'hello world';
}
?>
(1):let关键字
:let x = 'hello world'
"{x}
会被解析为:
<?php
call_user_func(function($x) {
echo htmlspecialchars($x);
}, 'hello world');
?>
(2)使用:let赋值时,被赋值的变量只在它的子block中有效:
"{x}
:let x = 'hello world'
"{x}
"{x}
会被解析为:
echo htmlspecialchars($data->x);
<?php
call_user_func(function($x) {
echo htmlspecialchars($x);
}, 'hello world');
?>
echo htmlspecialchars($data->x);
<?php if ($data->a > $data->b) { ?>
<div class="content"></div>
<?php } ?>
(2)变量默认被翻译为$data的属性,如'x'会被翻译为'$data->x'。
(3)由:let和:for产生的临时变量不会被翻译为$data的属性。
如:let x='12345' 中, 变量 'x' 会被翻译为 '$x' 。
(4)'$'会被当做一般字符进行翻译,如:
'$x' 会被翻译为 '$data->$x'
(1)使用php函数
:external is_array
:if is_array(a)
'hello world
会被解析为:
<?php
if (is_array($data->a)) {
echo 'hello world';
}
?>
(2)引用包涵静态方法的PHP类
:external Category
:if Category.exist(categoryName)
'hello world
会被解析为:
<?php
if (Category::exist($data->categoryName)) {
echo 'hello world';
}
?>
注意: external必须写在文件头部第一行。
## 条件指令(Conditionals)(1):if 关键字
:if a > b
'hello
会被解析为:
<?php
if ($data->a > $data->b) {
echo 'hello';
}
?>
(2):else 与 :else if 关键字:
:if a > b
'a bigger than b
:else if a < b
'a smaller than b
:else
'a equals b
会被解析为:
<?php
if ($data->a > $data->b) {
echo 'a bigger than b';
} elseif ($data->a < $data->b) {
echo 'a smaller than b';
} else {
echo 'a equals b';
}
?>
会被解析为:
<?php
foreach ($data->ads as $ad) {
echo htmlspecialchars($ad);
}
?>
(2)key,value形式
:for (key, ad) in ads
"{key} {ad}
会被解析为:
<?php
foreach ($data->ads as $key => $ad) {
echo htmlspecialchars($key), htmlspecialchars(' '), htmlspecialchars($ad);
}
?>
(3)多重嵌套的foreach循环:
:for x in list1, y in list2
"{x}, {y}
会被解析为:
foreach ($data->list1 as $x) {
foreach ($data->list2 as $y) {
echo htmlspecialchars($x), htmlspecialchars(', '), htmlspecialchars($y);
}
}
注意,后面的表达式不能引用前面的循环变量,如:
:for i in list1, j in i
上面代码会出现编译错误。
:for x in [0..3]
"{x}
会被解析为:
foreach ([0..3] as $x) {
echo htmlspecialchars($x);
}