Skip to content

Commit

Permalink
Merge branch 'release/0.3.3'
Browse files Browse the repository at this point in the history
  • Loading branch information
the-darc committed May 15, 2015
2 parents dd3b17e + 7d8cc8b commit 16f19d5
Show file tree
Hide file tree
Showing 5 changed files with 134 additions and 126 deletions.
4 changes: 2 additions & 2 deletions bower.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "br-masks",
"version": "0.3.2",
"version": "0.3.3",
"description": "A library of masks applicable to several Brazilian data like I.E., CNPJ, CPF and others",
"homepage": "http://github.com/the-darc/br-masks",
"repository": {
Expand Down Expand Up @@ -32,6 +32,6 @@
"package.json"
],
"dependencies": {
"string-mask": "^0.1.1"
"string-mask": "^0.2.1"
}
}
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "br-masks",
"version": "0.3.2",
"version": "0.3.3",
"description": "A library of masks applicable to several Brazilian data like I.E., CNPJ, CPF and others",
"id": "/br-masks",
"main": "releases/br-masks.js",
Expand Down
250 changes: 129 additions & 121 deletions releases/br-masks-standalone.js
Original file line number Diff line number Diff line change
@@ -1,12 +1,28 @@
var StringMask = (function() {
(function (root, factory) {
if (typeof define === 'function' && define.amd) {
// AMD. Register as an anonymous module.
define([], factory);
} else if (typeof exports === 'object') {
// Node. Does not work with strict CommonJS, but
// only CommonJS-like environments that support module.exports,
// like Node.
module.exports = factory();
} else {
// Browser globals (root is window)
root.StringMask = factory();
}
}(this, function () {
var tokens = {
'0': {pattern: /\d/, _default: '0'},
'9': {pattern: /\d/, optional: true},
'#': {pattern: /\d/, optional: true, recursive: true},
'S': {pattern: /[a-zA-Z]/},
'$': {escape: true}
'U': {pattern: /[a-zA-Z]/, transform: function (c) { return c.toLocaleUpperCase(); }},
'L': {pattern: /[a-zA-Z]/, transform: function (c) { return c.toLocaleLowerCase(); }},
'$': {escape: true}
};
var isEscaped = function(pattern, pos) {

function isEscaped(pattern, pos) {
var count = 0;
var i = pos - 1;
var token = {escape: true};
Expand All @@ -15,143 +31,149 @@ var StringMask = (function() {
count += token && token.escape ? 1 : 0;
i--;
}
return count > 0 && count%2 === 1;
};
var calcOptionalNumbersToUse = function(pattern, value) {
return count > 0 && count%2 === 1;
}

function calcOptionalNumbersToUse(pattern, value) {
var numbersInP = pattern.replace(/[^0]/g,'').length;
var numbersInV = value.replace(/[^\d]/g,'').length;
return numbersInV - numbersInP;
};
var concatChar = function(text, character, options) {
}

function concatChar(text, character, options, token) {
if (token && typeof token.transform === 'function') character = token.transform(character);
if (options.reverse) return character + text;
return text + character;
};
var hasMoreTokens = function(pattern, pos, inc) {
}

function hasMoreTokens(pattern, pos, inc) {
var pc = pattern.charAt(pos);
var token = tokens[pc];
if (pc === '') return false;
return token && !token.escape ? true : hasMoreTokens(pattern, pos + inc, inc);
};
var insertChar = function(text, char, position) {
}

function insertChar(text, char, position) {
var t = text.split('');
t.splice(position >= 0 ? position: 0, 0, char);
return t.join('');
};
var StringMask = function(pattern, opt) {
}

function StringMask(pattern, opt) {
this.options = opt || {};
this.options = {
reverse: this.options.reverse || false,
usedefaults: this.options.usedefaults || this.options.reverse
};
this.pattern = pattern;
}

StringMask.prototype.process = function proccess(value) {
if (!value) return '';
value = value + '';
var pattern2 = this.pattern;
var valid = true;
var formatted = '';
var valuePos = this.options.reverse ? value.length - 1 : 0;
var optionalNumbersToUse = calcOptionalNumbersToUse(pattern2, value);
var escapeNext = false;
var recursive = [];
var inRecursiveMode = false;

var steps = {
start: this.options.reverse ? pattern2.length - 1 : 0,
end: this.options.reverse ? -1 : pattern2.length,
inc: this.options.reverse ? -1 : 1
};

var continueCondition = function(options) {
if (!inRecursiveMode && hasMoreTokens(pattern2, i, steps.inc)) {
return true;
} else if (!inRecursiveMode) {
inRecursiveMode = recursive.length > 0;
}
StringMask.prototype.process = function proccess(value) {
if (!value) return '';
value = value + '';
var pattern2 = this.pattern;
var valid = true;
var formatted = '';
var valuePos = this.options.reverse ? value.length - 1 : 0;
var optionalNumbersToUse = calcOptionalNumbersToUse(pattern2, value);
var escapeNext = false;
var recursive = [];
var inRecursiveMode = false;

var steps = {
start: this.options.reverse ? pattern2.length - 1 : 0,
end: this.options.reverse ? -1 : pattern2.length,
inc: this.options.reverse ? -1 : 1
};

if (inRecursiveMode) {
var pc = recursive.shift();
recursive.push(pc);
if (options.reverse && valuePos >= 0) {
i++;
pattern2 = insertChar(pattern2, pc, i);
return true;
} else if (!options.reverse && valuePos < value.length) {
pattern2 = insertChar(pattern2, pc, i);
return true;
}
}
return i < pattern2.length && i >= 0;
};

for (var i = steps.start; continueCondition(this.options); i = i + steps.inc) {
var pc = pattern2.charAt(i);
var vc = value.charAt(valuePos);
var token = tokens[pc];
if (!inRecursiveMode || vc) {
if (this.options.reverse && isEscaped(pattern2, i)) {
formatted = concatChar(formatted, pc, this.options);
i = i + steps.inc;
continue;
} else if (!this.options.reverse && escapeNext) {
formatted = concatChar(formatted, pc, this.options);
escapeNext = false;
continue;
} else if (!this.options.reverse && token && token.escape) {
escapeNext = true;
continue;
}
function continueCondition(options) {
if (!inRecursiveMode && hasMoreTokens(pattern2, i, steps.inc)) {
return true;
} else if (!inRecursiveMode) {
inRecursiveMode = recursive.length > 0;
}

if (inRecursiveMode) {
var pc = recursive.shift();
recursive.push(pc);
if (options.reverse && valuePos >= 0) {
i++;
pattern2 = insertChar(pattern2, pc, i);
return true;
} else if (!options.reverse && valuePos < value.length) {
pattern2 = insertChar(pattern2, pc, i);
return true;
}
}
return i < pattern2.length && i >= 0;
}

if (!inRecursiveMode && token && token.recursive) {
recursive.push(pc);
} else if (inRecursiveMode && !vc) {
if (!token || !token.recursive) formatted = concatChar(formatted, pc, this.options);
for (var i = steps.start; continueCondition(this.options); i = i + steps.inc) {
var pc = pattern2.charAt(i);
var vc = value.charAt(valuePos);
var token = tokens[pc];
if (!inRecursiveMode || vc) {
if (this.options.reverse && isEscaped(pattern2, i)) {
formatted = concatChar(formatted, pc, this.options, token);
i = i + steps.inc;
continue;
} else if (recursive.length > 0 && token && !token.recursive) {
// Recursive tokens most be the last tokens of the pattern
valid = false;
} else if (!this.options.reverse && escapeNext) {
formatted = concatChar(formatted, pc, this.options, token);
escapeNext = false;
continue;
} else if (!inRecursiveMode && recursive.length > 0 && !vc) {
} else if (!this.options.reverse && token && token.escape) {
escapeNext = true;
continue;
}
}

if (!inRecursiveMode && token && token.recursive) {
recursive.push(pc);
} else if (inRecursiveMode && !vc) {
if (!token || !token.recursive) formatted = concatChar(formatted, pc, this.options, token);
continue;
} else if (recursive.length > 0 && token && !token.recursive) {
// Recursive tokens most be the last tokens of the pattern
valid = false;
continue;
} else if (!inRecursiveMode && recursive.length > 0 && !vc) {
continue;
}

if (!token) {
formatted = concatChar(formatted, pc, this.options);
if (!inRecursiveMode && recursive.length) {
recursive.push(pc);
}
} else if (token.optional) {
if (token.pattern.test(vc) && optionalNumbersToUse) {
formatted = concatChar(formatted, vc, this.options);
valuePos = valuePos + steps.inc;
optionalNumbersToUse--;
} else if (recursive.length > 0 && vc) {
valid = false;
break;
}
} else if (token.pattern.test(vc)) {
formatted = concatChar(formatted, vc, this.options);
if (!token) {
formatted = concatChar(formatted, pc, this.options, token);
if (!inRecursiveMode && recursive.length) {
recursive.push(pc);
}
} else if (token.optional) {
if (token.pattern.test(vc) && optionalNumbersToUse) {
formatted = concatChar(formatted, vc, this.options, token);
valuePos = valuePos + steps.inc;
} else if (!vc && token._default && this.options.usedefaults) {
formatted = concatChar(formatted, token._default, this.options);
} else {
optionalNumbersToUse--;
} else if (recursive.length > 0 && vc) {
valid = false;
break;
}
} else if (token.pattern.test(vc)) {
formatted = concatChar(formatted, vc, this.options, token);
valuePos = valuePos + steps.inc;
} else if (!vc && token._default && this.options.usedefaults) {
formatted = concatChar(formatted, token._default, this.options, token);
} else {
valid = false;
break;
}
}

return {result: formatted, valid: valid};
};
return {result: formatted, valid: valid};
};

StringMask.prototype.apply = function(value) {
return this.process(value).result;
};
StringMask.prototype.apply = function(value) {
return this.process(value).result;
};

StringMask.prototype.validate = function(value) {
return this.process(value).valid;
};
StringMask.prototype.validate = function(value) {
return this.process(value).valid;
};

StringMask.process = function(value, pattern, options) {
Expand All @@ -167,26 +189,12 @@ var StringMask = (function() {
};

return StringMask;
}());

/** Used to determine if values are of the language type Object */
var objectTypes = {
'boolean': false,
'function': true,
'object': true,
'number': false,
'string': false,
'undefined': false
};

if (objectTypes[typeof module]) {
module.exports = StringMask;
}
}));

/**
* br-masks
* A library of masks applicable to several Brazilian data like I.E., CNPJ, CPF and others
* @version v0.3.2
* @version v0.3.3
* @link http://github.com/the-darc/br-masks
* @license MIT
*/
Expand Down
Loading

0 comments on commit 16f19d5

Please sign in to comment.