Skip to content

Instantly share code, notes, and snippets.

@nauzilus
Last active July 4, 2016 11:20
Show Gist options
  • Save nauzilus/99084ea2f2738d2035cc to your computer and use it in GitHub Desktop.
Save nauzilus/99084ea2f2738d2035cc to your computer and use it in GitHub Desktop.
Generator
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