ラベル Nashorn の投稿を表示しています。 すべての投稿を表示
ラベル Nashorn の投稿を表示しています。 すべての投稿を表示

2015-11-23

Nashornでletとconstを使う

1. Nashornのバージョンを確認する

>echo "quit();" | jjs -version
nashorn 1.8.0_66
jjs> quit();
jjs>
>

2. 実行するスクリプト(LetAndConst.js):

try {
    const CONST_VALUE = 100;
    print("CONST_VALUE=${CONST_VALUE}");
    try {
        CONST_VALUE = 200;
    } catch (e) {
        print(e);
    }
    let letValue = CONST_VALUE + 1;
    print("letValue=${letValue}");
    var varValue = letValue + 1;
    print("varValue=${varValue}");
} finally {
    print("typeof CONST_VALUE: " + typeof CONST_VALUE);
    print("typeof letValue: " + typeof letValue);
    print("typeof varValue: " + typeof varValue);
}

3. jjsで実行する(--language=es6オプションが無いので文法エラーが起きた):

>jjs -scripting -fullversion LetAndConst.js
nashorn full version 1.8.0_66-b18
LetAndConst.js:2:1 Expected an operand but found const
    const CONST_VALUE = 100;
    ^
LetAndConst.js:9:5 Expected ; but found letValue
    let letValue = CONST_VALUE + 1;
        ^
LetAndConst.js:13:0 Expected eof but found }
} finally {
^

4. jjsで実行する(--language=es6オプションが有るので実行された):

>jjs -scripting -fullversion --language=es6 LetAndConst.js
nashorn full version 1.8.0_66-b18
CONST_VALUE=100
TypeError: Assignment to constant "CONST_VALUE"
letValue=101
varValue=102
typeof CONST_VALUE: undefined
typeof letValue: undefined
typeof varValue: number

NashornでFileVisitorを使って再帰的に同じ拡張子のファイルを収集する

1. ファイルを収集する対象のディレクトリ構造

./
  article-result.html
  article.html
  FileVisitorTest.js
  dir1/
    test1.txt
  dir2/
    test2.js

2. 実行するスクリプト(FileVisitorTest.js):

var Files = Java.type("java.nio.file.Files");
var Paths = Java.type("java.nio.file.Paths");
var FileVisitResult = Java.type("java.nio.file.FileVisitResult");
var SimpleFileVisitor = Java.type("java.nio.file.SimpleFileVisitor");
var ArrayList = Java.type("java.util.ArrayList");

function getPathListByPredicate(rootDir, predicateFunc) {
    var SimpleFileVisitorExtender = Java.extend(SimpleFileVisitor);
    var pathList = new ArrayList();
    var visitor = new SimpleFileVisitorExtender() {
        visitFile: function(path, attrs) {
            if (predicateFunc(path, attrs)) {
                pathList.add(path);
            }
            return FileVisitResult.CONTINUE;
        }
    };
    Files.walkFileTree(Paths.get(rootDir), visitor);
    return pathList;
}

var rootDir = Paths.get(".");

// List all files
var allFiles = getPathListByPredicate(rootDir, function(path, attrs) {
    return true;
});
print("allFiles=${allFiles}");

// List .js files
var jsFiles = getPathListByPredicate(rootDir, function(path, attrs) {
    return path.getFileName().toString().toLowerCase().endsWith(".js");
});
print("jsFiles=${jsFiles}");

3. jjsで実行する:

>jjs -scripting -fullversion FileVisitorTest.js
nashorn full version 1.8.0_66-b18
allFiles=[.\article-result.html, .\article.html, .\dir1\test1.txt, .\dir2\test2.js, .\FileVisitorTest.js]
jsFiles=[.\dir2\test2.js, .\FileVisitorTest.js]

Java8のjrunscriptでshowdown.js 1.3.0を使ってみる

過去に「Java6のjrunscriptでshowdown.jsを使ってみる」で書いたことをJava8で試してみる。

まず、input.txtに以下のように書いておく。

Markdown *rocks*.

showdown.js 1.3.0のzipをダウンロードして展開し、コマンドプロンプト(Windowsの場合)でshowdown.jsのあるディレクトリに移動した後、以下の1行を入力する。ちなみに、showdown.jsはconsole.logメソッドを使用するがNashornは提供していないので、最初の-eオプションで代わりのconsoleオブジェクトを作成する必要がある。

jrunscript -e "var console={log:function(s){print(s);}};" -f showdown.js -e "print('\n'+new showdown.Converter().makeHtml(read(new java.lang.StringBuilder(),true)));" < input.txt

すると以下のHTMLが出力される。1行目はread関数の第1引数で指定したプロンプト(空の行)、2行目からがshowdown.jsの出力。

(空の行)
<p>Markdown <em>rocks</em>.</p>

ちなみに、上記においてread関数の第1引数にnew StringBuilder()を渡しているのは、read関数が入力ファイルの行数と同じ数だけプロンプトを出力するのを見せないための醜いやり方なので、read関数ではなく入力ファイルの内容をStringに変える短い関数を自作した方が良いと思う。

--
showdown.jsは、以下のGitHubからダウンロード可能:
showdownjs/showdown · GitHub
https://github.com/showdownjs/showdown

Javaでshowdown.jsを使う方法は、以下の記事を参考にさせていただきました:
Markdown記法をJavaで扱いたい...Scripting for the Java と showdownを組み合わせる - Object Design
http://osima.jp/blog/showdown-on-java.html