|
74 | 74 | break |
75 | 75 | } |
76 | 76 | buffer.splice(i, 1); |
77 | | - var result= this.apply(buffer.join(''), i); |
| 77 | + var result= this.apply(buffer.join(''), i, true); |
78 | 78 | result.pos=i; |
79 | 79 | return result; |
80 | 80 | } |
|
86 | 86 | break |
87 | 87 | } |
88 | 88 | buffer.splice(i, 1); |
89 | | - var result=this.apply(buffer.join(''), i); |
| 89 | + var result=this.apply(buffer.join(''), i, true); |
90 | 90 | result.pos=i; |
91 | 91 | return result; |
92 | 92 | } |
93 | 93 |
|
94 | | - FixedWidthMask.prototype.apply = function(input, caretPosition){ |
| 94 | + FixedWidthMask.prototype.apply = function(inputString, caretPosition, doShift){ |
95 | 95 | if(caretPosition == null) |
96 | 96 | caretPosition = this.length; |
97 | | - var buffer=[], |
| 97 | + |
| 98 | + var input=inputString.split(''), |
| 99 | + buffer=[], |
98 | 100 | raw=[], |
99 | 101 | lastMatch = -1, |
100 | 102 | i, |
|
108 | 110 | buffer.push(this.settings.placeholder); |
109 | 111 |
|
110 | 112 | while (pos++ < input.length) { |
111 | | - c = input.charAt(pos - 1); |
| 113 | + c = input[pos - 1]; |
112 | 114 | if (action.test(c)) { |
113 | 115 | buffer[i] = c; |
114 | | - raw.push(c) |
| 116 | + raw.push(c); |
115 | 117 | lastMatch = i; |
116 | 118 | break; |
| 119 | + }else if(doShift){ |
| 120 | + //TODO: The following is awful and needs to be refactored. |
| 121 | + var tests=$.map(this.tests.slice(i + 1),function(test, offset){ |
| 122 | + var index = pos - 1 + offset; |
| 123 | + if(test.test && input[index] != null){ |
| 124 | + return {regex:test,char:input[index]}; |
| 125 | + } |
| 126 | + }); |
| 127 | + |
| 128 | + if(tests.length){ |
| 129 | + var newInput = [],canShift = true; |
| 130 | + tests.unshift({regex: action}); |
| 131 | + for(var j = 1; j < tests.length; j++){ |
| 132 | + if(!tests[j-1].regex.test(tests[j].char)){ |
| 133 | + canShift = false; |
| 134 | + break; |
| 135 | + } |
| 136 | + newInput.push(tests[j].char); |
| 137 | + } |
| 138 | + } |
| 139 | + |
| 140 | + if(canShift){ |
| 141 | + //Everything to the right can shift left and still match. |
| 142 | + input = newInput; |
| 143 | + buffer[i] = input[0]; |
| 144 | + pos = 1; |
| 145 | + }else{ |
| 146 | + //Retry current char at next position leaving a blank. |
| 147 | + pos--; |
| 148 | + } |
| 149 | + //Only allow shift attempt to happen once. |
| 150 | + doShift = false; |
| 151 | + break; |
117 | 152 | } |
118 | 153 | } |
119 | 154 | } else { |
120 | 155 | buffer.push(action); |
121 | | - if(action === input.charAt(pos) && i !== this.partialPosition) { |
| 156 | + if(action === input[pos] && i !== this.partialPosition) { |
122 | 157 | pos++; |
123 | 158 | } |
124 | 159 | } |
|
0 commit comments