Skip to content

Instantly share code, notes, and snippets.

View davidaurelio's full-sized avatar
💭
I may be slow to respond.

David Aurelio davidaurelio

💭
I may be slow to respond.
View GitHub Profile
#!/usr/bin/env python
"""
Fixes file names for downloads from jil.org.
jil.org delivers downloaded files with file names in e-mail header format. The
fix_filename function from this module can decode such file names.
When this module is executed as main program, all file names passed as program
arguments are renamed properly:
@davidaurelio
davidaurelio / create.js
Created February 22, 2011 14:48
Constructor-less inheritance for ECMAScript 5
var BaseObject = {
create: function create() {
var instance = Object.create(this);
instance._construct.apply(instance, arguments);
return instance;
},
extend: function extend(properties, propertyDescriptors) {
propertyDescriptors = propertyDescriptors || {};
@davidaurelio
davidaurelio / hastouch.html
Created September 6, 2011 17:10
Checking for touch support
<!doctype html>
<title>has touch?</title>
<h1>Has this device touch? </h1>
<script>
var isTouch = (function(){
try{
var event = document.createEvent("TouchEvent"); // Should throw an error if not supported
return !!event.initTouchEvent; // Check for existance of initialization method
}catch(error){
return false;
@davidaurelio
davidaurelio / EventEmitter.js
Created March 22, 2012 09:54
Constructable mixins in JavaScript
/*
EventEmitter is usable as constructor and as mixin.
*/
function EventEmitter() {}
// this does the trick
EventEmitter.prototype = EventEmitter;
EventEmitter.addListener = function(type, listener) {
this.listeners(type, true).push(listener);
@davidaurelio
davidaurelio / Usage
Created April 2, 2012 12:12
Angle type
var a = new Angle().radians(Math.PI * 3 / 4),
b = new Angle().degrees(135);
var c = new Angle(a + b);
Math.sin(a);
Math.cos(b);
a.add(new Angle().degrees(30));
b.add(Math.PI);
@davidaurelio
davidaurelio / point.js
Created July 18, 2012 08:40
A toString()’able point that allows addition
function Point(x, y) {
if (arguments.length === 1 && typeof x === 'string') {
return x.slice(1, -1)
.split('}{')
.map(function(tuple) {
return tuple.split(',', 2).map(parseFloat)
})
.reduce(function(point, coords) {
point.x += coords[0];
point.y += coords[1];
@davidaurelio
davidaurelio / point.js
Created July 18, 2012 10:11
A Point class that supports addition and subtraction of instances. Precision is 16bit fixed point per coordinate.
/*
A point constructor that creates objects supporting addition and subtraction.
The "trick" is to use 32bit integers and stuff two fixed 16bit fixed point
numbers into them that represent the coordinates of the point.
This approach has problems with overflow. E.g. when adding two points (0, 2)
and (0, -2), the addition will cause the y values to overflow into the 17th
bit, which is part of the x-value. When subtracting two points, e.g.
(.00390625, 0) - (0, -128)
@davidaurelio
davidaurelio / naive-super.js
Created September 7, 2012 09:54
Naive implementation of super in JS
Object.defineProperty(Object.prototype, 'super', {
get: function() { return Object.getPrototypeOf(this); }
});
function Foo() {}
Foo.prototype.reset = function() {
this.fooProp = 'reset';
console.log('Foo#reset()');
}
@davidaurelio
davidaurelio / super-proxy.js
Created September 7, 2012 10:13
`super` using `Proxy.create`
Object.defineProperty(Object.prototype, 'super', {
value: function(Constructor) {
var context = this;
var superProto = Object.getPrototypeOf(Constructor.prototype);
return Proxy.create({
get: function(_, name) {
return function() {
return superProto[name].apply(context, arguments);
}
}
@davidaurelio
davidaurelio / lazy-property.js
Created December 3, 2012 08:54
Lazy properties for ES5
function lazyProperty(object, name, create) {
Object.defineProperty(object, name, {
configurable: true, // or false if defined on prototype objects
enumerable: false,
get: function() {
return this[name] = create(this);
},
set: function(value) {
Object.defineProperty(this, name, {
configurable: true,