Java: форматировать код Javascript - PullRequest
1 голос
/ 24 октября 2011

В моей архитектуре код Javascript генерируется на сервере. Огромный кусок кода Javascript генерируется, сохраняется в java.lang.String и отправляется на клиентскую сторону. Я хочу более легко отлаживать сгенерированный код (как генерацию, так и то, как он выполняется).

Кто-нибудь знает простой способ форматирования кода Javascript?

Ответы [ 5 ]

4 голосов
/ 19 февраля 2018

Это может быть слишком поздно, но все же.

Я не нашел популярных библиотек Java для того, что вы хотите;однако для этого есть много библиотек javascript (например, js-beautify ).Вы можете сохранить исходный код такой библиотеки в ресурсах вашего приложения (вы можете получить код по одной из ссылок cdn, чтобы вам не приходилось группировать и минимизировать его вручную), а затем загрузить и вызвать его с помощью механизма javascript Nashorn.,

Ваш код может выглядеть примерно (примерно):

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"
        //        }
    }
}

Если вы собираетесь использовать этот подход, убедитесь, что вы повторно используете объект JavascriptBeautifier, потому что воссоздать его не слишком эффективно.всякий раз, когда вам нужно украсить код.

3 голосов
/ 24 октября 2011
1 голос
/ 19 февраля 2018

Может быть поздно - но все же:)

В репозитории jdk9 есть симпатичный образец принтера.При этом используется API анализатора Nashorn (https://docs.oracle.com/javase/9/docs/api/jdk/nashorn/api/tree/Parser.html)

http://hg.openjdk.java.net/jdk9/dev/nashorn/file/17cc754c8936/samples/prettyprinter.js

0 голосов
/ 24 октября 2011

используйте Firefox с аддоном Firebug. Вы можете добавить точки останова в ваш сгенерированный javascript и выполнить пошаговую отладку.

0 голосов
/ 24 октября 2011

Идея, которая приходит в голову, состоит в том, чтобы построчно управлять выходными данными JavaScript (например, классом CodeLine, имеющим текст и уровень отступа), и когда вы фактически отображаете это для пользователя и печатаете каждую строку на нем. собственную строку вы можете вкладывать соответствующим образом для форматирования кода. Это потребует пользовательского класса и, вероятно, что-то вроде ArrayList<CodeLine>.

...