14 Star 77 Fork 19

shengu / scriptparser

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README
MIT

简介

ScriptParser是一款可以在.net的环境下,解析执行javascript语法的开源组件,其主要定位如下:

  1. 在.net环境下,动态执行部分业务逻辑,以实现在不修改原生程序的基础上,动态的扩展一些功能。
  2. 提供一套可以用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中调用的类、对象、方法及属性。

其它

  1. 由于javascript对象的特殊性,所有需要传入到javascript中去访问的对象、方法,都需要直接或间接的转化成继承于IScriptObject的对象。

.net中的对象,如果没有特别处理,会使用ScriptTypeScriptNativeObjectScriptNativeArrayScriptNativeFunction进行包装后,供javascript的语句中调用。

  1. 该组件的解析和执行过程,使用内存结构来模拟线程栈的操作,以避免解析到恶意嵌套的语法,引发堆栈溢出,从而导致进程中止。
  2. 该组件在执行时,有支持暂停执行/继续执行的功能,在批量执行脚本时,可以支持类似于纤程的功能。

ScriptParserExecute时,可以调用ScriptContext.Pause方法,此时,会保存上下文环境并退出Execute方法,下次可以调用ScriptContext.Continue恢复执行。在批量执行脚本时,可以对一些执行时间比较长的方法,执行异步操作(比如:网络语法等),并调用ScriptContext.Pause中断执行,在异步回调中,再调用ScriptContext.Continue恢复。

Demo

请参见ScriptTest项目

JavaScript的解析过程

//创建执行上下文: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);

模板解析标签

标签简介

  1. ScriptParser的模板解析过程,是先将带特殊标签的模板,转化成一段可执行的javascript脚本,再执行脚本,生成最终的结果。所以,ScriptParser的模板支持在模板中编写javascript语法
  2. 标签格式:除了写入单值的语法(@{***})之外,所有的逻辑标签都是以<@***>开始,以及</@***>结束
  3. 逻辑标签,代表一个javascript的关键字(如:if/for/while/switch等),关键字的括号部分(如:if(***)for(***)等)的内容,基本上都写在code属性中。只有两个例外:do{...}while(***)else if(***){}

if...else if...else...

  1. if/else语法,if/else if/else节点之间,除了空格和换行之外,不能有其它内容
  2. else if节点表示为:<@else if="***"></@else>
<@if code="status==1">
	状态:@{"正常"}
</@if>
<@else if="statue==2">
	状态:@{"冻结"}
</@else>
<@else>
	@{"其它状态"}
</@else>

for(...; ...; ...)

<@for code="var i = 0; i < 100; i++">
	计数:@{i} <br/>
</@for>

for...in

<@for code="var index in list">
	元素:@{list[index]} <br/>
</@for>

for...of

<@for code="var item of list">
	元素:@{item} <br/>
</@for>

while

<@while code="i++ < 10">
	i的值:@{i}
</@while>

do...while

节点结构:<do while="***"> </do>

<@do while="i++ < 10">
	i的值:@{i}
</@do>

switch...case...default...

  1. case和default的节点,在生成javascript语法时,会自动在最后加上break;
  2. 如果需要不需要加break;,可以将case节点编写为:<@case code="***" />,或者:<@case code="***" ignoreBreak="true"></@case>
<@switch code="status">
	<@case code="1">
		状态:@{"正常"}
	</@case>
	<@case code="2">
		状态:@{"冻结"}
	</@case>
	<@default>
		@{"其它状态"}
	</@default>
</@switch>

break/continue

<@while code="true">
	<@if code="i<0">
		<@break />
	</@if>
	<@else if="i>0">
		<@continue />
	</@else>
	<@else>
		<@line code="i--" />
	</@else>
</@while>

try...catch...finally...

<@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>

QQ交流群

  1. 792893075快速加群
MIT License Copyright (c) 2021 shengu Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

简介

一款在.net环境下,解析执行Javascript的开源组件。 展开 收起
C# 等 3 种语言
MIT
取消

发行版

暂无发行版

贡献者

全部

近期动态

加载更多
不能加载更多了
C#
1
https://gitee.com/shenguz/scriptparser.git
git@gitee.com:shenguz/scriptparser.git
shenguz
scriptparser
scriptparser
master

搜索帮助