ソースを参照

Improve generateMaskSet + add definitionSymbol property in definitions

Robin Herbots 12 年 前
コミット
effa46762b
2 ファイル変更96 行追加8 行削除
  1. 56 2
      README.md
  2. 40 6
      js/jquery.inputmask.js

+ 56 - 2
README.md

@@ -143,13 +143,67 @@ $(document).ready(function(){
 
 ### add custom definitions
 
+You can define your own definitions to use in your mask.  
+Start by choosing a masksymbol. 
+
+##### validator
+Next define your validator.  The validator can be a regular expression or a function.
+
+##### cardinality
+Cardinality specifies how many characters are represented and validated for the definition.
+
+##### prevalidator
+ The prevalidator option is 
+used to validates the characters before the definition cardinality is reached. (see 'j' example)
+
+##### definitionSymbol
+When you insert or delete characters, they are only shifted when the definition type is the same.  This behavior can be overridden
+by giving a definitionSymbol. (see example x, y, z, which can be used for ip-address masking, the validation is different, but it is allowed to shift the characteres between the definitions)
+
 ```javascript
 $.extend($.inputmask.defaults.definitions, {
-    'f': {
+    'f': {  //masksymbol
         "validator": "[0-9\(\)\.\+/ ]",
         "cardinality": 1,
         'prevalidator': null
-    }
+    },
+	'g': {
+        "validator": function (chrs, buffer, pos, strict, opts) { 
+			//do some logic and return true, false, or { "pos": new position, "c": character to place }
+		}		
+        "cardinality": 1,
+        'prevalidator': null
+    },
+	'j': { //basic year
+            validator: "(19|20)\\d{2}",
+            cardinality: 4,
+            prevalidator: [
+                        { validator: "[12]", cardinality: 1 },
+                        { validator: "(19|20)", cardinality: 2 },
+                        { validator: "(19|20)\\d", cardinality: 3 }
+            ]
+     }, 
+	 'x': {
+        validator: "[0-2]",
+        cardinality: 1,
+        definitionSymbol: "i" //this allows shifting values from other definitions, with the same masksymbol or definitionSymbol
+     },
+     'y': {
+        validator: function (chrs, buffer, pos, strict, opts) {
+                        var valExp2 = new RegExp("2[0-5]|[01][0-9]");
+                        return valExp2.test(buffer[pos - 1] + chrs);
+                    },
+        cardinality: 1,
+        definitionSymbol: "i"
+     },
+     'z': {
+        validator: function (chrs, buffer, pos, strict, opts) {
+                       var valExp3 = new RegExp("25[0-5]|2[0-4][0-9]|[01][0-9][0-9]");
+                        return valExp3.test(buffer[pos - 2] + buffer[pos - 1] + chrs);
+        },
+        cardinality: 1,
+        definitionSymbol: "i"
+      }
 });
 ```
 

+ 40 - 6
js/jquery.inputmask.js

@@ -280,11 +280,11 @@
                             var prevalidators = maskdef["prevalidator"], prevalidatorsL = prevalidators ? prevalidators.length : 0;
                             for (var i = 1; i < maskdef.cardinality; i++) {
                                 var prevalidator = prevalidatorsL >= i ? prevalidators[i - 1] : [], validator = prevalidator["validator"], cardinality = prevalidator["cardinality"];
-                                outElem.push({ fn: validator ? typeof validator == 'string' ? new RegExp(validator) : new function () { this.test = validator; } : new RegExp("."), cardinality: cardinality ? cardinality : 1, optionality: isOptional, newBlockMarker: isOptional == true ? newBlockMarker : false, offset: 0, casing: maskdef["casing"], def: element });
+                                outElem.push({ fn: validator ? typeof validator == 'string' ? new RegExp(validator) : new function () { this.test = validator; } : new RegExp("."), cardinality: cardinality ? cardinality : 1, optionality: isOptional, newBlockMarker: isOptional == true ? newBlockMarker : false, offset: 0, casing: maskdef["casing"], def: maskdef["definitionSymbol"] | element });
                                 if (isOptional == true) //reset newBlockMarker
                                     newBlockMarker = false;
                             }
-                            outElem.push({ fn: maskdef.validator ? typeof maskdef.validator == 'string' ? new RegExp(maskdef.validator) : new function () { this.test = maskdef.validator; } : new RegExp("."), cardinality: maskdef.cardinality, optionality: isOptional, newBlockMarker: newBlockMarker, offset: 0, casing: maskdef["casing"], def: element });
+                            outElem.push({ fn: maskdef.validator ? typeof maskdef.validator == 'string' ? new RegExp(maskdef.validator) : new function () { this.test = maskdef.validator; } : new RegExp("."), cardinality: maskdef.cardinality, optionality: isOptional, newBlockMarker: newBlockMarker, offset: 0, casing: maskdef["casing"], def: maskdef["definitionSymbol"] | element });
                         } else {
                             outElem.push({ fn: null, cardinality: 0, optionality: isOptional, newBlockMarker: newBlockMarker, offset: 0, casing: null, def: element });
                             escaped = false;
@@ -296,21 +296,52 @@
                 });
             }
 
