@gsretail.com/gui-core
Version:
A skeleton to create your own React component library using Rollup, TypeScript, Sass and Storybook
2 lines (1 loc) • 7.43 kB
JavaScript
import e from"../core/change-details.js";import t from"../core/holder.js";import{DIRECTION as s}from"../core/utils.js";import i from"./base.js";import o,{normalizeOpts as l}from"./factory.js";import a from"./pattern/chunk-tail-details.js";import r from"./pattern/cursor.js";import n from"./pattern/fixed-definition.js";import h from"./pattern/input-definition.js";import"./regexp.js";class p extends i{static DEFAULTS={lazy:!0,placeholderChar:"_"};static STOP_CHAR="`";static ESCAPE_CHAR="\\";static InputDefinition=h;static FixedDefinition=n;constructor(e){super({...p.DEFAULTS,...e,definitions:Object.assign({},h.DEFAULT_DEFINITIONS,e?.definitions)})}updateOptions(e){super.updateOptions(e)}_update(e){e.definitions=Object.assign({},this.definitions,e.definitions),super._update(e),this._rebuildMask()}_rebuildMask(){const e=this.definitions;this._blocks=[],this.exposeBlock=void 0,this._stops=[],this._maskedBlocks={};const s=this.mask;if(!s||!e)return;let i=!1,a=!1;for(let r=0;r<s.length;++r){if(this.blocks){const e=s.slice(r),i=Object.keys(this.blocks).filter((t=>0===e.indexOf(t)));i.sort(((e,t)=>t.length-e.length));const a=i[0];if(a){const{expose:e,repeat:s,...i}=l(this.blocks[a]),n={lazy:this.lazy,eager:this.eager,placeholderChar:this.placeholderChar,displayChar:this.displayChar,overwrite:this.overwrite,...i,repeat:s,parent:this},h=null!=s?new t.RepeatBlock(n):o(n);h&&(this._blocks.push(h),e&&(this.exposeBlock=h),this._maskedBlocks[a]||(this._maskedBlocks[a]=[]),this._maskedBlocks[a].push(this._blocks.length-1)),r+=a.length-1;continue}}let c=s[r],u=c in e;if(c===p.STOP_CHAR){this._stops.push(this._blocks.length);continue}if("{"===c||"}"===c){i=!i;continue}if("["===c||"]"===c){a=!a;continue}if(c===p.ESCAPE_CHAR){if(++r,c=s[r],!c)break;u=!1}const d=u?new h({isOptional:a,lazy:this.lazy,eager:this.eager,placeholderChar:this.placeholderChar,displayChar:this.displayChar,...l(e[c]),parent:this}):new n({char:c,eager:this.eager,isUnmasking:i});this._blocks.push(d)}}get state(){return{...super.state,_blocks:this._blocks.map((e=>e.state))}}set state(e){if(!e)return void this.reset();const{_blocks:t,...s}=e;this._blocks.forEach(((e,s)=>e.state=t[s])),super.state=s}reset(){super.reset(),this._blocks.forEach((e=>e.reset()))}get isComplete(){return this.exposeBlock?this.exposeBlock.isComplete:this._blocks.every((e=>e.isComplete))}get isFilled(){return this._blocks.every((e=>e.isFilled))}get isFixed(){return this._blocks.every((e=>e.isFixed))}get isOptional(){return this._blocks.every((e=>e.isOptional))}doCommit(){this._blocks.forEach((e=>e.doCommit())),super.doCommit()}get unmaskedValue(){return this.exposeBlock?this.exposeBlock.unmaskedValue:this._blocks.reduce(((e,t)=>e+t.unmaskedValue),"")}set unmaskedValue(e){if(this.exposeBlock){const t=this.extractTail(this._blockStartPos(this._blocks.indexOf(this.exposeBlock))+this.exposeBlock.displayValue.length);this.exposeBlock.unmaskedValue=e,this.appendTail(t),this.doCommit()}else super.unmaskedValue=e}get value(){return this.exposeBlock?this.exposeBlock.value:this._blocks.reduce(((e,t)=>e+t.value),"")}set value(e){if(this.exposeBlock){const t=this.extractTail(this._blockStartPos(this._blocks.indexOf(this.exposeBlock))+this.exposeBlock.displayValue.length);this.exposeBlock.value=e,this.appendTail(t),this.doCommit()}else super.value=e}get typedValue(){return this.exposeBlock?this.exposeBlock.typedValue:super.typedValue}set typedValue(e){if(this.exposeBlock){const t=this.extractTail(this._blockStartPos(this._blocks.indexOf(this.exposeBlock))+this.exposeBlock.displayValue.length);this.exposeBlock.typedValue=e,this.appendTail(t),this.doCommit()}else super.typedValue=e}get displayValue(){return this._blocks.reduce(((e,t)=>e+t.displayValue),"")}appendTail(e){return super.appendTail(e).aggregate(this._appendPlaceholder())}_appendEager(){const t=new e;let s=this._mapPosToBlock(this.displayValue.length)?.index;if(null==s)return t;this._blocks[s].isFilled&&++s;for(let e=s;e<this._blocks.length;++e){const s=this._blocks[e]._appendEager();if(!s.inserted)break;t.aggregate(s)}return t}_appendCharRaw(t,s){void 0===s&&(s={});const i=this._mapPosToBlock(this.displayValue.length),o=new e;if(!i)return o;for(let e,l=i.index;e=this._blocks[l];++l){const i=e._appendChar(t,{...s,_beforeTailState:s._beforeTailState?._blocks?.[l]});if(o.aggregate(i),i.skip||i.rawInserted)break}return o}extractTail(e,t){void 0===e&&(e=0),void 0===t&&(t=this.displayValue.length);const s=new a;return e===t||this._forEachBlocksInRange(e,t,((e,t,i,o)=>{const l=e.extractTail(i,o);l.stop=this._findStopBefore(t),l.from=this._blockStartPos(t),l instanceof a&&(l.blockIndex=t),s.extend(l)})),s}extractInput(e,t,s){if(void 0===e&&(e=0),void 0===t&&(t=this.displayValue.length),void 0===s&&(s={}),e===t)return"";let i="";return this._forEachBlocksInRange(e,t,((e,t,o,l)=>{i+=e.extractInput(o,l,s)})),i}_findStopBefore(e){let t;for(let s=0;s<this._stops.length;++s){const i=this._stops[s];if(!(i<=e))break;t=i}return t}_appendPlaceholder(t){const s=new e;if(this.lazy&&null==t)return s;const i=this._mapPosToBlock(this.displayValue.length);if(!i)return s;const o=i.index,l=null!=t?t:this._blocks.length;return this._blocks.slice(o,l).forEach((e=>{if(!e.lazy||null!=t){const t=e._appendPlaceholder(e._blocks?.length);this._value+=t.inserted,s.aggregate(t)}})),s}_mapPosToBlock(e){let t="";for(let s=0;s<this._blocks.length;++s){const i=this._blocks[s],o=t.length;if(t+=i.displayValue,e<=t.length)return{index:s,offset:e-o}}}_blockStartPos(e){return this._blocks.slice(0,e).reduce(((e,t)=>e+t.displayValue.length),0)}_forEachBlocksInRange(e,t,s){void 0===t&&(t=this.displayValue.length);const i=this._mapPosToBlock(e);if(i){const e=this._mapPosToBlock(t),o=e&&i.index===e.index,l=i.offset,a=e&&o?e.offset:this._blocks[i.index].displayValue.length;if(s(this._blocks[i.index],i.index,l,a),e&&!o){for(let t=i.index+1;t<e.index;++t)s(this._blocks[t],t,0,this._blocks[t].displayValue.length);s(this._blocks[e.index],e.index,0,e.offset)}}}remove(e,t){void 0===e&&(e=0),void 0===t&&(t=this.displayValue.length);const s=super.remove(e,t);return this._forEachBlocksInRange(e,t,((e,t,i,o)=>{s.aggregate(e.remove(i,o))})),s}nearestInputPos(e,t){if(void 0===t&&(t=s.NONE),!this._blocks.length)return 0;const i=new r(this,e);if(t===s.NONE)return i.pushRightBeforeInput()?i.pos:(i.popState(),i.pushLeftBeforeInput()?i.pos:this.displayValue.length);if(t===s.LEFT||t===s.FORCE_LEFT){if(t===s.LEFT){if(i.pushRightBeforeFilled(),i.ok&&i.pos===e)return e;i.popState()}if(i.pushLeftBeforeInput(),i.pushLeftBeforeRequired(),i.pushLeftBeforeFilled(),t===s.LEFT){if(i.pushRightBeforeInput(),i.pushRightBeforeRequired(),i.ok&&i.pos<=e)return i.pos;if(i.popState(),i.ok&&i.pos<=e)return i.pos;i.popState()}return i.ok?i.pos:t===s.FORCE_LEFT?0:(i.popState(),i.ok?i.pos:(i.popState(),i.ok?i.pos:0))}return t===s.RIGHT||t===s.FORCE_RIGHT?(i.pushRightBeforeInput(),i.pushRightBeforeRequired(),i.pushRightBeforeFilled()?i.pos:t===s.FORCE_RIGHT?this.displayValue.length:(i.popState(),i.ok?i.pos:(i.popState(),i.ok?i.pos:this.nearestInputPos(e,s.LEFT)))):e}totalInputPositions(e,t){void 0===e&&(e=0),void 0===t&&(t=this.displayValue.length);let s=0;return this._forEachBlocksInRange(e,t,((e,t,i,o)=>{s+=e.totalInputPositions(i,o)})),s}maskedBlock(e){return this.maskedBlocks(e)[0]}maskedBlocks(e){const t=this._maskedBlocks[e];return t?t.map((e=>this._blocks[e])):[]}}t.MaskedPattern=p;export{p as default};