概要

Next.js、CETEIcean、React TEI Routerを組み合わせたTEI/XMLビューアの開発についての備忘録です。

背景

CETEIceanは、TEI/XML を HTML5 に変換する JavaScript ライブラリです。

https://github.com/TEIC/CETEIcean

そして、React TEI Routerは、CETEIcean をベースに React コンポーネントで TEI/XML を構造化して表示できるライブラリです。以下のように説明されています。

https://github.com/pfefferniels/react-teirouter

TEI for React using CETEIcean and routes

これらを組み合わせることで、Next.js において TEI/XML をカスタマイズして表示できるビューア を作成しました。

リポジトリ

以下がサンプルリポジトリです。

https://github.com/nakamura196/next-ceteicean-router

実際に動作するデモも用意しています。

https://next-ceteicean-router.vercel.app/

実装

Next.js のページコンポーネント (page.tsx)

CETEIcean を利用して XML を変換し、カスタムコンポーネントで描画します。

iie}mmxpppcrooooerrrn<ttttsT/utE<TrRRdIt/Eneeexe<tIanfmxxb/e><cdalmto<<bx`RteuCl>dd/d/ot;erlonyidi<<dd>nftns>vivpp/iydrft=v>pv>eorfe"t>ss>>rmounhyttmnttp<yyx"ctepllmr"t=p=eeele@i:"r==Ca/o`/os""occn</rNccnto?wiaoot"mAxwgmlle;ppmwieoonopl.nrrtn(tac::=e)velo{nei"rggxt{r->rrrmssceeel/i.seeCtoopnnoenr=;;ni=g"""t""/#>>e;1nin.sdt0/1}"1".>e0<>n"/<;c>pso>ed<gi/npsget=ry"slUNeTa=Fm"-ec8>o"l?o>r:blue;">xxx</seg>

TEIレンダリングコンポーネント

  • CETEIcean を使って XML を HTML5 に変換。
  • TEIRender + TEIRoute を使い、TEI 要素ごとにカスタムコンポーネントを適用。

import { TEIRender, TEIRoute } from "react-teirouter";を使用した上で、要素毎にコンポーネントを用意しています。

"iiiiiiie}ummmmmmmxsppppppppcR}i}r)eoooooooooe,fe;rrrrrrrrnac}fci}t<cttttttttsco;e[(ofud/lttnccstxtnr)ris}<diRC{{{{{d.sooecmes(e;nvt}h/ieeEe[utnnthlittt<ydjah1s}LhvnaTTDPPSftsCssTDCDeud/(liulet}o1>tcEEieeaeefEtteaootirics<dessiiyfcfa>"tIIvr}guiEeTitnceEnvltT/i=ptggloood;RslDftECdDat)ilayE<<<<Tv{linhenlniffe}Nf}tofcIEao(eEe(slITTTTE>{afIt=totnrrnarcehcTtc)n{lmseREEEEIyyt:{FrSgoodfmoff,cDeEa(;teeN=eIIIIR:Ce{a:immeremrutaaId]mna{nRRRReom"mzTroons(tnc=a)etm{doooon"nsci"eE"",m}"mce(aet;n)eeuuuudft:al#:IrC@tt)aaat=wrttttelely3.eET"f/"iT=nw){"reeeeren"c:3".aTE@rc@e=a;="id>xtc(32.cEI/ooni>a=itaeeee":e1""4tIRcmmcDsttitllll,n0A,p"coopoRo{ynena===="t0rx;eum"omecneCig=""""cevi"atp@npn]cwEDM{tttterha,neo/eodTooteeeen"l"ncnne=CEcdeiiiit,-,;}eoterEI.ei----enmsn(RTcq:Edppsr1sftpt{e=Eeuli"ee"2arstsa>Iae"evrg,8none/xc(nrvm"cs"psmteitmt{).yeeonx-en/el.;mSrncmac)s"iteiCuaettopmo"er/sl/oskli}moem,ree/eeneeec>pn"pialtmltSHcaoeofceeeeetTtlnncn"tminmnaMo-etoe,-e/tettLrrn=mntne/ne5(lt{ptetlpt}<(""=Po=i/e"/:Dxt,{}n{rdm;someDeSoiee{clihineuvnguC-etgt"t"xmoti}=}e;/;meneg{rplntihP"eCte"te;ron):rsn|t;snt)"Naen;camnuametlle":lc};>(s(1tn0ru0ilvnlhg);-})12{8px)"}}

カスタムコンポーネント (p.tsx の例)

pタグの例です。<TEINodes teiNodes={props.teiNode.childNodes} {...props} />を用いることで、再帰的にタグの処理を行うことができました。

iie}mmxpppccr)oooooe;rrrnnt<tttssup/ttr<p{{fnsT>utstETgnet(yIEeciylNIttNleoNSioe=dotod{edyne=sseltseP=gyt(ele}}ppteirrS}Nffootorrppycdoossllemm:.east(s=""{ets{r@ieNpe/tNiaraueoNmoctidoeptiNed=s-lo;e".tsd)mte"e;-ei;:1ir"NoC>ouhdtieel.rdc"Nh;oidledN}o)de{s}{...props}

補足

この方法を利用したものとして、CETEIcean を React コンポーネントとして活用し、カスタム要素を TEI にマッピングする「Astro TEI - React」がありました。

https://github.com/raffazizzi/astro-tei/tree/main/packages/react#readme

An Astro component for publishing TEI as Custom Elements powered by CETEIcean.

This utility provides the React version of CETEIcean’s default behaviors and provides a way of mapping your own React components to TEI elements via React TEI Router.

ただし、サイズが大きいTEI/XMLに対しては、 React TEI Router でレンダリングすると 再帰的に回す処理が多くなり、パフォーマンスが低下する可能性があります。

その場合、React componentとしては使用せず、CETEIceanのみを使用する方がよいかもしれません。

vC}aE)rTdEoCIcEcuTemEaeInnc.teg.aegnteHt=TEMlnLee5mw(e"nCUtERBTLyE_IITd(O()_"YTOEUIR"_)T.EaIp.pxemnld"C,hifludn(cdtaitoan)(data){

https://next-ceteicean-router.vercel.app/simple/

https://github.com/nakamura196/next-ceteicean-router/blob/main/src/app/simple/page.tsx

まとめ

ReactでのTEI/XMLの利用にあたり、参考になりましたら幸いです。