MorkJs docs
Reference

API 与模板标签速查

覆盖核心类型、互操作属性、导入导出以及模板标签含义,便于在编码时快速查找。

核心类型(代码:MorkJs/ShenGu.Script

MorkJs.cs

  • Parse(string script):解析脚本为可复用的 MorkJs(线程安全,可缓存)。
  • Execute(ScriptContext context):执行解析后的语法树,结果在 context.Result
  • 内部支持 import/export、调试断点(debugger 关键字)以及运算符重载回调(见 ScriptContext.RegisterOperatorExecutor)。

ScriptContext.cs

  • 变量管理:AddValue / SetValue / RemoveValue / GetValue
  • 类型注册:RegisterType(s)(可携带 ObjectMemberFlags),Mappings / AddMappings 读取 [ScriptMapping] 成员。
  • 结果与 this:ScriptResult(脚本对象)、Result(CLR 值)、ThisObject / ScriptThisObject
  • 执行控制:Pause() / Continue() / IsPausedSetCacheValue / GetCacheValue 传递运行时数据。
  • 导入:ImportManagerIImportSourceManager)。

ScriptUtils.cs

  • RegisterType(s):预热类型成员缓存,减少运行时反射成本。
  • Stringify:将 IScriptObject 转为 JSON 风格字符串。
  • ToScriptObject / ToValue:CLR 对象与脚本对象互转,支持空值、数值、字符串、数组、字典、DataTable。
  • EvalExecuteScriptExecuteTemplate:便捷执行接口。
  • CreateSystemMappings(bool):生成包含 Object/Array/String/Number/Date 等系统映射的成员列表。
  • ObjectConverter:自定义 ScriptObject 转 CLR 的全局钩子。

.NET 成员暴露与属性(ScriptNativeObject.cs

属性标记

  • [ScriptObject(MemberFlags, FirstLowerLetter)]:控制默认暴露的成员范围,支持首字母小写转换。
  • [ObjectMember(Name, IsEnumerable)]:显式暴露字段/属性/方法,可重命名。
  • [IgnoreMember]:从暴露列表中排除成员。
  • [ObjectConstructor]:指定可被脚本调用的构造函数。
  • [AddMember(Name, Script)]:在类型加载时追加脚本成员。

脚本名与代理

  • [ScriptMapping(Name)]:遍历并注册为全局变量/函数(context.AddMappings)。
  • [ScriptProxy(RealType)]:为真实类型提供代理(如 FormProxy 替代 Form)。
  • 内置代理:DataTableProxyDataRowCollectionProxyDataRowProxy 使脚本可遍历 DataTable

对象创建

  • ScriptNativeObject.CreateNativeObject:包装 CLR 实例为脚本对象。
  • ScriptNativeArray:数组包装,支持索引访问与 length
  • ScriptNativeDelegate:将委托包装为脚本函数。
  • ScriptMappingList:通过 Register 手动注册键值或工厂方法(CreateScriptObjectHandler)。

模块与导入

脚本 import/export

  • 解析阶段识别 ES 模块语法(import/export/from/as/*/default)。
  • IImportSourceManager.GetSource 返回 IImportSource,可以直接提供 ParserResult(缓存的执行结果)。
  • 示例实现:ImportExportExecutor 使用嵌套类 ImportSource 从内存字符串创建 MorkJs

模板 import/export

  • <@import code="id" from="path"/>:生成 import id from "path";
  • <@export code="default myComp"/> 或带 from 的转发。
  • TemplateImportSource:可通过 CreateByTemplate/CreateByScript/CreateByResult 包装模板或脚本作为 import 来源。

模板标签速查(TemplateParser.cs

标签用途要点
<@if code=""> / <@else if=""/> / <@else>条件判断ifelse 之间不能有其他内容(除空白)。
<@for code="">for 语句支持 for(;;)for...infor...of
<@while code=""> / <@do while="">循环do...while 结束标签写为 <@do while="...">...</@do>
<@switch code=""> + <@case> + <@default>分支<@case />ignoreBreak="true" 可省略自动 break
<@break/> / <@continue/>循环控制仅可出现在循环块内。
@{expr} / @@{expr}输出表达式@@{} 会输出 null/undefined@{} 不会。
<@line code="" />单行语句自动在尾部追加分号。
<@code>...</@code><@>...</@>自由脚本块原样写入生成的脚本。
<@try> / <@catch code="e"> / <@finally>异常处理与 JavaScript try/catch/finally 对应。
<@function id="" code="">定义函数生成 function id(code) { ... }
<@component ...>组件定义/注册export 导出组件;define="a,b" 仅注册标签用于调用。
<@slot id="" code="">插槽默认插槽 id 为 __default;可包含回退内容。
<@template id="" code="">调用方提供的插槽实现必须是组件节点的直接子级。
<@invoke id="" code="" />执行指定函数生成 id(code);
<@import> / <@export>模板层的模块引入与导出与脚本 import/export 语法保持一致。
<@nowrap>保留原始行内部文本不输出额外换行。
<@debugger/>调试插入 JavaScript debugger; 语句。

运行时特性

空值与布尔

  • ScriptUtils.IsNull:判断 null / undefined
  • ScriptUtils.IsTrue:脚本对象是否为真值(包装类型会取内部布尔)。

执行控制

  • 多线程:MorkJs 可多线程复用;ScriptContext 单次执行绑定线程(见 MorkJs.Execute 中的线程检查)。
  • 暂停:Pause / Continue 保持调用栈,适用于外部等待。
  • 异常:解析/执行异常对应 ScriptParseExceptionScriptExecuteException(附带行列号)。

模板执行管线

  • TemplateParser.Parse 将模板生成脚本,可选择 doCheck 预先语法校验。
  • TemplateParser.Execute 使用 ITemplateExecutor 输出;默认实现 StringTemplateExecutor 直接返回字符串。
  • 输出函数:__out(片段输出)、__write(值输出)可通过设置 OutputFunctionName/WriteFunctionName 重载。