LoginSignup
1
0

More than 3 years have passed since last update.

XMLファイルをsatyファイルに変換するソフトウェアを作りました

Last updated at Posted at 2020-01-26

はじめに

XMLファイルをSATySFiのsatyファイルに変換するソフトウェアを作成しました。

名前はやや安直で、"xml2saty"です。リポジトリはhttps://github.com/puripuri2100/xml2satyです。

インストール

  • OPAMをインストールします
sh <(curl -sL https://raw.githubusercontent.com/ocaml/opam/master/shell/install.sh)

で入ります。

  • OCamlをインストールします
opam init --comp 4.06.0

eval $(opam env)

などとすると良いでしょう(Ubuntu on WSLをを使っている人はopam initの際に--disable-sandboxingというオプションをつけてください)。
バージョンは古すぎなければ大体のもので動くと思われます。

  • 依存ライブラリをインストールする
opam install xml-light
opam install menhir

でインストールできます。既に入っている場合はしなくて大丈夫です。

  • リポジトリをクローンしてビルドする
git clone https://github.com/puripuri2100/xml2saty.git
cd xml2saty
make build

でビルドができ、フォルダにxml2satyという名前の実行ファイルができます。

後は適当にフォルダに移動させるなりしてパスを適切に設定してください。

使い方

  • -fもしくは--fileオプションでXMLファイルを渡すことができます。このオプションは省略することができます。
  • -oまたは--outputオプションで出力ファイル名を指定できます。無い場合は入力のファイル名を流用します。オプションそのものを省略するとXMLファイルの名前から自動的にファイルが作成されます。
  • -cまたは--configで設定ファイルを渡すことができます。オプションそのものを省略するとXMLファイルの名前から自動的に設定ファイルが探されます。
  • -tまたは--textで直接XML文字列を渡すことができます。このとき、-o--output-c--configオプションは省略できません。

起動は

xml2saty -f 〈XMLファイル〉 -o 〈satyファイル〉 -c 〈設定ファイル〉

です。

入力するXMLファイルについて

xml-lightパッケージが処理できる正しいXMLファイルである必要があります。
また、要素の名前などについてはASCII文字以外である場合の動作については保証できません。
ファイル名を渡すときに拡張子は省略できません。

出力ファイルについて

-o--outputオプションに渡すファイル名では拡張子を省略できません。

設定ファイルについて

設定ファイルの拡張子は.x2s-configで、文法はオリジナルのものです。

require:[stdja; list]

のように

〈設定タグ〉: [〈リスト〉]

と記述します。リストの区切りはセミコロンです。
設定タグは

  • require@require:の後に記述されるパッケージ名(パス)をリストの形で書きます。
  • import@import:の後に記述されるパッケージの相対パスをリストの形で書きます。
  • attrib:要素の属性の変換方法ついて指定をします。これだけは
〈要素名〉(〈要素の中身の型(省略可)〉)[
〈(〈属性名〉,〈子要素の型〉,〈その属性がコマンドの何番目の引数か〉)のリスト〉
]

のリストになります。ややこしいですが、例えば

attrib :
  [
    Paragraph (block-text)[
      (Hide, bool, 2);
      (Num, int, 1)
    ];
    ParagraphNum(inline-text)[];
    ParagraphCaption(inline-text)[];
    ParagraphSentence(inline-text)[];
    Sentence (inline-text) [
      (WritingMode, string, 1);
    ];
  ]

みたいな感じです。
このとき、属性のリストに含まれなかった属性は無視されます。

これらを与えることで出力されるファイルの中身を制御できるようになります。

使える型名は現在のところ

  • string
  • int
  • bool
  • float
  • length
  • inline-text
  • block-text
  • funciton

です。functionを選択すると、要素の中にある子要素が全て関数扱いになり、先頭が小文字になります。
inline-textは先頭に\が付き、block-text+が付きます。

子要素が続く場合は基本的にinline-textblock-textを指定しますが、文字列しかこないとわかっている場合はstringintなどを指定することもあるでしょう。

上に挙げたSATySFiの型名とrequireimportattribは要素名やパッケージ名で指定できません。エラーになります。
ただし、パッケージ名の時はパスの形にしておけばエラーはでません。
たとえば、require:[int]はエラーになりますが、require:[satysfi-base/int]はエラーになりません。

使用例

リポジトリにexampleフォルダの中にe-Gov法令検索からダウンロードできる元号法と刑法のXMLファイルが置いてあります。

make example

でsatyファイルを作成することができます。

付属のlocal.satyhにコマンドの定義が書いてあるのでそれを使って

satysfi example/keihou.saty -o example/keihou.pdf

のようにしてコンパイルすることができます。

また、これを応用することによりHTMLファイルをsatyファイルに変換することも可能なはずです。

おわりに

XMLファイルをsatyファイルに変換できるようになったことでSATySFi導入の敷居が下がると嬉しいです。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0