Nashorn and AsciidoctorJs
Jim Laskey (Oracle)
james.laskey at oracle.com
Tue Jul 29 13:21:09 UTC 2014
I just remembered I'm running with 8u20 preview - likely has some affect.
-- Jim
On Jul 29, 2014, at 10:08 AM, Jim Laskey (Oracle) <james.laskey at oracle.com> wrote:
> [Just getting back]
> Granted I tweaked the main to simplify the testing outside an IDE, but when I ran it it seems to work up to a point (asciidoctor.js:12234 timings.$start is undefined.):
>
>>> java -cp ../java nashorn.RenderDocumentWithNashorn
> Working Directory = /Projects/asciidoctorjs/src/test/resources
> <!DOCTYPE html>
> <html lang="en">
> <head>
> <meta charset="UTF-8">
> <!--[if IE]><meta http-equiv="X-UA-Compatible" content="IE=edge"><![endif]-->
> <meta name="viewport" content="width=device-width, initial-scale=1.0">
> <meta name="generator" content="Asciidoctor 1.5.0-preview.8">
> <title>Untitled</title>
> <link rel="stylesheet" href="./asciidoctor.css">
> </head>
> <body class="article">
> <div id="header">
> </div>
> <div id="content">
> <div class="paragraph">
> <p><strong>Hello World</strong></p>
> </div>
> </div>
> <div id="footer">
> <div id="footer-text">
> Last updated 2014-07-29 09:56:41 ADT
> </div>
> </div>
> </body>
> </html>
> *Hello World*
> [object Object]
> nashorn.AsciidoctorJs$$NashornJavaAdapter at 4a70d302
> undefined
> Exception in thread "main" <eval>:12235 TypeError: Cannot call undefined
> at jdk.nashorn.internal.runtime.ECMAErrors.error(ECMAErrors.java:56)
> at jdk.nashorn.internal.runtime.ECMAErrors.typeError(ECMAErrors.java:212)
> at jdk.nashorn.internal.runtime.ECMAErrors.typeError(ECMAErrors.java:184)
> at jdk.nashorn.internal.runtime.ECMAErrors.typeError(ECMAErrors.java:171)
> at jdk.nashorn.internal.runtime.Undefined.lookupTypeError(Undefined.java:128)
> at jdk.nashorn.internal.runtime.Undefined.lookup(Undefined.java:100)
> at jdk.nashorn.internal.runtime.linker.NashornLinker.getGuardedInvocation(NashornLinker.java:98)
> at jdk.internal.dynalink.support.CompositeTypeBasedGuardingDynamicLinker.getGuardedInvocation(CompositeTypeBasedGuardingDynamicLinker.java:176)
> at jdk.internal.dynalink.support.CompositeGuardingDynamicLinker.getGuardedInvocation(CompositeGuardingDynamicLinker.java:124)
> at jdk.internal.dynalink.support.LinkerServicesImpl.getGuardedInvocation(LinkerServicesImpl.java:144)
> at jdk.internal.dynalink.DynamicLinker.relink(DynamicLinker.java:232)
> at jdk.nashorn.internal.scripts.Script$\^eval\_$32._L11888$_L11906$_L12223$_L12226(<eval>:12235)
> at jdk.nashorn.internal.scripts.Script$\^eval\_$34._L11888$_L11906$_L12223$_L12310(<eval>:12336)
> at jdk.nashorn.internal.scripts.Script$\^eval\_._L1(<eval>:2)
> at nashorn.AsciidoctorJs$$NashornJavaAdapter.render(Unknown Source)
> at nashorn.RenderDocumentWithNashorn.main(RenderDocumentWithNashorn.java:66)
>
> package nashorn;
>
> import java.io.*;
> import java.util.HashMap;
> import java.util.Map;
> import java.util.Scanner;
>
> import javax.script.*;
>
> public class RenderDocumentWithNashorn {
> static void evalFile(String filename, ScriptEngine engine, SimpleScriptContext context) throws ScriptException, FileNotFoundException {
> engine.eval(new java.io.FileReader(filename), context);
> }
>
> public static void main(String[] args) throws ScriptException, NoSuchMethodException, FileNotFoundException {
> System.out.println("Working Directory = " + System.getProperty("user.dir"));
>
> ScriptEngineManager engineManager =
> new ScriptEngineManager();
> ScriptEngine engine =
> engineManager.getEngineByName("nashorn");
>
>
> SimpleScriptContext simpleScriptContext = new SimpleScriptContext();
> Bindings bindings = new SimpleBindings();
>
> simpleScriptContext.setBindings(bindings, ScriptContext.ENGINE_SCOPE);
>
> try {
> evalFile("opal.js", engine, simpleScriptContext);
> evalFile("asciidoctor.js", engine, simpleScriptContext);
> evalFile("asciidoctor_extensions.js", engine, simpleScriptContext);
> evalFile("asciidoctorjava.js", engine, simpleScriptContext);
> } catch (ScriptException e) {
> throw new IllegalArgumentException(e);
> }
>
> String content = "*Hello World*";
> Map<String, Object> options = new HashMap<>();
> options.put("header_footer", true);
>
> simpleScriptContext.getBindings(ScriptContext.ENGINE_SCOPE).put("listOptions", options.keySet().toArray());
> simpleScriptContext.getBindings(ScriptContext.ENGINE_SCOPE).put("options", options);
> simpleScriptContext.getBindings(ScriptContext.ENGINE_SCOPE).put("content", content);
>
>
> Invocable invocable = (Invocable) engine;
>
> Object eval = engine.eval("Opal.hash2(listOptions, options)", simpleScriptContext);
>
> simpleScriptContext.getBindings(ScriptContext.ENGINE_SCOPE).put("hash2", eval);
>
>
>
> engine.setContext(simpleScriptContext);
>
> System.out.println(engine.eval("Opal.Asciidoctor.$render(content, hash2);", simpleScriptContext));
>
> AsciidoctorJs asciidoctorJs =
> invocable.getInterface(
> AsciidoctorJs.class);
> System.out.println(content);
> System.out.println(eval);
> System.out.println(asciidoctorJs);
> System.out.println(
> asciidoctorJs.render(content, eval));
>
>
> }
>
> }
>
>
>
>
>
> On Jul 26, 2014, at 9:02 AM, Alex Soto <asotobu at gmail.com> wrote:
>
>> Hi guys,
>>
>> currently I am working on integrating Asciidoctor to Java using Nashorn and
>> Opal. Nowadays we have got an asciidoctor java running above JRuby.
>>
>> Apart from Asciidoctor java we also have an asciidoctorjs which is created
>> using Opal (a gem to convert Ruby programs to JavaScript).
>>
>> So next step is to integrate this js to java using nashorn. But we are
>> having one problem.
>>
>> I have created a project with a test so you can take a look as well:
>> https://github.com/lordofthejars/asciidoctorjs
>>
>> The test is located at
>> https://github.com/lordofthejars/asciidoctorjs/blob/master/src/test/java/rhino/RenderDocumentWithRhino.java
>> (although it is called Rhino currently we are using Nashorn).
>>
>> If I create an script engine an I use the eval method everywhere it works
>> perfectly but because I would like to use some more typesafe approach I
>> decided to create an interface mirroring some asciidoctor operations so I
>> call invocable.getInterface(AsciidoctorJs.class) to create the proxied
>> instance and then I call defined methods.
>>
>> This interface mimics the js asciidoctorjava.js which internally calls
>> asciidoctor.js operations. This is done because I only want some operations
>> available from Java part, not the whole operations that asciidoctor.js
>> offers.
>>
>> asciidoctorjava.js looks like:
>>
>> var render = function(content, optionsHash2) {
>> return Opal.Asciidoctor.$render(content, optionsHash2);
>> };
>>
>> The problem is that when I run the test an exception is thrown notifying
>> that Opal.Asciidoctor.$render is not found. If I change that line to:
>>
>> var render = function(content, optionsHash2) {
>> return "Hello World";
>> };
>>
>> then it works so it seems that Nashorn don't load the asciidoctor.js but
>> this is not exactly true because if I execute the same operation but using
>> eval method it works.
>>
>> Probably I am missing something in the creation of proxied interface, but
>> currently I cannot see what.
>>
>> Any idea on why this happens?
>>
>> Thank you so much for your help in advance.
>>
>> Alex.
>>
>> --
>> +----------------------------------------------------------+
>> Alex Soto Bueno - Computer Engineer
>> www.lordofthejars.com
>> +----------------------------------------------------------+
>
More information about the nashorn-dev
mailing list