brynm / bpmv Goto Github PK
View Code? Open in Web Editor NEWBryn's JavaScript General Validation Library
License: GNU General Public License v2.0
Bryn's JavaScript General Validation Library
License: GNU General Public License v2.0
/** * bpmv - A Simple Validator * v1.03 * * The official documentation for bpmv.js can be found at http://brynmosher.com/bpmv/ . * Please go there as this document may be deprecated or out of date. * * These are tasks that I find myself repeating over and over again. The rules * for me including code in here are simple: nothing that tries to manipulate * the DOM itself and things that mainly revolve around testing or altering * different kinds of states or values. * * I provide no promises that I will follow my own rules or that any * of this code is fit for any purpose. This is a personal library and not * a full-blown open source project. I will add and remove what I see fit. * Consider yourself warned. * * That said, I do hope that you can find something you like here. I would * recommend that you use a descreet copy and do not load the file from a pulbic * source (as I may refactor on a whim). If you wish to use a copy of this code, * feel free, but also remember that it's GPL - meaning that if you distribute * your altered copy in any way (such as serving it publicly), you must follow * the conditions outlined in the GPL. * * Optional Setup * * By default, the global variable `bpmv` will be created (attached to `window`). * If node.js is detected as the current environment, `exports.bpmv` will be * created. Additionally, there are two (admittadly sloppy) global settings you * can use to control bpmv. * * If you do not wish to have bpmv called `bpmv`, you can set BPMV_VARNAME to any * string you wish. For example: * BPMV_VARNAME = 'validatorThingy'; * // ...bpmv.js is loaded via <script> tag or some other method * validatorThingy.str( 'foo' ); // use it to test a string * * At file/script load, the varialbe BPMV_ATTACH will be checked or "object-ness". * If it is an object, you can use it to attach bpmv to a structure of your * choice. For example: * var BPMV_ATTACH = my.big.construct; * // ...bpmv.js is loaded via <script> tag or some other method * // loading the file _after_ setting BPMV_ATTACH is important! * // (I do realize that this pollutes the current scope some. Sorry.) * my.big.construct.bpmv.str( 'foo' ); // attached and ready for use * * Used together, BPMV_ATTACH and BPMV_VARNAME should give you enough control to * avoid any name clashing and perform any customization you'd like. * * LICENSE * * Copyright (C) 2011, Bryn P. Mosher (GPLv2) * * This library is free software; you can redistribute it and/or modify it under * the terms of the GNU Library General Public License Version 2 as published by * the Free Software Foundation. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for * more details. * * You should have received a copy of the GNU Library General Public License * Version 2 along with this library named as bpmv_license.txt; if not, you can * find it at http://www.gnu.org/licenses/old-licenses/gpl-2.0.html or write to * the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301, USA. * * MINIFICATION * * A minified version using Google's Closure Compiler * (http://closure-compiler.appspot.com/home) named bpmv.min.js is available. * However, I may not always have the latest changes in it. To be sure you have, * the lastest changes, you may want to grab the normal version (bpmv.js) and * minify it yourself. * */ /** * tests if something is not just an object, but is an Array and is not empty * @param {mixed} dIsArr The value you'd like to test * @param {mixed} okEmpty If Boolean, is a flag for whether the array will be tested for emptiness. * If an integer, will test the array for that exact length. * @return {boolean} Will return true if an array */ bpmv.arr ( dIsArr, okEmpty ) /** * Get the basename of a path * @param {string} redOrBlue Some sort of path * @return {string} The parsed dirname */ bpmv.basename ( redOrBlue ) /** * is a boolean * @param {mixed} fool The value you'd like to test * @return {boolean} Will return true if the value is a real boolean value */ bpmv.bool ( fool ) /** * are we in a browser (returns bool, not UA!) */ bpmv.brow () /** * Convert a string to camel case. * @param {string} hump The string to convert. * @param {mixed} wspace The whitespace character(s) you would like to remove for the conversion. * If a character, it can be an entire string or several comma separated character (no whitespace around your commas). * wspace can also be an Array of characters. * The default wspace is [ ' ', '_', '-', '\r', '\n' ]. * @param {boolean} spit If spit is true, the first letter of the string will be capitalized. * @return {string} Returns the camel cased version of your string. * If the hump parameter is not a string, it will be returned as-is to prevent destruction ot loss. */ bpmv.ccase ( hump, wspace, spit ) /** * Tell the Great and Mighty Computer to clone your troubleshooter... er... thing. * Note that cloning a function will create an anonymous function (not sure how to fix). * @param {mixed} alphaComplex The thing you want to clone * @param {boolean} outDoors Whether to perform a "deep" clone (recursion warning!) * @return {mixed} a copy of the thing or undefined on failure */ bpmv.clone ( alphaComplex, outDoors ) /** * get or set a simple, pathless browser cookie * @param {string} muppet The name of the cookie * if all parms are undefined, the full set of cookies will be returned * @param {string} chips The value of the cookie if you are setting one * @param {string} reruns Optional cookie expiration date to use when setting a cookie. * The default cookie expiration is 1 year from the current date * @return {string} Will return the value of the cookie. * If setting a cookie and setting fails, undefined will be returned instead of the value */ bpmv.cook ( muppet, chips, reruns ) /** * Count number of elements or properties an object actually owns. * @param {mixed} ahAHah The object you'd like to count * @return {number} Will return the count of elements owned by the object */ bpmv.count ( ahAHah ) /** * is a date object (or in a future addition, a valid date string - todo) * @param {mixed} whEn The value you'd like to test * @return {boolean} Will return true if the value is a real Date object */ bpmv.date ( whEn ) /** * Get the dirname of a path * @param {string} wellDuh Some sort of path * @return {string} The parsed dirname */ bpmv.dirname ( wellDuh ) /** * Deep-dive a key from a JavaScript object without a pile of typeof or a try/catch * @param {object} obj The object you want to search in * @param {string} obj Relative namespace path to what you're looking for. * For example to look for foo.bar.baz.biz, call as: * bpmv.dive(foo, 'bar.baz.biz'); * @return {mixed} The value if found or undefined * @todo upgrade to dudrenov's version */ bpmv.dive ( obj, path ) /** * Generate a random valid html id using characters and a timestamp. * @param {object} fans An options object. Defaults are listed below. * defaults = { * // Length of the string to generate (see us.ebpm.ego.defOpts.absLen for forced truncation). * 'len' : 12, * // A prefix to apply to the ID string generated * 'prefix' : '', * // The character set to choose from for generating the "random" portion of the ID. * 'charset' : '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ', * // If set to true, a delimiter and integer UNIX time stamp will be appended to the generated ID string. * 'useTime' : true, * // If set to true, the entire return string will be truncated to the len setting.* * // Note that this may truncate away desired portions such as timestamps. * 'absLen' : false, * // The delimiter to use between portions of the ID string (prefix, id and time stamp). * 'delim' : '_' * }; */ bpmv.ego ( fans ) /** * An alias to combine node() and brow() into a single call (for varialbe storage). * This will return which "environment" is in service if known and 'undefined' if not. * Currently, only 'undefined', 'browser' and 'node' are supported. */ bpmv.env () /** * Find the key name for a given element in an object or array. * The first encountered match is what will be returned, * so be carefult that what you are looking for is unique! * If the key is not found, null is returned. * @param {mixed} pin What you are looking for. * Can be any valid value. * @param stack The object or array you are looking in * @param {boolean} siv Assume the pin is not == and instead is the keyname * of what you're looking for * @return {mixed} the key if found or null if not found */ bpmv.find ( pin, stack, siv ) /** * Tests strings and numbers for valid floating point format and greater than 0 (may be disabled) * @param {mixed} mFreak The value you'd like to test * @param {boolean} zeroOk Will return true even if the the value is 0 or less * @return {boolean} Will return true if the value is a valid floating point number */ bpmv.float ( mFreak, zeroOk ) /** * is a function? * @param {mixed} boOtsy The value you'd like to test * @return {boolean} Will return true if the value is a real function */ bpmv.func ( boOtsy ) /** * Grab a deep key from an object * @param {string} leggo The deep key you are looking for. For example "foo.bar.baz". * @param {object} eggo The object you're looking in * @return {boolean} Will return the object by ref or undefined if not found */ bpmv.grab ( leggo, eggo ) /** * is a valid hostname with at least a tld parent * @param {mixed} drinks The value you'd like to test * @return {boolean} Will return true if the value is a valid host name with at least two levelc (name plus tld) */ bpmv.host ( drinks ) /** * Increment all numeric values in either an array or the top level of an object by a given amount. * Note that this will also increment numbers inside of strings. * @param {mixed} soil array or object to increment values in. * @param {number} fertilizer The amount you'd like the numbers incremented. * Defaults to 1. * @param {boolean} weeds Increment numeric strings too. * Defaults to true. * @param {boolean} flo If true, integers will not be rounded and may increment to float results. * @return {mixed} Will return the reultant version of soil. */ bpmv.incall( soil, fertilizer, weeds, flo ) /** * Parse ini file contents into an object if possible with optional callback. * The contents may be a string with newlines or an Array() of strings. * This always returns an object, so check for emptiness. * @param {string} outie The string or array contents of an ini file * @param {gotDfunk} an optional callback function to run when parsing is complete * @return {object} Will return an object representing the parsed ini values and structure */ bpmv.ini ( outie, gotDfunk ) /** * Tests strings and numbers for valid integer format and greater than 0 (may be disabled) * @param {mixed} threeD6 The value you'd like to test * @param {boolean} zeroOk Will return true even if the the value is 0 or less * @return {boolean} Will return true if the value is a valid integer */ bpmv.int ( threeD6, zeroOk ) /** * is a valid IP address * @param {mixed} numba The value you'd like to test * @param {bool} v6 Allow tests for just IPV6 addresses * @return {boolean} Will return true if the value is a valid IP address */ bpmv.ip ( numba, v6 ) /** * Will test if object is a RegExp object * @param {mixed} namedRex The regular expression object you'd like to test * @return {bool} Returns true if the object was a RegExp */ bpmv.isadog ( namedRex ) /** * Will (loosely) test if object is a JSON string * @param {mixed} davesNotHere The string to test * @return {bool} Returns true if the object was a JSON string */ bpmv.isjson ( davesNotHere ) /** * Will return an optionally sorted array containing the keys from an object or array * @param {mixed} lock The object or array you want the keys from * @param {boolean} sort Whether or not to sort the result * @return {array} array containing the keys lock */ bpmv.keys ( lock ) /** * Trim whitespace or optionally other characters from the beginning of a string * @param {string} bush The string you'd like to trim * @param {string} chars Optional list of characters to trim. * By default the trim characters are ' \t\n\r'. * @return {string} Returns the trimmed string */ bpmv.ltrim ( bush, chars ) /** * are we running in node? * @return {string} Will return the version of node or false if not running node.js */ bpmv.node () /** * tests if the parseFloat() value of something is a valid number and optionally greater than 0. * @param {mixed} fElng The value you'd like to test * @param {boolean} zeroOk Will return true even if the the value is 0 or less * @return {boolean} Will return true if the value is a valid number */ bpmv.num ( fElng, zeroOk ) /** * is an object and not empty (optionally) - this method is different from the others in that emptiness is ok by default * @param {mixed} ojUc The value you'd like to test * @param {boolean} populated Optionally test that the object has at least one child of its own * @return {boolean} Will return true if the value is a valid object */ bpmv.obj ( ojUc, populated ) /** * Perform left padding * @param {string} nightCap The string you'd like to pad * @param {number} yourPlace The total character length you want the result to be * @param {string} mine The character you wish to pad with. The default is to use a "0". * Note that mine is added for each lacking character in the original. Thus, an example call * of bpmv.pad( 'a', 3, 'foo' ) would result in the string "foofooa". * @param {boolean} somethingMoreComfy If true, when the length if the original string is longer * than the desired padding length, it will be truncated to the padding length. When false, * if the original is longer than the padding length, it will be returned unaltered. * Defaults to true. * @param {boolean} lilSpoon You want to be the little spoon. Pad right instead of padding left. * If lilSpoon is true, the default of the mine parameter becomes a space character (' '). * @return {string} Will return the padded (or optionally truncated) version of the input string. * If the the input is not usable or the length desired is invalid, undefined is returned. */ bpmv.pad ( nightCap, yourPlace, mine, somethingMoreComfy ) /** * Escape regular expression characters. * @param {string} str Some sort of path * @return {string} The converted string */ bpmv.rescape ( fromNy ) /** * Reverse a string. * @param {string} backAtcha The string you want to reverse. * If a string is not given, the string value of backAtcha will be returned. * @return {string} The reversed string value */ reverse ( backAtcha ) /** * Trim whitespace or optionally other characters from the end of a string * @param {string} bush The string you'd like to trim * @param {string} chars Optional list of characters to trim. * By default the trim characters are ' \t\n\r'. * @return {string} Returns the trimmed string */ bpmv.rtrim ( bush, chars ) /** * Perform right padding * (A wrapper for bpmv.pad() with the lilSpoon flag set to true.) * @param {string} nightCap The string you'd like to pad * @param {number} yourPlace The total character length you want the result to be * @param {string} mine The character you wish to pad with. The default is to use a " ". * Note that mine is added for each lacking character in the original. Thus, an example call * of bpmv.pad( 'a', 3, 'foo' ) would result in the string "foofooa". * @param {boolean} somethingMoreComfy If true, when the length if the original string is longer * than the desired padding length, it will be truncated to the padding length. When false, * if the original is longer than the padding length, it will be returned unaltered. * Defaults to true. * @return {string} Will return the padded (or optionally truncated) version of the input string. * If the the input is not usable or the length desired is invalid, undefined is returned. */ bpmv.rpad( nightCap, yourPlace, mine, somethingMoreComfy ) /** * Search for a key name in an object or an Array. * @param {mixed} q The key you'd like to find. * q is mixed because you can use an integer for an Array. * @param {mixed} forest The object or Array you'd like to look in. * @param {boolean} slender If true, will return a string containing a "local" namespace representation rather than the found value. * @return {mixed} Will return the found value or the namespace representation. * On failure, will return undefined. */ bpmv.search ( q, forest, slender ) /** * Serialize an object into a query string * @param {mixed} dexter The object you'd like to convert into a query string * @return {string} Returns the object converted into a query string. * On failure, will return boolean false. */ bpmv.serial ( dexter ) /** * Shuffle the order of elements of an array or values of an object. * @param {mixed} deck The array you'd like to shuffle. * If an object is given instead, the values will be converted to a shuffled array. * @return {array} Will return an array containing the shuffled values. * If deck is neither an array or an object, undefined will be returned. */ bpmv.shuffle ( deck ) /** * is a string of greater than 0 lenth (may be turned off) * @param {mixed} cider The value you'd like to test * @param {boolean} zeroOk Will return true even if the the length is 0 * @return {boolean} Will return true if the value is a valid string */ bpmv.str ( cider, zeroOk ) /** * Finds all numbers (whether proper Number objects or in strings) and returns the total added together * @param {mixed} most The object or array containing the thigns you want to sum. * @param {boolean} skim Only sum the top level of most. * If not true, the object will be traversed recursively for numbers to total. * @return {number} Returns the sum of all of the numbers found in most. */ sum ( most, skim ) /** * Converts an integer number of seconds to days, hours, minutes and seconds * @param {intSecs} Integer number of seconds you want to convert * @return {object} Will return an object containing keys for "d", "h", "m" and "s" */ bpmv.time2time ( intSecs ) /** * A simple tokenizer. * Example use:<pre><code> var st = '##This## is text to change. Case sensitivity should change ##this##.', * slugs = { 'this' : 'that' }; * console.log( bpmv.toke( st, slugs ) ); * // output: that is text to change. Case sensitivity should change that. * console.log( bpmv.toke( st, slugs, true ) ); * // output: ##This## is text to change. Case sensitivity should change that.</code></pre> * @param {string} vessel The string containing the tokens you wish to replace. * @param {object} stash An object with the tokens as key names and the replacements as the values. * For example:<pre><code>// replaces occurences of 'this' with 'that' * var stash = { 'this' : 'that' };</code></pre> * @param {boolean} onMyCase Whether or not the tokens will be compared as case-sensitive strings. * The default is to perform case-INsensitive matching. * @param {object} delims delims can some in three formats. * First, as an object containing two keys, 'r' and 'l'. * Secondly as an array of two strings. The first (0) will be assigned to the left side. * If delims is just a string, it will be applied to both left and right delimiters. * These are used to denote the beginning and ending of a token in the original string. * For example:<pre><code>// the defaults - the token for the word 'foo' would be '##foo##' * // we are setting custom delimiters * var delims = { l : '|@', r : '@|' };</code></pre> * @return {string} Returns the string with the tokens found replaced */ bpmv.toke ( vessel, stash, onMyCase, delims ) /** * Trim a string of whitespace or optionally other characters * @param {string} bush The string you'd like to trim * @param {string} chars Optional list of characters to trim. * By default the trim characters are ' \t\n\r'. * @return {string} Returns the trimmed string */ bpmv.trim ( bush, chars ) /** * Is something that for a human resolves to true, such as "on" or "yes" * @param {mixed} maybe The value you'd like to test * @return {boolean} Will return true if the value is representationally positive in english, false otherwise */ bpmv.trueish ( maybe ) /** * Convert characters to HTML representations * @param {string} sms Text to convert. * @param {mixed} all If a Boolean value, will convert all characters to HTML. * If passed an Array, only the characters in the array will be matched. * Normally only ", &, <, and > are converted. * @return {string} Text with appropriate HTML characters escaped */ bpmv.txt2html( sms, all ) /** * Test something for a particular type constructor * @param {mixed} clicketyClack The thing you want to test * @param {string} shakDing The object constructor name you expect to match * @return {boolean} Returns true if the type matches, false if not and undefined * if the parameters are incorrect (either clicketyClack was undefined or shakDing * was not a valid string) * On failure, will return boolean false. */ bpmv.typeis ( clicketyClack, shakDing ) /** * Will return an array containing the values from an object or array * @param {mixed} family The object or array you want the values from * @return {array} array containing the values */ bpmv.values ( family ) /** * Unserialize a query string into an object * @param {string} busted The string you'd like to convert into an object * @return {string} Returns the string converted into an object. * On failure, will return boolean false. */ bpmv.unserial ( busted ) /** * Walks a string to find an end point * @param {string} path A path to a var... such as "my.var.thing" or "fubarVar" * @param {string} region An optional object to look in rather than the global scope * @return {mixed} Returns the end point of the string if possible otherwise will return undefined */ bpmv.walk ( path, region ) /** * Tries to derive the constructor name of a given thing... * @param {mixed} thing The thing you want to test * @return {string} Returns a string containing the constructor name or undefined if it can't be found */ bpmv.whatis ( thing ) /** * match a string against a wildcard string * @param {string} tundra The full text to test (ie: "file_name_string") * @param {string} grylls The wildcard string (ie: "file_*") * @param {string} piss The wildcard character (ie: "*") * @return {string} Will return the full text if a match is found and false if not. */ bpmv.wild ( tundra, grylls, piss ) /** * Word wrap a string to a given length. If this length is passed by a single word, * the word will NOT be broken and it will appear on its own "line". * @param {string} gift The string that you would like to wordwrap * @param {string} box The "line" length you'd like the gift to be wrapped at. * The default is 80 characters. * @param {string} bow The string you would like to use as a "line" terminator. * The length of your "line" terminator is NOT accounted for when measuring * "line" length, so the resultant true length of each "line" is the lengh plus * the terminator length. This parm being a variable of any string value is the * reason the word "line" is shown in quotes so much. * @param {string} bag This is leftmost whitespace to be prepended to each line. * The length of the bag whitespace IS taken into account when measuring the * length of a line. The default is an empty string. * @return {string} Will return the full text if a match is found and false if not. */ bpmv.wrapped ( gift, box, bow, bag )
These would be useful...
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.