ztextutils
Version:
A powerful text utility library for parsing, masking, and formatting text content. Parse URLs, hashtags, mentions, emails, markdown elements, and format phone numbers, dates, and more.
2 lines • 7.13 kB
JavaScript
var n={url:/\b(?:https?:\/\/|www\.)[a-z0-9][-a-z0-9@:%._+~#=]{0,256}\.[a-z0-9()]{1,6}\b(?:[-a-z0-9()@:%_+.~#?&//=]*)/gi,hashtag:/\B#[a-z][a-z0-9._-]*\b/gi,mention:/\B@[a-z][a-z0-9._-]*\b/gi,email:/\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}\b/gi,phone:/(?:\+?(\d{1,3}))?[-. (]*(\d{3})[-. )]*(\d{3})[-. ]*(\d{4})(?: *x(\d+))?\b/g,markdown:{links:/\[([^\]]+)\]\(([^)]+)\)/g,headings:/^(#{1,6})\s+(.+)$/gm,bulletList:/^[-*+]\s+(.+)$/gm,numberedList:/^\d+\.\s+(.+)$/gm,bold:/\*\*([^*]+)\*\*|__([^_]+)__/g,italic:/\*([^*]+)\*|_([^_]+)_/g}},k=class{options;constructor(s={all:!0}){this.options={urls:s.all||s.urls,hashtags:s.all||s.hashtags,mentions:s.all||s.mentions,emails:s.all||s.emails,phones:s.all||s.phones,markdownLinks:s.all||s.markdownLinks,markdownHeadings:s.all||s.markdownHeadings,markdownLists:s.all||s.markdownLists,markdownEmphasis:s.all||s.markdownEmphasis}}parse(s){let a={urls:[],hashtags:[],mentions:[],emails:[],phones:[],markdown:{links:[],headings:[],lists:{bullet:[],numbered:[]},emphasis:{bold:[],italic:[]}}};return this.options.urls&&(a.urls=[...s.matchAll(n.url)].map(e=>e[0])),this.options.hashtags&&(a.hashtags=[...s.matchAll(n.hashtag)].map(e=>e[0])),this.options.mentions&&(a.mentions=[...s.matchAll(n.mention)].map(e=>e[0])),this.options.emails&&(a.emails=[...s.matchAll(n.email)].map(e=>e[0])),this.options.phones&&(a.phones=[...s.matchAll(n.phone)].map(e=>{let[t,r,i,h,m,p]=e,o="";return r&&(o+=`+${r} `),o+=`(${i}) ${h}-${m}`,p&&(o+=` x${p}`),o})),this.options.markdownLinks&&(a.markdown.links=[...s.matchAll(n.markdown.links)].map(e=>({text:e[1],url:e[2]}))),this.options.markdownHeadings&&(a.markdown.headings=[...s.matchAll(n.markdown.headings)].map(e=>({level:e[1].length,text:e[2]}))),this.options.markdownLists&&(a.markdown.lists.bullet=[...s.matchAll(n.markdown.bulletList)].map(e=>e[1]),a.markdown.lists.numbered=[...s.matchAll(n.markdown.numberedList)].map(e=>e[1])),this.options.markdownEmphasis&&(a.markdown.emphasis.bold=[...[...s.matchAll(n.markdown.bold)].map(e=>e[1]||e[2])],a.markdown.emphasis.italic=[...[...s.matchAll(n.markdown.italic)].map(e=>e[1]||e[2])]),a}parseMany(s){return s.map(a=>this.parse(a))}findLinkableElements(s,a){let e=[];if(this.options.urls)for(let t of s.matchAll(n.url))e.push({type:"url",text:t[0],value:t[0],position:{start:t.index,end:t.index+t[0].length},url:t[0].startsWith("http")?t[0]:`https://${t[0]}`});if(this.options.hashtags)for(let t of s.matchAll(n.hashtag)){let r=t[0].slice(1);e.push({type:"hashtag",text:t[0],value:r,position:{start:t.index,end:t.index+t[0].length},url:a?.hashtags?`${a.hashtags.replace(/\/$/,"")}/${r}`:`/tags/${r}`})}if(this.options.mentions)for(let t of s.matchAll(n.mention)){let r=t[0].slice(1);e.push({type:"mention",text:t[0],value:r,position:{start:t.index,end:t.index+t[0].length},url:a?.mentions?`${a.mentions.replace(/\/$/,"")}/${r}`:`/users/${r}`})}if(this.options.emails)for(let t of s.matchAll(n.email))e.push({type:"email",text:t[0],value:t[0],position:{start:t.index,end:t.index+t[0].length},url:`mailto:${t[0]}`});if(this.options.phones)for(let t of s.matchAll(n.phone)){let[r,i,h,m,p,o]=t,c="",g="";i&&(c+=`+${i} `,g+=`+${i}`),c+=`(${h}) ${m}-${p}`,g+=`${h}${m}${p}`,o&&(c+=` x${o}`,g+=`;${o}`),e.push({type:"phone",text:t[0],value:c,position:{start:t.index,end:t.index+t[0].length},url:`tel:${g}`})}if(this.options.markdownLinks)for(let t of s.matchAll(n.markdown.links)){let r=t[2];e.push({type:"markdown-link",text:t[0],value:t[1],position:{start:t.index,end:t.index+t[0].length},url:r.startsWith("http")||!a?.assets?r:`${a.assets.replace(/\/$/,"")}/${r.replace(/^\//,"")}`})}return e.sort((t,r)=>t.position.start-r.position.start)}},f=(l={all:!0})=>new k(l),y=new k;var u=class l{static DEFAULT_TOKENS={9:{pattern:/\d/,transform:s=>s},a:{pattern:/[a-zA-Z]/,transform:s=>s.toLowerCase()},A:{pattern:/[a-zA-Z]/,transform:s=>s.toUpperCase()},"*":{pattern:/[a-zA-Z0-9]/},"#":{pattern:/[0-9a-zA-Z]/},x:{pattern:/[0-9a-fA-F]/},X:{pattern:/[0-9a-fA-F]/,transform:s=>s.toUpperCase()}};static PRESET_MASKS={phone:{mask:"(999) 999-9999",autoClear:!0},phoneExt:{mask:"(999) 999-9999? x99999",autoClear:!1},phoneInt:{mask:"+9 (999) 999-9999",autoClear:!0},date:{mask:"99/99/9999",placeholder:"mm/dd/yyyy"},time:{mask:"99:99",placeholder:"hh:mm"},datetime:{mask:"99/99/9999 99:99",placeholder:"mm/dd/yyyy hh:mm"},ssn:{mask:"999-99-9999",autoClear:!0},creditCard:{mask:"9999 9999 9999 9999",autoClear:!0},currency:{mask:"$999,999,999.99",autoClear:!1,allowEmpty:!0},ipv4:{mask:"999.999.999.999",autoClear:!0},mac:{mask:"XX:XX:XX:XX:XX:XX",tokens:{X:{pattern:/[0-9A-F]/i,transform:s=>s.toUpperCase()}}}};options;tokens;constructor(s){this.options={mask:s?.mask||"",tokens:s?.tokens||{},placeholder:s?.placeholder||"_",autoClear:s?.autoClear??!0,stripMask:s?.stripMask??!1,allowEmpty:s?.allowEmpty??!1},this.tokens={...l.DEFAULT_TOKENS,...this.options.tokens}}mask(s,a){if(typeof a=="string"&&a in l.PRESET_MASKS)return this.applyMask(s,l.PRESET_MASKS[a]);let e=typeof a=="object"?a:this.options;return this.applyMask(s,e)}applyMask(s,a){let e=Array.isArray(a.mask)?a.mask:[a.mask],t={...this.tokens,...a.tokens};for(let r of e){let i=this.processValue(s,r,t,a);if(i!==null)return i}return a.allowEmpty&&!s?"":this.processValue(s,e[0],t,a)||""}processValue(s,a,e,t){let r="",i=0,h=!1;for(let m of a){if(i>=s.length)return h?r:t.autoClear?"":null;if(m==="?"){h=!0;continue}let p=e[m];if(p)for(;i<s.length;){let o=s[i];if(i++,p.pattern.test(o)){r+=p.transform?p.transform(o):o;break}else if(!h)return t.autoClear?"":null}else r+=m,s[i]===m&&i++}return r}stripMask(s){return this.options.stripMask?s.replace(/[^0-9a-zA-Z]/g,""):s}isComplete(s){return(Array.isArray(this.options.mask)?this.options.mask:[this.options.mask]).some(e=>this.processValue(s,e,this.tokens,this.options)!==null)}},M=l=>new u(l),x=new u;var d=class{parser;inputMask;constructor(s){this.parser=new k(s?.parser),this.inputMask=new u(s?.mask)}parse(s){return this.parser.parse(s)}parseMany(s){return this.parser.parseMany(s)}findLinkableElements(s,a){return this.parser.findLinkableElements(s,a)}mask(s,a){return this.inputMask.mask(s,a)}stripMask(s){return this.inputMask.stripMask(s)}isComplete(s){return this.inputMask.isComplete(s)}formatPhoneNumber(s){return this.inputMask.mask(s,"phone")}formatDate(s){return this.inputMask.mask(s,"date")}formatCurrency(s){return this.inputMask.mask(s.toString(),"currency")}extractUrls(s){return this.parser.parse(s).urls}extractMentions(s){return this.parser.parse(s).mentions}extractHashtags(s){return this.parser.parse(s).hashtags}extractPhones(s){return this.parser.parse(s).phones}processText(s,a){let e=this.findLinkableElements(s,a.parse?.baseUrls);return a.mask&&e.forEach(t=>{t.type==="phone"&&a.mask?.phones&&(t.value=this.formatPhoneNumber(t.value))}),{matches:e,filtered:a.parse?.types?e.filter(t=>a.parse?.types?.includes(t.type)):e,originalText:s}}},L=l=>new d(l),O=new d({parser:{all:!0}});export{u as InputMask,k as TextParser,d as TextUtils,M as createMask,f as createParser,L as createTextUtils,x as defaultMask,y as defaultParser,O as defaultUtils,n as patterns};
//# sourceMappingURL=index.js.map