-            function generateMaskSets() {  //TODO improve generate masksets
+            function generateMaskSets() {
                 var ms = [];
                 function markOptional(maskPart) { //needed for the clearOptionalTail functionality
                     return opts.optionalmarker.start + maskPart + opts.optionalmarker.end;
                 }
+                function splitFirstOptionalEndPart(maskPart) {
+                    var optionalStartMarkers = 0, optionalEndMarkers = 0, mpl = maskPart.length;
+                    for (i = 0; i < mpl; i++) {
+                        if (maskPart.charAt(i) == opts.optionalmarker.start) {
+                            optionalStartMarkers++;
+                        }
+                        if (maskPart.charAt(i) == opts.optionalmarker.end) {
+                            optionalEndMarkers++;
+                        }
+                        if (optionalStartMarkers > 0 && optionalStartMarkers == optionalEndMarkers)
+                            break;
+                    }
+                    var maskParts = [maskPart.substring(0, i)];
+                    if (i < mpl) {
+                        maskParts.push(maskPart.substring(i + 1, mpl));
+                    }
+                    return maskParts;
+                }
+                function splitFirstOptionalStartPart(maskPart) {
+                    var mpl = maskPart.length;
+                    for (i = 0; i < mpl; i++) {
+                        if (maskPart.charAt(i) == opts.optionalmarker.start) {
+                           break;
+                        }
+                    }
+                    var maskParts = [maskPart.substring(0, i)];
+                    if (i < mpl) {
+                        maskParts.push(maskPart.substring(i + 1, mpl));
+                    }
+                    return maskParts;
+                }
                 function generateMask(maskPrefix, maskPart) {
-                    var maskParts = maskPart.split(opts.optionalmarker.end, 2);
+                    var maskParts = splitFirstOptionalEndPart(maskPart);
                     var newMask, maskTemplate;
 
-
-                    var masks = maskParts[0].split(opts.optionalmarker.start);
+                    var masks = splitFirstOptionalStartPart(maskParts[0]);
                     if (masks.length > 1) {
                         newMask = maskPrefix + masks[0] + markOptional(masks[1]) + (maskParts.length > 1 ? maskParts[1] : "");
                         maskTemplate = getMaskTemplate(newMask);
                         ms.push({
+                            "mask": newMask,
                             "_buffer": maskTemplate["mask"],
                             "tests": getTestingChain(newMask),
                             "lastValidPosition": undefined,
@@ -320,6 +351,7 @@
                         newMask = maskPrefix + masks[0] + (maskParts.length > 1 ? maskParts[1] : "");
                         maskTemplate = getMaskTemplate(newMask);
                         ms.push({
+                            "mask": newMask,
                             "_buffer": maskTemplate["mask"],
                             "tests": getTestingChain(newMask),
                             "lastValidPosition": undefined,
@@ -335,6 +367,7 @@
                         newMask = maskPrefix + maskParts;
                         maskTemplate = getMaskTemplate(newMask);
                         ms.push({
+                            "mask" : newMask,
                             "_buffer": maskTemplate["mask"],
                             "tests": getTestingChain(newMask),
                             "lastValidPosition": undefined,
@@ -349,6 +382,7 @@
                         generateMask("", lmnt.toString());
                     });
                 } else generateMask("", opts.mask.toString());
+
                 return ms;
             }