Skip to content

Instantly share code, notes, and snippets.

View geraintluff's full-sized avatar

Geraint geraintluff

View GitHub Profile
@geraintluff
geraintluff / crush.js
Created November 20, 2014 19:40
JavaScript Crusher
// Copyright 2014 Geraint Luff
// MIT Licensed
function crush(code, searchLimit) {
var originalCode = code;
searchLimit = searchLimit || 15;
var substitutions = [];
var bannedChars = /[\r\n"'\\]/;
for (var charNum = 32; charNum < 127; charNum++) { // ASCII printable ("safe") characters
var char = String.fromCharCode(charNum);
@geraintluff
geraintluff / asyncReplace.js
Created August 28, 2014 09:18
Asynchronous replace() for JavaScript
String.prototype.asyncReplace = function (subStr, replacer, callback) {
var str = this;
var replacements = {};
var pending = 0;
var checkDone = function () {
if (!--pending) {
var result = str.replace(subStr, function (match) {
var args = Array.prototype.slice.call(arguments, 0);
var pos = args[args.length - 2];
var key = pos + '-' + match.length;
@geraintluff
geraintluff / tv4-asyncFetchSchemas.js
Last active August 29, 2015 14:01
A little tv4 extension that can pre-fetch all required schemas.
tv4.asyncFetchSchemas = function (urls, callback) {
var activeRequests = 0;
var attemptedRequest = {};
if (!Array.isArray(urls)) urls = [urls];
function requestFinished(url) {
activeRequests--;
var missing = tv4.getMissingUris();
for (var i = 0; i < missing; i++) {
var tv4coerce = require('tv4-coerce');
tv4coerce.addFix(tv4coerce.errorCodes.INVALID_TYPE, function (data, expectedType) {
if (typeof data === 'string' && expectedType === 'array') {
return data.split(',');
}
});
var data = "1,2,3";
var schema = {"type": "array", "items": {"type": "number"}};
@geraintluff
geraintluff / findin.sh
Last active August 29, 2015 13:57
findin - add to ~/.bash_profile or ~/.bashrc
findin() {
find . -iname $1 -exec grep -Hin $2 {} \;
}
// Quick'n'dirty EventEmitter class
function EventEmitter() {
}
EventEmitter.prototype = {
on: function (event, listener) {
this._events = this._events || {};
this._events[event] = this._events[event] || [];
this._events[event].push(listener);
this.emit('newListener', event, listener);
return this;
@geraintluff
geraintluff / Pretty JSON.md
Last active October 19, 2021 21:35
My personal opinion on what nice JSON looks like:

My personal opinion on what nice JSON looks like:

  • Scalars as per normal
  • Empty objects/arrays as {} or []
  • Single-entry objects on a single line if value is single-line
  • Single-entry arrays are just wrapped in [...] (even if value is not single-line)
  • Arrays <= 5 items on a single line if all values are single-line
  • JSON.stringify() style indenting otherwise

Indenting customisable, but defaults to tabs - I code in proportional font, so four-space looks a bit narrow, and two-space just looks ridiculous.

{
"title": "Ellipsis",
"description": "Placeholder for items that are not present in a preview list, but are expected to be present in the actual list.",
"type": "object",
"properties": {
"...": {
"type": ["integer", "null"],
"minimum": 1
},
"total": {
@geraintluff
geraintluff / copyStyle.js
Created September 24, 2013 18:59
Duplicates <link> and <style> elements in a new document (useful for spawning sub-windows)
function copyStyle(oldDoc, newDoc) {
var links = oldDoc.getElementsByTagName('link');
for (var i = 0; i < links.length; i++) {
var oldElement = links[i];
var newElement = newDoc.createElement('link');
newElement.rel = oldElement.rel;
newElement.href = oldElement.href;
newDoc.head.appendChild(newElement);
}
var styles = oldDoc.getElementsByTagName('style');
@geraintluff
geraintluff / addscript.txt
Created September 24, 2013 18:57
A bookmarklet that registers window.addScript(), for simply including JS scripts.
javascript:(function(){window.addScript=function(url){document.body.appendChild(document.createElement('script')).src=url;};})();