1 line
9.1 KiB
JavaScript
1 line
9.1 KiB
JavaScript
import{C as e,T as t,_ as n,b as r,g as i,h as a,n as o,v as s,w as c,x as l,y as u}from"./package-Bop5TfAT.js";import{A as d,C as f,D as p,E as m,J as ee,T as h,X as g,_ as te,a as ne,b as _,f as v,g as y,h as b,i as x,o as re,r as S,s as C,t as w,u as T,y as E}from"./runtime-core.esm-bundler-DO-WTVbd.js";var ie=r(`search`,[[`path`,{d:`m21 21-4.34-4.34`,key:`14j7rj`}],[`circle`,{cx:`11`,cy:`11`,r:`8`,key:`4ej97u`}]]),D=(e,t)=>t===`y`?Math.max(0,e.scrollHeight-e.clientHeight):Math.max(0,e.scrollWidth-e.clientWidth),O=(e,t)=>{let n=D(e,t);return n?(t===`y`?e.scrollTop:e.scrollLeft)/n:0},k=(e,t,n)=>{let r=D(e,t),i=Math.max(0,Math.min(r,n*r));t===`y`?e.scrollTop=i:e.scrollLeft=i},ae=(e,t,n)=>{let r=null,i=null,a=0,o=()=>{r?.(),r=null,i=null,a&&=(window.cancelAnimationFrame(a),0)},s=(e,t)=>{i&&i!==e||(i=e,a&&window.cancelAnimationFrame(a),a=window.requestAnimationFrame(()=>{k(t,`y`,O(e,`y`)),k(t,`x`,O(e,`x`)),window.requestAnimationFrame(()=>{i=null})}))},c=async()=>{if(o(),!e.value)return;await b();let a=t(),c=n();if(!a||!c||a===c)return;let l=()=>s(a,c),u=()=>s(c,a);a.addEventListener(`scroll`,l,{passive:!0}),c.addEventListener(`scroll`,u,{passive:!0});let d=typeof ResizeObserver==`function`?new ResizeObserver(()=>{i||s(a,c)}):null;d?.observe(a),d?.observe(c),r=()=>{a.removeEventListener(`scroll`,l),c.removeEventListener(`scroll`,u),d?.disconnect()}};return f(e,()=>{c()}),y(o),{bind:c,destroy:o}},oe={class:`compare-page`},se={class:`compare-header`},ce={class:`brand`,href:`/`,"aria-label":`返回 Flyfish Viewer 主预览`},le=[`src`],ue={class:`header-actions`},de={class:`line-locator`,"aria-label":`行级定位`},fe={class:`sync-toggle`},pe={class:`sync-toggle`},me={key:0,class:`compare-search-popover`,role:`search`,"aria-label":`文档比对搜索`},he={class:`compare-search-side`},ge={class:`compare-search-field`},_e={class:`compare-search-summary`},ve={class:`compare-board`,"aria-label":`文档左右比对`},ye=[`onPointerdown`,`onFocusin`],be={class:`panel-tools`},xe={class:`panel-heading`},Se={class:`tool-grid`},Ce=[`value`,`onChange`],we=[`value`],Te=[`onUpdate:modelValue`,`onInput`],Ee={class:`upload-button`},De=[`accept`,`onChange`],Oe={class:`source-card`},ke={class:`compare-viewer`};l(a(v({__name:`CompareApp`,setup(r){let a=new URLSearchParams(window.location.search),l=[{label:`DOC 旧版合同`,description:`Word 97-2003 示例`,url:`/example/test.doc`},{label:`DOCX 中文长文档`,description:`表格图示与正式页`,url:`/example/word.docx`},{label:`PDF 技术说明`,description:`真实 PDF 页面`,url:`/example/pdf.pdf`},{label:`PPTX 中文课件`,description:`55 页富样式课件`,url:`/example/ppt.pptx`},{label:`Typst 源文件`,description:`Typst 直读渲染`,url:`/example/report.typ`},{label:`Markdown 文档`,description:`轻量文本排版`,url:`/example/markdown.md`}],f=(e,t,n)=>({side:e,title:t,url:a.get(e)||n,file:void 0,filename:``,status:`准备就绪`}),v=m(f(`left`,`左侧文档`,l[0].url)),D=m(f(`right`,`右侧文档`,l[1].url)),O=p(!0),k=p(!0),A=p(!1),j=p(``),M=p(null),N=p(``),P=p(`left`),F=p(null),I=p(null),L=()=>({query:``,total:0,currentIndex:-1,current:null,matches:[]}),R=p(L()),z=p(L()),B=S(()=>P.value===`left`?`左侧文档`:`右侧文档`),V=S(()=>P.value===`left`?R.value:z.value),Ae=S(()=>({toolbar:!1,archive:{cache:!0},pdf:{toolbar:!k.value,defaultNavigationVisible:!1},ai:{enabled:!0,collectText:!0}})),je=`.doc,.docx,.docm,.dot,.dotx,.dotm,.pdf,.ofd,.typ,.typst,.ppt,.pptx,.pptm,.potx,.potm,.ppsx,.ppsm,.xls,.xlsx,.xlsm,.xlsb,.xlt,.xltx,.xltm,.csv,.ods,.md,.markdown,.txt,.html,.htm,.eml,.msg,.epub,.umd,.png,.jpg,.jpeg`.split(`,`).join(`,`),H=S(()=>new Map(l.map(e=>[e.url,e]))),Me=e=>e.file?e.filename||`本地文件`:H.value.get(e.url)?.label||e.url||`未选择`,Ne=e=>e.file?`本地上传`:H.value.get(e.url)?.description||`URL 文件`,U=(e,t)=>{e.url=t,e.file=void 0,e.filename=``,e.status=`等待加载`},Pe=e=>{e.file=void 0,e.filename=``,e.status=e.url?`等待加载`:`未选择文件`},Fe=e=>e.target?.value||``,Ie=(e,t)=>{let n=t.target,r=n.files?.[0];r&&(e.file=r,e.filename=r.name,e.url=``,e.status=`等待加载`,n.value=``)},Le=()=>{let e={url:v.url,file:v.file,filename:v.filename,status:v.status};v.url=D.url,v.file=D.file,v.filename=D.filename,v.status=D.status,D.url=e.url,D.file=e.file,D.filename=e.filename,D.status=e.status},Re=()=>{U(v,l[0].url),U(D,l[1].url)},ze=(e,t)=>{e===`left`?F.value=t:I.value=t},W=e=>(e===`left`?F.value:I.value)?.getScrollContainer?.()||null,{bind:Be}=ae(O,()=>W(`left`),()=>W(`right`)),Ve=S(()=>j.value.trim()?`${B.value} · ${(e=>e.total?`${e.currentIndex+1}/${e.total}`:`0/0`)(V.value)}`:`${B.value} · 0/0`),G=e=>{P.value=e},K=()=>P.value===`left`?F.value:I.value,q=e=>{P.value===`left`?R.value=e:z.value=e},J=async(e=P.value)=>{P.value=e,A.value=!0,await b(),M.value?.focus(),M.value?.select()},Y=async()=>{let e=await K()?.clearDocumentSearch()??L();return q(e),e},X=async()=>{A.value=!1,await Y()},Z=async()=>{let e=j.value.trim();if(!e){await Y();return}q(await K()?.searchDocument(e)??L())},He=async()=>{if(j.value.trim()){if(V.value.query!==j.value.trim()){await Z();return}q(await K()?.nextSearchResult()??V.value)}},Ue=async()=>{if(j.value.trim()){if(V.value.query!==j.value.trim()){await Z();return}q(await K()?.previousSearchResult()??V.value)}},Q=async()=>{let e=Number.parseInt(N.value,10);!Number.isFinite(e)||e<=0||await Promise.all([F.value?.scrollToLine(e),I.value?.scrollToLine(e)])},We=e=>(e===`left`?F.value:I.value)?.getDocumentTextChunks?.().length||0,Ge=e=>{e.status=`加载中`},Ke=(e,t)=>{let n=We(e.side),r=n?` · ${n} 个切片`:``;e.status=`${t.duration?`已完成 ${t.duration}ms`:`已完成`}${r}`,Be(),j.value.trim()&&Z()},qe=e=>{e.status=`已卸载`},$=e=>{let t=e.key.toLowerCase();if((e.metaKey||e.ctrlKey)&&!e.altKey&&t===`f`){if(e.preventDefault(),e.stopPropagation(),A.value){X();return}J();return}e.key===`Escape`&&A.value&&X()};return te(()=>{document.addEventListener(`keydown`,$)}),y(()=>{document.removeEventListener(`keydown`,$)}),(r,a)=>(E(),C(`main`,oe,[x(`header`,se,[x(`a`,ce,[x(`img`,{src:d(i),alt:``},null,8,le),a[4]||=x(`span`,null,[x(`strong`,null,`Flyfish Viewer`),x(`small`,null,`Document Compare`)],-1)]),a[7]||=x(`div`,{class:`compare-title`},[x(`h1`,null,`文档比对`),x(`p`,null,`左右并排预览,支持示例、URL、本地上传、同步滚动、聚焦搜索和行级定位。`)],-1),x(`div`,ue,[x(`div`,de,[h(x(`input`,{"onUpdate:modelValue":a[0]||=e=>N.value=e,type:`number`,min:`1`,placeholder:`行号`,onKeyup:t(Q,[`enter`])},null,544),[[c,N.value,void 0,{trim:!0}]]),x(`button`,{type:`button`,onClick:Q},`定位`)]),x(`label`,fe,[h(x(`input`,{"onUpdate:modelValue":a[1]||=e=>O.value=e,type:`checkbox`},null,512),[[e,O.value]]),a[5]||=x(`span`,null,`同步滚动`,-1)]),x(`label`,pe,[h(x(`input`,{"onUpdate:modelValue":a[2]||=e=>k.value=e,type:`checkbox`},null,512),[[e,k.value]]),a[6]||=x(`span`,null,`隐藏 PDF 工具栏`,-1)]),x(`button`,{type:`button`,onClick:Le},`交换`),x(`button`,{type:`button`,onClick:Re},`重置`)])]),A.value?(E(),C(`div`,me,[x(`span`,he,g(B.value),1),x(`label`,ge,[T(d(ie),{class:`compare-search-field-icon`,"aria-hidden":`true`}),h(x(`input`,{ref_key:`compareSearchInputRef`,ref:M,"onUpdate:modelValue":a[3]||=e=>j.value=e,type:`search`,placeholder:`搜索当前文档`,onKeyup:t(Z,[`enter`])},null,544),[[c,j.value,void 0,{trim:!0}]])]),x(`span`,_e,g(Ve.value),1),x(`button`,{type:`button`,title:`上一个搜索结果`,"aria-label":`上一个搜索结果`,onClick:Ue},[T(d(s),{class:`compare-search-icon`,"aria-hidden":`true`})]),x(`button`,{type:`button`,title:`下一个搜索结果`,"aria-label":`下一个搜索结果`,onClick:He},[T(d(u),{class:`compare-search-icon`,"aria-hidden":`true`})]),x(`button`,{type:`button`,title:`关闭搜索`,"aria-label":`关闭搜索`,onClick:X},[T(d(n),{class:`compare-search-icon`,"aria-hidden":`true`})])])):re(``,!0),x(`section`,ve,[(E(!0),C(w,null,_([v,D],e=>(E(),C(`article`,{key:e.side,class:ee([`compare-panel`,{"compare-panel--active":P.value===e.side}]),tabindex:`0`,onPointerdown:t=>G(e.side),onFocusin:t=>G(e.side)},[x(`div`,be,[x(`div`,xe,[a[8]||=x(`span`,{class:`status-dot`},null,-1),x(`div`,null,[x(`h2`,null,g(e.title),1),x(`p`,null,g(e.status),1)])]),x(`div`,Se,[x(`label`,null,[a[9]||=x(`span`,null,`示例`,-1),x(`select`,{value:e.url,onChange:t=>U(e,Fe(t))},[(E(),C(w,null,_(l,e=>x(`option`,{key:e.url,value:e.url},g(e.label),9,we)),64))],40,Ce)]),x(`label`,null,[a[10]||=x(`span`,null,`URL`,-1),h(x(`input`,{"onUpdate:modelValue":t=>e.url=t,type:`text`,placeholder:`/example/word.docx`,onInput:t=>Pe(e)},null,40,Te),[[c,e.url,void 0,{trim:!0}]])]),x(`label`,Ee,[x(`input`,{type:`file`,accept:d(je),onChange:t=>Ie(e,t)},null,40,De),a[11]||=x(`span`,null,`上传文件`,-1)])])]),x(`div`,Oe,[x(`strong`,null,g(Me(e)),1),x(`span`,null,g(Ne(e)),1)]),x(`div`,ke,[(E(),ne(d(o),{key:`${e.side}-${e.file?e.filename:e.url}-${k.value?`compact`:`full`}`,ref_for:!0,ref:t=>ze(e.side,t),url:e.file?void 0:e.url,file:e.file,options:Ae.value,onLoadStart:t=>Ge(e),onLoadComplete:t=>Ke(e,t),onUnloadComplete:t=>qe(e)},null,8,[`url`,`file`,`options`,`onLoadStart`,`onLoadComplete`,`onUnloadComplete`]))])],42,ye))),128))])]))}}),[[`__scopeId`,`data-v-14b1a2c4`]])).mount(`#compare-app`); |