AozoraEpub3とは青空文庫形式のテキストをEPUBに変換することができるソフトウェアである。Javaで書かれているので動作させるのにJavaが必要となる。昔はJavaで書けばどこでも動くと言われていたがいまはJavaScriptでブラウザ上のほうがどこでも動きがする。
Javaで動くのになぜJavaScriptにするかというと、Javaに起因するインスールの失敗のコメントがよく見つかる。Java8のサポート期間が延長されたので、それ以降のバージョンに移行する人がいない。けれどJavaの開発主体は17や21が多い、17や21はOpenJDKなのでJDKやJREを自分でインストールする必要がある。ソフトウェア制作者がインストーラーを作ってJREを同梱させればいいのだけど、インストーラーで作成されたexeとjarとで動作が変わるのでうまく動かない。
目標
- CLIの部分をnode.jsで書いて同じような動作を可能にしたい。
- rollupでjsやフォントなどまとめてブラウザ上で動かしたい。
現状
今年のはじめぐらいから、ChatGPTの手を借りながらAozoraEpub3をnode.jsに書き換えていた。問題点は長いコードは分割しないといけないこと。Javaではクラスごとに書かれているので、コードの分割すると違う意味なることがある。意味が通るように分割すると今度は結合するのがめんどくさくなる。
同じコードを書き換えできているかの確認にdiffを使っているので大きくコードを書き換えることができなかった。
jsでは関数型で書いていたので、Javaのオブジェクト指向的な書き方が移植するときにあまり見慣れない書き方になる。「引数だけ異なって名前は同じメソッド」がJSではだめなので条件分岐をする必要がある。chatgptが吐いたコードは別のメソッドを作っただけだった。
jsではJavaのライブラリが同じ名前じゃないので似た機能のライブラリを探す必要がある。たまに存在しないライブラリがあるように見せたコードを出力する。使っているライブラリを置き換える必要がある。
- common compress、jszip
- unrar、node-unrar-js
- velocity、ejs
- juniversalchardet、encoding.js
- imageio、jimp
- uuid
ファイル構造の問題
node.jsで同じファイル構造にすると、設定ファイルの変更がやりにくい。
どの箇所を移植し終えたか
最低限のAozoraEpub3の部分だけ抽出してJSに移植しているが、どの箇所を移植し終えたかをメモっておく。
はじめはcommonjsで書いていたが、パッケージ化するときにes moduleに書き換えた。
「下記のJavaコードをコメントは書き換えないで、es moduleに書き換えて。」という指示が一番しっくり来た。読ませたコードに今度は「テストコードを書いて」と指示したりもした。
テストコードをChatGPTに書かせるがmochaを使ったもので慣れていなかったのであまり使いこなせていない。
そのまま使う
-
chuki_alt.txt
-
chuki_ivs.txt
-
chuki_latin.txt
-
chuki_tag.txt
-
chuki_tag_suf.txt
-
chuki_utf.txt
-
presets
-
template velocityからejsに書き換えた
まだ
- AozoraEpub3.java
- AozoraEpub3Applet.java
書き換え中
- converter
- image
- info
- swing
- util
- web
- writer
converterフォルダー
- AozoraEpub3Converter.java constructorが重複している。
- AozoraGaijiConverter.java 確認済みやや不安
- GlyphConverter.java 未使用
- JisConverter.java 確認済み
- LatinConverter.java 確認済み
- PageBreakType.java 確認済み
- RubyCharType.java 確認済み
imageフォルダー
画像の情報の扱いはだいぶ違う
- ImageInfoReader.java 画像編集をJimpにunrarとunzipを書き換え
- ImageUtils.java
infoフォルダー
は書き換え済み
- BookInfo.java
- BookInfoHistory.java
- ChapterInfo.java
- ChapterLineInfo.java
- CoverEditInfo.java
- GaijiInfo.java
- ImageInfo.java sharpにするかjimpにするか
- ProfileInfo.java
- SectionInfo.java
swingフォルダー
はGUIを作るときまでまとう
- JConfirmDialog.java
- JCoverImagePanel.java
- JProfileDialog.java
- JTocTable.java
- NarrowTitledBorder.java
変換はしたけどライブラリをどのように使う。ログツールはライブラリを使ってもいいが書き換えるのが面倒。Detectorは文字コード判別だがencoding.jsにエラー処理を書いた。log4js-nodeを入れようかな。
utilフォルダー
- CharUtils.java
- Detector.java
- FileNameComparator.java
- LogAppender.java
writerフォルダー
- Epub3ImageWriter.java
- Epub3Writer.java ejsとjszipで圧縮しようかと