2011-12-13 55 views
5

在我的一个项目中,我必须编写HTML代码为&的JavaScript代码。我宁愿使用静态类型语言,所以我正在评估OPA。但是,我的目标是生成一组静态页面,所以我不关心OPA HTTP服务器和持久层。在OPA中生成静态页面

因此,我的问题是:是否有一种(简单)的方式来生成OPA中的静态页面集合?

回答

5

如果我理解正确,你想用Opa构建你的xhtml,但不是服务,打印到文件中?

我们有该2个功能:

那些2个功能之间的差别是,第一个不会产生相关的OPA js代码。

然后,您可以将结果字符串写入磁盘上的HTML文件。

请注意,我们不提供任何方法在stdlib中的磁盘中写入文件。 你必须使用的BSL系统:

write = %%BslFile.of_string%% 

一个小例子:

static.opa

write = %%BslFile.of_string%% 

xhtml_page(num:int) = 
    <p>Page {num}</p> 

pages = [1, 2, 3, 4, 5] 

do List.iter(i -> 
    xhtml_content = xhtml_page(i) 
    string_content = Xhtml.serialize_as_standalone_html(xhtml_content) 
    write("{i}.html", string_content) 
, pages) 

编译并运行:opa static.opa --

这将产生5个html页面。

+0

甜!如果你在'xhtml_page'中调用了一些JavaScript函数(如'{Random.int num}'),会发生什么?有没有办法确保生成的页面不会包含一些JavaScript代码,它将尝试与服务器进行通信? – Thomas

+0

不会有'Random.int'的服务器通信(在我的例子中),因为它会在您生成页面时执行。 – Fred

+0

如果您将事件侦听器附加到某个xhtml部件(例如''),那么您可以进行“服务器”通信,但是如果您使用'Xhtml.serialize_as_standalone_html',那么这些操作将从xhtml ,因此不会有服务器呼叫。这取决于你想要生成的html。请注意,您不能生成类似因为Opa禁止它。 – Fred

0

托马斯,我想你想用Opa代码(而不是JS),对吗?

有只是一堆静态网页不会是对语言的典型使用,但相信你能做到这一点很容易:

Server.start(Server.http, { resources: @static_resource_directory("resources") }) 

上面是一个完整的OPA程序(S4 style),将只服务静态地显示资源目录的内容(包含HTML)。

更传统的情况是使用Opa的模板机制(一种接受HTML大集合的标记)。

希望有所帮助。

+0

不是。我想要的是编写一个.opa文件来生成一堆静态页面。我很高兴只使用OPA功能的一个子集(例如,我不需要任何形式的通信)。然后,静态页面可以由任何HTTP服务器提供服务。 – Thomas

+0

你的意思是你想_programatically_生成这些网页? (即有一个程序可以生成一堆静态页面?) – akoprowski

+0

是的,确切!当然,我可以编写我的应用程序,在本地运行它,然后使用wget获取一堆静态页面(以及它们的资源)......但是,我需要依赖OPA编译器不包含任何服务器端通信在生成的页面中构造。 – Thomas

2

您可以使用Xhtml.precompiled。它需要一个xhtml值,并给你一个预编译的xhtml(内部已经扁平化为一个字符串)。

当网页的一部分是静态的,而其余部分是动态的时,这是有用的。 您可以避免为静态部分支付一些费用(序列化,内存...)。