TITLE:Rhinoでgoogle-prettify.jsを実行する

Rhinoでgoogle-prettify.jsを実行する

#adsense2

編集者:Terai Atsuhiro
作成日:2011-01-25
更新日:2018-12-10 (月) 16:47:59

概要

Rhinoでgoogle-prettify.jsを実行し、ソースコードをハイライトされたHtml(google sites用)に変換します。

サンプルコード

import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;
import javax.script.*;
import javax.swing.*;
public class GooglePrettifyRhinoTest {
  private final JTextArea src = new JTextArea();
  private final JTextArea dst = new JTextArea();
  private final ScriptEngine engine = createEngine();
  public JComponent makeUI() {
//     ScriptEngineManager manager = new ScriptEngineManager();
//     java.util.List<ScriptEngineFactory> list = manager.getEngineFactories();
//     for (ScriptEngineFactory f:list) {
//       System.out.format("%s %s", f.getEngineName(), f.getEngineVersion());
//     }
//     InputStream is = getClass().getResourceAsStream("Test.java");
//     try {
//       Reader reader = new InputStreamReader(is);
//       src.read(reader, null);
//     } catch (Exception ex) {
//       ex.printStackTrace();
//     }

    JButton b = new JButton((new AbstractAction("Convert to google sites") {
      String pre =
        "<pre style=\"color:#0;background:#f0fff8;margin:8px;padding:8px\">";
      @Override public void actionPerformed(ActionEvent e) {
        String str = prettify(engine, src.getText());
        str = str.replace("class=\"str\"", "style=\"color:#080\"");
        str = str.replace("class=\"kwd\"", "style=\"color:#008\"");
        str = str.replace("class=\"com\"", "style=\"color:#800\"");
        str = str.replace("class=\"typ\"", "style=\"color:#606\"");
        str = str.replace("class=\"lit\"", "style=\"color:#066\"");
        str = str.replace("class=\"pun\"", "style=\"color:#660\"");
        str = str.replace("class=\"pln\"", "style=\"color:#000\"");
        str = str.replace("class=\"tag\"", "style=\"color:#008\"");
        str = str.replace("class=\"atn\"", "style=\"color:#606\"");
        str = str.replace("class=\"atv\"", "style=\"color:#080\"");
        str = str.replace("class=\"dec\"", "style=\"color:#606\"");
        dst.setText(pre+str+"\n</pre>");
      }
    }));
    JSplitPane sp = new JSplitPane(JSplitPane.VERTICAL_SPLIT);
    sp.setResizeWeight(.5);
    sp.setTopComponent(new JScrollPane(src));
    sp.setBottomComponent(new JScrollPane(dst));
    JPanel p = new JPanel(new BorderLayout());
    p.add(b, BorderLayout.SOUTH);
    p.add(sp);
    return p;
  }
  public static ScriptEngine createEngine() {
    ScriptEngineManager manager = new ScriptEngineManager();
    ScriptEngine engine         = manager.getEngineByName("JavaScript");
//     ScriptEngineFactory factory = engine.getFactory();
//     String name = factory.getEngineName();
//     String version = factory.getEngineVersion();
//     System.out.printf("\tScript Engine: %s (%s)\n", name, version);
    Reader reader = null;
    try {
//       reader = new InputStreamReader(
//         GooglePrettifyRhinoTest.class.getResourceAsStream("prettify.js"));
      URL url = new URL(
        //"http://google-code-prettify.googlecode.com/svn/trunk/src/prettify.js");
        "http://terai.xrea.jp/skin/irid/prettify.js");
      reader = new BufferedReader(new InputStreamReader(url.openStream()));
      engine.eval("var window={};var navigator=null;");
      engine.eval(reader);
      return engine;
    } catch (Exception ex) {
      ex.printStackTrace();
    } finally {
      if (reader!=null) {
        try {
          reader.close();
        } catch (Exception exx) {
          exx.printStackTrace();
        }
      }
    }
    return null;
  }
  public static String prettify(ScriptEngine engine, String src) {
    try {
      Object w = engine.get("window");
      return (String) ((Invocable)engine).invokeMethod(
               w, "prettyPrintOne", src, "java"); //, Boolean.TRUE );
    } catch (Exception e) {
      e.printStackTrace();
      return "";
    }
  }
  public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
      @Override public void run() {
        createAndShowGUI();
      }
    });
  }
  public static void createAndShowGUI() {
    JFrame f = new JFrame();
    f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    f.getContentPane().add(new GooglePrettifyRhinoTest().makeUI());
    f.setSize(320, 240);
    f.setLocationRelativeTo(null);
    f.setVisible(true);
  }
}

解説

上記のサンプルでは、new ScriptEngineManager().getEngineByName("JavaScript"); で取得したJavaScriptエンジン(Rhino)に、prettify.jsを読み込んで、prettify.jsのprettyPrintOneメソッドを実行しています。 google sitesでは、cssファイルも使用できないので、replace("class=\"kwd\"", "style=\"color:#008\"");のように、クラスをスタイルの色に全部置換しています。

参考リンク

コメント

  • prettyPrintOneの内部で、Document型のオブジェクトが使用されるようになっているので、上記のサンプルでは古いprettify.js(このサイトで使用中)を参照するように変更。 -- aterai