🍇

HTML の生成に対応した HTMLBudouX.swift

2021/12/25に公開

HTML の生成に対応した HTMLBudouX.swift を作りました

先日投稿したこちらのアーティクル『Swift で BudouX を使ってアラートの改行位置を整える』では、Google の BudouX を Swift に移植し、iOS アプリのアラート表示などで改行位置を整える BudouX.swift のことを書きました。

その BudouX.swift を拡張し、HTML の生成に対応した別ライブラリ

を作りました。

今回は、そのお話をします。

Google の BudouX の話や BudouX.swift について、ここでは詳しく言及しませんので各リポジトリや先ほど紹介した先日の投稿をごらんください。

HTMLBudouX.swift とは?

BudouX.swift をベースに HTML を含んだ入力に対して、ブラウザがよしなに改行できるような HTML を返すライブラリです。

Google の BudouX には標準搭載されている機能ですが、僕が移植した BudouX.swift には実装していませんでした。HTMLBudouX.swift はそれを補完する別ライブラリです。

なぜ、別ライブラリに分けたのか?

オリジナルである Google の BudouX は HTML の表示時の問題を解決することにフォーカスしています。ですので当然 HTML を含んだ文字列を変換し、HTML を出力する機能を持っています。

これに対して、BudouX.swift を Swift に移植したときの想定利用シーンは、ネイティブ iOS アプリ開発です。ネイティブアプリでは、Swift の String 型を UI 表示に使用します。BudouX.swift は、Swift String に対して改行位置がよしなに調整されるような処理を加えたものに注力したいと考えました。ネイティブ iOS アプリ開発のシーンで HTML をアプリ側で生成して表示するようなケースはごくごく希だと考えています。

さらに外部依存管理の問題が絡んできます。これは僕の知識不足かもしれませんが、Swift Package Manager では依存する外部ライブラリの細かいコントロールができません。BudouX.swift に HTML 関連の機能を実装しようとすると DOM 操作を行うための外部ライブラリを追加しないといけないと思いました。先ほど書いたように僕としては BudouX.swift 自体は String にフォーカスして HTML はオマケという考えです。ほとんど使われないだろうと思っているオマケのために別の依存外部ライブラリが増えることが許容できなかったために、HTML 機能は別ライブラリとして切り出すことにしました。

DOM 操作はどうしたのか?

SwiftSoup を使っています。

Swift で利用しやすい DOM パーサは色々とありましたが、DOM ツリーの操作・編集機能がある程度実装されているものはこれ以外に見つけられませんでした。

オリジナルである BudouX の TypeScript 実装で JSDOM が担っている部分を SwiftSoup に置き換える形で移植しました。

苦労した点

ある意味当然ですが、JSDOMSwiftSoup はやろうとしていることは同じであっても API は全く違います。同じような名前の機能であっても挙動が違うことがありました。そのような場合にはオリジナル TypeScript のテストコードをデバッガーで止めながら動作をみて同じような処理になるように SwiftSoup 側を拡張したりしました。

SwiftSoup は公開されている型やメソッドが割とバラバラで一部は素直に使えなかったので内部実装を引っ張り出して利用しています。(SwiftSoup 側に PR を出した方が良いのでしょうが...)

最後に

興味のある方は軽く触ってみてください。

Discussion