Last active
July 4, 2016 11:20
-
-
Save nauzilus/99084ea2f2738d2035cc to your computer and use it in GitHub Desktop.
Generator
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
var gen = function(str) { | |
var g_datetime = function(flags) { | |
var date = new Date(); | |
if (flags["<"] ^ flags[">"]) { | |
var dayTicks = 86400000, | |
midnight=new Date(date.getTime() - ( ( date.getTime() - ( date.getTimezoneOffset() * 60000 ) ) % dayTicks )), | |
mins=~~(date.getTime() - midnight.getTime()), | |
tOffset=g_number.apply(null, flags.t ? flags["<"] ? [0,mins] : [mins,dayTicks] : [0,dayTicks]), | |
dOffset=g_number(1,365)*dayTicks*(flags["<"]?-1:1); | |
date = new Date(midnight.getTime() + (flags.t && !flags.d ? 0 : dOffset) + tOffset); | |
} | |
return !(flags.d ^ flags.t) | |
? date.toLocaleString() | |
: flags.d | |
? date.toLocaleDateString() | |
: date.toLocaleTimeString(); | |
}; | |
var g_randstr = function(arg) { | |
var str=""; | |
if (typeof arg == "number") | |
for(var i=0;i<arg;i++) | |
str += g_number(0,35).toString(36); | |
else if (arg && arg.push) | |
str=arg[g_number(0,arg.length-1)]; | |
return str; | |
} | |
var g_number = function(min,max,pad) { | |
var num = ~~((Math.random() * (max-min+1)) + min); | |
return pad ? (pad + num).slice(-(pad.length)).replace(/^(0+)-\b/,"-$1") : num; | |
}; | |
var g_email = function(domain) { | |
domain=domain||"example.com"; | |
return g_randstr(10,10) + (~domain.indexOf("@") ? "" : "@") + domain; | |
}; | |
var a_passthru = function(opt) { return opt; } | |
var a_numrange = function(opt) { | |
var m=_numrange(/^(?:(-?\d+)?-(-?\d+)?)?(?:([sz])(\d+)?)?$/, opt,0,100); | |
return m.slice(0,2).concat(m[2] ? _padder({s:' ',z:0}[m[2]], m[3] || Math.max((m[0]+"").length,(m[1]+"").length)) : ""); | |
}; | |
var a_randstr = function(opt) { | |
return ~opt.indexOf("|") ? [opt.split("|")] : _numOr(opt,g_number.apply(null,_numrange(/^(\d+)(?:-(\d+))$/, opt, 5, 5))); | |
} | |
var a_flags = function(opt) { | |
return opt.split("").reduce(function(o,v) { o[v]=true; return o; }, {}); | |
} | |
var _numOr = function(num,or) { | |
return /^-?\d+$/.exec(num) ? Number(num) : or; | |
}; | |
var _padder = function(char,sz) { | |
for (var i=0,pad="";i<sz;i++) | |
pad += char; | |
return pad; | |
}; | |
var _numrange = function(re,opt,defaultMin,defaultMax) { | |
var m = re.exec(opt) || [], | |
min=_numOr(m[1],defaultMin), | |
max=_numOr(m[2],defaultMax); | |
return [min,max].sort().concat(m.slice(3)); | |
} | |
var generators = { | |
d:g_datetime, | |
n:g_number, | |
e:g_email, | |
s:g_randstr | |
}; | |
var attribs = { | |
d:a_flags, | |
n:a_numrange, | |
s:a_randstr | |
}; | |
return str.replace(/{=(\w+)(?::([^}]*))?}/g, function(matched, name, opt) { | |
name=name.toLowerCase(); | |
var fnGenerator = generators[name]; | |
var fnAttribs = attribs[name] || a_passthru; | |
return fnGenerator | |
? fnGenerator.apply(null, [].concat(fnAttribs(opt || ""))) | |
: matched; | |
} | |
); | |
}; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment