UNPKG

@orama/plugin-match-highlight

Version:

Orama plugin for search match highlighting

2 lines 1.7 kB
import{load as f,save as m,search as T}from"@orama/orama";import{boundedLevenshtein as x}from"@orama/orama/internals";async function E(t,e){"positions"in t.data||Object.assign(t.data,{positions:{}}),await y(t,await t.documentsStore.get(t.data.docs,e),e)}var k=/[\p{L}0-9_'-]+/gimu;async function y(t,e,n,h="",r=t.schema){t.data.positions[n]=Object.create(null);for(let s of Object.keys(e)){let l=typeof e[s]=="object",g=typeof r[s]=="object",o=`${h}${String(s)}`;if(l&&s in r&&g&&y(t,e[s],n,o+".",r[s]),!(typeof e[s]=="string"&&s in r&&!g))continue;t.data.positions[n][o]=Object.create(null);let R=e[s],a;for(;(a=k.exec(R))!==null;){let c=a[0].toLowerCase(),u=`${t.tokenizer.language}:${c}`,i;t.tokenizer.normalizationCache.has(u)?i=t.tokenizer.normalizationCache.get(u):([i]=t.tokenizer.tokenize(c),t.tokenizer.normalizationCache.set(u,i)),Array.isArray(t.data.positions[n][o][i])||(t.data.positions[n][o][i]=[]);let p=a.index,d=a[0].length;t.data.positions[n][o][i].push({start:p,length:d})}}}async function v(t,e,n){let h=await T(t,e,n),r=t.tokenizer.tokenize(e.term??"",n),s=[];for(let l of h.hits){let g=Object.entries(t.data.positions[l.id]),o=[];for(let[R,a]of g){let c=[],u=Object.entries(a);for(let i of u){let[p]=i;for(let d of r)if(e.tolerance){if(x(p,d,e.tolerance).isBounded){c.push(i);break}}else if(p.startsWith(d)){c.push(i);break}}o.push([R,Object.fromEntries(c)])}s.push(Object.assign(l,{positions:Object.fromEntries(o)}))}return h.hits=s,h}function L(t){return{...m(t),positions:t.data.positions}}function C(t,e){f(t,e),t.data.positions=e.positions}export{E as afterInsert,C as loadWithHighlight,L as saveWithHighlight,v as searchWithHighlight}; //# sourceMappingURL=index.js.map