65.9K
CodeProject 正在变化。 阅读更多。
Home

一个用于在 C# 中编写/构建脚本的库

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.15/5 (6投票s)

2008年8月25日

CPOL

3分钟阅读

viewsIcon

56340

downloadIcon

521

旨在简化在 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

大多数项目都可以选择布局模式(InlineInlineBlockBlock)。 如果该项目将跨多行渲染,则会产生影响。

ScriptIf

此项将在渲染时执行 if-then-else 检查,然后渲染获胜的对象。

基于集合的 ScriptItem (ScriptSet) 如果其集合为空,将导致 false。 因此,您可以根据另一个项目的内容(全部在渲染时)来决定是否渲染某些内容。

如果对象希望动态地为 if 条件提供结果,则可以实现 IScriptIfCondition 接口。

历史

  • 2008 年 8 月 25 日:初始版本 1.0.0
  • 2008 年 10 月 12 日:源代码文件已更新 (版本 1.0.1)
© . All rights reserved.