帮酷LOGO
  • 显示原文与译文双语对照的内容
Evaluate JavaScript from Crystal!

  • 源代码名称:duktape.cr
  • 源代码网址:http://www.github.com/jessedoyle/duktape.cr
  • duktape.cr源代码文档
  • duktape.cr源代码下载
  • Git URL:
    git://www.github.com/jessedoyle/duktape.cr.git
  • Git Clone代码到本地:
    git clone http://www.github.com/jessedoyle/duktape.cr
  • Subversion代码到本地:
    $ svn co --depth empty http://www.github.com/jessedoyle/duktape.cr
    Checked out revision 1.
    $ cd repo
    $ svn up trunk
  • Duktape.cr

    GitHub versionBuild Status

    Duktape.cr 为 Duktape的javascript引擎提供水晶绑定。

    安装

    Duktape.cr 最好使用分片工具安装。

    将这个添加到你的shard.yml:

    name: example # your project's nameversion: 1.0.0 # your project's versiondependencies:
     duktape:
     github: jessedoyle/duktape.crversion: ~> 0.13.0

    然后执行:

    shards install

    碎片 v0.4.0 或者 GREATER 将自动生成本地库。 你可以通过从 libs/duktape/ext 调用 make libduktape 来手工创建库。

    用法

    你必须首先创建一个Duktape上下文:

    require"duktape"sbx =Duktape::Sandbox.new
    sbx.eval! <<-JSvar birthYear =1990;functioncalcAge(birthYear){var current =newDate();var year =current.getFullYear();return year - birthYear; }print("You are "+calcAge(birthYear) +" years old.");JS

    的大部分 Duktape API已经实现。 你可以直接在 Duktape::Sandbox 或者 Duktape::Context 实例上调用API函数:

    sbx =Duktape::Sandbox.new
    sbx.push_global_object # [ global ]sbx.push_string "Math"# [ global"Math" ]sbx.get_prop -2# [ global Math ]sbx.push_string "PI"# [ global Math"PI" ]sbx.get_prop -2# [ global Math PI ]pi = sbx.get_number -1puts"PI: #{pi}"# => PI: 3.14159sbx.pop_3

    评估 vs 评估 !

    所有的评估API方法都有相应的blast方法( ) 。! 当出现javascript错误时,bang方法将引发,而非blast方法不会在无效的javascript上引发。

    例如:

    sbx =Duktape::Context.new
    sbx.eval <<-JSvar a =JS

    将不会产生任何错误,但会返回非零错误码。

    以下代码:

    sbx =Duktape::Context.new
    sbx.eval! <<-JS__invalid();JS

    将引发 Duktape::SyntaxError

    沙箱 vs-上下文

    你应该只在 Duktape::Sandbox 实例中执行不受信任的javascript代码。 沙箱将代码从不安全操作( 如 duktape require 机制内部和 Duktape 全局javascript对象) 中隔离。

    创建 Duktape::Context 可以提供对内部Duktape属性的代码访问:

    ctx =Duktape::Context.new
    ctx.eval! <<-JSprint(Duktape.version);JS

    设置超时

    Duktape::Sandbox 实例可以选择以毫秒为单位执行执行超时限制。 这在执行不受信任的代码时提供对无限循环的保护。

    当执行以下代码时,将引发 Duktape::RangeError 异常,时间比指定的长:

    sbx =Duktape::Sandbox.new 500# 500ms execution time limitsbx.eval! "while (true) {}"# => RangeError

    Duktape::Runtime

    通过 Duktape::Runtime 类可以提供用于评估JS代码的可选接口。 这个类提供了一个简化的计算 API ( 类似于 ExecJS ),它允许轻松访问javascript值,而不需要调用许多低级的Duktape 。

    整个 Runtime API如下所示:

    • call(property, *args) - 调用具有给定参数的属性或者函数,并返回结果。
    • call([properties], *args) - 调用嵌套在字符串属性名称的array 中的属性。
    • eval(source) - 计算javascript源并返回最后一个值。
    • exec(source) - 评估javascript源并始终返回 nil

    创建 Duktape::Runtime 实例时,还可以提供初始化 block 。

    下面是一个示例:

    require"duktape/runtime"# A Runtime (optionally) accepts an initialization block rt =Duktape::Runtime.new do |sbx|
     sbx.eval! <<-JSfunctiontest(a, b, c) { return a + b + c; } JSend rt.call("test", 3, 4, 5) # => 12.0 (same as test(3, 4, 5);) rt.call(["Math", "PI"]) # => 3.14159 rt.eval("1 + 1") # => 2.0 rt.exec("1 + 1") # => nil

    注意,基本 Duktape 没有加载 duktape/runtime,如果必要的话,可以单独使用( IE 。 如果需要这里功能,请用 require"duktape/runtime" 替换 require"duktape" 调用。

    从Javascript调用Crystal代码

    英镑注释:这个功能被认为是实验性和语法性的;在不同版本之间,。

    从你的javascript中调用Crystal代码是可能的:

     sbx =Duktape::Sandbox.new
     # Push a global function named"add_together"# that accepts two arguments. sbx.push_global_proc("add_together", 2) do |ptr|
     env =Duktape::Sandbox.new ptr
     # Get the two arguments# from the stack a = env.require_number 0 b = env.require_number 1 env.push_number a + b # Push the return value to the stack env.call_success # call_success -> stack top is value returnedend sbx.eval! "print(add_together(2, 3));"# => 5

    推送到Duktape堆栈的proc 对象接受一个指向 Context 实例的指针。 我们必须通过调用 env = Duktape::Sandbox.new ptrproc 还必须返回 Int32 状态代码- env.call_failureenv.call_success 将提供适当的整数值。

    注意:因为目前不可能在晶体中传递闭包到C 绑定,所以必须小心,在 proc的范围之外不能引用或者初始化任何变量。 这就是使用 env 等变量名称的原因。

    异常

    以下异常可能在运行时引发,并且可能会被正常保存:

    • Duktape::Error
    • Duktape::EvalError
    • Duktape::RangeError
    • Duktape::ReferenceError
    • Duktape::SyntaxError
    • Duktape::TypeError
    • Duktape::URIError

    这些异常都是 inherit 来自 Duktape::Error的,所以它可以以用作运行时错误所有的捕获。

    以下异常表示Duktape引擎内部错误,并且在从上下文中引发时通常无法恢复这些错误:

    • Duktape::InternalError
    • Duktape::HeapError

    这些异常来自 Duktape::InternalError的所有 inherit 。

    我将接受任何对 Bug/特性良好测试的请求请求

    你应该 fork 主 repo,创建特性分支,编写测试并提交请求请求。

    许可证

    Duktape.cr 是在MIT许可证下许可的。 有关详细信息,请参见 LICENSE




    Copyright © 2011 HelpLib All rights reserved.    知识分享协议 京ICP备05059198号-3  |  如果智培  |  酷兔英语