Skip to content

Instantly share code, notes, and snippets.

Avatar

Mike mscalora

  • Utah
View GitHub Profile
View emoji-favicon.html
<link rel="icon" href="data:image/svg+xml,<svg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 100 100%22><text y=%22.9em%22 font-size=%2290%22>☃️</text></svg>">
@mscalora
mscalora / spin-the-needle.js
Created Apr 1, 2020
Work towards a spin the needle animation using SVG
View spin-the-needle.js
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Make</title>
<style>
</style>
</head>
<body>
View object-diff.js
// From: NicolasLetellier @ https://gist.github.com/Yimiprod/7ee176597fef230d1451#gistcomment-3058093
function objectDiff(object, base) {
function changes(object, base) {
const accumulator = {};
Object.keys(base).forEach((key) => {
if (object[key] === undefined) {
accumulator[`-${key}`] = base[key];
}
});
@mscalora
mscalora / search_all_up.sh
Last active Mar 8, 2020
search up a directory tree for multiple filenames
View search_all_up.sh
#!/bin/bash
search_all_up() {
# extended from https://stackoverflow.com/a/19011599/370746
local look=${PWD%/}
while [[ -n $look ]]; do
for name in $@ ; do
[[ -e $look/$name ]] && {
printf '%s\n' "$look/$name"
return
@mscalora
mscalora / ansi.js
Created Feb 13, 2020
Javascript tools for dealing with ansi formatted text
View ansi.js
// regexp group 1: visible text group 2: ansi codes
// eslint-disable-next-line no-control-regex
const ansiMatcher = new RegExp("([^\u001B\u009B]*)([\u001B\u009B][[\\]()#;?]*(?:(?:(?:[a-zA-Z\\d]*(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?\u0007)|(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-ntqry=><~]))|$)", "g")
function stripAnsi (s) {
return s.replace(ansiMatcher, "$1")
}
function truncateAnsi (s, len) {
let total = 0
View resize-table.js
// table resize test for tty-table
const Table = require("tty-table")
const Chalk = require("chalk")
let failures = []
function test (width, truncate, marginLeft) {
let output = new Table([
{minWidth: 6, shrink: 0},
@mscalora
mscalora / isInViewport.js
Created Dec 13, 2019
test if dom element is in viewport either fully or fully/partially/none
View isInViewport.js
function isInViewport (elem, partially) {
let box = elem.getBoundingClientRect(),
top = box.top,
bottom = box.bottom,
right = box.right,
left = box.left,
h = window.innerHeight || document.documentElement.clientHeight,
w = window.innerWidth || document.documentElement.clientWidth,
fully = (top >= 0 && box.left >= 0 && bottom <= h && box.right <= w);
@mscalora
mscalora / console.js
Created Nov 28, 2019
Save and restore form contents in the js console
View console.js
// save:
localStorage.temp = JSON.stringify(Array.from(document.querySelectorAll('input')).map(x => {console.log(x.value); return x.value}))
// restore:
JSON.parse(localStorage.temp).forEach((x,i) => document.querySelectorAll('input').item(i).value = x)
@mscalora
mscalora / .htaccess
Created Aug 11, 2019
Htaccess to force all html to be processed by PHP
View .htaccess
# for Dreamhost, need to adjust FcgidWrapper path for other hosts
AddHandler fcgid-script .html
FcgidWrapper "/dh/cgi-system/php72.cgi" .html
View xhrRequest.js
const encs = {json: 'application/json', text: 'text/plain', url: 'application/x-www-form-urlencoded', form: 'multipart/form-data'},
xhrRequestDefaults = {method: 'POST', encoding: 'url', beforeCallback: function () {}, openedCallback: function () {}};
/**
* Make http request to url with object data as body
* @param {string} url
* @param {(object | string)} [data] - post data, formatting controlled by encoding
* @param {object} [options] - object of options
* @param {string} [options.encoding] - body encoding 'none', 'url', 'form', 'json', 'text' or mime (content) type, default: 'url'
* @param {string} [options.contentType] - override automatic contentType, null disable automatic without sending one
* @param {function} [options.method] - 'GET', 'POST', 'PUT', etc, default: 'POST'