TEI用ビューワでローカルPC上の画像を表示するには(準備編)

TEI用ビューワにローカルPC上の画像を読み込んで拡大縮小させつつ領域を画像上に表示したい、というニーズが最近増えてきました。IIIFなら簡単なのですが、ローカルPCだと微妙に難しいところがあります。Webブラウザのセキュリティが色々細かくなってきているので、それをどうパスするか、という課題もあります。そのあたりをクリアしたTEI用ビューワを最近2つほど作成しました。日本近代文学の草稿研究向けのものと、和歌・歌合研究のためのものです。基本は同じですが、今のところそれぞれ少しニーズが異なるので、ベースは同じで、それぞれにカスタマイズしながら作っています。

なお、ローカルPC上の画像を読み込みたいというニーズは、つまり、画像を公開できないということなので、ここでデモを表示することもできないのですが、和歌・歌合研究用のものは古典の再生シンポジウムで公表しましたので、そちらをご覧になった人は覚えておられると思います。あのようなものの作り方、ということになります。

さて、ローカルPC上で画像を表示するなら、TEIのファイルや表示プログラムもローカルで動くようにしないとうまくいきません。ここで、ブラウザセキュリティ的に簡単なのはローカルでHTTPサーバを立ち上げるという方法なのですが、HTTPサーバの立ち上げは、少し慣れてないとハマり要素の一つになってしまいがちで、たとえば「誰かに操作してもらう」というような場合に結構ややこしいことになりがちです。そこで、別案を考えます。

ブラウザセキュリティ的にややこしいのは、ビューワのプログラム(ここではJavascriptを前提としています)からTEIのXMLファイルを読み込むという局面です。普通にローカルのTEIファイルを読み込もうとしてもブラウザにブロックされて読み込めない場合が多いのです。そこで、TEIのXMLファイル読み込みをブラウザのフォームからアップロードする形でWebブラウザに渡すという方法があり得ます。この場合、アップロードした時点でJavascriptで読み込むことができますので、割とすんなりと読み込むことができます。開くたびにアップロードするのがちょっと面倒ですが、デモ用と割り切っていただくということで…

さて、そうなってくると、まずは、TEIのXMLファイルをJavascriptで読み込む方法をとりあえず押さえておく必要がありますね。これは以下のようなスクリプトで簡単にやってみましょう。

<!doctype html>
<html lang="ja">
  <head>
    <!-- Favicons -->
  <script src="https://code.jquery.com/jquery-3.6.0.js"></script>   
  </head>
  <body>
        <h1>TEIビューワ ver.0.1</h1>

<div id="text_body" style="writing-mode: vertical-rl" >
    <div id="body_result" style="overflow-x: scroll;width:1000px;height:600px;padding:10px;"><!--この id="body_reusult"にデータを表示する-->
    </div>
</div>

<div id="input1" style="padding:10px">本文:<br/>
    <input class="file_input1" type="file" multiple="" class="btn btn-default">
</div>
<script>
$( function() {
    $('.file_input1').change(function(){
        for (var i = 0; i < this.files.length; ++i){
            if (this.files[i].type == 'text/xml'){
                var reader = new FileReader();
                reader.onload = function(e){
                    var xmldata = $.parseXML(e.target.result); // TEI/XMLファイルの内容をXMLでパースしてxmldata変数に代入
                    $(xmldata).find('titleStmt').each(function(){
                        $(this).find('title').each(function(){ // TEI/XMLのデータからタイトルを取得
                            $('#body_result').append('<span style="font-weight:bold">'+$(this).html()+'</span>'); //タイトルを<span>タグに入れてid="body_resut"のエレメントに付与
                        });
                        $(this).find('author').each(function(){ // TEI/XMLのデータから著者名を取得
                            $('#body_result').append('<div class="author">'+$(this).html()+'</div>'); // 著者名を<div>タグに入れてid="body_resut"のエレメントに付与
                        });
                    });
                    // ここに次のスクリプトを追加
                }
                reader.readAsText(this.files[i], "utf-8")
            }
        }
    });
});
</script>
  </body>
</html>

とりあえずこれをコピペしてhtmlファイルを作成して、Google chromeで開いてから何らかのTEI/XMLファイルを読み込ませてみてください。そうすると、タイトルと著者名が表示されるはずです。たとえば以下のものは、こちらの『走れメロス』のファイルを読み込ませてみた例です。

