项目作者: whxaxes

项目描述 :
🚀 A high performance server-side javascript template library.
高级语言: JavaScript
项目地址: git://github.com/whxaxes/mus.git
创建时间: 2017-03-09T16:24:20Z
项目社区:https://github.com/whxaxes/mus

开源协议:MIT License

下载


Mus

NPM version
Build Status
Appveyor status
Coverage Status

A server-side javascript template library, high performance and extending easily.

Quick start

  1. npm install node-mus --save

Or

  1. yarn add node-mus --save

Simple demo

  1. const mus = require('node-mus');
  2. mus.renderString('{{ mus }}', { mus: 'hello mus' }); // hello mus;

Apis

configure(options)

options

  • baseDir String, default: __dirname
  • blockStart String, default: {%
  • blockEnd String, default: %}
  • variableStart String, default: {{
  • variableEnd String, String, default: }}
  • noCache Boolean, default: false
  • ext String, default: tpl
  • autoescape Boolean, default: true
  • compress Boolean, default: false

e.g.

  1. const mus = require('node-mus');
  2. mus.configure({
  3. baseDir: 'template',
  4. blockStart: '<%',
  5. blockEnd: '%>',
  6. variableStart: '<%=',
  7. variableEnd: '%>',
  8. ext: 'ejs',
  9. });
  10. const template = '<% if test %><div><%= test %></div><% endif %>';
  11. mus.renderString(template, { test: '123' });
  12. // '<div>123</div>'
  13. mus.render('test', { test: '123' });
  14. // render template/test.ejs to '<div>123</div>'

render(path[, args])

render template file

  1. mus.render('test', { text: 'hello' });
  2. // render test.tpl to string

renderString(html[, args])

render template string

  1. mus.renderString('asd{{ text }}', { text: 'hello' });
  2. // output: asdhello

setFilter(name, cb)

create a custom filter.

  1. mus.setFilter('join', arr => arr.join(','));

using

  1. mus.renderString('{{ text | join }}', { text: [1, 2] });
  2. // output: 12

setTag(name, tagOptions)

create a custom tag.

tagOptions

  • unary Boolean, if true, endtag was no need
  • attrName String, default attribute name, default is 'default'
  • render(attr, scope, compiler) Function, render function

render function args

  • attr Object, attribute in tag
  • scope Object, render scope
  • compiler Object, compiler object

compiler property

  • fileUrl String, template file url
  • include(templateUrl, scope) Function, include other template file, would return rendered string
  • compile(ast, scope) Function, compile ast to string, would return rendered string.

e.g.

  1. mus.setTag('css', {
  2. unary: true,
  3. attrName: 'href',
  4. render(attr, scope, compiler) {
  5. return `<link href="${attr.href}" rel="stylesheet">`;
  6. }
  7. });

using

  1. mus.renderString('{% css "style.css" %}');
  2. // output: <link href="style.css" rel="stylesheet">

compile child node, this in render function was current tag object.

  1. mus.setTag('style', {
  2. render(attr, scope, compiler) {
  3. return `<style>${compiler.compile(this.children, scope)}</style>`;
  4. }
  5. });

using

  1. mus.renderString('{% style %}.text{margin: 10px;}{% endstyle %}')
  2. // output: <style>.text{margin: 10px;}</style>

custom tag example

Base Feature

variable

  1. mus.renderString('{{ obj.hello }}{{ obj.mus }}', {
  2. obj: {
  3. hello: 'hello',
  4. mus: 'mus'
  5. }
  6. }); // hello mus;

expression

  1. mus.renderString('{{ !test ? text : "nothing" }}', {
  2. test: false,
  3. text: 'hello mus',
  4. }); // hello mus;

using function

  1. mus.renderString('{{ add(1, 2) }}', {
  2. add: (a, b) => a+b,
  3. }); // 3;

builtin function

  • range(start[, end])
  • regular(str[, flag]) create a regular object

regular expression

It needs to be prefixed with r.

  1. mus.renderString('{{ test | replace(r/[a-z]/gi, 'b') }}', {
  2. test: 'aBc11cc'
  3. }); // bbb11bb;

smarty style

and or not

  1. mus.renderString('<div>{{ not test1 and test3 or test2 }}</div>', {
  2. test1: false,
  3. test2: '123'
  4. }) // <div>123</div>;

