はじめに

IIIF(International Image Interoperability Framework)ビューアとして広く使われているMiradorで、以下の要件を満たす実装を行いました:

  1. URLパラメータで指定したキャンバス(ページ)を初期表示する
  2. 指定したキャンバス内の検索語をハイライト表示する

本記事では、この要件を実現するためのアプローチと実装方法を共有します。

アプローチの検討

defaultSearchQueryオプション

Mirador 4では、ウィンドウ設定に defaultSearchQuery オプションを指定することで、初期化時に自動的に検索を実行できます:

c}o)nw};si]tnmcd,daaemonnfiwivarsfaua:esldsIto[tdSr{I:eVdai:creacwmnheavQrnauise=fIredyMs,:itrU'ardlo,r'.,viewer({

このオプションは検索を自動実行する便利な機能ですが、今回の要件では以下の点を考慮する必要がありました:

  1. ページ遷移の制御 - 検索実行時、最初のヒットのページに自動遷移する仕様のため、canvasId で指定したページに留まりたい場合は追加の制御が必要
  2. 検索完了タイミングの把握 - 非同期で検索が実行されるため、完了後に処理を行いたい場合はRedux状態の監視が必要

より直接的なアプローチ

検討の結果、receiveSearch アクションを直接使用するアプローチを採用しました。このアプローチでは:

  1. Search APIを直接呼び出して、指定キャンバスに該当するヒットのみを取得
  2. IIIF Search API形式のレスポンスを構築
  3. receiveSearch アクションで検索結果としてMiradorに登録

これにより、指定キャンバスの表示を維持しながら、Miradorの検索ハイライト機能をそのまま活用できます。

実装

1. Search APIからヒットを取得する関数

c)}o:;nmcqt}}saauPrtnneryciccc)icccicccf}rccrivroofooo;fooofooooeaoegfaym{nnnn(nnnnnnrci}ttntees:ims(sIsss(sss(sssofucsutsIsat!tItt:!ttt!ttt(nh}rhorStdsenmIsrcs(i)nlneU:t<imamFss{essredrhotrticx;(earr{fanaeeaeeesaeinesdhyhe.[rlsieninSrapraasptsts[s.:awire]c:tnisifievrrcrrpoaostroprhtrr;hrgdtfefaicohcconu:euurs:sorHsi:eserchfShhns=rrsrse:;roitnstsceSieBUsec{eochsf)rtrgsstRthselrare.aesue(orr(si,teRerevslowsiorC{uea{'Fnraes=A=v?ie=kaducarsgFogirspPi:cU=)i=:rencomar,ncpoaImceratcCveueiCghonwaes)l`wrdseaa[rnla;nsasnt$aeratns'ctensseiei=rr={itetrov@e.dvcee.trfiestusaifa=i.rahrove(ntserp.ns=dretsav=kmisAgueafnorgr,='epori)actrrarene;e]sl=scane.r}nrct[sssfcoaf:ewrisa)chc]eocorauceaaefey[hBh;.uhuanretssUiter.=]Sa(jrargvc(cytRtusvi>;essscrcmare'hnrLrtisreeoeseese?xcifnRcAsvUans:snIs.ysneeer.irr()tdocwe(gt[srpclcs]uhha;c]pare}h;t{&ra=rh;oyo[?Ur=&cr'cx(n(f'qr[ies,hyms[si@=l]nrf.wae]eli$);gerihhn.;red{;;sadi:ijv?'eog,)tfsi.]nxumq,sseocicyreu:tsnenwcne'rt(scdhetr,iU))le:.)ynr;usUo,egl?deRsn{r)eaIt.r};ssrCrso[e(coipr]r'hmnl)>vsSpgi;ieeot=carn}(>erve['scin]#{hct':'e(=)).q;[iu[sde]e;r;ryv)i}c`e;s]).find(

この実装では、manifestのserviceプロパティからIIIF Search APIのエンドポイントを動的に取得しています。これにより、任意のIIIF準拠サーバーで動作します。

2. Mirador初期化とハイライト登録

c}i}o)fniw}w}w};ci}Msdi]i,o,(ofit:nimct,naasresncc)i}rddaahdlliknes(oofam'o:nnuolldsaathnnwcss=c}c)c}mcc)i}dimwivmwooepbrissioee>(o;oo)ioo;foris'fab:wwBalchtttnmaarn'''w}r}nwp=ncp;rnnic)mrar:wesnFCacehisdprrReIs@@@i,e)sia>sooacssd(o;idaisIa{ulredQt.MroaccecItcitt'ts''mr}o)tnytnsdottsn's`srod[ntdiloOC:uslewnhhceIodyh@oo@@oe,n,dlRtiom=eswe$earo{dI:llspoee=cIiIJoiFsn'pittuitts'c:aooeaetrpss>atia{adVrodNseenfr=nedodsrvet:enyardyio@hdwacdniVaternrcroi-w:cac:ntaygwi:n:odeSae':plc'pvuta`dIdodtoinaascsdcacrev-avr:rlativWn<Serx`:e:e:earyr$Cd:rA:neitrtheohnhVwi1mniefos&whnesis:seact${'s'tcps{o:dc:woecaCawCvRiee'avgeatle&adStnttarh'{':h:`:iee:cm{<t'enhtor-oaeerw,naanlrP,i>oerdrurrcR:csi$o:'apssis'rW=Cemc1mssweist:suactwaioinicheac'th{n:hnatctoer.io.ph'pIpe=rfIieena0.rnwnknhs'n:ssico:{ivnrornaisnmmcaA,ador'edot,,eng)McgIgng)AphvAc.taa'taiinirgtdiponcn}n.w,s,nrlveih,d,o,Potan:lsn:'c.sontn=chooramitissitPu:at{r:w{IntsnLe.vAsncIngeghtrwanpoisetnUesSa=nuspIoanmancthdW,n,a''eIdianoneodrs,{Iedsne:dtygasn::a}itd,,.doonWnWarolidaoMtk/}aetpIopCr#n:uddrniiirew,t)rr.rn=//trh(dtaosxdnCiVWon=nc..icrioisi',(}ain,yoskosiinddhdMo{haenw{ieo,h/tntwwtnmpenWoro?iinHscgnianisitehropawdiwewqsr:ie,>frLteoin==iwateonIcI=patRi;.ci,annt$nnncrwdded$ad'sevihsr'gA{Mg>ih.Io)i,{tofFceo?tic,'sh.;;o(sdwvecraooS/q'nh,Tianats{enh.rrrea=,d-etdpWdo=[Sc(v-Cdap$erx.doidrieosira<ri{xetxCsnAeOdadeeinsc/e)s'yoidc.b]reawgvthsnu,wmtotgj.cUreharec=lhpiwieechRcrtsiaao>t}ao(otco(Ih('(nsrd-`nn'nStnCA{,mgce($,i:w)t.toca,(hU{{oi;akemtn/Rinsntenpiiu1InWtdeytoofn/Cdiro(snnekcoeniw)(=e)snomxdn-;s=n;tonp}og1t=tUwto`w'a(rnen,},t'sl>xeaese,;tns{.ea.tcarcj((orcassmchnoephQvnaa'ua'rnes,cirIhoydQn),uW}ei`srn,eyda)or}wc`sh,)Q.ufeirnyd)(;

ポイント

1. Miradorのアクション関数へのアクセス

Mirador 4では、アクション関数がグローバルオブジェクトから直接アクセスできます:

cccooonnnssstttMraed=cdeCwioivmnepdSaoenwai.roMcnihWria=nddoMor.wrae=sceMRi.evacedoSdreCdao<rmscpthar;niinogn,Wiunndkonwo;wn>;

Mirador.actions ではなく、Mirador.receiveSearch のように直接アクセスする点に注意してください。

2. IIIF Search API形式のレスポンス

receiveSearch に渡すJSONは、IIIF Search API 1.0の形式に準拠する必要があります:

{}"""]@@rcte{}oysnpo"""}"teu@mr,oe"rtoe""nx:cyts@c"tepioth:""sevuya:s""arpr"c::tces":ie""hA["o"::tnon:tna"""po::{cU:tAnR/an"tI/tns:#iiocCxiot:oyinapnwfLtath.iiie=isonn"xotntt,/""iAya,,ns,pgTwi"ei/,xdstte"ha,,rhcehi/g1h/tc"ontext.json",

3. CompanionWindowの配置

検索パネルの配置は position パラメータで制御できます:

  • left: 左側(メタデータパネルと同じ位置)
  • right: 右側

左側にメタデータ、右側に検索結果という配置が自然です。

結論

receiveSearch アクションを直接呼び出すことで、以下のメリットが得られました:

  1. キャンバス表示の制御 - 指定したキャンバスを初期表示しながらハイライトを追加できる
  2. ハイライトの即時表示 - 検索結果を直接登録するため、ハイライトが即座に表示される
  3. パネル配置の制御 - 検索パネルの位置を自由に設定できる

この方法はMiradorのReduxストアの仕組みを活用しており、柔軟なカスタマイズが可能です。

参考リンク