一个用于在 C# 中编写/构建脚本的库
旨在简化在 C# 中编写 JavaScript 等脚本
引言
ClockWork Script Builder 是一个 .NET 库 (2.0),用于使脚本的构建更具可读性和结构性。
一种可扩展的架构允许开发人员为诸如 JavaScript (Js) 和 XML (Xs) 之类的语言添加脚本构建块(脚本项),这些语言在下载中提供。
背景
最近我开始玩 ExtJs,结果需要从 .NET 代码构建大量的 JavaScript 代码。 我从未找到一种在 C# 中构建脚本的好方法,所以这次我决定编写一个库来提供帮助。
Using the Code
(CHM 文档可从 Tony's Wibbles 获取。)
以其最简单的形式,它是一种将一堆 string
连接在一起的方法,以便每个 string
都写在新行上
Script script = Sb.Script(
"line 1;",
"line 2;",
"line 3;"
);
string result = script.Render();
Console.WriteLine(result);
它会产生以下输出
line 1;
line 2;
line 3;
但是还有很多。 脚本不仅理解 string
,还接受任何类型的对象。 特别是,基于 IScriptItem
的对象专门设计用于与脚本一起使用,并且可以由任何人编写以扩展脚本功能。
此示例演示了某些核心布局项的使用。
Script script = Sb.Script(
Sb.Line("1","2","3","4","5",";"),
Sb.Line("1","2","3","4","5",";"),
Sb.Indent(
Sb.Line("indented ","1","2","3","4","5",";"),
Sb.Line("indented ","1","2","3","4","5",";"),
Sb.Script(
Sb.Line("Some objects"),
Sb.Line("Number = ", 47),
Sb.Line("True = ", true),
Sb.Line("Now is = ", DateTime.Now)
)
)
);
string result = script.Render();
Console.WriteLine(result);
它会产生以下输出
12345;
12345;
indented 12345;
indented 12345;
Some objects
Number = 47
True = True
Now is = 23/08/2008 11:23:00 AM
您会注意到所有脚本项都是使用“Sb
.”创建的。 为了使脚本更易于编写和阅读,我为每组脚本项创建了帮助程序类。 它们提供 static
方法,这些方法将为您创建脚本项的实例。
脚本语言
我目前已经开发了以下几组脚本项,以帮助编写脚本
脚本集 | 描述 | 辅助类 |
核心 | 核心脚本项,用于构造格式化的脚本 | ClockWork.ScriptBuilder.Sb |
JavaScript | 用于帮助构造标准 JavaScript 元素(如对象、数组、列表、函数、调用、块、语句)的项目 | ClockWork.ScriptBuilder.JavaScript.Js |
XML | 用于构造 Element、Attribute、Text 和 CData 的基本 XML 节点的项目。 还支持直接写入 XmlElement 或 XmlDocument | ClockWork.ScriptBuilder.XmlScript.Xs |
ExtJs | 旨在使编写 ExtJs 类的子类更容易的类和组件项 | ClockWork.ScriptBuilder.JavaScript.ExtJs.ExtJs |
关注点
DOM & 渲染
添加到脚本的所有对象都按原样存储(如 DOM)。 脚本的 string
表示形式仅在其 Render
方法被调用时才创建。 除此之外,这使您可以分步构建脚本,从而可以构建结构化的构建器代码。
如果在渲染时找到 IScriptItem
,那么它将使用自己的 Render
方法来渲染自身。 其他对象使用带有可选格式提供程序的 ToString
渲染。
渲染是使用 ScriptWriter
执行的,该 ScriptWriter
被传递到 Render
方法中。 此对象提供了渲染到多个目标的能力,并且还处理缩进。
ScriptLayout
大多数项目都可以选择布局模式(Inline
、InlineBlock
、Block
)。 如果该项目将跨多行渲染,则会产生影响。
ScriptIf
此项将在渲染时执行 if
-then
-else
检查,然后渲染获胜的对象。
基于集合的 ScriptItem
(ScriptSet
) 如果其集合为空,将导致 false
。 因此,您可以根据另一个项目的内容(全部在渲染时)来决定是否渲染某些内容。
如果对象希望动态地为 if
条件提供结果,则可以实现 IScriptIfCondition
接口。
历史
- 2008 年 8 月 25 日:初始版本 1.0.0
- 2008 年 10 月 12 日:源代码文件已更新 (版本 1.0.1)