text-annotator
Version:
A JavaScript library for locating and annotating plain text in HTML
1 lines • 13.5 kB
JavaScript
var TextAnnotator;(()=>{"use strict";var t={178:(t,e)=>{Object.defineProperty(e,"__esModule",{value:!0});let i=[];const n=["al","adj","assn","Ave","BSc","MSc","Cell","Ch","Co","cc","Corp","Dem","Dept","ed","eg","Eq","Eqs","est","est","etc","Ex","ext","Fig","fig","Figs","figs","i.e","ie","Inc","inc","Jan","Feb","Mar","Apr","Jun","Jul","Aug","Sep","Sept","Oct","Nov","Dec","jr","mi","Miss","Mrs","Mr","Ms","Mol","mt","mts","no","Nos","PhD","MD","BA","MA","MM","pl","pop","pp","Prof","Dr","pt","Ref","Refs","Rep","repr","rev","Sec","Secs","Sgt","Col","Gen","Rep","Sen","Gov","Lt","Maj","Capt","St","Sr","sr","Jr","jr","Rev","Sun","Mon","Tu","Tue","Tues","Wed","Th","Thu","Thur","Thurs","Fri","Sat","trans","Univ","Viz","Vol","vs","v"],s=t=>/^[A-Z][a-z].*/.test(t)||c(t),o=t=>s(t)||/``|"|'/.test(t.substring(0,2)),r=(t,e)=>("a.m."===t||"p.m."===t)&&"day"===e.replace(/\W+/g,"").slice(-3).toLowerCase(),h=t=>{const e=t.replace(/[()[\]{}]/g,"").match(/(.\.)*/);return e&&e[0].length>0},l=t=>t.length<=3||s(t),a=(t,e)=>e.length>0&&(!!(t<5&&e[0].length<6&&s(e[0]))||e.filter((t=>/[A-Z]/.test(t.charAt(0)))).length>=3),c=(t,e)=>(e&&(t=t.slice(e-1,e+2)),!isNaN(t)),g=t=>t.match(/^(?:(?:\+?1\s*(?:[.-]\s*)?)?(?:\(\s*([2-9]1[02-9]|[2-9][02-8]1|[2-9][02-8][02-9])\s*\)|([2-9]1[02-9]|[2-9][02-8]1|[2-9][02-8][02-9]))\s*(?:[.-]\s*)?)?([2-9]1[02-9]|[2-9][02-9]1|[2-9][02-9]{2})\s*(?:[.-]\s*)?([0-9]{4})(?:\s*(?:#|x\.?|ext\.?|extension)\s*(\d+))?$/),d=t=>t.match(/[-a-zA-Z0-9@:%._+~#=]{2,256}\.[a-z]{2,6}\b([-a-zA-Z0-9@:%_+.~#?&//=]*)/),u=t=>{let e=0;return!(!((e=t.indexOf("."))>-1||(e=t.indexOf("!"))>-1||(e=t.indexOf("?"))>-1)||!t.charAt(e+1).match(/[a-zA-Z].*/))&&[t.slice(0,e+1),t.slice(e+1)]},p=(t,e)=>e.length>1?e.indexOf(t.slice(-1))>-1:t.slice(-1)===e,f=(t,e)=>t.slice(t.length-e.length)===e;e.default=function(t,e){const s=" @~@ ",b=s.trim(),x=new RegExp("\\S",""),m=new RegExp("\\n+|[-#=_+*]{4,}","g"),C=new RegExp("\\S+|\\n","g");if(!t||"string"!=typeof t||!t.length)return[];if(!x.test(t))return[];const S={newline_boundaries:!1,html_boundaries:!1,html_boundaries_tags:["p","div","ul","ol"],sanitize:!1,allowed_tags:!1,preserve_whitespace:!1,abbreviations:null};if("boolean"==typeof e)S.newline_boundaries=!0;else for(const t in e)S[t]=e[t];var T;if(T=S.abbreviations,i=T||n,S.newline_boundaries&&(t=t.replace(m,s)),S.html_boundaries){const e="(<br\\s*\\/?>|<\\/("+S.html_boundaries_tags.join("|")+")>)",i=new RegExp(e,"g");t=t.replace(i,"$1 @~@ ")}let L,w;(S.sanitize||S.allowed_tags)&&(S.allowed_tags||(S.allowed_tags=[""]),t=(t=>{if(("string"==typeof t||t instanceof String)&&"undefined"!=typeof document){const e=document.createElement("DIV");e.innerHTML=t,t=(e.textContent||"").trim()}else"object"==typeof t&&t.textContent&&(t=(t.textContent||"").trim());return t})(t,S.allowed_tags)),S.preserve_whitespace?(w=t.split(/(<br\s*\/?>|\S+|\n+)/),L=w.filter(((t,e)=>e%2))):L=t.trim().match(C);let v=0,M=0,O=[],_=[],y=[];if(!L||!L.length)return[];let H=0;for(let t=0,e=L.length;t<e;t++){if(v++,y.push(L[t]),~L[t].indexOf(",")&&(v=0),"."===(A=L[t])||"!"===A||"?"===A||p(L[t],"?!")||L[t]===b){(S.newline_boundaries||S.html_boundaries)&&L[t]===b&&y.pop(),_.push(y),v=0,y=[];continue}if((p(L[t],'"')||p(L[t],"”"))&&(L[t]=L[t].slice(0,-1),M=2*t+1),p(L[t],".")){if(t+1<e){if(2===L[t].length&&isNaN(L[t].charAt(0)))continue;if(j=L[t],~i.indexOf(j.replace(/\W+/g,"")))continue;if(o(L[t+1])){if(r(L[t],L[t+1]))continue;if(a(v,L.slice(t,6)))continue;if(c(L[t+1])&&l(L[t]))continue}else{if(f(L[t],".."))continue;if(h(L[t]))continue;if(a(v,L.slice(t,5)))continue}}_.push(y),y=[],v=0;continue}if((M=L[t].indexOf("."))>-1){if(c(L[t],M))continue;if(h(L[t]))continue;if(d(L[t])||g(L[t]))continue}const n=u(L[t]);n&&(O=n,y.pop(),y.push(O[0]),_.push(y),S.preserve_whitespace&&(w.splice(2*t+1+H,1,O[0],"",O[1]),H+=2),y=[],v=0,y.push(O[1]))}var j,A;y.length&&_.push(y);const z=[];let R="";_=_.filter((function(t){return t.length>0}));for(let t=0;t<_.length;t++){if(!S.preserve_whitespace||S.newline_boundaries||S.html_boundaries)R=_[t].join(" ");else{let e=2*_[t].length;0===t&&(e+=1),R=w.splice(0,e).join("")}1===_[t].length&&_[t][0].length<4&&_[t][0].indexOf(".")>-1&&_[t+1]&&_[t+1][0].indexOf(".")<0&&(R+=" "+_[t+1].join(" "),t++),z.push(R)}return z}},590:(t,e,i)=>{Object.defineProperty(e,"__esModule",{value:!0});const n=i(996);t.exports=n.default},996:(t,e,i)=>{Object.defineProperty(e,"__esModule",{value:!0});const n=i(178),s=t=>t.replace(/&/g,"&").replace(/"/g,""").replace(/'/g,"'").replace(/</g,"<").replace(/>/g,">"),o=["address","article","aside","blockquote","canvas","dd","div","dl","dt","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","header","hgroup","hr","li","main","nav","noscript","ol","output","p","pre","section","table","tfoot","ul","video"];class r{constructor(t={content:""}){this.content="",this.isHTML=!0,this.originalContent="",this.annotatedContent="",this.stripedHTML="",this.tagLocations=[],this.sentences=[],this.highlights=[];const e=t.content,i=void 0===t.isHTML||t.isHTML;this.originalContent=this.annotatedContent=e,this.isHTML=i,i&&this.stripAndStoreHTMLTags()}search(t,e={}){let i=e.prefix||"",n=e.postfix||"";const s=e.directSearchOptions||{},o=e.fuzzySearchOptions,h=e.eagerSearchOptions,l=void 0===e.trim||e.trim,a=e.caseSensitive;if(l){const e=r.trim(i,t,n);i=e.prefix,t=e.str,n=e.postfix}let c=-1;return c=this.directSearch(i,t,n,Object.assign({caseSensitive:a},s)),-1!==c||o&&(c=this.fuzzySearch(i,t,n,Object.assign({caseSensitive:a},o)),-1!==c)||h&&(c=this.eagerSearch(i,t,n,Object.assign({caseSensitive:a},h))),c}searchAll(t,e={}){const i=[],n=(t,e)=>{const s=this.search(t,e);-1!==s&&(i.push(s),e.directSearchOptions=e.directSearchOptions||{},e.directSearchOptions.lastHighlightIndex=s,n(t,e))};return n(t,e),i}highlight(t,e={}){const i=e.highlightTagName||"span",n=e.highlightClass||"highlight",s=e.highlightIdPattern||"highlight-",o=r.createOpenTag(i,s,t,n),h=this.adjustLoc(i,s,t,n);return this.annotatedContent=r.insert(this.annotatedContent,o,h[0]),this.annotatedContent=r.insert(this.annotatedContent,r.createCloseTag(i),h[1]+o.length),this.highlights[t].highlighted=!0,this.annotatedContent}highlightAll(t,e={}){for(let i=0;i<t.length;i++)this.annotatedContent=this.highlight(t[i],e);return this.annotatedContent}searchAndHighlight(t,e={}){const i=this.search(t,e.searchOptions);if(-1!==i)return{highlightIndex:i,content:this.highlight(i,e.highlightOptions)}}unhighlight(t,e={}){const i=e.highlightTagName||"span",n=e.highlightClass||"highlight",s=e.highlightIdPattern||"highlight-";this.highlights[t].highlighted=!1;const o=this.adjustLoc(i,s,t,n),h=r.getOpenTagLength(i,s,t,n),l=this.annotatedContent.substring(o[0],o[1]+h+r.getCloseTagLength(i)),a=this.annotatedContent.substring(o[0]+h,o[1]+h);return this.annotatedContent=this.annotatedContent.replace(l,a),this.annotatedContent}stripAndStoreHTMLTags(){let t;this.stripedHTML=this.originalContent;const e=/<[^>]+>/;let i=0;for(;t=this.stripedHTML.match(e);){this.stripedHTML=this.stripedHTML.replace(t[0],"");const e=t[0].length;this.tagLocations.push([t.index,e,i]),i+=e}}directSearch(t,e,i,n={}){const o=n.caseSensitive,r=n.encode,h=n.lastHighlightIndex;let l=t+e+i,a=this.isHTML?this.stripedHTML:this.originalContent;o||(l=l.toLowerCase(),a=a.toLowerCase());let c=0;void 0!==h&&(c=this.highlights[h].loc[1]+1);let g=-1;const d=a.indexOf(l,c);if(r&&-1===d){const i=s(l),n=a.indexOf(i,c);if(-1!==n){const i=[];i[0]=n+s(t).length,i[1]=i[0]+s(e).length,g=this.highlights.push({loc:i})-1}}else if(-1!==d){const i=[];i[0]=d+t.length,i[1]=i[0]+e.length,g=this.highlights.push({loc:i})-1}return g}eagerSearch(t,e,i,n={containerId:""}){const s=n.caseSensitive,o=n.containerId,h=n.threshold||.74,l=t+e+i;let a=-1;if(window.find){document.designMode="on";const t=window.getSelection();for(t.collapse(document.body,0);window.find(l,s);){document.execCommand("hiliteColor",!0,"rgba(255, 255, 255, 0)"),t.collapseToEnd();const i=document.querySelector("#"+o+' [style="background-color: rgba(255, 255, 255, 0);"]');if(i){const t=i.innerHTML.replace(/<[^>]*>/g,""),n=r.getBestSubstring(t,e,h);if(n){const e=(this.isHTML?this.stripedHTML:this.originalContent).indexOf(t);-1!==e&&(a=this.highlights.push({loc:[e+n.loc[0],e+n.loc[1]]})-1)}break}}document.execCommand("undo"),document.designMode="off"}return a}fuzzySearch(t,e,i,n){const s=n.caseSensitive,o=n.tokenBased;let h=n.tbThreshold||.68;const l=void 0===n.sentenceBased||n.sentenceBased;let a=n.sbThreshold||.85;const c=n.maxLengthDiff||.1,g=n.lenRatio||2,d=n.processSentence;let u=-1;const p=this.isHTML?this.stripedHTML:this.originalContent;if(o||t||i){const n=[];let o=-1;for(;-1!==(o=p.indexOf(e,o+1));)n.push(o);let l=-1;const a=t+e+i;for(let o=0;o<n.length;o++){const c=n[o],g=p.substring(c-t.length,c)+e+p.substring(c+e.length,c+e.length+i.length),d=r.getSimilarity(g,a,s);d>=h&&(h=d,l=c)}-1!==l&&(u=this.highlights.push({loc:[l,l+e.length]})-1)}else if(l){let t=[];t=this.sentences.length?this.sentences:this.sentences=r.sentenize(p);const i=e.split(/\s/),n=[];for(let e=0;e<t.length;e++)for(let s=0;s<i.length;s++)if(t[e].raw.includes(i[s])){n.push(t[e]);break}if(d){let t=0;for(let e=0;e<n.length;e++){const i=n[e];let s=i.raw;const o=[i.index,i.index+s.length];let r=0;const h=this.tagLocations;for(let e=t;e<h.length;e++){const i=h[e];if(i[0]>=o[0]&&i[0]<=o[1]){const t=this.originalContent.substring(i[0]+i[2],i[0]+i[2]+i[1]),e=i[0]+r-o[0];s=s.slice(0,e)+t+s.slice(e),r+=i[1]}else if(i[0]>o[1]){t=e;break}}s=d(s),s=s.replace(/(<([^>]+)>)/gi,"");const l=i.raw;l!==s&&(i.raw=s,i.index=i.index+l.indexOf(s))}}let o=null;for(let t=0;t<n.length;t++){const i=n[t],h=r.getSimilarity(i.raw,e,s);if(h>=a)a=h,o=i;else if(t!==n.length-1){const h=i.raw+n[t+1].raw;if(Math.abs(h.length-e.length)/e.length<=c){const t=r.getSimilarity(h,e,s);t>=a&&(a=t,o={raw:h,index:i.index})}}}if(o){const t=r.getBestSubstring(o.raw,e,a,g,s,!0);if(t){const e=o.index;u=this.highlights.push({loc:[e+t.loc[0],e+t.loc[1]]})-1}}}return u}includeRequiredTag(t,e,i){const n=i.startsWith("</"),s=n?i.split("</")[1].split(">")[0]:i.split(" ")[0].split("<")[1].split(">")[0];let o=!1,r=1,h=0;if(n)for(let i=t-1;i>=0;i--){const t=this.tagLocations[i];if(e[0]>t[0])break;{const e=this.originalContent.substring(t[0]+t[2],t[0]+t[2]+t[1]);if(e.startsWith("</"+s)?r++:e.startsWith("<"+s)&&h++,r===h){o=!0;break}}}else for(let i=t+1;i<this.tagLocations.length;i++){const t=this.tagLocations[i];if(e[1]<t[0])break;{const e=this.originalContent.substring(t[0]+t[2],t[0]+t[2]+t[1]);if(e.startsWith("<"+s)?r++:e.startsWith("</"+s)&&h++,r===h){o=!0;break}}}return o}adjustLoc(t="span",e,i,n){const s=this.highlights[i].loc,h=[0,0],l=this.tagLocations.length;for(let t=0;t<l;t++){const e=this.tagLocations[t];if(s[1]<e[0])break;if(s[1]===e[0]){const i=this.originalContent.substring(e[0]+e[2],e[0]+e[2]+e[1]);!i.endsWith("/>")&&i.startsWith("</")&&!o.includes(i.split("</")[1].split(">")[0])&&this.includeRequiredTag(t,s,i)&&(h[1]+=e[1])}else if(s[1]>e[0])if(h[1]+=e[1],s[0]===e[0]){const i=this.originalContent.substring(e[0]+e[2],e[0]+e[2]+e[1]);(i.startsWith("</")||i.endsWith("/>")||o.includes(i.split(" ")[0].split("<")[1].split(">")[0])||!this.includeRequiredTag(t,s,i))&&(h[0]+=e[1])}else s[0]>e[0]&&(h[0]+=e[1])}for(let i=0;i<this.highlights.length;i++){const o=this.highlights[i];if(o.highlighted){const l=r.getOpenTagLength(t,e,i,n),a=r.getCloseTagLength(t),c=o.loc;s[0]>=c[1]?(h[0]+=l+a,h[1]+=l+a):s[0]<c[1]&&s[0]>c[0]&&s[1]>c[1]?(h[0]+=l,h[1]+=l+a):s[0]<=c[0]&&s[1]>=c[1]?h[1]+=l+a:s[0]<c[0]&&s[1]>c[0]&&s[1]<c[1]?h[1]+=l:s[0]>=c[0]&&s[1]<=c[1]&&(h[0]+=l,h[1]+=l)}}return[s[0]+h[0],s[1]+h[1]]}static createOpenTag(t="span",e,i,n){return`<${t} id="${e+i}" class="${n}">`}static createCloseTag(t="span"){return`</${t}>`}static getOpenTagLength(t="span",e,i,n){return r.createOpenTag(t,e,i,n).length}static getCloseTagLength(t="span"){return r.createCloseTag(t).length}static trim(t,e,i){return t=t.replace(/^\s+/,""),i=i.replace(/\s+$/,""),t||(e=e.replace(/^\s+/,"")),i||(e=e.replace(/\s+$/,"")),{prefix:t,str:e,postfix:i}}static insert(t,e,i){return t.slice(0,i)+e+t.slice(i)}static sentenize(t){return(0,n.default)(t,{newline_boundaries:!1,html_boundaries:!1,sanitize:!1,allowed_tags:!1,preserve_whitespace:!0}).map((e=>({raw:e,index:t.indexOf(e)})))}static getBestSubstring(t,e,i,n,s,o){let h=null,l=o?i:r.getSimilarity(t,e,s);if(l>=i){const i=t.split(" ");for(;i.length;){const t=i.shift(),n=i.join(" ");let o=r.getSimilarity(n,e,s);if(o<l){i.unshift(t);const n=i.pop();if(o=r.getSimilarity(i.join(" "),e,s),o<l){i.push(n);break}l=o}else l=o}const o=i.join(" ");if(!n||o.length/e.length<=n){const e=[];e[0]=t.indexOf(o),e[1]=e[0]+o.length,h={similarity:l,loc:e}}}return h}static getSimilarity(t,e,i){return i||(t=t.toLowerCase(),e=e.toLowerCase()),t===e?1:r.lcsLength(t,e)/e.length}static lcsLength(t,e,i){const n=i?t:t.toLowerCase(),s=i?e:e.toLowerCase();if(n===s)return n.length;if(""===(n||s))return"".length;const o=n.length,r=s.length,h=function(t){const e=[];for(let i=0;i<t;i++)e[i]=[];return e}(r+1);let l,a;for(l=0;l<=o;l++)h[0][l]=0;for(l=0;l<=r;l++)h[l][0]=0;for(l=1;l<=r;l++)for(a=1;a<=o;a++)n[a-1]===s[l-1]?h[l][a]=h[l-1][a-1]+1:h[l][a]=Math.max(h[l-1][a],h[l][a-1]);let c="";for(l=r,a=o;l>0&&a>0;)n[a-1]===s[l-1]?(c=n[a-1]+c,l--,a--):Math.max(h[l-1][a],h[l][a-1])===h[l-1][a]?l--:a--;return c.length}}e.default=r}},e={},i=function i(n){var s=e[n];if(void 0!==s)return s.exports;var o=e[n]={exports:{}};return t[n](o,o.exports,i),o.exports}(590);TextAnnotator=i})();