Wicket でpopup Window の外部リンクページ表示

結局JavaScript なのだが、a タグ onclick に Wicket で window.open 実行を埋め込んでくれる。

<a wicket:id="link" href="#">other</a>

PopupSettings をリンクのコンポーネント(ExternalLink)に設定する。

PopupSettings settings = new PopupSettings();
settings.setWindowName("_blank");

queue(new ExternalLink("link", "http://google.com").setPopupSettings(settings));

すると、<a> の onclick が、以下のように生成される。

onclick="var w = window.open(href, '_blank', 'scrollbars=no,location=no
,menuBar=no,resizable=no,status=no,toolbar=no'); 
try {if (w.blur) w.focus();}catch(ignore){}; return false;"

開く前のリンクのブラウザウィンドウ大きさサイズで開くので、開くウィンドウサイズを調整したければ
PopupSettings  に、width と height をセットしておく。

PopupSettings settings = new PopupSettings();
settings.setWindowName("_blank");
settings.setHeight(800);
settings.setWidth(500);

window.open() の中に、width=800,height=500 となるはずだ。

Python における JSON の読込み、シングルクォート

Python で、import json を使った、json.loadsJSON読込みは、
キーが、シングルクォートで括られていてはダメだ。ダブルクォートでないとならない。
これは、非常に不便だ。
JavaGoogle GSON は、シングルクォートだろうが解釈してくれる。

以下は、ダメ!

import json
dict = json.loads("{ 'a':10, 'b':'ABC' , 'c':{ 'd':'abc' } }")

ダブルクォートで括られてないとならない。

import json
dict = json.loads('{ "a":10, "b":"ABC", "c":{ "d":"abc"  } }')

しかし、抽象構文木 (Abstract Syntax Tree) ast のヘルパー関数 literal_eval
使用すれば、シングルクォートでも読み込める

import ast
dict = ast.literal_eval("{ 'a':10, 'b':'ABC' , 'c':{ 'd':'abc' } }")

抽象構文木
32.2. ast — 抽象構文木 — Python 3.6.5 ドキュメント

抽象構文木

ATOM markdownプレビューの見出しメニューリンクの作成

ATOM プラグイン markdown-preview-enhanced を利用すると
h1, h2, h3 タグ記述の見出しリンクを作成、HTMLに変換しても見出しリンク表示のアイコンが作れる。
atom.io

HTML に変換すると以下のように左下端にアイコンが表示される。
f:id:posturan:20190121193921j:plain

ただし、HTML変換した時に、アイコンがきちんと動くようにするには、このプラグインの設定を以下のとおり、
Enable Script Execution を有効にしないとダメだ。
f:id:posturan:20190121194553j:plain

デフォルトではこのチェックがOFFになっているのでONにする
f:id:posturan:20190121194608j:plain

クラスと同じ場所に置くファイル読込み(for java11)

ただのメモです。
テンプレートなど Java クラスと同じ場所に配置したファイルを読込む想定です。

java.io.Reader 取得

public Reader getFileRreader(Class<?> cls, String filename) throws IOException, URISyntaxException{
   return new FileReader(
      new File(ClassLoader.getSystemClassLoader().getResource(
            cls.getPackageName().replaceAll("\\.", "/") + "/" + filename).toURI()
      ), StandardCharsets.UTF_8);
}

String 取得

public String readStringFile(Class<?> cls, String filename) throws IOException, URISyntaxException{
   try(InputStream in = new FileInputStream(new File(ClassLoader.getSystemClassLoader()
      .getResource(cls.getPackageName().replaceAll("\\.", "/") + "/" + filename).toURI()));
   ){
      return new String(in.readAllBytes(), StandardCharsets.UTF_8);
   }
}

JSON書式判定

書式として与える JSON または任意の JSON に対してその要素のキーを必須で持つかどうかを判定する処理を
普遍的に欲しくなりました。

フォーマッタ―とまでは望まないけど、それに近い処理も、できれば充分です。
だって JSONを Object から JSON作成は、Google gson に頼れば楽なのですから。

Google gson の JsonParser を使って JSON のキーと値の型を解析、
書式判定になるものを、作成し、git-hub に入れました。
今までの Google gson 利用補助を目的とした JAR の中に入れました。
→ org.yipuran.gsonhelper.JsonPattern
Wiki :
patternvalidate · yipuran/yipuran-gsonhelper Wiki · GitHub

code :
https://github.com/yipuran/yipuran-gsonhelper/blob/master/src/main/java/org/yipuran/gsonhelper/JsonPattern.java

yipuran-gsonhelper のバージョンも 4.4 にUPしました。

苦労したのは、JsonArray の扱い方です。
JsonElement ← JsonArray
JsonElement ← JsonObject
という関係ですから。
それと、JsonPattern を開発して気づいて驚いたのは、空の JSON オブジェクト "{}" を JsonElement から
取得して、空のオブジェクトかどうかをチェックするには、
JsonElement の deepCopy() 関数で取得した結果は、"{}" でも toString()
実行させて、"{}" と equals() の判定処理にしなくてはならないところでした。

GSON で作成するJSONの整形

Google gson でオブジェクトから JSONテキストを生成したとき、
人間の目で見やすいように、整形するには、
 GsonBuilder の setPrettyPrinting() を実行してから、Gsonを作成する。

Gson gson = new GsonBuilder().setPrettyPrinting()
                      .create();

String str = gson.toJson(map);

固定サイズでの画像の切取り

Cropper JS使用の画像 crop で、常に固定サイズ
=常に一定の width と height
で切り取りするようにする。

切り取り BOX をリサイズ不可にするのは、
https://github.com/fengyuanchen/cropperjs#options
にあるとおり、cropBoxResizable オプションを false にする。
メソッドの説明により、
https://github.com/fengyuanchen/cropperjs#methods
setData メソッドで、crop セット(readyイベント)のタイミングで切り取り BOX の位置、サイズを
指定する。
切り取りBOXの再描画が行われるドラッグ時のモードを 'crop' ではなく、'move' にする。
setDragMode メソッド

以下のように cropper を設置することになる。

$('#image').cropper({
   aspectRatio: 1 / 1,
   cropBoxResizable: false,
   preview: '.img-preview',
   ready: function(e){
      $(this).cropper('setData', {
            x: 0, y:0, 
            width: 100, height: 100,
            rotate: 0, scaleX: 1, scaleY: 1
      });
      $(this).cropper('setDragMode', 'move');
   }
});

f:id:posturan:20190112133759j:plain