Skip to content

Instantly share code, notes, and snippets.

@omarstreak
omarstreak / badlevinshtein.js
Created July 9, 2012 19:09
Naïve Levinshtein
// create a 2d array
function createGrid(rows, columns) {
var grid = new Array(rows);
for(var i = 0; i < rows; i++) {
grid[i] = new Array(columns);
for(var j = 0; j < columns; j++) {
grid[i][j] = 0;
}
}
return grid;
@omarstreak
omarstreak / FasterLevinshtein.js
Created July 9, 2012 20:29
Fast non-optimal one step lookahead Levinshtein
// create a 2d array
function createGrid(rows, columns) {
var grid = new Array(rows);
for(var i = 0; i < rows; i++) {
grid[i] = new Array(columns);
for(var j = 0; j < columns; j++) {
grid[i][j] = 0;
}
}
return grid;
@omarstreak
omarstreak / table.html
Created July 9, 2012 21:44
Standard table structure
<table>
<tbody>
<tr>
<td>...</td>
<td>...</td>
...
</tr>
...
</tbody>
</table>
/* animation for even number of compose windows */
@-webkit-keyframes streakComposeTriggerEven {
from { clip: rect(1px, auto, auto, auto); }
to { clip: rect(0px, auto, auto, auto); }
}
.streakGmailComposeChildren:first-child:nth-last-child(2n) {
-webkit-animation-duration: 0.001s;
-webkit-animation-name: streakComposeTriggerEven;
}
@omarstreak
omarstreak / Unquoted.js
Created February 1, 2016 05:40
Get unquoted text
function extract(mv){
//NodeIterators are really cool: https://developer.mozilla.org/en-US/docs/Web/API/NodeIterator
var nodeIterator = document.createNodeIterator(
mv.getBodyElement(),
NodeFilter.SHOW_ELEMENT,
{
acceptNode: function(node){
//this is the main function where the interesting code occurs
//because node iterator is a recursive tree walk you'll see every node below the body element
//this includes nodes that contain both the html we want, and html we don't want
@omarstreak
omarstreak / Install XAR
Created January 18, 2013 01:10
Bash script to install XAR. Run as root and takes one command line argument where you want the xar executable to exist.
#!/bin/bash
if [ "`whoami`" != "root" ]; then
printf "Please run this script as root or using sudo\n"
exit 0
fi
LIB_DIR=$1
CURRENT_DIR=`pwd`
printf "Setting up XAR\n"
/*
To inject a button into composes there's 5 main strategies an extension developer can use, each strategy has large tradeoffs
mainly around performance and ease of implementation. The result is that most extension developers opt for the
easy to implement but poor performing strategy.
*/
/*
Strategy 1
document.addEventListener('DOMNodeInserted', function(e){
if(e.target.classList.contains('An')){
addButton(e.target);
}
});
$('.An').forEach(addButton);
function addButton(composeNode){
var button = $('<div class="wG J-Z-I"><div class="J-J5-Ji J-Z-I-Kv-H"><div class="J-J5-Ji J-Z-I-J6-H"><div class="aA7 aaA aMZ"><img src="//composeIcon" /></div></div></div></div>');
button.click(function(e){
@omarstreak
omarstreak / createAndSign.sh
Created January 18, 2013 01:41
Create and sign your safari extension file
XAR=path/to/xar/bin
BUILD_DIR=path/to/dir/with/cert/files
EXTENSION=your extension name
$XAR -czf $EXTENSION.safariextz --distribution $EXTENSION.safariextension
$XAR --sign -f $EXTENSION.safariextz --digestinfo-to-sign digest.dat --sig-size `cat $BUILD_DIR/size.txt` --cert-loc $BUILD_DIR/cert.der --cert-loc $BUILD_DIR/cert01 --cert-loc $BUILD_DIR/cert02
openssl rsautl -sign -inkey $BUILD_DIR/key.pem -in digest.dat -out sig.dat
$XAR --inject-sig sig.dat -f $EXTENSION.safariextz
rm -f sig.dat digest.dat
sdk.Lists.registerThreadRowViewHandler(function(threadRowView){
var emitter; //variable name to hoist the emitter to
var stream = Kefir.stream(function(inEmitter){
emitter = inEmitter;
return function(){}; //we need to return a function that gets called when the stream ends
});
threadRowView.addLabel(stream); //add the label passing in the stream