これだけでは本文がないですね。そこで本文も表示させてみましょうか。以下のスクリプトを「ここに次のスクリプトを追加」と書いてあるところに追加して、保存⇒Webブラウザで再読み込み⇒TEI/XMLファイルの読み込み、をさせてみましょう。

                    $(xmldata).find('text').find('body').each(function(){
                        $('#body_result').append($(this).html());
                    });

ちなみに、このスクリプトは、jQueryというやや古いが比較的簡単な記法を用いて書いています。冒頭の$(xmldata) はjQueryが提供している色々な機能を用いてデータを操作できるものです。これに対して find('text') とついているのは、下位要素のなかでtextエレメントを探す、という意味です。ここに、.find('body')をつけると、さらに下位の要素のなかのbodyエレメントを探す、という意味です。そして、 .each(function... とついているのは、bodyの内容が複数であることを想定して一つずつ処理するということになります(PythonのBeautifulSoupとはfindの意味が異なりますのでご注意ください)

そして、$('#body_result')は、HTMLファイルの中でIDがbody_resultであるものを指定しており、それに対して .appendを用いて続く括弧の内容を付与します。括弧の内容は $(this).html()となっていますが、これは bodyエレメントの内容として一つずつ処理されるものが$(this)に代入されることになっており、それに対して .html() をつけることでタグ付きデータを取り出すように指示しています。

ということで、うまくできていれば以下のように表示できているはずです。

さて、これでTEI/XMLファイル中のタイトル・著者名・本文を取り出してHTMLファイルとして表示できるようになりました。このようにしてTEI/XMLのデータを取り出して処理できるようにすることで、ローカルPC上の画像ともリンクできるようになります。

準備編ということで、今回はここまでとします。

DHフェス2023が発表者・参加者募集中です

人文学+デジタルな取り組みを気楽に話すオンラインミーティング、DHフェス2023が発表者・参加者募集中です!

sites.google.com

かっちりした話でなくても、むしろ、研究のアイデアや相談事などの持ち込みを歓迎しているようです。 「デジタルでこういうことをやってみたいけどどうしたらいいのかよくわからない」というようなことでも 持ち込んでいただければ面白い展開があるかもしれません。会場は、バーチャルコミュニケーションツールoViceを用いる予定です。

ぜひご参加ください。

ちなみに、去年は以下のように開催されました。

digitalnagasaki.hatenablog.com

書誌情報作成/図書館情報学/デジタル・ヒューマニティーズ/デジタルアーカイブに関心がある方々におすすめの講演会

2月の18日(土)と21日(火)、連続講演会「TEI (Text Encoding Initiative) × Library が拓くデジタル人文学と図書館の未来」が開催されます。

ケンブリッジ大学の、デジタル図書館の責任者であるHuw Jones氏と中東専門部門長のYasmin Faghihi氏をお招きしての講演会です。これがなぜ、「書誌情報作成/図書館情報学/デジタル・ヒューマニティーズに関心がある方々におすすめ」なのか、少しご説明をさせていただきます。

ケンブリッジ大学デジタル図書館では、古典籍・貴重書用のデジタル図書館システムにおいて、詳細な書誌情報を記述・表示できる仕組みを提供しています。この記述ルールとして、人文学のための研究データ構築のガイドラインである TEI (Text Encoding Initiative) ガイドラインを採用しているということが、まずデジタル・ヒューマニティーズ分野において注目されることなのですが、同時に、こちらのブログ「ケンブリッジ大学デジタル図書館の日本資料の書誌情報を視覚化してみる - digitalnagasakiのブログ」にてご紹介しているように、詳細な書誌情報を対象とした統計分析も可能としているという点が、書誌情報を扱う方々におかれても、関心をお持ちいただけるところなのではないかと思います。

日本古典籍に関してはこの書誌情報はそれほど整理されていないのですが、それを高度に推し進め、さらにそれを各地の専門司書のネットワークによって構築しているのが、Yasmin Faghihi氏率いるイスラーム写本横断検索サイトFIHRISTです。

FIHRIST
FIHRIST

これについては、須永恵美子氏による紹介記事がとてもわかりやすいです。FIHRISTでは、TEIガイドラインに準拠した詳細かつ構造化された書誌情報を各地の専門司書が作成し、それを集約して高度な書誌情報検索を可能としています。たとえば、書誌情報に登場する、著者だけでなく、筆耕者、前の所蔵者、描かれている人、翻訳者、パトロン、寄付者、注釈者、画家、編纂者、編集者、蔵書印、人物の様々な「役割」まで記述し、それが以下のようにして絞り込み検索の対象として提示されます。これだけでも、書物の歴史に関する様々な分析が可能になりそうです。

登場人物の役割
登場人物の役割
この役割の記述手法自体はTEIガイドラインに用意されていますが、実際にそれを記述するというのはまた別な話であり、さらに、記述内容をある程度統制することにもまた別の努力が必要になります。そういったことも含めてきちんと実現されているというところにこのFIHRISTの素晴らしさがあります。

同様に、作成時期や装飾の有無、素材、所蔵機関、所属コレクション等々の情報が提供されており、物理的な形態に関する情報であれば以下のように記述されてまとめられています。

物理的な形態に関する情報
物理的な形態に関する情報

サブジェクトに関するメタデータも以下のように付与されています。

サブジェクトの分類
サブジェクトの分類

日本の古典籍のメタデータもこれくらい情報をとれるようになると、また色々な分析が出来るようになり、書物を愛する人達にとって興味深い情報が得られ、何か新しい事実や解釈の発見もできるかもしれません。そういうことを考えてみるための手がかりとして、この会にて、このFIHRISTを率いるYasmin Faghihi氏のご講演は色々なヒントを提供してくださるのではないかと思っております。

また、ケンブリッジ大学デジタル図書館は、書誌情報だけでなく、画像をIIIF対応で公開しているのはもちろんですが、さらに、テキストによっては本文もTEIガイドラインに準拠した形で作成・公開しています。科学史の研究者の方々ならおそらくよくご存じかと思いますが、ここの図書館のNewton Papersというデジタルコレクションでは、ニュートンの手書き原稿のTEIガイドラインに準拠して構造化された翻刻テキストが公開されています。たとえば、Papers connected with the Principiaでは、以下のような感じで頁画像を拡大表示しつつ、TEIガイドラインに準拠して記述された翻刻テキストをCSSで整形・レイアウトして表示しています。数式の記述には数式をXMLで記述するためのMathMLが用いられています。

Papers connected with the Principia
Papers connected with the Principia

そして、このTEI/XMLテキスト自体も、こちらのURLからダウンロードして再利用できるようになっています。

このような仕組みは、デジタル図書館システムとしても、デジタルアーカイブシステムとしても、古典籍の事情と人文学者のニーズに深く寄り添った興味深いシステムであり、そして、このようなものを作成する仕組みやワークフローという観点や、このデータの使い道といった観点ではデジタル・ヒューマニティーズにも大変興味深いものではないかと思っております。

このようなものについて、その責任者から直接、しかも同時通訳がついて日本語で話を聞ける機会、というのが、2/18と2/21の講演会です。これはなかなか貴重な機会ではないかと思います。対面とオンラインのハイブリッド形式ですので、遠隔地でもご参加いただけます。よかったらぜひご参加してみてください。

仏典のTEI/XMLデータをHTMLに変換して読みやすくするスクリプトを作りました

SAT大蔵経データベース研究会で公開している仏典(勝鬘経義疏)のTEI/XMLデータをHTMLに変換して読みやすくするスクリプトを作りました。例によって、Google Colab上で動かせるようにしております。

それから、見本ということで、変換後のHTML版は、とりあえず以下のURLにて閲覧できるようにしています。

https://www.dhii.jp/dh/tei/2185/2185.html

まだ完成版からはほど遠いですが、これくらいやっておけば、TEI/XMLファイルのマークアップをする人達には便利なのではないか…というようなものを作ってみたところです。TEI/XMLのデータを作成することによって何ができるのか・何がしたいのか、ということも、この変換結果をみていただくとなんとなくつかんでいただけるかもしれないと思っております。

サーバを立てなくてもローカルでファイルをブラウザで読み込むだけで閲覧できるように、javascriptファイルなどをダウンロードして、各章のファイルなども一緒にまとめて zip ファイルを作成するようになっています。

変換をかけている主な項目としては、

  1. 章のリストと本文を上下にわけて、頁上部の章タイトルをクリックするとページ下部に本文が表示されるように。

  2. <div>の章単位で個々のHTMLにファイルを分割(⇒大きすぎるファイルは表示の際にブラウザが固まってしまうため)

  3. Double-endpoint attachment method の校異情報に対応して本文には黄色いマーカー+脚注記号を付与、校異情報はポップアップダイアログに表示

  4. 改行・返り点・脚注記号はそれぞれ小さく表示した上で任意に非表示化できるようにチェックボックスを用意

  5. 引用に関しては、@source属性を持っているものは外部リンクを埋め込み

  6. <back>にリストされている固有表現をとりだして右ウインドウに表示

といった感じです。

ただ、今回は、変換にはPythonを使っていますが、HTML上で動的な表示を行うために、変換結果の中にJavascriptが含まれるような書き方をしています。そのため、PythonとJavascriptの文法が完全に混在しています。両者をうまく分割するというのもあり得るのですが、とりあえず1つのスクリプトで済ませてしまいたいので、ここでは両者を混在させています。両方をある程度知らないと、スクリプトをみてもわけがわからないと思いますので、その点、ご注意ください。

それから、splitpinesを利用するためにvue.jsを使ったので、ついでに、Javascriptが必要な事柄については、基本的にvue.jsで書いています。

この後、さらにこのスクリプトをグレードアップしていくというのと、検索させるために検索用データを抽出するといったことにも取り組んでいく予定です。ちょっと気の長い話ですが、引き続きお付き合いいただけますと幸いです。

なお、このスクリプトと見本は、『人文学のためのテキストデータ構築入門』のフォローアップサイトでもリストしておりますので、他の入門的なスクリプトもあわせてご覧ください。

TEI利活用セミナーを開催します

明日(2022/11/5)の11:00-17:00、TEI利活用セミナーというのを開催します。 参加費無料・要申込み、です。参加申込みはこちらからお願いいたします。

TEIに準拠してファイルを作ったけど、これをどう扱えばいいのか…とか、 TEIに準拠して作られたファイルが自分の分野にはたくさんあるようだけど、これをどう使えばいいのか…?

というような人に向けて、ごく初歩的なことを知っていただく会です。

具体的には、

  • Oxygen XML Editorを用いたXPathによる検索とデータの抽出
  • Pythonを用いたデータの抽出と処理・地図へのプロット

といったあたりを扱う予定です。前半は、プログラミングの知識などはまったくなくても大丈夫です。後半は、Python等のプログラミング言語を勉強してない人でも、「勉強するとこういうことができるのか」というイメージを持っていただくのに役立てていただければと思います。

ご興味がおありの方はぜひご参加ください。

TEI/XML利活用の基礎:PythonでTEI/XMLファイルの地理情報を地図上にプロットする

プログラミング言語Pythonは、自然言語処理のライブラリが充実しているので、自分のメインの言語ではなかったのですが、10年くらい前に、授業で教えられるくらいの勉強をして、授業で教えたりしていました。その後、ディープラーニングへの入口として注目されるようになったので、このところは、人に教えるとき、特に若者に教えるときはPythonが基本です。インタラクティブなものを作りたいという人にだけはJavascriptをやりますが、やはり今は猫も杓子もPythonを使えるようになっているのがよいのではないかと思っております。

というわけで、漱石書簡の3つのTEI/XMLファイルに含まれる座標情報をPythonで地図上にプロットできるようになるチュートリアルをGoogle Colabに作ってみました。ご興味がおありの方はぜひ以下のURLにアクセスしてみてください。

colab.research.google.com

これを一通りやってみると、以下のような地図を作れるようになります。(以下のものはサンプル画像ですが、このような地図をOpenStreetMapを利用したインタラクティブなものとして作成できます。)

map
地図

基本的なものですので、これを踏まえて色々な応用の仕方や、逆に、こういった応用の仕方を踏まえて、マークアップの方法を検討してみたりしていただけるとよいかもしれません。

なお、上記のURLも含めて、TEI/XMLの利活用に関するチュートリアル的なものは、以下のURLに蓄積しておりますので、あわせてご覧ください。

www.dhii.jp