if condition. but I extremely suggested using a ? b : c instead.

  1. mus.renderString('<div>{{ "123" if test1 else "321" }}</div>', {
  2. test1: false
  3. }); // <div>321</div>

comment

  1. mus.renderString('11{# {{ test }} #}', {
  2. test: 'hello mus',
  3. }); // 11;

filter

  1. // expression would be autoescape
  2. // use safe filter to prevent escape
  3. mus.renderString('{{ text | nl2br | safe }}', {
  4. text: 'hello \n mus',
  5. }); // hello <br/> mus;

custom filter

  1. mus.setFilter('add', (input, a) => {
  2. return +input + a;
  3. });
  4. mus.renderString('{{ text | add(2) }}', {
  5. text: 1,
  6. }); // 3;

builtin filter

  • nl2br replace '\n' or '\r\n' to <br/>
  • json JSON.stringify
  • escape escape html tag
  • reverse Array#reverse
  • replace String#replace
  • abs Math.abs
  • join Array#join
  • lower String#lower
  • upper String#upper
  • slice Array#slice
  • trim String#trim
  • safe use to prevent escape

source

Tags

for

  1. {% for item in list %}
  2. ({{ loop.index0 }}:{{ item }})
  3. {% endfor %}
  1. mus.render('test', {
  2. list: [1, 2],
  3. }); // (0:1)(1:2)

if

  1. {% if test > 1 %}
  2. {{ test }}
  3. {% endif %}
  1. mus.render('test', {
  2. test: 2
  3. }); // 2

Or

  1. {% if test > 2 %}
  2. {{ test }}
  3. {% elseif test === 2 %}
  4. 111
  5. {% else %}
  6. 333
  7. {% endif %}
  1. mus.render('test', {
  2. test: 2
  3. }); // 111

set

  1. {% set test = { say: 'hello' } %}
  2. {{ test.say }}
  1. mus.render('test');
  2. // hello

raw

  1. {% raw %}
  2. {{ test }}
  3. {% endraw %}
  1. mus.render('test', {
  2. test: 2
  3. }); // {{ test }}

filter

  1. {% filter replace(123, 321) %}
  2. {% for item in list %}
  3. {{ item }}
  4. {% endfor %}
  5. {% endfilter %}
  1. mus.render('test', { list: [123, 12, 123] });
  2. // output: 32112321

macro

  1. {% macro test %}
  2. 123
  3. {% endmacro %}
  4. {{ test() }}
  1. mus.render('test');
  2. // 123

with arguments

  1. {% macro test(a, b = '123') %}
  2. {{ a }}{{ b }}
  3. {% endmacro %}
  4. {{ test('123') }}
  1. mus.render('test');
  2. // 123123

import

import other template’s macro

  1. {% macro test(a, b = '123') %}
  2. {{ a }}{{ b }}
  3. {% endmacro %}
  1. {% import "test" %}
  2. {{ test(123) }}

Or

  1. {% import "test" as item %}
  2. {{ item.test(123) }}

extends & block

template 1: test.tpl

  1. <!doctype html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>{{ title }}</title>
  6. </head>
  7. <body>
  8. {% block main %}
  9. test.tpl content
  10. {% endblock %}
  11. </body>
  12. </html>

template 2: test2.tpl

  1. {% extends './test.tpl' %}
  2. {% block main %}
  3. test2.tpl content
  4. {% endblock %}

render

  1. mus.render('test2.tpl');
  2. // <!doctype html> ... test2.tpl content ...

include

template 1: test.tpl

  1. {% include './test2.tpl' test=obj.text %}

template 2: test2.tpl

  1. hello {{ test }}

render:

  1. mus.render('test.tpl', { obj: { text: 'mus' } });
  2. // hello mus

Debug

friendly error

  1. /Users/wanghx/Workspace/my-project/mus/test/template/test7.tpl:14:3
  2. 12 {% endraw %}
  3. 13
  4. 14 {{ num.replace('aaaa') }}
  5. ^^^^^^^^^^^^^^^^^^^^^^^^^
  6. 15 </div>
  7. Error: num.replace is not a function
  8. at Object.genError (/Users/wanghx/Workspace/my-project/mus/lib/utils/utils.js:107:19)
  9. at Object.throw (/Users/wanghx/Workspace/my-project/mus/lib/utils/utils.js:122:16)

Command

test

  1. npm test

benchmark

  1. npm run benchmark

example

  1. npm run example

Author

wanghx

License

MIT