It may be too late, but still.
I haven't found popular Java libraries for doing what you want; however, there are many javascript libraries for that (for example, js-beautify). You can save such library source code in resources of your application (you can get the code from one of cdn links, so you don't have to group and minify it manually), and then load it and invoke it with the Nashorn javascript engine.
Your code may look like this (roughly):
import javax.script.Invocable;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
import java.io.InputStreamReader;
public class JavascriptBeautifierForJava {
// my javascript beautifier of choice
private static final String BEAUTIFY_JS_RESOURCE = "beautify.js";
// name of beautifier function
private static final String BEAUTIFY_METHOD_NAME = "js_beautify";
private final ScriptEngine engine;
JavascriptBeautifierForJava() throws ScriptException {
engine = new ScriptEngineManager().getEngineByName("nashorn");
// this is needed to make self invoking function modules work
// otherwise you won't be able to invoke your function
engine.eval("var global = this;");
engine.eval(new InputStreamReader(getClass().getClassLoader().getResourceAsStream(BEAUTIFY_JS_RESOURCE)));
}
public String beautify(String javascriptCode) throws ScriptException, NoSuchMethodException {
return (String) ((Invocable) engine).invokeFunction(BEAUTIFY_METHOD_NAME, javascriptCode);
}
public static void main(String[] args) throws ScriptException, NoSuchMethodException {
String unformattedJs = "var a = 1; b = 2; var user = { name : \n \"Andrew\"}";
JavascriptBeautifierForJava javascriptBeautifierForJava = new JavascriptBeautifierForJava();
String formattedJs = javascriptBeautifierForJava.beautify(unformattedJs);
System.out.println(formattedJs);
// will print out:
// var a = 1;
// b = 2;
// var user = {
// name: "Andrew"
// }
}
}
If you're going to use this approach, make sure to reuse JavascriptBeautifier object, because it's not too effective to recreate one whenever you need to beautify code.