@manifest-editor/ocr-classification 2.0.3-next.0.3782be7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,59 @@
1
+ async function ortWasmThreaded(moduleArg={}){var moduleRtn;var h=moduleArg,aa=!!globalThis.window,k=!!globalThis.WorkerGlobalScope,m=globalThis.process?.versions?.node&&"renderer"!=globalThis.process?.type,n=k&&self.name?.startsWith("em-pthread");if(m){const {createRequire:a}=await import("module");var require=a(import.meta.url),ba=require("worker_threads");global.Worker=ba.Worker;n=(k=!ba.ic)&&"em-pthread"==ba.workerData}h.mountExternalData=(a,b)=>{a.startsWith("./")&&(a=a.substring(2));(h.Sb||(h.Sb=new Map)).set(a,b)};
2
+ h.unmountExternalData=()=>{delete h.Sb};var SharedArrayBuffer=globalThis.SharedArrayBuffer??(new WebAssembly.Memory({initial:0,maximum:0,kc:!0})).buffer.constructor,ca="./this.program",da=(a,b)=>{throw b;},ea=import.meta.url,fa="",ha,ia;
3
+ if(m){var fs=require("fs");ea.startsWith("file:")&&(fa=require("path").dirname(require("url").fileURLToPath(ea))+"/");ia=a=>{a=ja(a)?new URL(a):a;return fs.readFileSync(a)};ha=async a=>{a=ja(a)?new URL(a):a;return fs.readFileSync(a,void 0)};1<process.argv.length&&(ca=process.argv[1].replace(/\\/g,"/"));process.argv.slice(2);da=(a,b)=>{process.exitCode=a;throw b;}}else if(aa||k){try{fa=(new URL(".",ea)).href}catch{}m||(k&&(ia=a=>{var b=new XMLHttpRequest;b.open("GET",a,!1);b.responseType="arraybuffer";
4
+ b.send(null);return new Uint8Array(b.response)}),ha=async a=>{if(ja(a))return new Promise((d,c)=>{var e=new XMLHttpRequest;e.open("GET",a,!0);e.responseType="arraybuffer";e.onload=()=>{200==e.status||0==e.status&&e.response?d(e.response):c(e.status)};e.onerror=c;e.send(null)});var b=await fetch(a,{credentials:"same-origin"});if(b.ok)return b.arrayBuffer();throw Error(b.status+" : "+b.url);})}var ka=console.log.bind(console),la=console.error.bind(console);
5
+ if(m){var ma=require("util"),na=a=>"object"==typeof a?ma.inspect(a):a;ka=(...a)=>fs.writeSync(1,a.map(na).join(" ")+"\n");la=(...a)=>fs.writeSync(2,a.map(na).join(" ")+"\n")}var oa=ka,p=la,q,r,pa=!1,t,ja=a=>a.startsWith("file://");function v(){x.buffer!=z.buffer&&qa()}var ra,sa;
6
+ if(m&&n){var ta=ba.parentPort;ta.on("message",a=>global.onmessage?.({data:a}));Object.assign(globalThis,{self:global,postMessage:a=>ta.postMessage(a)});process.on("uncaughtException",a=>{postMessage({Qb:"uncaughtException",error:a});process.exit(1)})}var ua;
7
+ if(n){var va=!1;self.onunhandledrejection=b=>{throw b.reason||b;};function a(b){try{var d=b.data,c=d.Qb;if("load"===c){let e=[];self.onmessage=f=>e.push(f);ua=()=>{postMessage({Qb:"loaded"});for(let f of e)a(f);self.onmessage=a};for(const f of d.$b)if(!h[f]||h[f].proxy)h[f]=(...g)=>{postMessage({Qb:"callHandler",Zb:f,args:g})},"print"==f&&(oa=h[f]),"printErr"==f&&(p=h[f]);x=d.ec;qa();r=d.fc;wa();xa()}else if("run"===c){ya(d.Pb);za(d.Pb,0,0,1,0,0);Aa();Ba(d.Pb);va||=!0;try{Ca(d.cc,d.Ub)}catch(e){if("unwind"!=
8
+ e)throw e;}}else"setimmediate"!==d.target&&("checkMailbox"===c?va&&Da():c&&(p(`worker: received unknown command ${c}`),p(d)))}catch(e){throw Ea(),e;}}self.onmessage=a}var z,A,Fa,C,D,Ga,G,H,Ha=!1;function qa(){var a=x.buffer;h.HEAP8=z=new Int8Array(a);Fa=new Int16Array(a);h.HEAPU8=A=new Uint8Array(a);new Uint16Array(a);h.HEAP32=C=new Int32Array(a);h.HEAPU32=D=new Uint32Array(a);Ga=new Float32Array(a);G=new Float64Array(a);H=new BigInt64Array(a);new BigUint64Array(a)}
9
+ function Ia(){Ha=!0;n?ua():I.Ua()}function J(a){a="Aborted("+a+")";p(a);pa=!0;a=new WebAssembly.RuntimeError(a+". Build with -sASSERTIONS for more info.");sa?.(a);throw a;}var Ja;async function Ka(a){if(!q)try{var b=await ha(a);return new Uint8Array(b)}catch{}if(a==Ja&&q)a=new Uint8Array(q);else if(ia)a=ia(a);else throw"both async and sync fetching of the wasm failed";return a}
10
+ async function La(a,b){try{var d=await Ka(a);return await WebAssembly.instantiate(d,b)}catch(c){p(`failed to asynchronously prepare wasm: ${c}`),J(c)}}async function Na(a){var b=Ja;if(!q&&!ja(b)&&!m)try{var d=fetch(b,{credentials:"same-origin"});return await WebAssembly.instantiateStreaming(d,a)}catch(c){p(`wasm streaming compile failed: ${c}`),p("falling back to ArrayBuffer instantiation")}return La(b,a)}
11
+ function Oa(){Pa={S:Qa,f:Ra,w:Sa,e:Ta,j:Ua,g:Va,T:Wa,b:Xa,G:Ya,ua:Za,k:$a,K:ab,Ka:bb,qa:cb,sa:db,La:eb,Ia:fb,Ba:gb,Ha:hb,Z:ib,ra:jb,oa:kb,Ja:lb,pa:mb,Qa:nb,Ea:ob,ma:pb,va:qb,ja:rb,U:sb,Da:Ba,Na:tb,ya:ub,za:vb,Aa:wb,wa:xb,xa:yb,ka:zb,Sa:Ab,Pa:Bb,W:Cb,V:Db,Oa:Eb,F:Fb,Ma:Gb,na:Hb,u:Ib,H:Jb,R:Kb,la:Lb,da:Mb,Ta:Nb,Fa:Ob,Ga:Pb,ta:Qb,L:Rb,Y:Sb,Ca:Tb,X:Ub,$:Vb,M:Wb,aa:Xb,N:Yb,v:Zb,c:$b,m:ac,n:bc,r:cc,ea:dc,x:ec,o:fc,O:gc,D:hc,I:ic,ba:jc,ca:kc,Q:lc,P:mc,fa:nc,z:oc,E:pc,d:qc,q:rc,i:sc,_:tc,l:uc,p:vc,s:wc,t:xc,
12
+ y:yc,ga:zc,B:Ac,J:Bc,C:Cc,ha:Dc,ia:Ec,A:Fc,h:Gc,a:x,Ra:Hc};return{a:Pa}}
13
+ async function wa(){function a(c,e){I=c.exports;I=Ic();Jc.push(I.wb);c=I;h._OrtInit=c.Va;h._OrtGetLastError=c.Wa;h._OrtCreateSessionOptions=c.Xa;h._OrtAppendExecutionProvider=c.Ya;h._OrtAddFreeDimensionOverride=c.Za;h._OrtAddSessionConfigEntry=c._a;h._OrtReleaseSessionOptions=c.$a;h._OrtCreateSession=c.ab;h._OrtReleaseSession=c.bb;h._OrtGetInputOutputCount=c.cb;h._OrtGetInputOutputMetadata=c.db;h._OrtFree=c.eb;h._OrtCreateTensor=c.fb;h._OrtGetTensorData=c.gb;h._OrtReleaseTensor=c.hb;h._OrtCreateRunOptions=
14
+ c.ib;h._OrtAddRunConfigEntry=c.jb;h._OrtReleaseRunOptions=c.kb;h._OrtCreateBinding=c.lb;h._OrtBindInput=c.mb;h._OrtBindOutput=c.nb;h._OrtClearBoundOutputs=c.ob;h._OrtReleaseBinding=c.pb;h._OrtRunWithBinding=c.qb;h._OrtRun=c.rb;h._OrtEndProfiling=c.sb;Kc=c.tb;Lc=h._free=c.ub;Mc=h._malloc=c.vb;za=c.yb;Ea=c.zb;Nc=c.Ab;Oc=c.Bb;Pc=c.Cb;Qc=c.Db;Rc=c.Eb;K=c.Fb;L=c.Gb;Sc=c.Hb;M=c.Ib;Tc=c.Jb;N=c.Kb;Uc=c.Lb;Vc=c.Mb;Wc=c.Nb;Xc=c.Ob;Yc=c.xb;r=e;return I}var b=Oa();if(h.instantiateWasm)return new Promise(c=>{h.instantiateWasm(b,
15
+ (e,f)=>{c(a(e,f))})});if(n){var d=new WebAssembly.Instance(r,Oa());return a(d,r)}Ja??=h.locateFile?h.locateFile?h.locateFile("ort-wasm-simd-threaded.wasm",fa):fa+"ort-wasm-simd-threaded.wasm":(new URL("ort-wasm-simd-threaded.wasm",import.meta.url)).href;return function(c){return a(c.instance,c.module)}(await Na(b))}class Zc{name="ExitStatus";constructor(a){this.message=`Program terminated with exit(${a})`;this.status=a}}
16
+ var $c=a=>{a.terminate();a.onmessage=()=>{}},ad=[],O=0,P=null,dd=a=>{0==Q.length&&(bd(),cd(Q[0]));var b=Q.pop();if(!b)return 6;R.push(b);S[a.Pb]=b;b.Pb=a.Pb;var d={Qb:"run",cc:a.bc,Ub:a.Ub,Pb:a.Pb};m&&b.unref();b.postMessage(d,a.Yb);return 0},T=0,U=(a,b,...d)=>{var c=16*d.length,e=N(),f=Tc(c),g=f>>>3,l;for(l of d)"bigint"==typeof l?((v(),H)[g++>>>0]=1n,(v(),H)[g++>>>0]=l):((v(),H)[g++>>>0]=0n,(v(),G)[g++>>>0]=l);a=Nc(a,0,c,f,b);M(e);return a};
17
+ function Hc(a){if(n)return U(0,1,a);t=a;if(!(0<T)){for(var b of R)$c(b);for(b of Q)$c(b);Q=[];R=[];S={};pa=!0}da(a,new Zc(a))}function ed(a){if(n)return U(1,0,a);Qb(a)}var Qb=a=>{t=a;if(n)throw ed(a),"unwind";Hc(a)},Q=[],R=[],Jc=[],S={};function fd(){for(var a=h.numThreads-1;a--;)bd();ad.push(async()=>{var b=gd();O++;await b;O--;0==O&&P&&(b=P,P=null,b())})}var hd=a=>{var b=a.Pb;delete S[b];Q.push(a);R.splice(R.indexOf(a),1);a.Pb=0;Oc(b)};function Aa(){Jc.forEach(a=>a())}
18
+ var cd=a=>new Promise(b=>{a.onmessage=f=>{var g=f.data;f=g.Qb;if(g.Tb&&g.Tb!=Kc()){var l=S[g.Tb];l?l.postMessage(g,g.Yb):p(`Internal error! Worker sent a message "${f}" to target pthread ${g.Tb}, but that thread no longer exists!`)}else if("checkMailbox"===f)Da();else if("spawnThread"===f)dd(g);else if("cleanupThread"===f)jd(()=>{hd(S[g.dc])});else if("loaded"===f)a.loaded=!0,m&&!a.Pb&&a.unref(),b(a);else if("setimmediate"===g.target)a.postMessage(g);else if("uncaughtException"===f)a.onerror(g.error);
19
+ else if("callHandler"===f)h[g.Zb](...g.args);else f&&p(`worker sent an unknown command ${f}`)};a.onerror=f=>{p(`${"worker sent an error!"} ${f.filename}:${f.lineno}: ${f.message}`);throw f;};m&&(a.on("message",f=>a.onmessage({data:f})),a.on("error",f=>a.onerror(f)));var d=[],c=[],e;for(e of c)h.propertyIsEnumerable(e)&&d.push(e);a.postMessage({Qb:"load",$b:d,ec:x,fc:r})});async function gd(){if(!n)return Promise.all(Q.map(cd))}
20
+ function bd(){var a=new Worker(new URL(import.meta.url),{type:"module",workerData:"em-pthread",name:"em-pthread"});Q.push(a)}function ya(a){var b=(v(),D)[a+52>>>2>>>0];a=(v(),D)[a+56>>>2>>>0];Sc(b,b-a);M(b)}var kd=[],V=a=>{var b=kd[a];b||(kd[a]=b=Yc.get(a));return b},Ca=(a,b)=>{T=0;a=V(a)(b);0<T?t=a:Pc(a)},x,ld=[],md=0;function Ra(a){a>>>=0;var b=new nd(a);0==(v(),z)[b.Rb+12>>>0]&&(od(b,!0),md--);pd(b,!1);ld.push(b);return Xc(a)}
21
+ var W=0,Sa=()=>{K(0,0);var a=ld.pop();Uc(a.Vb);W=0};function od(a,b){b=b?1:0;(v(),z)[a.Rb+12>>>0]=b}function pd(a,b){b=b?1:0;(v(),z)[a.Rb+13>>>0]=b}class nd{constructor(a){this.Vb=a;this.Rb=a-24}}var qd=a=>{var b=W;if(!b)return L(0),0;var d=new nd(b);(v(),D)[d.Rb+16>>>2>>>0]=b;var c=(v(),D)[d.Rb+4>>>2>>>0];if(!c)return L(0),b;for(var e of a){if(0===e||e===c)break;if(Wc(e,c,d.Rb+16))return L(e),b}L(c);return b};function Ta(){return qd([])}function Ua(a){return qd([a>>>0])}
22
+ function Va(a,b,d,c){return qd([a>>>0,b>>>0,d>>>0,c>>>0])}var Wa=()=>{var a=ld.pop();a||J("no exception to throw");var b=a.Vb;0==(v(),z)[a.Rb+13>>>0]&&(ld.push(a),pd(a,!0),od(a,!1),md++);Vc(b);W=b;throw W;};function Xa(a,b,d){a>>>=0;var c=new nd(a);b>>>=0;d>>>=0;(v(),D)[c.Rb+16>>>2>>>0]=0;(v(),D)[c.Rb+4>>>2>>>0]=b;(v(),D)[c.Rb+8>>>2>>>0]=d;Vc(a);W=a;md++;throw W;}var Ya=()=>md;function rd(a,b,d,c){return n?U(2,1,a,b,d,c):Za(a,b,d,c)}
23
+ function Za(a,b,d,c){a>>>=0;b>>>=0;d>>>=0;c>>>=0;if(!globalThis.SharedArrayBuffer)return 6;var e=[];if(n&&0===e.length)return rd(a,b,d,c);a={bc:d,Pb:a,Ub:c,Yb:e};return n?(a.Qb="spawnThread",postMessage(a,e),0):dd(a)}function $a(a){W||=a>>>0;throw W;}
24
+ var sd=globalThis.TextDecoder&&new TextDecoder,td=(a,b=0,d,c)=>{b>>>=0;var e=b;d=e+d;if(c)c=d;else{for(;a[e]&&!(e>=d);)++e;c=e}if(16<c-b&&a.buffer&&sd)return sd.decode(a.buffer instanceof ArrayBuffer?a.subarray(b,c):a.slice(b,c));for(e="";b<c;)if(d=a[b++],d&128){var f=a[b++]&63;if(192==(d&224))e+=String.fromCharCode((d&31)<<6|f);else{var g=a[b++]&63;d=224==(d&240)?(d&15)<<12|f<<6|g:(d&7)<<18|f<<12|g<<6|a[b++]&63;65536>d?e+=String.fromCharCode(d):(d-=65536,e+=String.fromCharCode(55296|d>>10,56320|
25
+ d&1023))}}else e+=String.fromCharCode(d);return e},ud=(a,b,d)=>(a>>>=0)?td((v(),A),a,b,d):"";function ab(a,b,d){return n?U(3,1,a,b,d):0}function bb(a,b){if(n)return U(4,1,a,b)}function cb(a,b){if(n)return U(5,1,a,b)}function db(a,b,d){if(n)return U(6,1,a,b,d)}function eb(a,b,d){return n?U(7,1,a,b,d):0}function fb(a,b){if(n)return U(8,1,a,b)}function gb(a,b,d){if(n)return U(9,1,a,b,d)}function hb(a,b,d,c){if(n)return U(10,1,a,b,d,c)}function ib(a,b,d,c){if(n)return U(11,1,a,b,d,c)}
26
+ function jb(a,b,d,c){if(n)return U(12,1,a,b,d,c)}function kb(a){if(n)return U(13,1,a)}function lb(a,b){if(n)return U(14,1,a,b)}function mb(a,b,d){if(n)return U(15,1,a,b,d)}var nb=()=>J("");function ob(a){za(a>>>0,!k,1,!aa,131072,!1);Aa()}
27
+ var jd=a=>{if(!pa)try{if(a(),!(0<T))try{n?Kc()&&Pc(t):Qb(t)}catch(b){b instanceof Zc||"unwind"==b||da(1,b)}}catch(b){b instanceof Zc||"unwind"==b||da(1,b)}},vd=!Atomics.waitAsync||globalThis.navigator?.userAgent&&91>Number((navigator.userAgent.match(/Chrom(e|ium)\/([0-9]+)\./)||[])[2]);function Ba(a){a>>>=0;vd||(Atomics.waitAsync((v(),C),a>>>2,a).value.then(Da),a+=128,Atomics.store((v(),C),a>>>2,1))}var Da=()=>jd(()=>{var a=Kc();a&&(Ba(a),Rc())});
28
+ function pb(a,b){a>>>=0;a==b>>>0?setTimeout(Da):n?postMessage({Tb:a,Qb:"checkMailbox"}):(a=S[a])&&a.postMessage({Qb:"checkMailbox"})}var wd=[];function qb(a,b,d,c,e){b>>>=0;e>>>=0;wd.length=0;d=e>>>3;for(c=e+c>>>3;d<c;){var f;(v(),H)[d++>>>0]?f=(v(),H)[d++>>>0]:f=(v(),G)[d++>>>0];wd.push(f)}return(b?xd[b]:yd[a])(...wd)}var rb=()=>{T=0};function sb(a){a>>>=0;n?postMessage({Qb:"cleanupThread",dc:a}):hd(S[a])}function tb(a){m&&S[a>>>0].ref()}
29
+ function ub(a,b){a=-9007199254740992>a||9007199254740992<a?NaN:Number(a);b>>>=0;a=new Date(1E3*a);(v(),C)[b>>>2>>>0]=a.getUTCSeconds();(v(),C)[b+4>>>2>>>0]=a.getUTCMinutes();(v(),C)[b+8>>>2>>>0]=a.getUTCHours();(v(),C)[b+12>>>2>>>0]=a.getUTCDate();(v(),C)[b+16>>>2>>>0]=a.getUTCMonth();(v(),C)[b+20>>>2>>>0]=a.getUTCFullYear()-1900;(v(),C)[b+24>>>2>>>0]=a.getUTCDay();a=(a.getTime()-Date.UTC(a.getUTCFullYear(),0,1,0,0,0,0))/864E5|0;(v(),C)[b+28>>>2>>>0]=a}
30
+ var zd=a=>0===a%4&&(0!==a%100||0===a%400),Ad=[0,31,60,91,121,152,182,213,244,274,305,335],Bd=[0,31,59,90,120,151,181,212,243,273,304,334];
31
+ function vb(a,b){a=-9007199254740992>a||9007199254740992<a?NaN:Number(a);b>>>=0;a=new Date(1E3*a);(v(),C)[b>>>2>>>0]=a.getSeconds();(v(),C)[b+4>>>2>>>0]=a.getMinutes();(v(),C)[b+8>>>2>>>0]=a.getHours();(v(),C)[b+12>>>2>>>0]=a.getDate();(v(),C)[b+16>>>2>>>0]=a.getMonth();(v(),C)[b+20>>>2>>>0]=a.getFullYear()-1900;(v(),C)[b+24>>>2>>>0]=a.getDay();var d=(zd(a.getFullYear())?Ad:Bd)[a.getMonth()]+a.getDate()-1|0;(v(),C)[b+28>>>2>>>0]=d;(v(),C)[b+36>>>2>>>0]=-(60*a.getTimezoneOffset());d=(new Date(a.getFullYear(),
32
+ 6,1)).getTimezoneOffset();var c=(new Date(a.getFullYear(),0,1)).getTimezoneOffset();a=(d!=c&&a.getTimezoneOffset()==Math.min(c,d))|0;(v(),C)[b+32>>>2>>>0]=a}
33
+ function wb(a){a>>>=0;var b=new Date((v(),C)[a+20>>>2>>>0]+1900,(v(),C)[a+16>>>2>>>0],(v(),C)[a+12>>>2>>>0],(v(),C)[a+8>>>2>>>0],(v(),C)[a+4>>>2>>>0],(v(),C)[a>>>2>>>0],0),d=(v(),C)[a+32>>>2>>>0],c=b.getTimezoneOffset(),e=(new Date(b.getFullYear(),6,1)).getTimezoneOffset(),f=(new Date(b.getFullYear(),0,1)).getTimezoneOffset(),g=Math.min(f,e);0>d?(v(),C)[a+32>>>2>>>0]=Number(e!=f&&g==c):0<d!=(g==c)&&(e=Math.max(f,e),b.setTime(b.getTime()+6E4*((0<d?g:e)-c)));(v(),C)[a+24>>>2>>>0]=b.getDay();d=(zd(b.getFullYear())?
34
+ Ad:Bd)[b.getMonth()]+b.getDate()-1|0;(v(),C)[a+28>>>2>>>0]=d;(v(),C)[a>>>2>>>0]=b.getSeconds();(v(),C)[a+4>>>2>>>0]=b.getMinutes();(v(),C)[a+8>>>2>>>0]=b.getHours();(v(),C)[a+12>>>2>>>0]=b.getDate();(v(),C)[a+16>>>2>>>0]=b.getMonth();(v(),C)[a+20>>>2>>>0]=b.getYear();a=b.getTime();return BigInt(isNaN(a)?-1:a/1E3)}function xb(a,b,d,c,e,f,g){return n?U(16,1,a,b,d,c,e,f,g):-52}function yb(a,b,d,c,e,f){if(n)return U(17,1,a,b,d,c,e,f)}var X={},Ib=()=>performance.timeOrigin+performance.now();
35
+ function zb(a,b){if(n)return U(18,1,a,b);X[a]&&(clearTimeout(X[a].id),delete X[a]);if(!b)return 0;var d=setTimeout(()=>{delete X[a];jd(()=>Qc(a,performance.timeOrigin+performance.now()))},b);X[a]={id:d,lc:b};return 0}
36
+ var Y=(a,b,d)=>{var c=(v(),A);b>>>=0;if(0<d){var e=b;d=b+d-1;for(var f=0;f<a.length;++f){var g=a.codePointAt(f);if(127>=g){if(b>=d)break;c[b++>>>0]=g}else if(2047>=g){if(b+1>=d)break;c[b++>>>0]=192|g>>6;c[b++>>>0]=128|g&63}else if(65535>=g){if(b+2>=d)break;c[b++>>>0]=224|g>>12;c[b++>>>0]=128|g>>6&63;c[b++>>>0]=128|g&63}else{if(b+3>=d)break;c[b++>>>0]=240|g>>18;c[b++>>>0]=128|g>>12&63;c[b++>>>0]=128|g>>6&63;c[b++>>>0]=128|g&63;f++}}c[b>>>0]=0;a=b-e}else a=0;return a};
37
+ function Ab(a,b,d,c){a>>>=0;b>>>=0;d>>>=0;c>>>=0;var e=(new Date).getFullYear(),f=(new Date(e,0,1)).getTimezoneOffset();e=(new Date(e,6,1)).getTimezoneOffset();var g=Math.max(f,e);(v(),D)[a>>>2>>>0]=60*g;(v(),C)[b>>>2>>>0]=Number(f!=e);b=l=>{var u=Math.abs(l);return`UTC${0<=l?"-":"+"}${String(Math.floor(u/60)).padStart(2,"0")}${String(u%60).padStart(2,"0")}`};a=b(f);b=b(e);e<f?(Y(a,d,17),Y(b,c,17)):(Y(a,c,17),Y(b,d,17))}var Eb=()=>Date.now(),Cd=1;
38
+ function Bb(a,b,d){d>>>=0;if(!(0<=a&&3>=a))return 28;if(0===a)a=Date.now();else if(Cd)a=performance.timeOrigin+performance.now();else return 52;a=Math.round(1E6*a);(v(),H)[d>>>3>>>0]=BigInt(a);return 0}var Dd=[];function Cb(a,b,d){a>>>=0;b>>>=0;d>>>=0;Dd.length=0;for(var c;c=(v(),A)[b++>>>0];){var e=105!=c;e&=112!=c;d+=e&&d%8?4:0;Dd.push(112==c?(v(),D)[d>>>2>>>0]:106==c?(v(),H)[d>>>3>>>0]:105==c?(v(),C)[d>>>2>>>0]:(v(),G)[d>>>3>>>0]);d+=e?8:4}return xd[a](...Dd)}var Db=()=>{};
39
+ function Fb(a,b){return p(ud(a>>>0,b>>>0))}var Gb=()=>{T+=1;throw"unwind";};function Hb(){return 4294901760}var Jb=()=>m?require("os").cpus().length:navigator.hardwareConcurrency,Z={},Ed=a=>{for(var b=0,d=0;d<a.length;++d){var c=a.charCodeAt(d);127>=c?b++:2047>=c?b+=2:55296<=c&&57343>=c?(b+=4,++d):b+=3}return b},Fd=a=>{var b;return(b=/\bwasm-function\[\d+\]:(0x[0-9a-f]+)/.exec(a))?+b[1]:(b=/:(\d+):\d+(?:\)|$)/.exec(a))?2147483648|+b[1]:0},Gd=a=>{for(var b of a)(a=Fd(b))&&(Z[a]=b)};
40
+ function Mb(){var a=Error().stack.toString().split("\n");"Error"==a[0]&&a.shift();Gd(a);Z.Wb=Fd(a[3]);Z.ac=a;return Z.Wb}function Kb(a){a=Z[a>>>0];if(!a)return 0;var b;if(b=/^\s+at .*\.wasm\.(.*) \(.*\)$/.exec(a))a=b[1];else if(b=/^\s+at (.*) \(.*\)$/.exec(a))a=b[1];else if(b=/^(.+?)@/.exec(a))a=b[1];else return 0;Lc(Kb.Xb??0);b=Ed(a)+1;var d=Mc(b);d&&Y(a,d,b);Kb.Xb=d;return Kb.Xb}
41
+ function Lb(a){a>>>=0;var b=(v(),A).length;if(a<=b||4294901760<a)return!1;for(var d=1;4>=d;d*=2){var c=b*(1+.2/d);c=Math.min(c,a+100663296);a:{c=(Math.min(4294901760,65536*Math.ceil(Math.max(a,c)/65536))-x.buffer.byteLength+65535)/65536|0;try{x.grow(c);qa();var e=1;break a}catch(f){}e=void 0}if(e)return!0}return!1}
42
+ function Nb(a,b,d){a>>>=0;b>>>=0;if(Z.Wb==a)var c=Z.ac;else c=Error().stack.toString().split("\n"),"Error"==c[0]&&c.shift(),Gd(c);for(var e=3;c[e]&&Fd(c[e])!=a;)++e;for(a=0;a<d&&c[a+e];++a)(v(),C)[b+4*a>>>2>>>0]=Fd(c[a+e]);return a}
43
+ var Hd={},Jd=()=>{if(!Id){var a={USER:"web_user",LOGNAME:"web_user",PATH:"/",PWD:"/",HOME:"/home/web_user",LANG:(globalThis.navigator?.language??"C").replace("-","_")+".UTF-8",_:ca||"./this.program"},b;for(b in Hd)void 0===Hd[b]?delete a[b]:a[b]=Hd[b];var d=[];for(b in a)d.push(`${b}=${a[b]}`);Id=d}return Id},Id;function Ob(a,b){if(n)return U(19,1,a,b);a>>>=0;b>>>=0;var d=0,c=0,e;for(e of Jd()){var f=b+d;(v(),D)[a+c>>>2>>>0]=f;d+=Y(e,f,Infinity)+1;c+=4}return 0}
44
+ function Pb(a,b){if(n)return U(20,1,a,b);a>>>=0;b>>>=0;var d=Jd();(v(),D)[a>>>2>>>0]=d.length;a=0;for(var c of d)a+=Ed(c)+1;(v(),D)[b>>>2>>>0]=a;return 0}function Rb(a){return n?U(21,1,a):52}function Sb(a,b,d,c){return n?U(22,1,a,b,d,c):52}function Tb(a,b,d,c){return n?U(23,1,a,b,d,c):70}var Kd=[null,[],[]];
45
+ function Ub(a,b,d,c){if(n)return U(24,1,a,b,d,c);b>>>=0;d>>>=0;c>>>=0;for(var e=0,f=0;f<d;f++){var g=(v(),D)[b>>>2>>>0],l=(v(),D)[b+4>>>2>>>0];b+=8;for(var u=0;u<l;u++){var w=a,y=(v(),A)[g+u>>>0],B=Kd[w];0===y||10===y?((1===w?oa:p)(td(B)),B.length=0):B.push(y)}e+=l}(v(),D)[c>>>2>>>0]=e;return 0}function Gc(a){return a>>>0}n||fd();n||(x=new WebAssembly.Memory({initial:256,maximum:65536,shared:!0}),qa());h.wasmBinary&&(q=h.wasmBinary);h.stackSave=()=>N();h.stackRestore=a=>M(a);h.stackAlloc=a=>Tc(a);
46
+ h.setValue=function(a,b,d="i8"){d.endsWith("*")&&(d="*");switch(d){case "i1":(v(),z)[a>>>0]=b;break;case "i8":(v(),z)[a>>>0]=b;break;case "i16":(v(),Fa)[a>>>1>>>0]=b;break;case "i32":(v(),C)[a>>>2>>>0]=b;break;case "i64":(v(),H)[a>>>3>>>0]=BigInt(b);break;case "float":(v(),Ga)[a>>>2>>>0]=b;break;case "double":(v(),G)[a>>>3>>>0]=b;break;case "*":(v(),D)[a>>>2>>>0]=b;break;default:J(`invalid type for setValue: ${d}`)}};
47
+ h.getValue=function(a,b="i8"){b.endsWith("*")&&(b="*");switch(b){case "i1":return(v(),z)[a>>>0];case "i8":return(v(),z)[a>>>0];case "i16":return(v(),Fa)[a>>>1>>>0];case "i32":return(v(),C)[a>>>2>>>0];case "i64":return(v(),H)[a>>>3>>>0];case "float":return(v(),Ga)[a>>>2>>>0];case "double":return(v(),G)[a>>>3>>>0];case "*":return(v(),D)[a>>>2>>>0];default:J(`invalid type for getValue: ${b}`)}};h.UTF8ToString=ud;h.stringToUTF8=Y;h.lengthBytesUTF8=Ed;
48
+ var yd=[Hc,ed,rd,ab,bb,cb,db,eb,fb,gb,hb,ib,jb,kb,lb,mb,xb,yb,zb,Ob,Pb,Rb,Sb,Tb,Ub],xd={887900:(a,b,d,c,e)=>{if("undefined"==typeof h||!h.Sb)return 1;a=ud(Number(a>>>0));a.startsWith("./")&&(a=a.substring(2));a=h.Sb.get(a);if(!a)return 2;b=Number(b>>>0);d=Number(d>>>0);c=Number(c>>>0);if(b+d>a.byteLength)return 3;try{const f=a.subarray(b,b+d);switch(e){case 0:(v(),A).set(f,c>>>0);break;case 1:h.hc?h.hc(c,f):h.jc(c,f);break;default:return 4}return 0}catch{return 4}},888724:()=>"undefined"!==typeof wasmOffsetConverter};
49
+ function Qa(){return"undefined"!==typeof wasmOffsetConverter}var Kc,Lc,Mc,za,Ea,Nc,Oc,Pc,Qc,Rc,K,L,Sc,M,Tc,N,Uc,Vc,Wc,Xc,Yc,Pa;function bc(a,b,d,c){var e=N();try{return V(a)(b,d,c)}catch(f){M(e);if(f!==f+0)throw f;K(1,0)}}function ac(a,b,d){var c=N();try{return V(a)(b,d)}catch(e){M(c);if(e!==e+0)throw e;K(1,0)}}function sc(a,b,d){var c=N();try{V(a)(b,d)}catch(e){M(c);if(e!==e+0)throw e;K(1,0)}}function $b(a,b){var d=N();try{return V(a)(b)}catch(c){M(d);if(c!==c+0)throw c;K(1,0)}}
50
+ function qc(a){var b=N();try{V(a)()}catch(d){M(b);if(d!==d+0)throw d;K(1,0)}}function fc(a,b,d,c,e,f,g){var l=N();try{return V(a)(b,d,c,e,f,g)}catch(u){M(l);if(u!==u+0)throw u;K(1,0)}}function rc(a,b){var d=N();try{V(a)(b)}catch(c){M(d);if(c!==c+0)throw c;K(1,0)}}function wc(a,b,d,c,e,f){var g=N();try{V(a)(b,d,c,e,f)}catch(l){M(g);if(l!==l+0)throw l;K(1,0)}}function uc(a,b,d,c){var e=N();try{V(a)(b,d,c)}catch(f){M(e);if(f!==f+0)throw f;K(1,0)}}
51
+ function vc(a,b,d,c,e){var f=N();try{V(a)(b,d,c,e)}catch(g){M(f);if(g!==g+0)throw g;K(1,0)}}function xc(a,b,d,c,e,f,g){var l=N();try{V(a)(b,d,c,e,f,g)}catch(u){M(l);if(u!==u+0)throw u;K(1,0)}}function Ec(a,b,d,c,e,f,g){var l=N();try{V(a)(b,d,c,e,f,g)}catch(u){M(l);if(u!==u+0)throw u;K(1,0)}}function Dc(a,b,d,c,e,f,g,l){var u=N();try{V(a)(b,d,c,e,f,g,l)}catch(w){M(u);if(w!==w+0)throw w;K(1,0)}}function cc(a,b,d,c,e){var f=N();try{return V(a)(b,d,c,e)}catch(g){M(f);if(g!==g+0)throw g;K(1,0)}}
52
+ function yc(a,b,d,c,e,f,g,l){var u=N();try{V(a)(b,d,c,e,f,g,l)}catch(w){M(u);if(w!==w+0)throw w;K(1,0)}}function Bc(a,b,d,c,e,f,g,l,u,w,y,B){var E=N();try{V(a)(b,d,c,e,f,g,l,u,w,y,B)}catch(F){M(E);if(F!==F+0)throw F;K(1,0)}}function ec(a,b,d,c,e,f){var g=N();try{return V(a)(b,d,c,e,f)}catch(l){M(g);if(l!==l+0)throw l;K(1,0)}}function oc(a,b,d){var c=N();try{return V(a)(b,d)}catch(e){M(c);if(e!==e+0)throw e;K(1,0);return 0n}}
53
+ function zc(a,b,d,c,e,f,g,l,u){var w=N();try{V(a)(b,d,c,e,f,g,l,u)}catch(y){M(w);if(y!==y+0)throw y;K(1,0)}}function Zb(a){var b=N();try{return V(a)()}catch(d){M(b);if(d!==d+0)throw d;K(1,0)}}function lc(a,b,d){var c=N();try{return V(a)(b,d)}catch(e){M(c);if(e!==e+0)throw e;K(1,0)}}function nc(a,b){var d=N();try{return V(a)(b)}catch(c){M(d);if(c!==c+0)throw c;K(1,0);return 0n}}function Fc(a,b,d,c,e){var f=N();try{V(a)(b,d,c,e)}catch(g){M(f);if(g!==g+0)throw g;K(1,0)}}
54
+ function mc(a){var b=N();try{return V(a)()}catch(d){M(b);if(d!==d+0)throw d;K(1,0);return 0n}}function ic(a,b,d,c,e,f){var g=N();try{return V(a)(b,d,c,e,f)}catch(l){M(g);if(l!==l+0)throw l;K(1,0)}}function dc(a,b,d,c,e,f){var g=N();try{return V(a)(b,d,c,e,f)}catch(l){M(g);if(l!==l+0)throw l;K(1,0)}}function gc(a,b,d,c,e,f,g,l){var u=N();try{return V(a)(b,d,c,e,f,g,l)}catch(w){M(u);if(w!==w+0)throw w;K(1,0)}}
55
+ function pc(a,b,d,c,e){var f=N();try{return V(a)(b,d,c,e)}catch(g){M(f);if(g!==g+0)throw g;K(1,0);return 0n}}function Yb(a,b,d,c){var e=N();try{return V(a)(b,d,c)}catch(f){M(e);if(f!==f+0)throw f;K(1,0)}}function Wb(a,b,d,c){var e=N();try{return V(a)(b,d,c)}catch(f){M(e);if(f!==f+0)throw f;K(1,0)}}function hc(a,b,d,c,e,f,g,l,u,w,y,B){var E=N();try{return V(a)(b,d,c,e,f,g,l,u,w,y,B)}catch(F){M(E);if(F!==F+0)throw F;K(1,0)}}
56
+ function Ac(a,b,d,c,e,f,g,l,u,w,y){var B=N();try{V(a)(b,d,c,e,f,g,l,u,w,y)}catch(E){M(B);if(E!==E+0)throw E;K(1,0)}}function Cc(a,b,d,c,e,f,g,l,u,w,y,B,E,F,Ld,Md){var Nd=N();try{V(a)(b,d,c,e,f,g,l,u,w,y,B,E,F,Ld,Md)}catch(Ma){M(Nd);if(Ma!==Ma+0)throw Ma;K(1,0)}}function kc(a,b,d,c){var e=N();try{return V(a)(b,d,c)}catch(f){M(e);if(f!==f+0)throw f;K(1,0)}}function jc(a,b,d,c,e){var f=N();try{return V(a)(b,d,c,e)}catch(g){M(f);if(g!==g+0)throw g;K(1,0)}}
57
+ function Xb(a,b,d){var c=N();try{return V(a)(b,d)}catch(e){M(c);if(e!==e+0)throw e;K(1,0)}}function Vb(a,b,d){var c=N();try{return V(a)(b,d)}catch(e){M(c);if(e!==e+0)throw e;K(1,0)}}function tc(a,b,d,c){var e=N();try{V(a)(b,d,c)}catch(f){M(e);if(f!==f+0)throw f;K(1,0)}}function Ic(){var a=I;a=Object.assign({},a);var b=c=>()=>c()>>>0,d=c=>e=>c(e)>>>0;a.tb=b(a.tb);a.vb=d(a.vb);a.Jb=d(a.Jb);a.Kb=b(a.Kb);a.Ob=d(a.Ob);return a}
58
+ function xa(){if(0<O)P=xa;else if(n)ra?.(h),Ia();else{for(var a=ad;0<a.length;)a.shift()(h);0<O?P=xa:(h.calledRun=!0,pa||(Ia(),ra?.(h)))}}var I;n||(I=await (wa()),xa());h.PTR_SIZE=4;Ha?moduleRtn=h:moduleRtn=new Promise((a,b)=>{ra=a;sa=b});
59
+ ;return moduleRtn}export default ortWasmThreaded;var isPthread=globalThis.self?.name?.startsWith("em-pthread");var isNode=globalThis.process?.versions?.node&&globalThis.process?.type!="renderer";if(isNode)isPthread=(await import("worker_threads")).workerData==="em-pthread";isPthread&&ortWasmThreaded();
@@ -0,0 +1,85 @@
1
+ import { BackgroundActionDefinition, BackgroundActionRunContext, ManifestEditorTag } from "@manifest-editor/shell";
2
+
3
+ //#region rolldown:runtime
4
+ //#endregion
5
+ //#region src/plugin.d.ts
6
+ declare const _default: {
7
+ id: string;
8
+ label: string;
9
+ description: string;
10
+ author: string;
11
+ official: true;
12
+ defaultEnabled: false;
13
+ tags: string[];
14
+ supports: {
15
+ apps: string[];
16
+ projectTypes: "Manifest"[];
17
+ };
18
+ };
19
+ //#endregion
20
+ //#region src/canvas-image.d.ts
21
+ type CanvasImageForClassification = {
22
+ url: string;
23
+ blob: Blob;
24
+ };
25
+ //#endregion
26
+ //#region src/ocr-difficulty.d.ts
27
+ declare const OCR_DIFFICULTY_TAG_TYPE = "ocr-difficulty";
28
+ type OcrDifficultyId = "easy" | "medium" | "difficult";
29
+ type OcrDifficultyClass = {
30
+ id: OcrDifficultyId;
31
+ index: number;
32
+ label: string;
33
+ backgroundColor: string;
34
+ textColor: string;
35
+ };
36
+ type OcrDifficultyPrediction = OcrDifficultyClass & {
37
+ score: number;
38
+ };
39
+ type OcrClassifierRun = {
40
+ scores: number[];
41
+ prediction: OcrDifficultyPrediction;
42
+ inferenceMs: number;
43
+ };
44
+ declare const OCR_DIFFICULTY_CLASSES: OcrDifficultyClass[];
45
+ declare function selectOcrDifficulty(scores: ArrayLike<number>): OcrDifficultyPrediction;
46
+ declare function createOcrDifficultyTag(prediction: OcrDifficultyPrediction): ManifestEditorTag;
47
+ declare function formatOcrScore(score: number): string;
48
+ //#endregion
49
+ //#region src/background-action.d.ts
50
+ declare const OCR_CLASSIFICATION_ACTION_ID = "@manifest-editor/ocr-classification/classify-canvases";
51
+ type OcrCanvasClassification = {
52
+ canvasId: string;
53
+ canvasLabel: string;
54
+ tagId: string;
55
+ label: string;
56
+ score: number;
57
+ scores: number[];
58
+ imageUrl: string;
59
+ };
60
+ type OcrCanvasClassificationSkip = {
61
+ canvasId: string;
62
+ canvasLabel: string;
63
+ reason: string;
64
+ };
65
+ type OcrClassificationActionResult = {
66
+ total: number;
67
+ classified: number;
68
+ skipped: number;
69
+ counts: Record<string, number>;
70
+ classifications: OcrCanvasClassification[];
71
+ skippedCanvases: OcrCanvasClassificationSkip[];
72
+ };
73
+ type OcrClassificationActionDependencies = {
74
+ prepareClassifier?: () => Promise<void>;
75
+ getCanvasImage?: (ctx: BackgroundActionRunContext, canvas: any) => Promise<CanvasImageForClassification | null>;
76
+ classifyImage?: (image: Blob) => Promise<OcrClassifierRun>;
77
+ };
78
+ declare function createOcrClassificationBackgroundAction(dependencies?: OcrClassificationActionDependencies): BackgroundActionDefinition;
79
+ declare namespace index_d_exports {
80
+ export { OCR_CLASSIFICATION_ACTION_ID, OCR_DIFFICULTY_CLASSES, OCR_DIFFICULTY_TAG_TYPE, OcrCanvasClassification, OcrCanvasClassificationSkip, OcrClassificationActionDependencies, OcrClassificationActionResult, OcrClassifierRun, OcrDifficultyClass, OcrDifficultyId, OcrDifficultyPrediction, backgroundActions, createOcrClassificationBackgroundAction, createOcrDifficultyTag, _default as default, formatOcrScore, selectOcrDifficulty };
81
+ }
82
+ declare const backgroundActions: BackgroundActionDefinition[];
83
+ //#endregion
84
+ export { selectOcrDifficulty as _, OcrCanvasClassificationSkip as a, createOcrClassificationBackgroundAction as c, OcrClassifierRun as d, OcrDifficultyClass as f, formatOcrScore as g, createOcrDifficultyTag as h, OcrCanvasClassification as i, OCR_DIFFICULTY_CLASSES as l, OcrDifficultyPrediction as m, index_d_exports as n, OcrClassificationActionDependencies as o, OcrDifficultyId as p, OCR_CLASSIFICATION_ACTION_ID as r, OcrClassificationActionResult as s, backgroundActions as t, OCR_DIFFICULTY_TAG_TYPE as u, _default as v };
85
+ //# sourceMappingURL=index-CwtpxPp2.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-CwtpxPp2.d.ts","names":[],"sources":["../src/plugin.ts","../src/canvas-image.ts","../src/ocr-difficulty.ts","../src/background-action.ts","../src/index.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;;;;;;;;;;;KCGY,4BAAA;;QAEJ;;;;cCHK,uBAAA;KAED,eAAA;KAEA,kBAAA;MACN;;;;;;KAOM,uBAAA,GAA0B;;;KAI1B,gBAAA;;cAEE;;;cAID,wBAAwB;ADrBzB,iBC6CI,mBAAA,CD7CwB,MAEhC,EC2CoC,SD3ChC,CAAA,MAAA,CAAA,CAAA,EC2CoD,uBD3CpD;iBCmEI,sBAAA,aAAmC,0BAA0B;iBAU7D,cAAA;;;cClEH,4BAAA;KAED,uBAAA;;;;;;;;;KAUA,2BAAA;;;;;KAMA,6BAAA;EF/BA,KAAA,EAAA,MAAA;;;UEmCF;EDpCG,eAAA,ECqCM,uBDrCiB,EAAA;EAExB,eAAA,ECoCO,2BDpCQ,EAAA;AAE3B,CAAA;AAQY,KCuCA,mCAAA,GDvC0B;EAI1B,iBAAA,CAAA,EAAgB,GAAA,GCoCA,ODlCd,CAAA,IAAA,CAAA;EAID,cAAA,CAAA,EAAA,CAAA,GAAA,EC+BY,0BD/BY,EAAA,MAAkB,EAAA,GAAA,EAAA,GC+Bc,OD/Bd,CC+BsB,4BD/BtB,GAAA,IAAA,CAAA;EAwBvC,aAAA,CAAA,EAAA,CAAA,KAAmB,ECQT,IDRS,EAAA,GCQA,ODRS,CCQD,gBDRqB,CAAA;AAwBhE,CAAA;AAUgB,iBCvBA,uCAAA,CDuBc,YAAA,CAAA,ECtBd,mCDsBc,CAAA,ECrB3B,0BDqB2B;AAAA;;;cE9EjB,mBAAmB"}
@@ -0,0 +1,85 @@
1
+ import { BackgroundActionDefinition, BackgroundActionRunContext, ManifestEditorTag } from "@manifest-editor/shell";
2
+
3
+ //#region rolldown:runtime
4
+ //#endregion
5
+ //#region src/plugin.d.ts
6
+ declare const _default: {
7
+ id: string;
8
+ label: string;
9
+ description: string;
10
+ author: string;
11
+ official: true;
12
+ defaultEnabled: false;
13
+ tags: string[];
14
+ supports: {
15
+ apps: string[];
16
+ projectTypes: "Manifest"[];
17
+ };
18
+ };
19
+ //#endregion
20
+ //#region src/canvas-image.d.ts
21
+ type CanvasImageForClassification = {
22
+ url: string;
23
+ blob: Blob;
24
+ };
25
+ //#endregion
26
+ //#region src/ocr-difficulty.d.ts
27
+ declare const OCR_DIFFICULTY_TAG_TYPE = "ocr-difficulty";
28
+ type OcrDifficultyId = "easy" | "medium" | "difficult";
29
+ type OcrDifficultyClass = {
30
+ id: OcrDifficultyId;
31
+ index: number;
32
+ label: string;
33
+ backgroundColor: string;
34
+ textColor: string;
35
+ };
36
+ type OcrDifficultyPrediction = OcrDifficultyClass & {
37
+ score: number;
38
+ };
39
+ type OcrClassifierRun = {
40
+ scores: number[];
41
+ prediction: OcrDifficultyPrediction;
42
+ inferenceMs: number;
43
+ };
44
+ declare const OCR_DIFFICULTY_CLASSES: OcrDifficultyClass[];
45
+ declare function selectOcrDifficulty(scores: ArrayLike<number>): OcrDifficultyPrediction;
46
+ declare function createOcrDifficultyTag(prediction: OcrDifficultyPrediction): ManifestEditorTag;
47
+ declare function formatOcrScore(score: number): string;
48
+ //#endregion
49
+ //#region src/background-action.d.ts
50
+ declare const OCR_CLASSIFICATION_ACTION_ID = "@manifest-editor/ocr-classification/classify-canvases";
51
+ type OcrCanvasClassification = {
52
+ canvasId: string;
53
+ canvasLabel: string;
54
+ tagId: string;
55
+ label: string;
56
+ score: number;
57
+ scores: number[];
58
+ imageUrl: string;
59
+ };
60
+ type OcrCanvasClassificationSkip = {
61
+ canvasId: string;
62
+ canvasLabel: string;
63
+ reason: string;
64
+ };
65
+ type OcrClassificationActionResult = {
66
+ total: number;
67
+ classified: number;
68
+ skipped: number;
69
+ counts: Record<string, number>;
70
+ classifications: OcrCanvasClassification[];
71
+ skippedCanvases: OcrCanvasClassificationSkip[];
72
+ };
73
+ type OcrClassificationActionDependencies = {
74
+ prepareClassifier?: () => Promise<void>;
75
+ getCanvasImage?: (ctx: BackgroundActionRunContext, canvas: any) => Promise<CanvasImageForClassification | null>;
76
+ classifyImage?: (image: Blob) => Promise<OcrClassifierRun>;
77
+ };
78
+ declare function createOcrClassificationBackgroundAction(dependencies?: OcrClassificationActionDependencies): BackgroundActionDefinition;
79
+ declare namespace index_d_exports {
80
+ export { OCR_CLASSIFICATION_ACTION_ID, OCR_DIFFICULTY_CLASSES, OCR_DIFFICULTY_TAG_TYPE, OcrCanvasClassification, OcrCanvasClassificationSkip, OcrClassificationActionDependencies, OcrClassificationActionResult, OcrClassifierRun, OcrDifficultyClass, OcrDifficultyId, OcrDifficultyPrediction, backgroundActions, createOcrClassificationBackgroundAction, createOcrDifficultyTag, _default as default, formatOcrScore, selectOcrDifficulty };
81
+ }
82
+ declare const backgroundActions: BackgroundActionDefinition[];
83
+ //#endregion
84
+ export { selectOcrDifficulty as _, OcrCanvasClassificationSkip as a, createOcrClassificationBackgroundAction as c, OcrClassifierRun as d, OcrDifficultyClass as f, formatOcrScore as g, createOcrDifficultyTag as h, OcrCanvasClassification as i, OCR_DIFFICULTY_CLASSES as l, OcrDifficultyPrediction as m, index_d_exports as n, OcrClassificationActionDependencies as o, OcrDifficultyId as p, OCR_CLASSIFICATION_ACTION_ID as r, OcrClassificationActionResult as s, backgroundActions as t, OCR_DIFFICULTY_TAG_TYPE as u, _default as v };
85
+ //# sourceMappingURL=index-MMJWr93c.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-MMJWr93c.d.cts","names":[],"sources":["../src/plugin.ts","../src/canvas-image.ts","../src/ocr-difficulty.ts","../src/background-action.ts","../src/index.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;;;;;;;;;;;KCGY,4BAAA;;QAEJ;;;;cCHK,uBAAA;KAED,eAAA;KAEA,kBAAA;MACN;;;;;;KAOM,uBAAA,GAA0B;;;KAI1B,gBAAA;;cAEE;;;cAID,wBAAwB;ADrBzB,iBC6CI,mBAAA,CD7CwB,MAEhC,EC2CoC,SD3ChC,CAAA,MAAA,CAAA,CAAA,EC2CoD,uBD3CpD;iBCmEI,sBAAA,aAAmC,0BAA0B;iBAU7D,cAAA;;;cClEH,4BAAA;KAED,uBAAA;;;;;;;;;KAUA,2BAAA;;;;;KAMA,6BAAA;EF/BA,KAAA,EAAA,MAAA;;;UEmCF;EDpCG,eAAA,ECqCM,uBDrCiB,EAAA;EAExB,eAAA,ECoCO,2BDpCQ,EAAA;AAE3B,CAAA;AAQY,KCuCA,mCAAA,GDvC0B;EAI1B,iBAAA,CAAA,EAAgB,GAAA,GCoCA,ODlCd,CAAA,IAAA,CAAA;EAID,cAAA,CAAA,EAAA,CAAA,GAAA,EC+BY,0BD/BY,EAAA,MAAkB,EAAA,GAAA,EAAA,GC+Bc,OD/Bd,CC+BsB,4BD/BtB,GAAA,IAAA,CAAA;EAwBvC,aAAA,CAAA,EAAA,CAAA,KAAmB,ECQT,IDRS,EAAA,GCQA,ODRS,CCQD,gBDRqB,CAAA;AAwBhE,CAAA;AAUgB,iBCvBA,uCAAA,CDuBc,YAAA,CAAA,ECtBd,mCDsBc,CAAA,ECrB3B,0BDqB2B;AAAA;;;cE9EjB,mBAAmB"}
package/dist/index.cjs ADDED
@@ -0,0 +1 @@
1
+ Object.defineProperty(exports,`__esModule`,{value:!0});const e=require(`./ocr-difficulty-9L3ewI3P.cjs`),t=require(`./plugin-Bfd4lYW9.cjs`),n=require(`./onnx-classifier-CDO8vcMl.cjs`);let r=require(`@iiif/helpers`),i=require(`@manifest-editor/components`),a=require(`react`),o=require(`react/jsx-runtime`);async function s(e,t){let n=c(e,t);if(!n)return null;let i=(await(0,r.createThumbnailHelper)(e.vault).getBestThumbnailAtSize(n,{width:512,height:512,maxWidth:512,maxHeight:512,unsafeImageService:!0,allowUnsafe:!0,preferFixedSize:!0},!1)).best?.id;if(!i)return null;let a=await fetch(i,{signal:e.signal});if(!a.ok)throw Error(`Unable to fetch canvas image (${a.status}).`);return{url:i,blob:await a.blob()}}function c(e,t){let n=t?.items&&e.vault.get(t.items)||[];for(let t of n){let n=t?.items&&e.vault.get(t.items)||[];for(let t of n){if(!l(t))continue;let n=u(t?.body);if(n)return e.vault.get(n)||n}}return null}function l(e){return(Array.isArray(e?.motivation)?e.motivation:[e?.motivation]).includes(`painting`)}function u(e){return Array.isArray(e)?e[0]??null:e??null}const d=`@manifest-editor/ocr-classification:results`;function f(e,t){typeof window>`u`||window.dispatchEvent(new CustomEvent(d,{detail:{actionId:e,result:x(t)?t:void 0}}))}function p(e){return(0,o.jsx)(m,{actionId:e})}function m({actionId:t}){let[n,r]=(0,a.useState)(null);(0,a.useEffect)(()=>{let e=e=>{let n=e.detail;n?.actionId===t&&r(n)};return window.addEventListener(d,e),()=>window.removeEventListener(d,e)},[t]);let s=n?.result,c=(0,a.useMemo)(()=>s?.classifications||[],[s]),l=(0,a.useMemo)(()=>s?e.t.map(e=>({...e,count:s.counts?.[e.id]||0})):[],[s]);return n?(0,o.jsx)(i.Modal,{title:`OCR classification results`,onClose:()=>r(null),className:`max-w-6xl`,children:(0,o.jsx)(`div`,{className:`flex min-h-0 flex-col gap-4 p-4 text-sm text-zinc-700`,children:s?(0,o.jsxs)(o.Fragment,{children:[(0,o.jsxs)(`div`,{className:`rounded border border-zinc-200 bg-white p-4`,children:[(0,o.jsxs)(`div`,{className:`flex flex-wrap items-start justify-between gap-3`,children:[(0,o.jsxs)(`div`,{className:`min-w-0`,children:[(0,o.jsx)(`div`,{className:`text-xs font-semibold uppercase text-zinc-500`,children:`Task complete`}),(0,o.jsxs)(`div`,{className:`mt-1 text-lg font-semibold text-zinc-950`,children:[`Classified `,y(s.classified),` of `,y(s.total),` canvases`]}),(0,o.jsx)(`div`,{className:`mt-1 text-sm text-zinc-500`,children:s.skipped?`${y(s.skipped)} ${s.skipped===1?`canvas was`:`canvases were`} skipped. Review the skipped list below before rerunning.`:`Every canvas was classified and tagged.`})]}),(0,o.jsxs)(`div`,{className:`rounded border border-zinc-200 bg-zinc-50 px-3 py-2 text-right`,children:[(0,o.jsx)(`div`,{className:`text-2xl font-semibold text-zinc-950`,children:b(s.classified,s.total)}),(0,o.jsx)(`div`,{className:`text-xs uppercase text-zinc-500`,children:`Coverage`})]})]}),(0,o.jsx)(`div`,{className:`mt-4 flex h-2 overflow-hidden rounded-full bg-zinc-100`,children:s.classified?l.map(e=>e.count?(0,o.jsx)(`div`,{className:`h-full`,style:{width:`${e.count/s.classified*100}%`,backgroundColor:e.backgroundColor}},e.id):null):(0,o.jsx)(`div`,{className:`h-full w-full bg-zinc-200`})}),(0,o.jsx)(`div`,{className:`mt-3 flex flex-wrap gap-2`,children:l.map(e=>(0,o.jsxs)(`div`,{className:`inline-flex items-center gap-2 rounded border border-zinc-200 bg-zinc-50 px-2 py-1`,children:[(0,o.jsx)(`span`,{className:`h-2.5 w-2.5 rounded-full`,style:{backgroundColor:e.backgroundColor},"aria-hidden":`true`}),(0,o.jsx)(`span`,{className:`font-medium text-zinc-900`,children:e.label}),(0,o.jsxs)(`span`,{className:`text-zinc-500`,children:[y(e.count),` (`,b(e.count,s.classified),`)`]})]},e.id))})]}),(0,o.jsxs)(`div`,{className:`grid gap-2 sm:grid-cols-4`,children:[(0,o.jsx)(_,{label:`Total canvases`,value:y(s.total)}),(0,o.jsx)(_,{label:`Classified`,value:y(s.classified)}),(0,o.jsx)(_,{label:`Skipped`,value:y(s.skipped)}),(0,o.jsx)(_,{label:`Tags applied`,value:y(s.classifications.length)})]}),(0,o.jsx)(`div`,{className:`grid gap-2 sm:grid-cols-3`,children:l.map(e=>(0,o.jsxs)(`div`,{className:`rounded border border-zinc-200 bg-white p-3`,children:[(0,o.jsx)(`div`,{className:`inline-flex rounded px-2 py-1 text-xs font-medium`,style:{backgroundColor:e.backgroundColor,color:e.textColor},children:e.label}),(0,o.jsx)(`div`,{className:`mt-2 text-xl font-semibold text-zinc-950`,children:y(e.count)}),(0,o.jsxs)(`div`,{className:`mt-1 text-xs text-zinc-500`,children:[b(e.count,s.classified),` of classified canvases`]})]},e.id))}),c.length?(0,o.jsxs)(`div`,{className:`min-h-0 overflow-hidden rounded border border-zinc-200`,children:[(0,o.jsxs)(`div`,{className:`flex flex-wrap items-center justify-between gap-2 border-b border-zinc-200 bg-zinc-50 px-3 py-2`,children:[(0,o.jsx)(`div`,{className:`font-medium text-zinc-900`,children:`Classified canvases`}),(0,o.jsxs)(`div`,{className:`text-xs text-zinc-500`,children:[`Showing all `,y(c.length),` classified results`]})]}),(0,o.jsx)(`div`,{className:`max-h-[55vh] overflow-auto`,children:(0,o.jsxs)(`table`,{className:`w-full min-w-[820px] border-collapse text-left`,children:[(0,o.jsx)(`thead`,{className:`sticky top-0 bg-white text-xs uppercase text-zinc-500`,children:(0,o.jsxs)(`tr`,{children:[(0,o.jsx)(`th`,{className:`w-14 border-b border-zinc-200 px-3 py-2 font-medium`,children:`#`}),(0,o.jsx)(`th`,{className:`border-b border-zinc-200 px-3 py-2 font-medium`,children:`Canvas`}),(0,o.jsx)(`th`,{className:`w-44 border-b border-zinc-200 px-3 py-2 font-medium`,children:`Result`}),(0,o.jsx)(`th`,{className:`w-28 border-b border-zinc-200 px-3 py-2 font-medium`,children:`Confidence`}),(0,o.jsx)(`th`,{className:`border-b border-zinc-200 px-3 py-2 font-medium`,children:`Scores`})]})}),(0,o.jsx)(`tbody`,{children:c.map((t,n)=>{let r=t.canvasLabel||t.canvasId;return(0,o.jsxs)(`tr`,{className:`border-b border-zinc-100 last:border-0`,children:[(0,o.jsx)(`td`,{className:`px-3 py-2 align-top text-xs text-zinc-400`,children:n+1}),(0,o.jsxs)(`td`,{className:`px-3 py-2 align-top`,title:t.canvasId,children:[(0,o.jsx)(`div`,{className:`font-medium text-zinc-900`,children:r}),r===t.canvasId?null:(0,o.jsx)(`div`,{className:`mt-0.5 break-all text-xs text-zinc-500`,children:t.canvasId})]}),(0,o.jsx)(`td`,{className:`px-3 py-2 align-top`,children:(0,o.jsx)(h,{tagId:t.tagId,label:t.label})}),(0,o.jsx)(`td`,{className:`px-3 py-2 align-top font-medium text-zinc-900`,children:e.i(t.score)}),(0,o.jsx)(`td`,{className:`px-3 py-2 align-top text-xs text-zinc-500`,children:(0,o.jsx)(g,{scores:t.scores})})]},t.canvasId)})})]})})]}):(0,o.jsx)(`div`,{className:`rounded border border-zinc-200 bg-zinc-50 p-3`,children:`No canvases were classified. Check the skipped canvases and task logs for details.`}),s.skippedCanvases.length?(0,o.jsxs)(`details`,{open:!0,className:`rounded border border-zinc-200 bg-zinc-50`,children:[(0,o.jsxs)(`summary`,{className:`cursor-pointer px-3 py-2 font-medium text-zinc-900`,children:[`Skipped canvases (`,s.skippedCanvases.length,`)`]}),(0,o.jsx)(`div`,{className:`max-h-52 overflow-auto border-t border-zinc-200 bg-white`,children:s.skippedCanvases.map(e=>(0,o.jsxs)(`div`,{className:`grid gap-1 border-b border-zinc-100 px-3 py-2 last:border-0`,children:[(0,o.jsx)(`div`,{className:`font-medium text-zinc-900`,children:e.canvasLabel||e.canvasId}),e.canvasLabel&&e.canvasLabel!==e.canvasId?(0,o.jsx)(`div`,{className:`break-all text-xs text-zinc-500`,children:e.canvasId}):null,(0,o.jsx)(`div`,{className:`text-xs text-zinc-500`,children:e.reason})]},e.canvasId))})]}):null]}):(0,o.jsx)(`div`,{className:`rounded border border-zinc-200 bg-zinc-50 p-3`,children:`No result data is available for this run.`})})}):null}function h({tagId:e,label:t}){let n=v(e);return(0,o.jsx)(`span`,{className:`inline-flex rounded px-2 py-1 text-xs font-medium`,style:{backgroundColor:n?.backgroundColor||`#f4f4f5`,color:n?.textColor||`#18181b`},children:t})}function g({scores:t}){return(0,o.jsx)(`div`,{className:`flex flex-wrap gap-1.5`,children:t.map((t,n)=>(0,o.jsxs)(`span`,{className:`whitespace-nowrap rounded bg-zinc-100 px-1.5 py-0.5`,children:[e.t[n]?.id||`class-${n}`,`: `,e.i(t)]},n))})}function _({label:e,value:t}){return(0,o.jsxs)(`div`,{className:`rounded border border-zinc-200 bg-white p-3`,children:[(0,o.jsx)(`div`,{className:`text-xs uppercase text-zinc-500`,children:e}),(0,o.jsx)(`div`,{className:`mt-1 text-xl font-semibold text-zinc-950`,children:t})]})}function v(t){return e.t.find(e=>e.id===t)}function y(e){return new Intl.NumberFormat().format(e)}function b(t,n){return n?e.i(t/n):`0%`}function x(e){if(!e||typeof e!=`object`)return!1;let t=e;return typeof t.total==`number`&&typeof t.classified==`number`&&typeof t.skipped==`number`&&!!t.counts&&typeof t.counts==`object`&&Array.isArray(t.classifications)&&Array.isArray(t.skippedCanvases)}const S=`@manifest-editor/ocr-classification/classify-canvases`;function C(t={}){let n=t.prepareClassifier||D,r=t.getCanvasImage||s,i=t.classifyImage||O;return{id:S,label:`Classify OCR difficulty`,summary:`Tag each canvas by OCR difficulty`,section:`OCR`,order:10,resourceTypes:[`Manifest`],resumable:!0,render:()=>p(S),onResults:e=>f(e.definition.id,e.instance?.result),supports:e=>!!e.vault.get(e.target)?.items?.length,prepare:e=>w(j(e)),run:async t=>{let a=t.plan||w(j(t)),o=t.tasks.getAll(),s=t.tasks.getPending();if(t.setActionLabel(`Classifying OCR difficulty`),!o.length)return t.setActionStatus(`running`,`No canvases to classify`),T(0);s.length&&(t.canvasProgress.setStatuses(s.map(e=>e.target).filter(e=>!!e&&e.type===`Canvas`),`queued`),t.setActionStatus(`running`,`Loading OCR classifier`),await n(),await t.tasks.runEach(async(n,{index:a,total:o})=>{k(t.signal);let s=n.target?.id||n.input?.canvasId||n.id,c=M(t,s),l=N(c,s),u=`Classifying ${a+1}/${o}`;t.appendActionLog(u,`info`,{canvasId:s,current:a+1,total:o});try{let n=c?await r(t,c):null;if(!n){let e={canvasId:s,canvasLabel:l,reason:`No painting image found`};return t.appendActionLog(`Skipped canvas classification`,`warn`,{canvasId:s,reason:e.reason}),{taskStatus:`skipped`,result:{type:`skipped`,skip:e}}}let a=await i(n.blob),o=e.r(a.prediction);t.tags.upsertTag({id:s,type:`Canvas`},o);let u={canvasId:s,canvasLabel:l,tagId:o.id,label:o.label,score:a.prediction.score,scores:a.scores,imageUrl:n.url};return t.appendActionLog(`Classified canvas`,`info`,{canvasId:s,label:o.label,score:a.prediction.score}),{taskStatus:`complete`,result:{type:`classified`,classification:u}}}catch(e){if(t.signal.aborted)throw e;let n={canvasId:s,canvasLabel:l,reason:A(e)};return t.appendActionLog(`Skipped canvas classification`,`warn`,{canvasId:s,reason:n.reason}),{taskStatus:`skipped`,result:{type:`skipped`,skip:n}}}},{progressLabel:(e,t,n)=>`Classifying ${t+1}/${n}`}));let c=E(t.tasks.getAll().length?t.tasks.getAll():a.tasks);return t.setActionStatus(`running`,`Classified ${c.classified}/${c.total}`),t.setActionProgress({current:c.total,total:c.total,label:`Classification complete`}),t.appendActionLog(`Classification complete`,`info`,{total:c.total,classified:c.classified,skipped:c.skipped,counts:c.counts}),c}}}function w(e){return{version:1,tasks:e.map((e,t)=>{let n=e?.id||`canvas-${t+1}`,r=N(e,n);return{id:`canvas:${n}`,label:r,target:{id:n,type:`Canvas`,label:r,scope:`canvas`},input:{canvasId:n,canvasLabel:r},status:`queued`}})}}function T(t){return{total:t,classified:0,skipped:0,counts:Object.fromEntries(e.t.map(e=>[e.id,0])),classifications:[],skippedCanvases:[]}}function E(e){let t=T(e.length);for(let n of e){let e=n.result;if(e?.type===`classified`){t.classifications.push(e.classification),t.counts[e.classification.tagId]=(t.counts[e.classification.tagId]||0)+1;continue}if(e?.type===`skipped`){t.skippedCanvases.push(e.skip);continue}if(n.status===`error`&&n.error){let e=n.target?.id||n.id;t.skippedCanvases.push({canvasId:e,canvasLabel:n.label||e,reason:n.error.message})}}return t.classified=t.classifications.length,t.skipped=t.skippedCanvases.length,t}async function D(){let{loadOcrClassifier:e}=await Promise.resolve().then(()=>require(`./onnx-classifier-CDO8vcMl.cjs`));await e()}async function O(e){let{runOcrClassifier:t}=await Promise.resolve().then(()=>require(`./onnx-classifier-CDO8vcMl.cjs`));return t(e)}function k(e){if(e.aborted)throw Error(`OCR classification cancelled.`)}function A(e){return e instanceof Error?e.message:`Canvas classification failed`}function j(e){let t=e.vault.get(e.target);return t?.items?(e.vault.get(t.items)||[]).filter(Boolean):[]}function M(e,t){return e.vault.get({id:t,type:`Canvas`})}function N(e,t){let n=e?.label;if(!n)return t;if(typeof n==`string`)return n;let r=Array.isArray(n.en)?n.en[0]:void 0;if(r)return r;let i=Object.keys(n)[0];return(i&&Array.isArray(n[i])?n[i][0]:void 0)||t}const P=[C()];exports.OCR_CLASSIFICATION_ACTION_ID=S,exports.OCR_DIFFICULTY_CLASSES=e.t,exports.OCR_DIFFICULTY_TAG_TYPE=e.n,exports.backgroundActions=P,exports.createOcrClassificationBackgroundAction=C,exports.createOcrDifficultyTag=e.r,exports.default=t.t,exports.formatOcrScore=e.i,exports.selectOcrDifficulty=e.a;
@@ -0,0 +1,2 @@
1
+ import { _ as selectOcrDifficulty, a as OcrCanvasClassificationSkip, c as createOcrClassificationBackgroundAction, d as OcrClassifierRun, f as OcrDifficultyClass, g as formatOcrScore, h as createOcrDifficultyTag, i as OcrCanvasClassification, l as OCR_DIFFICULTY_CLASSES, m as OcrDifficultyPrediction, o as OcrClassificationActionDependencies, p as OcrDifficultyId, r as OCR_CLASSIFICATION_ACTION_ID, s as OcrClassificationActionResult, t as backgroundActions, u as OCR_DIFFICULTY_TAG_TYPE, v as _default } from "./index-MMJWr93c.cjs";
2
+ export { OCR_CLASSIFICATION_ACTION_ID, OCR_DIFFICULTY_CLASSES, OCR_DIFFICULTY_TAG_TYPE, OcrCanvasClassification, OcrCanvasClassificationSkip, OcrClassificationActionDependencies, OcrClassificationActionResult, OcrClassifierRun, OcrDifficultyClass, OcrDifficultyId, OcrDifficultyPrediction, backgroundActions, createOcrClassificationBackgroundAction, createOcrDifficultyTag, _default as default, formatOcrScore, selectOcrDifficulty };
@@ -0,0 +1,2 @@
1
+ import { _ as selectOcrDifficulty, a as OcrCanvasClassificationSkip, c as createOcrClassificationBackgroundAction, d as OcrClassifierRun, f as OcrDifficultyClass, g as formatOcrScore, h as createOcrDifficultyTag, i as OcrCanvasClassification, l as OCR_DIFFICULTY_CLASSES, m as OcrDifficultyPrediction, o as OcrClassificationActionDependencies, p as OcrDifficultyId, r as OCR_CLASSIFICATION_ACTION_ID, s as OcrClassificationActionResult, t as backgroundActions, u as OCR_DIFFICULTY_TAG_TYPE, v as _default } from "./index-CwtpxPp2.js";
2
+ export { OCR_CLASSIFICATION_ACTION_ID, OCR_DIFFICULTY_CLASSES, OCR_DIFFICULTY_TAG_TYPE, OcrCanvasClassification, OcrCanvasClassificationSkip, OcrClassificationActionDependencies, OcrClassificationActionResult, OcrClassifierRun, OcrDifficultyClass, OcrDifficultyId, OcrDifficultyPrediction, backgroundActions, createOcrClassificationBackgroundAction, createOcrDifficultyTag, _default as default, formatOcrScore, selectOcrDifficulty };
package/dist/index.js ADDED
@@ -0,0 +1,2 @@
1
+ import{a as e,i as t,n,r,t as i}from"./ocr-difficulty-CjQvA3aZ.js";import{t as a}from"./plugin-Cn1QgMZa.js";import{createThumbnailHelper as o}from"@iiif/helpers";import{Modal as s}from"@manifest-editor/components";import{useEffect as c,useMemo as l,useState as u}from"react";import{Fragment as d,jsx as f,jsxs as p}from"react/jsx-runtime";async function m(e,t){let n=h(e,t);if(!n)return null;let r=(await o(e.vault).getBestThumbnailAtSize(n,{width:512,height:512,maxWidth:512,maxHeight:512,unsafeImageService:!0,allowUnsafe:!0,preferFixedSize:!0},!1)).best?.id;if(!r)return null;let i=await fetch(r,{signal:e.signal});if(!i.ok)throw Error(`Unable to fetch canvas image (${i.status}).`);return{url:r,blob:await i.blob()}}function h(e,t){let n=t?.items&&e.vault.get(t.items)||[];for(let t of n){let n=t?.items&&e.vault.get(t.items)||[];for(let t of n){if(!g(t))continue;let n=_(t?.body);if(n)return e.vault.get(n)||n}}return null}function g(e){return(Array.isArray(e?.motivation)?e.motivation:[e?.motivation]).includes(`painting`)}function _(e){return Array.isArray(e)?e[0]??null:e??null}const v=`@manifest-editor/ocr-classification:results`;function y(e,t){typeof window>`u`||window.dispatchEvent(new CustomEvent(v,{detail:{actionId:e,result:O(t)?t:void 0}}))}function b(e){return f(x,{actionId:e})}function x({actionId:e}){let[n,r]=u(null);c(()=>{let t=t=>{let n=t.detail;n?.actionId===e&&r(n)};return window.addEventListener(v,t),()=>window.removeEventListener(v,t)},[e]);let a=n?.result,o=l(()=>a?.classifications||[],[a]),m=l(()=>a?i.map(e=>({...e,count:a.counts?.[e.id]||0})):[],[a]);return n?f(s,{title:`OCR classification results`,onClose:()=>r(null),className:`max-w-6xl`,children:f(`div`,{className:`flex min-h-0 flex-col gap-4 p-4 text-sm text-zinc-700`,children:a?p(d,{children:[p(`div`,{className:`rounded border border-zinc-200 bg-white p-4`,children:[p(`div`,{className:`flex flex-wrap items-start justify-between gap-3`,children:[p(`div`,{className:`min-w-0`,children:[f(`div`,{className:`text-xs font-semibold uppercase text-zinc-500`,children:`Task complete`}),p(`div`,{className:`mt-1 text-lg font-semibold text-zinc-950`,children:[`Classified `,E(a.classified),` of `,E(a.total),` canvases`]}),f(`div`,{className:`mt-1 text-sm text-zinc-500`,children:a.skipped?`${E(a.skipped)} ${a.skipped===1?`canvas was`:`canvases were`} skipped. Review the skipped list below before rerunning.`:`Every canvas was classified and tagged.`})]}),p(`div`,{className:`rounded border border-zinc-200 bg-zinc-50 px-3 py-2 text-right`,children:[f(`div`,{className:`text-2xl font-semibold text-zinc-950`,children:D(a.classified,a.total)}),f(`div`,{className:`text-xs uppercase text-zinc-500`,children:`Coverage`})]})]}),f(`div`,{className:`mt-4 flex h-2 overflow-hidden rounded-full bg-zinc-100`,children:a.classified?m.map(e=>e.count?f(`div`,{className:`h-full`,style:{width:`${e.count/a.classified*100}%`,backgroundColor:e.backgroundColor}},e.id):null):f(`div`,{className:`h-full w-full bg-zinc-200`})}),f(`div`,{className:`mt-3 flex flex-wrap gap-2`,children:m.map(e=>p(`div`,{className:`inline-flex items-center gap-2 rounded border border-zinc-200 bg-zinc-50 px-2 py-1`,children:[f(`span`,{className:`h-2.5 w-2.5 rounded-full`,style:{backgroundColor:e.backgroundColor},"aria-hidden":`true`}),f(`span`,{className:`font-medium text-zinc-900`,children:e.label}),p(`span`,{className:`text-zinc-500`,children:[E(e.count),` (`,D(e.count,a.classified),`)`]})]},e.id))})]}),p(`div`,{className:`grid gap-2 sm:grid-cols-4`,children:[f(w,{label:`Total canvases`,value:E(a.total)}),f(w,{label:`Classified`,value:E(a.classified)}),f(w,{label:`Skipped`,value:E(a.skipped)}),f(w,{label:`Tags applied`,value:E(a.classifications.length)})]}),f(`div`,{className:`grid gap-2 sm:grid-cols-3`,children:m.map(e=>p(`div`,{className:`rounded border border-zinc-200 bg-white p-3`,children:[f(`div`,{className:`inline-flex rounded px-2 py-1 text-xs font-medium`,style:{backgroundColor:e.backgroundColor,color:e.textColor},children:e.label}),f(`div`,{className:`mt-2 text-xl font-semibold text-zinc-950`,children:E(e.count)}),p(`div`,{className:`mt-1 text-xs text-zinc-500`,children:[D(e.count,a.classified),` of classified canvases`]})]},e.id))}),o.length?p(`div`,{className:`min-h-0 overflow-hidden rounded border border-zinc-200`,children:[p(`div`,{className:`flex flex-wrap items-center justify-between gap-2 border-b border-zinc-200 bg-zinc-50 px-3 py-2`,children:[f(`div`,{className:`font-medium text-zinc-900`,children:`Classified canvases`}),p(`div`,{className:`text-xs text-zinc-500`,children:[`Showing all `,E(o.length),` classified results`]})]}),f(`div`,{className:`max-h-[55vh] overflow-auto`,children:p(`table`,{className:`w-full min-w-[820px] border-collapse text-left`,children:[f(`thead`,{className:`sticky top-0 bg-white text-xs uppercase text-zinc-500`,children:p(`tr`,{children:[f(`th`,{className:`w-14 border-b border-zinc-200 px-3 py-2 font-medium`,children:`#`}),f(`th`,{className:`border-b border-zinc-200 px-3 py-2 font-medium`,children:`Canvas`}),f(`th`,{className:`w-44 border-b border-zinc-200 px-3 py-2 font-medium`,children:`Result`}),f(`th`,{className:`w-28 border-b border-zinc-200 px-3 py-2 font-medium`,children:`Confidence`}),f(`th`,{className:`border-b border-zinc-200 px-3 py-2 font-medium`,children:`Scores`})]})}),f(`tbody`,{children:o.map((e,n)=>{let r=e.canvasLabel||e.canvasId;return p(`tr`,{className:`border-b border-zinc-100 last:border-0`,children:[f(`td`,{className:`px-3 py-2 align-top text-xs text-zinc-400`,children:n+1}),p(`td`,{className:`px-3 py-2 align-top`,title:e.canvasId,children:[f(`div`,{className:`font-medium text-zinc-900`,children:r}),r===e.canvasId?null:f(`div`,{className:`mt-0.5 break-all text-xs text-zinc-500`,children:e.canvasId})]}),f(`td`,{className:`px-3 py-2 align-top`,children:f(S,{tagId:e.tagId,label:e.label})}),f(`td`,{className:`px-3 py-2 align-top font-medium text-zinc-900`,children:t(e.score)}),f(`td`,{className:`px-3 py-2 align-top text-xs text-zinc-500`,children:f(C,{scores:e.scores})})]},e.canvasId)})})]})})]}):f(`div`,{className:`rounded border border-zinc-200 bg-zinc-50 p-3`,children:`No canvases were classified. Check the skipped canvases and task logs for details.`}),a.skippedCanvases.length?p(`details`,{open:!0,className:`rounded border border-zinc-200 bg-zinc-50`,children:[p(`summary`,{className:`cursor-pointer px-3 py-2 font-medium text-zinc-900`,children:[`Skipped canvases (`,a.skippedCanvases.length,`)`]}),f(`div`,{className:`max-h-52 overflow-auto border-t border-zinc-200 bg-white`,children:a.skippedCanvases.map(e=>p(`div`,{className:`grid gap-1 border-b border-zinc-100 px-3 py-2 last:border-0`,children:[f(`div`,{className:`font-medium text-zinc-900`,children:e.canvasLabel||e.canvasId}),e.canvasLabel&&e.canvasLabel!==e.canvasId?f(`div`,{className:`break-all text-xs text-zinc-500`,children:e.canvasId}):null,f(`div`,{className:`text-xs text-zinc-500`,children:e.reason})]},e.canvasId))})]}):null]}):f(`div`,{className:`rounded border border-zinc-200 bg-zinc-50 p-3`,children:`No result data is available for this run.`})})}):null}function S({tagId:e,label:t}){let n=T(e);return f(`span`,{className:`inline-flex rounded px-2 py-1 text-xs font-medium`,style:{backgroundColor:n?.backgroundColor||`#f4f4f5`,color:n?.textColor||`#18181b`},children:t})}function C({scores:e}){return f(`div`,{className:`flex flex-wrap gap-1.5`,children:e.map((e,n)=>p(`span`,{className:`whitespace-nowrap rounded bg-zinc-100 px-1.5 py-0.5`,children:[i[n]?.id||`class-${n}`,`: `,t(e)]},n))})}function w({label:e,value:t}){return p(`div`,{className:`rounded border border-zinc-200 bg-white p-3`,children:[f(`div`,{className:`text-xs uppercase text-zinc-500`,children:e}),f(`div`,{className:`mt-1 text-xl font-semibold text-zinc-950`,children:t})]})}function T(e){return i.find(t=>t.id===e)}function E(e){return new Intl.NumberFormat().format(e)}function D(e,n){return n?t(e/n):`0%`}function O(e){if(!e||typeof e!=`object`)return!1;let t=e;return typeof t.total==`number`&&typeof t.classified==`number`&&typeof t.skipped==`number`&&!!t.counts&&typeof t.counts==`object`&&Array.isArray(t.classifications)&&Array.isArray(t.skippedCanvases)}const k=`@manifest-editor/ocr-classification/classify-canvases`;function A(e={}){let t=e.prepareClassifier||P,n=e.getCanvasImage||m,i=e.classifyImage||F;return{id:k,label:`Classify OCR difficulty`,summary:`Tag each canvas by OCR difficulty`,section:`OCR`,order:10,resourceTypes:[`Manifest`],resumable:!0,render:()=>b(k),onResults:e=>y(e.definition.id,e.instance?.result),supports:e=>!!e.vault.get(e.target)?.items?.length,prepare:e=>j(R(e)),run:async e=>{let a=e.plan||j(R(e)),o=e.tasks.getAll(),s=e.tasks.getPending();if(e.setActionLabel(`Classifying OCR difficulty`),!o.length)return e.setActionStatus(`running`,`No canvases to classify`),M(0);s.length&&(e.canvasProgress.setStatuses(s.map(e=>e.target).filter(e=>!!e&&e.type===`Canvas`),`queued`),e.setActionStatus(`running`,`Loading OCR classifier`),await t(),await e.tasks.runEach(async(t,{index:a,total:o})=>{I(e.signal);let s=t.target?.id||t.input?.canvasId||t.id,c=z(e,s),l=B(c,s),u=`Classifying ${a+1}/${o}`;e.appendActionLog(u,`info`,{canvasId:s,current:a+1,total:o});try{let t=c?await n(e,c):null;if(!t){let t={canvasId:s,canvasLabel:l,reason:`No painting image found`};return e.appendActionLog(`Skipped canvas classification`,`warn`,{canvasId:s,reason:t.reason}),{taskStatus:`skipped`,result:{type:`skipped`,skip:t}}}let a=await i(t.blob),o=r(a.prediction);e.tags.upsertTag({id:s,type:`Canvas`},o);let u={canvasId:s,canvasLabel:l,tagId:o.id,label:o.label,score:a.prediction.score,scores:a.scores,imageUrl:t.url};return e.appendActionLog(`Classified canvas`,`info`,{canvasId:s,label:o.label,score:a.prediction.score}),{taskStatus:`complete`,result:{type:`classified`,classification:u}}}catch(t){if(e.signal.aborted)throw t;let n={canvasId:s,canvasLabel:l,reason:L(t)};return e.appendActionLog(`Skipped canvas classification`,`warn`,{canvasId:s,reason:n.reason}),{taskStatus:`skipped`,result:{type:`skipped`,skip:n}}}},{progressLabel:(e,t,n)=>`Classifying ${t+1}/${n}`}));let c=N(e.tasks.getAll().length?e.tasks.getAll():a.tasks);return e.setActionStatus(`running`,`Classified ${c.classified}/${c.total}`),e.setActionProgress({current:c.total,total:c.total,label:`Classification complete`}),e.appendActionLog(`Classification complete`,`info`,{total:c.total,classified:c.classified,skipped:c.skipped,counts:c.counts}),c}}}function j(e){return{version:1,tasks:e.map((e,t)=>{let n=e?.id||`canvas-${t+1}`,r=B(e,n);return{id:`canvas:${n}`,label:r,target:{id:n,type:`Canvas`,label:r,scope:`canvas`},input:{canvasId:n,canvasLabel:r},status:`queued`}})}}function M(e){return{total:e,classified:0,skipped:0,counts:Object.fromEntries(i.map(e=>[e.id,0])),classifications:[],skippedCanvases:[]}}function N(e){let t=M(e.length);for(let n of e){let e=n.result;if(e?.type===`classified`){t.classifications.push(e.classification),t.counts[e.classification.tagId]=(t.counts[e.classification.tagId]||0)+1;continue}if(e?.type===`skipped`){t.skippedCanvases.push(e.skip);continue}if(n.status===`error`&&n.error){let e=n.target?.id||n.id;t.skippedCanvases.push({canvasId:e,canvasLabel:n.label||e,reason:n.error.message})}}return t.classified=t.classifications.length,t.skipped=t.skippedCanvases.length,t}async function P(){let{loadOcrClassifier:e}=await import(`./onnx-classifier-mb_6hJ1l.js`);await e()}async function F(e){let{runOcrClassifier:t}=await import(`./onnx-classifier-mb_6hJ1l.js`);return t(e)}function I(e){if(e.aborted)throw Error(`OCR classification cancelled.`)}function L(e){return e instanceof Error?e.message:`Canvas classification failed`}function R(e){let t=e.vault.get(e.target);return t?.items?(e.vault.get(t.items)||[]).filter(Boolean):[]}function z(e,t){return e.vault.get({id:t,type:`Canvas`})}function B(e,t){let n=e?.label;if(!n)return t;if(typeof n==`string`)return n;let r=Array.isArray(n.en)?n.en[0]:void 0;if(r)return r;let i=Object.keys(n)[0];return(i&&Array.isArray(n[i])?n[i][0]:void 0)||t}const V=[A()];export{k as OCR_CLASSIFICATION_ACTION_ID,i as OCR_DIFFICULTY_CLASSES,n as OCR_DIFFICULTY_TAG_TYPE,V as backgroundActions,A as createOcrClassificationBackgroundAction,r as createOcrDifficultyTag,a as default,t as formatOcrScore,e as selectOcrDifficulty};
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":["result","backgroundActions: BackgroundActionDefinition[]"],"sources":["../src/canvas-image.ts","../src/results.tsx","../src/background-action.ts","../src/index.ts"],"sourcesContent":["import { createThumbnailHelper } from \"@iiif/helpers\";\nimport type { BackgroundActionRunContext } from \"@manifest-editor/shell\";\n\nexport type CanvasImageForClassification = {\n url: string;\n blob: Blob;\n};\n\nexport async function getCanvasImageForClassification(\n ctx: BackgroundActionRunContext,\n canvas: any,\n): Promise<CanvasImageForClassification | null> {\n const paintingBody = getFirstPaintingBody(ctx, canvas);\n if (!paintingBody) {\n return null;\n }\n\n const thumbnailHelper = createThumbnailHelper(ctx.vault);\n const thumbnail = await thumbnailHelper.getBestThumbnailAtSize(\n paintingBody,\n {\n width: 512,\n height: 512,\n maxWidth: 512,\n maxHeight: 512,\n unsafeImageService: true,\n allowUnsafe: true,\n preferFixedSize: true,\n },\n false,\n );\n const url = thumbnail.best?.id;\n\n if (!url) {\n return null;\n }\n\n const response = await fetch(url, { signal: ctx.signal });\n if (!response.ok) {\n throw new Error(`Unable to fetch canvas image (${response.status}).`);\n }\n\n return {\n url,\n blob: await response.blob(),\n };\n}\n\nfunction getFirstPaintingBody(ctx: BackgroundActionRunContext, canvas: any) {\n const pages = canvas?.items ? ctx.vault.get(canvas.items) || [] : [];\n\n for (const page of pages) {\n const annotations = page?.items ? ctx.vault.get(page.items) || [] : [];\n for (const annotation of annotations) {\n if (!isPaintingAnnotation(annotation)) {\n continue;\n }\n\n const body = first(annotation?.body);\n if (!body) {\n continue;\n }\n\n return ctx.vault.get(body) || body;\n }\n }\n\n return null;\n}\n\nfunction isPaintingAnnotation(annotation: any) {\n const motivation = Array.isArray(annotation?.motivation) ? annotation.motivation : [annotation?.motivation];\n return motivation.includes(\"painting\");\n}\n\nfunction first<T>(value: T | T[] | null | undefined): T | null {\n if (Array.isArray(value)) {\n return value[0] ?? null;\n }\n\n return value ?? null;\n}\n","import { Modal } from \"@manifest-editor/components\";\nimport { useEffect, useMemo, useState } from \"react\";\nimport type { OcrClassificationActionResult } from \"./background-action\";\nimport { formatOcrScore, OCR_DIFFICULTY_CLASSES } from \"./ocr-difficulty\";\n\nconst resultsEventName = \"@manifest-editor/ocr-classification:results\";\n\ntype OcrClassificationResultsEvent = {\n actionId: string;\n result?: OcrClassificationActionResult;\n};\n\nexport function openOcrClassificationResults(actionId: string, result: unknown) {\n if (typeof window === \"undefined\") {\n return;\n }\n\n window.dispatchEvent(\n new CustomEvent<OcrClassificationResultsEvent>(resultsEventName, {\n detail: {\n actionId,\n result: isOcrClassificationActionResult(result) ? result : undefined,\n },\n }),\n );\n}\n\nexport function renderOcrClassificationResults(actionId: string) {\n return <OcrClassificationResultsModal actionId={actionId} />;\n}\n\nfunction OcrClassificationResultsModal({ actionId }: { actionId: string }) {\n const [activeResult, setActiveResult] = useState<OcrClassificationResultsEvent | null>(null);\n\n useEffect(() => {\n const listener = (event: Event) => {\n const detail = (event as CustomEvent<OcrClassificationResultsEvent>).detail;\n if (detail?.actionId === actionId) {\n setActiveResult(detail);\n }\n };\n\n window.addEventListener(resultsEventName, listener);\n return () => window.removeEventListener(resultsEventName, listener);\n }, [actionId]);\n\n const result = activeResult?.result;\n const classifiedRows = useMemo(() => result?.classifications || [], [result]);\n const difficultyRows = useMemo(\n () =>\n result\n ? OCR_DIFFICULTY_CLASSES.map((item) => ({\n ...item,\n count: result.counts?.[item.id] || 0,\n }))\n : [],\n [result],\n );\n\n if (!activeResult) {\n return null;\n }\n\n return (\n <Modal title=\"OCR classification results\" onClose={() => setActiveResult(null)} className=\"max-w-6xl\">\n <div className=\"flex min-h-0 flex-col gap-4 p-4 text-sm text-zinc-700\">\n {!result ? (\n <div className=\"rounded border border-zinc-200 bg-zinc-50 p-3\">No result data is available for this run.</div>\n ) : (\n <>\n <div className=\"rounded border border-zinc-200 bg-white p-4\">\n <div className=\"flex flex-wrap items-start justify-between gap-3\">\n <div className=\"min-w-0\">\n <div className=\"text-xs font-semibold uppercase text-zinc-500\">Task complete</div>\n <div className=\"mt-1 text-lg font-semibold text-zinc-950\">\n Classified {formatNumber(result.classified)} of {formatNumber(result.total)} canvases\n </div>\n <div className=\"mt-1 text-sm text-zinc-500\">\n {result.skipped\n ? `${formatNumber(result.skipped)} ${result.skipped === 1 ? \"canvas was\" : \"canvases were\"} skipped. Review the skipped list below before rerunning.`\n : \"Every canvas was classified and tagged.\"}\n </div>\n </div>\n <div className=\"rounded border border-zinc-200 bg-zinc-50 px-3 py-2 text-right\">\n <div className=\"text-2xl font-semibold text-zinc-950\">\n {formatRatio(result.classified, result.total)}\n </div>\n <div className=\"text-xs uppercase text-zinc-500\">Coverage</div>\n </div>\n </div>\n\n <div className=\"mt-4 flex h-2 overflow-hidden rounded-full bg-zinc-100\">\n {result.classified ? (\n difficultyRows.map((item) =>\n item.count ? (\n <div\n key={item.id}\n className=\"h-full\"\n style={{\n width: `${(item.count / result.classified) * 100}%`,\n backgroundColor: item.backgroundColor,\n }}\n />\n ) : null,\n )\n ) : (\n <div className=\"h-full w-full bg-zinc-200\" />\n )}\n </div>\n\n <div className=\"mt-3 flex flex-wrap gap-2\">\n {difficultyRows.map((item) => (\n <div\n key={item.id}\n className=\"inline-flex items-center gap-2 rounded border border-zinc-200 bg-zinc-50 px-2 py-1\"\n >\n <span\n className=\"h-2.5 w-2.5 rounded-full\"\n style={{ backgroundColor: item.backgroundColor }}\n aria-hidden=\"true\"\n />\n <span className=\"font-medium text-zinc-900\">{item.label}</span>\n <span className=\"text-zinc-500\">\n {formatNumber(item.count)} ({formatRatio(item.count, result.classified)})\n </span>\n </div>\n ))}\n </div>\n </div>\n\n <div className=\"grid gap-2 sm:grid-cols-4\">\n <SummaryStat label=\"Total canvases\" value={formatNumber(result.total)} />\n <SummaryStat label=\"Classified\" value={formatNumber(result.classified)} />\n <SummaryStat label=\"Skipped\" value={formatNumber(result.skipped)} />\n <SummaryStat label=\"Tags applied\" value={formatNumber(result.classifications.length)} />\n </div>\n\n <div className=\"grid gap-2 sm:grid-cols-3\">\n {difficultyRows.map((item) => (\n <div key={item.id} className=\"rounded border border-zinc-200 bg-white p-3\">\n <div\n className=\"inline-flex rounded px-2 py-1 text-xs font-medium\"\n style={{ backgroundColor: item.backgroundColor, color: item.textColor }}\n >\n {item.label}\n </div>\n <div className=\"mt-2 text-xl font-semibold text-zinc-950\">{formatNumber(item.count)}</div>\n <div className=\"mt-1 text-xs text-zinc-500\">\n {formatRatio(item.count, result.classified)} of classified canvases\n </div>\n </div>\n ))}\n </div>\n\n {classifiedRows.length ? (\n <div className=\"min-h-0 overflow-hidden rounded border border-zinc-200\">\n <div className=\"flex flex-wrap items-center justify-between gap-2 border-b border-zinc-200 bg-zinc-50 px-3 py-2\">\n <div className=\"font-medium text-zinc-900\">Classified canvases</div>\n <div className=\"text-xs text-zinc-500\">\n Showing all {formatNumber(classifiedRows.length)} classified results\n </div>\n </div>\n <div className=\"max-h-[55vh] overflow-auto\">\n <table className=\"w-full min-w-[820px] border-collapse text-left\">\n <thead className=\"sticky top-0 bg-white text-xs uppercase text-zinc-500\">\n <tr>\n <th className=\"w-14 border-b border-zinc-200 px-3 py-2 font-medium\">#</th>\n <th className=\"border-b border-zinc-200 px-3 py-2 font-medium\">Canvas</th>\n <th className=\"w-44 border-b border-zinc-200 px-3 py-2 font-medium\">Result</th>\n <th className=\"w-28 border-b border-zinc-200 px-3 py-2 font-medium\">Confidence</th>\n <th className=\"border-b border-zinc-200 px-3 py-2 font-medium\">Scores</th>\n </tr>\n </thead>\n <tbody>\n {classifiedRows.map((item, index) => {\n const canvasLabel = item.canvasLabel || item.canvasId;\n return (\n <tr key={item.canvasId} className=\"border-b border-zinc-100 last:border-0\">\n <td className=\"px-3 py-2 align-top text-xs text-zinc-400\">{index + 1}</td>\n <td className=\"px-3 py-2 align-top\" title={item.canvasId}>\n <div className=\"font-medium text-zinc-900\">{canvasLabel}</div>\n {canvasLabel !== item.canvasId ? (\n <div className=\"mt-0.5 break-all text-xs text-zinc-500\">{item.canvasId}</div>\n ) : null}\n </td>\n <td className=\"px-3 py-2 align-top\">\n <DifficultyBadge tagId={item.tagId} label={item.label} />\n </td>\n <td className=\"px-3 py-2 align-top font-medium text-zinc-900\">\n {formatOcrScore(item.score)}\n </td>\n <td className=\"px-3 py-2 align-top text-xs text-zinc-500\">\n <ScoreList scores={item.scores} />\n </td>\n </tr>\n );\n })}\n </tbody>\n </table>\n </div>\n </div>\n ) : (\n <div className=\"rounded border border-zinc-200 bg-zinc-50 p-3\">\n No canvases were classified. Check the skipped canvases and task logs for details.\n </div>\n )}\n\n {result.skippedCanvases.length ? (\n <details open className=\"rounded border border-zinc-200 bg-zinc-50\">\n <summary className=\"cursor-pointer px-3 py-2 font-medium text-zinc-900\">\n Skipped canvases ({result.skippedCanvases.length})\n </summary>\n <div className=\"max-h-52 overflow-auto border-t border-zinc-200 bg-white\">\n {result.skippedCanvases.map((item) => (\n <div key={item.canvasId} className=\"grid gap-1 border-b border-zinc-100 px-3 py-2 last:border-0\">\n <div className=\"font-medium text-zinc-900\">{item.canvasLabel || item.canvasId}</div>\n {item.canvasLabel && item.canvasLabel !== item.canvasId ? (\n <div className=\"break-all text-xs text-zinc-500\">{item.canvasId}</div>\n ) : null}\n <div className=\"text-xs text-zinc-500\">{item.reason}</div>\n </div>\n ))}\n </div>\n </details>\n ) : null}\n </>\n )}\n </div>\n </Modal>\n );\n}\n\nfunction DifficultyBadge({ tagId, label }: { tagId: string; label: string }) {\n const difficultyClass = getDifficultyClass(tagId);\n\n return (\n <span\n className=\"inline-flex rounded px-2 py-1 text-xs font-medium\"\n style={{\n backgroundColor: difficultyClass?.backgroundColor || \"#f4f4f5\",\n color: difficultyClass?.textColor || \"#18181b\",\n }}\n >\n {label}\n </span>\n );\n}\n\nfunction ScoreList({ scores }: { scores: number[] }) {\n return (\n <div className=\"flex flex-wrap gap-1.5\">\n {scores.map((score, index) => (\n <span key={index} className=\"whitespace-nowrap rounded bg-zinc-100 px-1.5 py-0.5\">\n {OCR_DIFFICULTY_CLASSES[index]?.id || `class-${index}`}: {formatOcrScore(score)}\n </span>\n ))}\n </div>\n );\n}\n\nfunction SummaryStat({ label, value }: { label: string; value: string }) {\n return (\n <div className=\"rounded border border-zinc-200 bg-white p-3\">\n <div className=\"text-xs uppercase text-zinc-500\">{label}</div>\n <div className=\"mt-1 text-xl font-semibold text-zinc-950\">{value}</div>\n </div>\n );\n}\n\nfunction getDifficultyClass(tagId: string) {\n return OCR_DIFFICULTY_CLASSES.find((item) => item.id === tagId);\n}\n\nfunction formatNumber(value: number) {\n return new Intl.NumberFormat().format(value);\n}\n\nfunction formatRatio(value: number, total: number) {\n return total ? formatOcrScore(value / total) : \"0%\";\n}\n\nfunction isOcrClassificationActionResult(result: unknown): result is OcrClassificationActionResult {\n if (!result || typeof result !== \"object\") {\n return false;\n }\n\n const candidate = result as Partial<OcrClassificationActionResult>;\n return (\n typeof candidate.total === \"number\" &&\n typeof candidate.classified === \"number\" &&\n typeof candidate.skipped === \"number\" &&\n !!candidate.counts &&\n typeof candidate.counts === \"object\" &&\n Array.isArray(candidate.classifications) &&\n Array.isArray(candidate.skippedCanvases)\n );\n}\n","import type {\n BackgroundActionDefinition,\n BackgroundActionPlan,\n BackgroundActionRunContext,\n BackgroundActionTask,\n} from \"@manifest-editor/shell\";\nimport { type CanvasImageForClassification, getCanvasImageForClassification } from \"./canvas-image\";\nimport {\n createOcrDifficultyTag,\n formatOcrScore,\n OCR_DIFFICULTY_CLASSES,\n OCR_DIFFICULTY_TAG_TYPE,\n type OcrClassifierRun,\n} from \"./ocr-difficulty\";\nimport { openOcrClassificationResults, renderOcrClassificationResults } from \"./results\";\n\nexport const OCR_CLASSIFICATION_ACTION_ID = \"@manifest-editor/ocr-classification/classify-canvases\";\n\nexport type OcrCanvasClassification = {\n canvasId: string;\n canvasLabel: string;\n tagId: string;\n label: string;\n score: number;\n scores: number[];\n imageUrl: string;\n};\n\nexport type OcrCanvasClassificationSkip = {\n canvasId: string;\n canvasLabel: string;\n reason: string;\n};\n\nexport type OcrClassificationActionResult = {\n total: number;\n classified: number;\n skipped: number;\n counts: Record<string, number>;\n classifications: OcrCanvasClassification[];\n skippedCanvases: OcrCanvasClassificationSkip[];\n};\n\ntype OcrClassificationTaskResult =\n | {\n type: \"classified\";\n classification: OcrCanvasClassification;\n }\n | {\n type: \"skipped\";\n skip: OcrCanvasClassificationSkip;\n };\n\nexport type OcrClassificationActionDependencies = {\n prepareClassifier?: () => Promise<void>;\n getCanvasImage?: (ctx: BackgroundActionRunContext, canvas: any) => Promise<CanvasImageForClassification | null>;\n classifyImage?: (image: Blob) => Promise<OcrClassifierRun>;\n};\n\nexport function createOcrClassificationBackgroundAction(\n dependencies: OcrClassificationActionDependencies = {},\n): BackgroundActionDefinition {\n const prepareClassifier = dependencies.prepareClassifier || defaultPrepareClassifier;\n const getCanvasImage = dependencies.getCanvasImage || getCanvasImageForClassification;\n const classifyImage = dependencies.classifyImage || defaultClassifyImage;\n\n return {\n id: OCR_CLASSIFICATION_ACTION_ID,\n label: \"Classify OCR difficulty\",\n summary: \"Tag each canvas by OCR difficulty\",\n section: \"OCR\",\n order: 10,\n resourceTypes: [\"Manifest\"],\n resumable: true,\n render: () => renderOcrClassificationResults(OCR_CLASSIFICATION_ACTION_ID),\n onResults: (ctx) => openOcrClassificationResults(ctx.definition.id, ctx.instance?.result),\n supports: (ctx) => {\n const manifest = ctx.vault.get(ctx.target as any) as any;\n return !!manifest?.items?.length;\n },\n prepare: (ctx) => {\n return createClassificationPlan(getManifestCanvases(ctx));\n },\n run: async (ctx) => {\n const plan = ctx.plan || createClassificationPlan(getManifestCanvases(ctx));\n const tasks = ctx.tasks.getAll();\n const pendingTasks = ctx.tasks.getPending();\n\n ctx.setActionLabel(\"Classifying OCR difficulty\");\n\n if (!tasks.length) {\n ctx.setActionStatus(\"running\", \"No canvases to classify\");\n return createEmptyResult(0);\n }\n\n if (pendingTasks.length) {\n ctx.canvasProgress.setStatuses(\n pendingTasks\n .map((task) => task.target)\n .filter((target): target is NonNullable<BackgroundActionTask[\"target\"]> => !!target && target.type === \"Canvas\"),\n \"queued\",\n );\n ctx.setActionStatus(\"running\", \"Loading OCR classifier\");\n await prepareClassifier();\n\n await ctx.tasks.runEach(\n async (task, { index, total }) => {\n throwIfAborted(ctx.signal);\n const canvasId = task.target?.id || (task.input as { canvasId?: string } | undefined)?.canvasId || task.id;\n const canvas = getCanvasById(ctx, canvasId);\n const canvasLabel = getCanvasLabel(canvas, canvasId);\n const label = `Classifying ${index + 1}/${total}`;\n\n ctx.appendActionLog(label, \"info\", { canvasId, current: index + 1, total });\n\n try {\n const image = canvas ? await getCanvasImage(ctx, canvas) : null;\n if (!image) {\n const skip = {\n canvasId,\n canvasLabel,\n reason: \"No painting image found\",\n };\n ctx.appendActionLog(\"Skipped canvas classification\", \"warn\", {\n canvasId,\n reason: skip.reason,\n });\n return {\n taskStatus: \"skipped\",\n result: {\n type: \"skipped\",\n skip,\n } satisfies OcrClassificationTaskResult,\n };\n }\n\n const classification = await classifyImage(image.blob);\n const tag = createOcrDifficultyTag(classification.prediction);\n ctx.tags.upsertTag({ id: canvasId, type: \"Canvas\" }, tag);\n\n const result = {\n canvasId,\n canvasLabel,\n tagId: tag.id,\n label: tag.label,\n score: classification.prediction.score,\n scores: classification.scores,\n imageUrl: image.url,\n };\n ctx.appendActionLog(\"Classified canvas\", \"info\", {\n canvasId,\n label: tag.label,\n score: classification.prediction.score,\n });\n return {\n taskStatus: \"complete\",\n result: {\n type: \"classified\",\n classification: result,\n } satisfies OcrClassificationTaskResult,\n };\n } catch (error) {\n if (ctx.signal.aborted) {\n throw error;\n }\n\n const skip = {\n canvasId,\n canvasLabel,\n reason: getErrorMessage(error),\n };\n ctx.appendActionLog(\"Skipped canvas classification\", \"warn\", {\n canvasId,\n reason: skip.reason,\n });\n return {\n taskStatus: \"skipped\",\n result: {\n type: \"skipped\",\n skip,\n } satisfies OcrClassificationTaskResult,\n };\n }\n },\n {\n progressLabel: (_task, index, total) => `Classifying ${index + 1}/${total}`,\n },\n );\n }\n\n const result = aggregateClassificationResult(ctx.tasks.getAll().length ? ctx.tasks.getAll() : plan.tasks);\n ctx.setActionStatus(\"running\", `Classified ${result.classified}/${result.total}`);\n ctx.setActionProgress({ current: result.total, total: result.total, label: \"Classification complete\" });\n ctx.appendActionLog(\"Classification complete\", \"info\", {\n total: result.total,\n classified: result.classified,\n skipped: result.skipped,\n counts: result.counts,\n });\n\n return result;\n },\n };\n}\n\nfunction createClassificationPlan(canvases: any[]): BackgroundActionPlan {\n return {\n version: 1,\n tasks: canvases.map((canvas, index) => {\n const canvasId = canvas?.id || `canvas-${index + 1}`;\n const canvasLabel = getCanvasLabel(canvas, canvasId);\n return {\n id: `canvas:${canvasId}`,\n label: canvasLabel,\n target: {\n id: canvasId,\n type: \"Canvas\",\n label: canvasLabel,\n scope: \"canvas\",\n },\n input: {\n canvasId,\n canvasLabel,\n },\n status: \"queued\",\n };\n }),\n };\n}\n\nfunction createEmptyResult(total: number): OcrClassificationActionResult {\n return {\n total,\n classified: 0,\n skipped: 0,\n counts: Object.fromEntries(OCR_DIFFICULTY_CLASSES.map((item) => [item.id, 0])),\n classifications: [],\n skippedCanvases: [],\n };\n}\n\nfunction aggregateClassificationResult(tasks: BackgroundActionTask[]): OcrClassificationActionResult {\n const result = createEmptyResult(tasks.length);\n\n for (const task of tasks) {\n const taskResult = task.result as OcrClassificationTaskResult | undefined;\n if (taskResult?.type === \"classified\") {\n result.classifications.push(taskResult.classification);\n result.counts[taskResult.classification.tagId] = (result.counts[taskResult.classification.tagId] || 0) + 1;\n continue;\n }\n\n if (taskResult?.type === \"skipped\") {\n result.skippedCanvases.push(taskResult.skip);\n continue;\n }\n\n if (task.status === \"error\" && task.error) {\n const canvasId = task.target?.id || task.id;\n result.skippedCanvases.push({\n canvasId,\n canvasLabel: task.label || canvasId,\n reason: task.error.message,\n });\n }\n }\n\n result.classified = result.classifications.length;\n result.skipped = result.skippedCanvases.length;\n return result;\n}\n\nasync function defaultPrepareClassifier() {\n const { loadOcrClassifier } = await import(\"./onnx-classifier\");\n await loadOcrClassifier();\n}\n\nasync function defaultClassifyImage(image: Blob) {\n const { runOcrClassifier } = await import(\"./onnx-classifier\");\n return runOcrClassifier(image);\n}\n\nfunction throwIfAborted(signal: AbortSignal) {\n if (signal.aborted) {\n throw new Error(\"OCR classification cancelled.\");\n }\n}\n\nfunction getErrorMessage(error: unknown) {\n return error instanceof Error ? error.message : \"Canvas classification failed\";\n}\n\nfunction getManifestCanvases(ctx: BackgroundActionRunContext) {\n const manifest = ctx.vault.get(ctx.target as any) as any;\n return manifest?.items ? (ctx.vault.get(manifest.items) || []).filter(Boolean) : [];\n}\n\nfunction getCanvasById(ctx: BackgroundActionRunContext, canvasId: string) {\n return ctx.vault.get({ id: canvasId, type: \"Canvas\" } as any) as any;\n}\n\nfunction getCanvasLabel(canvas: any, fallback: string) {\n const label = canvas?.label;\n if (!label) {\n return fallback;\n }\n\n if (typeof label === \"string\") {\n return label;\n }\n\n const englishLabel = Array.isArray(label.en) ? label.en[0] : undefined;\n if (englishLabel) {\n return englishLabel;\n }\n\n const firstLanguage = Object.keys(label)[0];\n const firstValue = firstLanguage && Array.isArray(label[firstLanguage]) ? label[firstLanguage][0] : undefined;\n return firstValue || fallback;\n}\n\nexport { OCR_DIFFICULTY_TAG_TYPE, formatOcrScore };\n","import type { BackgroundActionDefinition } from \"@manifest-editor/shell\";\nimport { createOcrClassificationBackgroundAction } from \"./background-action\";\nexport { default } from \"./plugin\";\n\nexport const backgroundActions: BackgroundActionDefinition[] = [createOcrClassificationBackgroundAction()];\n\nexport * from \"./background-action\";\nexport * from \"./ocr-difficulty\";\n"],"mappings":"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"}
package/dist/lazy.cjs ADDED
@@ -0,0 +1 @@
1
+ const e=require(`./plugin-Bfd4lYW9.cjs`);var t={default:e.t,load:()=>Promise.resolve().then(()=>require(`./index.cjs`))};module.exports=t;
@@ -0,0 +1,21 @@
1
+ import { n as index_d_exports } from "./index-MMJWr93c.cjs";
2
+
3
+ //#region src/lazy.d.ts
4
+ declare const _default: {
5
+ default: {
6
+ id: string;
7
+ label: string;
8
+ description: string;
9
+ author: string;
10
+ official: true;
11
+ defaultEnabled: false;
12
+ tags: string[];
13
+ supports: {
14
+ apps: string[];
15
+ projectTypes: "Manifest"[];
16
+ };
17
+ };
18
+ load: () => Promise<typeof index_d_exports>;
19
+ };
20
+ export = _default;
21
+ //# sourceMappingURL=lazy.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lazy.d.cts","names":[],"sources":["../src/lazy.ts"],"sourcesContent":[],"mappings":""}
package/dist/lazy.d.ts ADDED
@@ -0,0 +1,22 @@
1
+ import { n as index_d_exports } from "./index-CwtpxPp2.js";
2
+
3
+ //#region src/lazy.d.ts
4
+ declare const _default: {
5
+ default: {
6
+ id: string;
7
+ label: string;
8
+ description: string;
9
+ author: string;
10
+ official: true;
11
+ defaultEnabled: false;
12
+ tags: string[];
13
+ supports: {
14
+ apps: string[];
15
+ projectTypes: "Manifest"[];
16
+ };
17
+ };
18
+ load: () => Promise<typeof index_d_exports>;
19
+ };
20
+ //#endregion
21
+ export { _default as default };
22
+ //# sourceMappingURL=lazy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lazy.d.ts","names":[],"sources":["../src/lazy.ts"],"sourcesContent":[],"mappings":""}
package/dist/lazy.js ADDED
@@ -0,0 +1,2 @@
1
+ import{t as e}from"./plugin-Cn1QgMZa.js";var t={default:e,load:()=>import(`./index.js`)};export{t as default};
2
+ //# sourceMappingURL=lazy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lazy.js","names":["metadata"],"sources":["../src/lazy.ts"],"sourcesContent":["import type { LazyPluginModule } from \"@manifest-editor/shell\";\nimport metadata from \"./plugin\";\n\nexport default {\n default: metadata,\n load: () => import(\"./index\"),\n} satisfies LazyPluginModule;\n"],"mappings":"yCAGA,IAAA,EAAe,CACb,QAASA,EACT,SAAY,OAAO,cACpB"}
@@ -0,0 +1 @@
1
+ const e=`ocr-difficulty`,t=[{id:`easy`,index:0,label:`OCR Easy`,backgroundColor:`#047857`,textColor:`#ffffff`},{id:`medium`,index:1,label:`OCR Medium`,backgroundColor:`#b45309`,textColor:`#ffffff`},{id:`difficult`,index:2,label:`OCR Difficult`,backgroundColor:`#991b1b`,textColor:`#ffffff`}];function n(e){if(!e.length)throw Error(`OCR classifier returned no scores.`);let n=0,r=Number(e[0]??0);for(let t=1;t<e.length;t+=1){let i=Number(e[t]);i>r&&(n=t,r=i)}return{...t[n]??t[2],score:r}}function r(t){return{type:e,id:t.id,label:t.label,backgroundColor:t.backgroundColor,textColor:t.textColor}}function i(e){return`${Math.round(e*1e3)/10}%`}Object.defineProperty(exports,`a`,{enumerable:!0,get:function(){return n}}),Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return i}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return e}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return r}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return t}});
@@ -0,0 +1,2 @@
1
+ const e=`ocr-difficulty`,t=[{id:`easy`,index:0,label:`OCR Easy`,backgroundColor:`#047857`,textColor:`#ffffff`},{id:`medium`,index:1,label:`OCR Medium`,backgroundColor:`#b45309`,textColor:`#ffffff`},{id:`difficult`,index:2,label:`OCR Difficult`,backgroundColor:`#991b1b`,textColor:`#ffffff`}];function n(e){if(!e.length)throw Error(`OCR classifier returned no scores.`);let n=0,r=Number(e[0]??0);for(let t=1;t<e.length;t+=1){let i=Number(e[t]);i>r&&(n=t,r=i)}return{...t[n]??t[2],score:r}}function r(t){return{type:e,id:t.id,label:t.label,backgroundColor:t.backgroundColor,textColor:t.textColor}}function i(e){return`${Math.round(e*1e3)/10}%`}export{n as a,i,e as n,r,t};
2
+ //# sourceMappingURL=ocr-difficulty-CjQvA3aZ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ocr-difficulty-CjQvA3aZ.js","names":["OCR_DIFFICULTY_CLASSES: OcrDifficultyClass[]"],"sources":["../src/ocr-difficulty.ts"],"sourcesContent":["import type { ManifestEditorTag } from \"@manifest-editor/shell\";\n\nexport const OCR_DIFFICULTY_TAG_TYPE = \"ocr-difficulty\";\n\nexport type OcrDifficultyId = \"easy\" | \"medium\" | \"difficult\";\n\nexport type OcrDifficultyClass = {\n id: OcrDifficultyId;\n index: number;\n label: string;\n backgroundColor: string;\n textColor: string;\n};\n\nexport type OcrDifficultyPrediction = OcrDifficultyClass & {\n score: number;\n};\n\nexport type OcrClassifierRun = {\n scores: number[];\n prediction: OcrDifficultyPrediction;\n inferenceMs: number;\n};\n\nexport const OCR_DIFFICULTY_CLASSES: OcrDifficultyClass[] = [\n {\n id: \"easy\",\n index: 0,\n label: \"OCR Easy\",\n backgroundColor: \"#047857\",\n textColor: \"#ffffff\",\n },\n {\n id: \"medium\",\n index: 1,\n label: \"OCR Medium\",\n backgroundColor: \"#b45309\",\n textColor: \"#ffffff\",\n },\n {\n id: \"difficult\",\n index: 2,\n label: \"OCR Difficult\",\n backgroundColor: \"#991b1b\",\n textColor: \"#ffffff\",\n },\n];\n\nexport function selectOcrDifficulty(scores: ArrayLike<number>): OcrDifficultyPrediction {\n if (!scores.length) {\n throw new Error(\"OCR classifier returned no scores.\");\n }\n\n let bestIndex = 0;\n let bestScore = Number(scores[0] ?? 0);\n\n for (let index = 1; index < scores.length; index += 1) {\n const score = Number(scores[index]);\n if (score > bestScore) {\n bestIndex = index;\n bestScore = score;\n }\n }\n\n const difficultyClass = OCR_DIFFICULTY_CLASSES[bestIndex] ?? OCR_DIFFICULTY_CLASSES[2]!;\n\n return {\n ...difficultyClass,\n score: bestScore,\n };\n}\n\nexport function createOcrDifficultyTag(prediction: OcrDifficultyPrediction): ManifestEditorTag {\n return {\n type: OCR_DIFFICULTY_TAG_TYPE,\n id: prediction.id,\n label: prediction.label,\n backgroundColor: prediction.backgroundColor,\n textColor: prediction.textColor,\n };\n}\n\nexport function formatOcrScore(score: number) {\n return `${Math.round(score * 1000) / 10}%`;\n}\n"],"mappings":"AAEA,MAAa,EAA0B,iBAsB1BA,EAA+C,CAC1D,CACE,GAAI,OACJ,MAAO,EACP,MAAO,WACP,gBAAiB,UACjB,UAAW,UACZ,CACD,CACE,GAAI,SACJ,MAAO,EACP,MAAO,aACP,gBAAiB,UACjB,UAAW,UACZ,CACD,CACE,GAAI,YACJ,MAAO,EACP,MAAO,gBACP,gBAAiB,UACjB,UAAW,UACZ,CACF,CAED,SAAgB,EAAoB,EAAoD,CACtF,GAAI,CAAC,EAAO,OACV,MAAU,MAAM,qCAAqC,CAGvD,IAAI,EAAY,EACZ,EAAY,OAAO,EAAO,IAAM,EAAE,CAEtC,IAAK,IAAI,EAAQ,EAAG,EAAQ,EAAO,OAAQ,GAAS,EAAG,CACrD,IAAM,EAAQ,OAAO,EAAO,GAAO,CAC/B,EAAQ,IACV,EAAY,EACZ,EAAY,GAMhB,MAAO,CACL,GAHsB,EAAuB,IAAc,EAAuB,GAIlF,MAAO,EACR,CAGH,SAAgB,EAAuB,EAAwD,CAC7F,MAAO,CACL,KAAM,EACN,GAAI,EAAW,GACf,MAAO,EAAW,MAClB,gBAAiB,EAAW,gBAC5B,UAAW,EAAW,UACvB,CAGH,SAAgB,EAAe,EAAe,CAC5C,MAAO,GAAG,KAAK,MAAM,EAAQ,IAAK,CAAG,GAAG"}
@@ -0,0 +1 @@
1
+ var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;l<u;l++)d=c[l],!a.call(e,d)&&d!==o&&t(e,d,{get:(e=>i[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},s=(n,r,a)=>(a=n==null?{}:e(i(n)),o(r||!n||!n.__esModule?t(a,`default`,{value:n,enumerable:!0}):a,n));const c=require(`./ocr-difficulty-9L3ewI3P.cjs`);let l=require(`onnxruntime-web/wasm`);l=s(l);const u=new URL(`./assets/ocr_router_efficientnet_b0_threshold_0.15.onnx`,require(`url`).pathToFileURL(__filename).href).href,d=new URL(`./assets/ort-wasm-simd-threaded.mjs`,require(`url`).pathToFileURL(__filename).href).href,f=new URL(`./assets/ort-wasm-simd-threaded.wasm`,require(`url`).pathToFileURL(__filename).href).href,p=[1,3,224,224],m=256,h=[.485,.456,.406],g=[.229,.224,.225];let _=null;async function v(){return _||(l.env.wasm.wasmPaths={mjs:d,wasm:f},l.env.wasm.numThreads=1,_=l.InferenceSession.create(u,{executionProviders:[`wasm`],graphOptimizationLevel:`all`}).catch(e=>{throw _=null,e})),_}async function y(e){let t=await v(),n=await x(e);try{let e=C(n),r=t.inputNames[0]??`x`,i=t.outputNames[0]??`linear`,a=performance.now(),o=await t.run({[r]:e}),s=performance.now()-a,l=o[i];if(!l)throw Error(`Model output "${i}" was not returned.`);let u=Array.from(l.data).map(b);return{scores:u,prediction:c.a(u),inferenceMs:s}}finally{n.dispose()}}function b(e){return 1/(1+Math.exp(-e))}async function x(e){if(typeof createImageBitmap==`function`){let t=await createImageBitmap(e,{imageOrientation:`from-image`});return{source:t,width:t.width,height:t.height,dispose:()=>t.close()}}let t=URL.createObjectURL(e);try{let e=await S(t);return{source:e,width:e.naturalWidth,height:e.naturalHeight,dispose:()=>URL.revokeObjectURL(t)}}catch(e){throw URL.revokeObjectURL(t),e}}function S(e){return new Promise((t,n)=>{let r=new Image;r.decoding=`async`,r.onload=()=>t(r),r.onerror=()=>n(Error(`Unable to decode the canvas image.`)),r.src=e})}function C(e){let[,t,n,r]=p,i=256/Math.min(e.width,e.height),a=Math.round(e.width*i),o=Math.round(e.height*i),s=w(a,o);T(s).drawImage(e.source,0,0,a,o);let c=Math.max(0,Math.floor((a-r)/2)),u=Math.max(0,Math.floor((o-n)/2)),d=T(w(r,n));d.drawImage(s,c,u,r,n,0,0,r,n);let f=d.getImageData(0,0,r,n).data,m=r*n,_=new Float32Array(t*m);for(let e=0;e<m;e+=1){let t=e*4,n=(f[t]??0)/255,r=(f[t+1]??0)/255,i=(f[t+2]??0)/255;_[e]=(n-h[0])/g[0],_[m+e]=(r-h[1])/g[1],_[m*2+e]=(i-h[2])/g[2]}return new l.Tensor(`float32`,_,Array.from(p))}function w(e,t){let n=document.createElement(`canvas`);return n.width=e,n.height=t,n}function T(e){let t=e.getContext(`2d`,{willReadFrequently:!0});if(!t)throw Error(`Could not acquire a 2D canvas context for image preprocessing.`);return t}exports.loadOcrClassifier=v,exports.runOcrClassifier=y,exports.t=s;
@@ -0,0 +1,2 @@
1
+ import{a as e}from"./ocr-difficulty-CjQvA3aZ.js";import*as t from"onnxruntime-web/wasm";const n=new URL(`./assets/ocr_router_efficientnet_b0_threshold_0.15.onnx`,import.meta.url).href,r=new URL(`./assets/ort-wasm-simd-threaded.mjs`,import.meta.url).href,i=new URL(`./assets/ort-wasm-simd-threaded.wasm`,import.meta.url).href,a=[1,3,224,224],o=[.485,.456,.406],s=[.229,.224,.225];let c=null;async function l(){return c||(t.env.wasm.wasmPaths={mjs:r,wasm:i},t.env.wasm.numThreads=1,c=t.InferenceSession.create(n,{executionProviders:[`wasm`],graphOptimizationLevel:`all`}).catch(e=>{throw c=null,e})),c}async function u(t){let n=await l(),r=await f(t);try{let t=m(r),i=n.inputNames[0]??`x`,a=n.outputNames[0]??`linear`,o=performance.now(),s=await n.run({[i]:t}),c=performance.now()-o,l=s[a];if(!l)throw Error(`Model output "${a}" was not returned.`);let u=Array.from(l.data).map(d);return{scores:u,prediction:e(u),inferenceMs:c}}finally{r.dispose()}}function d(e){return 1/(1+Math.exp(-e))}async function f(e){if(typeof createImageBitmap==`function`){let t=await createImageBitmap(e,{imageOrientation:`from-image`});return{source:t,width:t.width,height:t.height,dispose:()=>t.close()}}let t=URL.createObjectURL(e);try{let e=await p(t);return{source:e,width:e.naturalWidth,height:e.naturalHeight,dispose:()=>URL.revokeObjectURL(t)}}catch(e){throw URL.revokeObjectURL(t),e}}function p(e){return new Promise((t,n)=>{let r=new Image;r.decoding=`async`,r.onload=()=>t(r),r.onerror=()=>n(Error(`Unable to decode the canvas image.`)),r.src=e})}function m(e){let[,n,r,i]=a,c=256/Math.min(e.width,e.height),l=Math.round(e.width*c),u=Math.round(e.height*c),d=h(l,u);g(d).drawImage(e.source,0,0,l,u);let f=Math.max(0,Math.floor((l-i)/2)),p=Math.max(0,Math.floor((u-r)/2)),m=g(h(i,r));m.drawImage(d,f,p,i,r,0,0,i,r);let _=m.getImageData(0,0,i,r).data,v=i*r,y=new Float32Array(n*v);for(let e=0;e<v;e+=1){let t=e*4,n=(_[t]??0)/255,r=(_[t+1]??0)/255,i=(_[t+2]??0)/255;y[e]=(n-o[0])/s[0],y[v+e]=(r-o[1])/s[1],y[v*2+e]=(i-o[2])/s[2]}return new t.Tensor(`float32`,y,Array.from(a))}function h(e,t){let n=document.createElement(`canvas`);return n.width=e,n.height=t,n}function g(e){let t=e.getContext(`2d`,{willReadFrequently:!0});if(!t)throw Error(`Could not acquire a 2D canvas context for image preprocessing.`);return t}export{l as loadOcrClassifier,u as runOcrClassifier};
2
+ //# sourceMappingURL=onnx-classifier-mb_6hJ1l.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"onnx-classifier-mb_6hJ1l.js","names":["sessionPromise: Promise<ort.InferenceSession> | null"],"sources":["../src/onnx-classifier.ts"],"sourcesContent":["import * as ort from \"onnxruntime-web/wasm\";\nimport { type OcrClassifierRun, selectOcrDifficulty } from \"./ocr-difficulty\";\n\nconst MODEL_URL = new URL(\"./assets/ocr_router_efficientnet_b0_threshold_0.15.onnx\", import.meta.url).href;\nconst ORT_WASM_MODULE_URL = new URL(\"./assets/ort-wasm-simd-threaded.mjs\", import.meta.url).href;\nconst ORT_WASM_BINARY_URL = new URL(\"./assets/ort-wasm-simd-threaded.wasm\", import.meta.url).href;\n\nexport const MODEL_INPUT_SHAPE = [1, 3, 224, 224] as const;\nexport const MODEL_OUTPUT_SHAPE = [1, 3] as const;\n\nconst RESIZE_SHORT_SIDE = 256;\nconst IMAGE_MEAN = [0.485, 0.456, 0.406] as const;\nconst IMAGE_STD = [0.229, 0.224, 0.225] as const;\n\ntype LoadedImageSource = {\n source: CanvasImageSource;\n width: number;\n height: number;\n dispose: () => void;\n};\n\nlet sessionPromise: Promise<ort.InferenceSession> | null = null;\n\nexport async function loadOcrClassifier() {\n if (!sessionPromise) {\n ort.env.wasm.wasmPaths = {\n mjs: ORT_WASM_MODULE_URL,\n wasm: ORT_WASM_BINARY_URL,\n };\n ort.env.wasm.numThreads = 1;\n\n sessionPromise = ort.InferenceSession.create(MODEL_URL, {\n executionProviders: [\"wasm\"],\n graphOptimizationLevel: \"all\",\n }).catch((error: unknown) => {\n sessionPromise = null;\n throw error;\n });\n }\n\n return sessionPromise;\n}\n\nexport async function runOcrClassifier(imageBlob: Blob): Promise<OcrClassifierRun> {\n const session = await loadOcrClassifier();\n const image = await loadImageSource(imageBlob);\n\n try {\n const tensor = imageToTensor(image);\n const inputName = session.inputNames[0] ?? \"x\";\n const outputName = session.outputNames[0] ?? \"linear\";\n const startedAt = performance.now();\n const outputMap = await session.run({ [inputName]: tensor });\n const inferenceMs = performance.now() - startedAt;\n const outputTensor = outputMap[outputName];\n\n if (!outputTensor) {\n throw new Error(`Model output \"${outputName}\" was not returned.`);\n }\n\n const scores = Array.from(outputTensor.data as ArrayLike<number>).map(sigmoid);\n\n return {\n scores,\n prediction: selectOcrDifficulty(scores),\n inferenceMs,\n };\n } finally {\n image.dispose();\n }\n}\n\nfunction sigmoid(value: number) {\n return 1 / (1 + Math.exp(-value));\n}\n\nasync function loadImageSource(blob: Blob): Promise<LoadedImageSource> {\n if (typeof createImageBitmap === \"function\") {\n const bitmap = await createImageBitmap(blob, { imageOrientation: \"from-image\" });\n\n return {\n source: bitmap,\n width: bitmap.width,\n height: bitmap.height,\n dispose: () => bitmap.close(),\n };\n }\n\n const objectUrl = URL.createObjectURL(blob);\n\n try {\n const image = await loadHtmlImage(objectUrl);\n\n return {\n source: image,\n width: image.naturalWidth,\n height: image.naturalHeight,\n dispose: () => URL.revokeObjectURL(objectUrl),\n };\n } catch (error) {\n URL.revokeObjectURL(objectUrl);\n throw error;\n }\n}\n\nfunction loadHtmlImage(source: string) {\n return new Promise<HTMLImageElement>((resolve, reject) => {\n const image = new Image();\n image.decoding = \"async\";\n image.onload = () => resolve(image);\n image.onerror = () => reject(new Error(\"Unable to decode the canvas image.\"));\n image.src = source;\n });\n}\n\nfunction imageToTensor(image: LoadedImageSource) {\n const [, channels, croppedHeight, croppedWidth] = MODEL_INPUT_SHAPE;\n const resizeScale = RESIZE_SHORT_SIDE / Math.min(image.width, image.height);\n const resizedWidth = Math.round(image.width * resizeScale);\n const resizedHeight = Math.round(image.height * resizeScale);\n const resizeCanvas = createCanvas(resizedWidth, resizedHeight);\n const resizeContext = getCanvasContext(resizeCanvas);\n\n resizeContext.drawImage(image.source, 0, 0, resizedWidth, resizedHeight);\n\n const cropX = Math.max(0, Math.floor((resizedWidth - croppedWidth) / 2));\n const cropY = Math.max(0, Math.floor((resizedHeight - croppedHeight) / 2));\n const cropCanvas = createCanvas(croppedWidth, croppedHeight);\n const cropContext = getCanvasContext(cropCanvas);\n\n cropContext.drawImage(resizeCanvas, cropX, cropY, croppedWidth, croppedHeight, 0, 0, croppedWidth, croppedHeight);\n\n const imageData = cropContext.getImageData(0, 0, croppedWidth, croppedHeight).data;\n const pixelCount = croppedWidth * croppedHeight;\n const tensorData = new Float32Array(channels * pixelCount);\n\n for (let pixelIndex = 0; pixelIndex < pixelCount; pixelIndex += 1) {\n const dataOffset = pixelIndex * 4;\n const red = (imageData[dataOffset] ?? 0) / 255;\n const green = (imageData[dataOffset + 1] ?? 0) / 255;\n const blue = (imageData[dataOffset + 2] ?? 0) / 255;\n\n tensorData[pixelIndex] = (red - IMAGE_MEAN[0]) / IMAGE_STD[0];\n tensorData[pixelCount + pixelIndex] = (green - IMAGE_MEAN[1]) / IMAGE_STD[1];\n tensorData[pixelCount * 2 + pixelIndex] = (blue - IMAGE_MEAN[2]) / IMAGE_STD[2];\n }\n\n return new ort.Tensor(\"float32\", tensorData, Array.from(MODEL_INPUT_SHAPE));\n}\n\nfunction createCanvas(width: number, height: number) {\n const canvas = document.createElement(\"canvas\");\n canvas.width = width;\n canvas.height = height;\n return canvas;\n}\n\nfunction getCanvasContext(canvas: HTMLCanvasElement) {\n const context = canvas.getContext(\"2d\", { willReadFrequently: true });\n\n if (!context) {\n throw new Error(\"Could not acquire a 2D canvas context for image preprocessing.\");\n }\n\n return context;\n}\n"],"mappings":"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"}
@@ -0,0 +1 @@
1
+ var e={id:`@manifest-editor/ocr-classification`,label:`OCR Classification`,description:`Classify canvases by OCR difficulty and apply canvas tags.`,author:`Digirati`,official:!0,defaultEnabled:!1,tags:[`ocr`,`classification`,`automation`],supports:{apps:[`manifest-editor`],projectTypes:[`Manifest`]}};Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return e}});
@@ -0,0 +1,2 @@
1
+ var e={id:`@manifest-editor/ocr-classification`,label:`OCR Classification`,description:`Classify canvases by OCR difficulty and apply canvas tags.`,author:`Digirati`,official:!0,defaultEnabled:!1,tags:[`ocr`,`classification`,`automation`],supports:{apps:[`manifest-editor`],projectTypes:[`Manifest`]}};export{e as t};
2
+ //# sourceMappingURL=plugin-Cn1QgMZa.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin-Cn1QgMZa.js","names":[],"sources":["../src/plugin.ts"],"sourcesContent":["import type { PluginMetadata } from \"@manifest-editor/shell\";\n\nexport default {\n id: \"@manifest-editor/ocr-classification\",\n label: \"OCR Classification\",\n description: \"Classify canvases by OCR difficulty and apply canvas tags.\",\n author: \"Digirati\",\n official: true,\n defaultEnabled: false,\n tags: [\"ocr\", \"classification\", \"automation\"],\n supports: {\n apps: [\"manifest-editor\"],\n projectTypes: [\"Manifest\"],\n },\n} satisfies PluginMetadata;\n"],"mappings":"AAEA,IAAA,EAAe,CACb,GAAI,sCACJ,MAAO,qBACP,YAAa,6DACb,OAAQ,WACR,SAAU,GACV,eAAgB,GAChB,KAAM,CAAC,MAAO,iBAAkB,aAAa,CAC7C,SAAU,CACR,KAAM,CAAC,kBAAkB,CACzB,aAAc,CAAC,WAAW,CAC3B,CACF"}