ScriptParser是一款可以在.net的环境下,解析执行javascript
语法的开源组件,其主要定位如下:
javascript
来控制逻辑的模板机制,以便在.net环境下,可以动态生成文本(比如:某些情况下,代替.aspx生成html页面等)目前ECMAScript 5
的语法,除了with语法、Property
等个别语法之外,其它的都有支持。
支持的预设类型:Object、Array、Number、String、Date
,以及部分预设方法:parseInt、parseFloat、stringify、eval
等。
因为模板的需要,支持几个ECMAScript 6
的语法:for...of...表达式,箭头表达式,let、const
语法。
支持对DataTable
的访问。
支持开发者根据需要,添加需要在javascript
中调用的类、对象、方法及属性。
javascript
对象的特殊性,所有需要传入到javascript
中去访问的对象、方法,都需要直接或间接的转化成继承于IScriptObject的对象。.net中的对象,如果没有特别处理,会使用
ScriptType
、ScriptNativeObject
、ScriptNativeArray
、ScriptNativeFunction
进行包装后,供javascript
的语句中调用。
ScriptParser
在Execute
时,可以调用ScriptContext.Pause
方法,此时,会保存上下文环境并退出Execute
方法,下次可以调用ScriptContext.Continue
恢复执行。在批量执行脚本时,可以对一些执行时间比较长的方法,执行异步操作(比如:网络语法等),并调用ScriptContext.Pause
中断执行,在异步回调中,再调用ScriptContext.Continue
恢复。
请参见ScriptTest项目
//创建执行上下文:ScriptContext
ScriptContext context = new ScriptContext();
//添加变量,以及方法映射
context.AddValue("inc", 100);
//获取执行结果
object result = ScriptUtils.ExecuteScript(context, "var i = 0; return i + inc;");
//创建执行上下文:ScriptContext
ScriptContext context = new ScriptContext();
//添加变量,以及方法映射
context.AddValue("status", 2);
string template = @"
状态码:
<@switch code="status">
<@case code="1">@{"正常"}</@case>
<@case code="2">@{"冻结"}</@case>
<@default>其它状态</@default>
</@switch>
";
string result = ScriptUtils.ExecuteTemplate(context, template);
javascript
脚本,再执行脚本,生成最终的结果。所以,ScriptParser的模板支持在模板中编写javascript
语法@{***}
)之外,所有的逻辑标签都是以<@***>
开始,以及</@***>
结束javascript
的关键字(如:if/for/while/switch等),关键字的括号部分(如:if(***)
、for(***)
等)的内容,基本上都写在code属性中。只有两个例外:do{...}while(***)
、else if(***){}
<@else if="***"></@else>
<@if code="status==1">
状态:@{"正常"}
</@if>
<@else if="statue==2">
状态:@{"冻结"}
</@else>
<@else>
@{"其它状态"}
</@else>
<@for code="var i = 0; i < 100; i++">
计数:@{i} <br/>
</@for>
<@for code="var index in list">
元素:@{list[index]} <br/>
</@for>
<@for code="var item of list">
元素:@{item} <br/>
</@for>
<@while code="i++ < 10">
i的值:@{i}
</@while>
节点结构:<do while="***"> </do>
<@do while="i++ < 10">
i的值:@{i}
</@do>
javascript
语法时,会自动在最后加上break;
break;
,可以将case节点编写为:<@case code="***" />
,或者:<@case code="***" ignoreBreak="true"></@case>
<@switch code="status">
<@case code="1">
状态:@{"正常"}
</@case>
<@case code="2">
状态:@{"冻结"}
</@case>
<@default>
@{"其它状态"}
</@default>
</@switch>
<@while code="true">
<@if code="i<0">
<@break />
</@if>
<@else if="i>0">
<@continue />
</@else>
<@else>
<@line code="i--" />
</@else>
</@while>
<@try>
正常执行
</@try>
<@catch code="e">
<br/>错误信息:@{e}
</@catch>
<@finally>
<br/>最终执行
</@finally>
代表将内部的表达式输出来(注意:内部必须是一个表达式)
@{i > 0 ? i : "异常状态"}
<@line />
单行语法,在生成javascript
语法时,会在最后自动加上“;”
<@line code="i++" />
<@code>...</@code>
(<@>...</@>
)自由语法,可以在节点之间,任意编写javascript
脚本,这些脚本在生成javascript
时,会被原封不动的保留下来
<@code>
var i = 0;
var list = [];
for (var i = 0; i < 100; i++) {
list.push(i);
}
</@code>
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。
1. 开源生态
2. 协作、人、软件
3. 评估模型