jsc: 我的新朋友

765 阅读2分钟

我的一个朋友最近向我推荐了一个隐藏的很好的命令行工具。在 Safari 和苹果产品的其他部分使用的前端框架中,有一个工具叫做 jsc。它是 JavaScript 的命令行界面,使用和系统其它部分相同的代码。

你可以在这个路径下 /System/Library/Frameworks/JavaScriptCore.framework/Versions/Current/Helpers/jsc 找到这个工具的二进制文件。这个路径十分的冗长,因此我为这个路径取了个别名,让我在终端中输入 jsc 就能快速进入。

所以,我们使用 jsc 可以做些什么?在浏览器中使用 JavaScript 你可以做许多事情,但需要注意的是,没有 documentwindow 实例。

如果你运行 jsc -h 命令,你会看到很多用于测试和分析的 JavaScript 选项。显然,Webkit 团队在内部使用它来进行测试。但是我们仍然可以使用它来尝试我们的想法和运行简单的用例。

一张图片胜过千言万语,所以让我来给你们展示如何使用它来解决一个简单的问题。我最近需要将我们的土耳其语 Frenzic 本地化中的一些字符串转换成大写:小写的 “i” 将被转换为无点的版本

JavaScript 中的 toLocaleUpperCase() 是处理这个问题最好的方法,所以我将 jsc 从我的工具包中拿出并投入使用。第一个挑战是如何获得输入。

幸运的是,readline() 方法可以获得键盘中的输入并返回值。不幸的是,输入并不是所期待的用 UTF-8 进行编码,而是以 ISO-8895-1(Latin-1) 返回。请记住,这里没有 document 实例,所以使用默认的编码方式。

为了解决这个限制,你可以将字符先转义为 UTF-16,然后再使用这项技术将它们解码为 UTF-8:

var text = decodeURIComponent(escape(readline()));

(如果有 Webkit 工程师读到这里,那么有一个像 --encoding=utf-8 这样的命令行选项该多好。)

生成输出和浏览器相比也有些不同。你将使用 print() 代替 console.log()。为了转换文本输入并显示它们,我会使用以下的代码:

print(text.toLocaleUpperCase('tr-TR'));

这里有一些可能证明是有用的内置方法,但是目前,我只需要去读取和写入文本。虽然没有记录,但是 jsc 也接受标准的输入并且可以像 shebang 一样使用:

$ echo "print(1+2);" | jsc

由于这部分代码我可能会再次使用,因此我创建了一个 Turkish.js 文件:

while (true) {
    print('Turkish text?');
    var text = decodeURIComponent(escape(readline()));
    print(text.toLocaleUpperCase('tr-TR'));
    print('-------------');
}

我现在可以随时使用 jsc Turkish.js 来运行这些代码。并且你也可以了解到在命令行中使用 JavaScript 是多么的方便。享受吧!