All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.theoryinpractise.coffeescript.CoffeeScriptCompiler Maven / Gradle / Ivy

There is a newer version: 1.4.18
Show newest version
package com.theoryinpractise.coffeescript;

import com.fasterxml.jackson.databind.ObjectMapper;
import org.mozilla.javascript.Context;
import org.mozilla.javascript.JavaScriptException;
import org.mozilla.javascript.NativeObject;
import org.mozilla.javascript.Scriptable;
import org.mozilla.javascript.commonjs.module.Require;
import org.mozilla.javascript.commonjs.module.provider.StrongCachingModuleScriptProvider;
import org.mozilla.javascript.commonjs.module.provider.UrlModuleSourceProvider;

import java.net.URI;
import java.net.URISyntaxException;
import java.util.Collections;

/**
 * Copyright 2011 Mark Derricutt.
 * 

* Contributing authors: * Daniel Bower *

* Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at *

* http://www.apache.org/licenses/LICENSE-2.0 *

* Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. *

*

* Wrapper around the coffee-script compiler from https://github.com/jashkenas/coffee-script/ */ public class CoffeeScriptCompiler { private final Scriptable globalScope; private String version; private Scriptable coffeeScript; public CoffeeScriptCompiler(String version) { this.version = version; try { Context context = createContext(); globalScope = context.initStandardObjects(); final Require require = getSandboxedRequire(context, globalScope, true); coffeeScript = require.requireMain(context, "coffee-script"); } catch (Exception e1) { throw new CoffeeScriptException("Unable to load the coffeeScript compiler into Rhino", e1); } finally { Context.exit(); } } public CompileResult compile(String coffeeScriptSource, String sourceName, boolean bare, SourceMap map, boolean header, boolean literate) { Context context = Context.enter(); try { Scriptable compileScope = context.newObject(coffeeScript); compileScope.setParentScope(coffeeScript); compileScope.put("coffeeScript", compileScope, coffeeScriptSource); try { boolean useMap = map != SourceMap.NONE; String options = String.format("{bare: %s, sourceMap: %s, literate: %s, header: %s, filename: '%s'}", bare, useMap, literate, header, sourceName); Object result = context.evaluateString( compileScope, String.format("compile(coffeeScript, %s);", options), sourceName, 0, null); if (map == SourceMap.NONE) { return new CompileResult((String) result, null); } else { NativeObject nativeObject = (NativeObject) result; String js = nativeObject.get("js").toString(); String sourceMap; try { ObjectMapper objectMapper = new ObjectMapper(); sourceMap = objectMapper.writeValueAsString(nativeObject.get("v3SourceMap")); } catch (Exception e) { sourceMap = null; } return new CompileResult(js, sourceMap); } } catch (JavaScriptException e) { throw new CoffeeScriptException(e.getMessage(), e); } } finally { Context.exit(); } } private Context createContext() { Context context = Context.enter(); context.setOptimizationLevel(9); // Enable optimization return context; } private Require getSandboxedRequire(Context cx, Scriptable scope, boolean sandboxed) throws URISyntaxException { return new Require(cx, cx.initStandardObjects(), new StrongCachingModuleScriptProvider( new UrlModuleSourceProvider(Collections.singleton( getDirectory()), null)), null, null, sandboxed); } private URI getDirectory() throws URISyntaxException { final String resourcePath = String.format("/coffee-script-%s/", version); return getClass().getResource(resourcePath).toURI(); } public static enum SourceMap {NONE, V3} }





© 2015 - 2025 Weber Informatics LLC | Privacy Policy