Skip to content

Instantly share code, notes, and snippets.

View hperrin's full-sized avatar

Hunter Perrin hperrin

View GitHub Profile
@hperrin
hperrin / splitn.js
Last active January 12, 2022 07:35
splitn.js, a split function that returns everything after the limit in the last element.
export default const splitn = (s, d, n = Infinity) => {
const a = s.split(d);
return [
...a.slice(0, n - 1),
...(a.length >= n ? [a.slice(n - 1).join(d)] : [])
];
};
@hperrin
hperrin / percenttwenty.js
Created August 12, 2021 21:57
Useful functions written in the most ridiculous way.
export const repeat = (str, num) => `${Array(num + 1)}`.replaceAll(/,/g, str);
export const kebabCase = (string, delimiter = " ") =>
string
.split(delimiter)
.map((word) => [
`${Number.NEGATIVE_INFINITY}`.slice(0, 1)[0],
word.toLowerCase(),
])
.flat()
function verses(bottles) {
const count = (b, cap) => `${b || `${cap ? 'N' : 'n'}o more`} bottle${b == 1 ? '' : 's'}`;
return [...new Array(bottles + 1)].map((v, i) => bottles - i).map(b => [
`${count(b, true)} of beer on the wall, ${count(b)} of beer.`,
b > 0
? `Take one down and pass it around, ${count(b - 1)} of beer on the wall.`
: `Go to the store and buy some more, ${count(bottles)} of beer on the wall.`
]);
}
@hperrin
hperrin / Get caret Y position in HTML (WYSIWYG) editor from document origin.
Created February 5, 2014 18:54
This function will give the Y position of the text cursor (caret) when it is in a contenteditable element. This particular one only works on CKEDITOR.
var getCaretYPosition = function(){
var editor = CKEDITOR.instances.editor1, //get your CKEDITOR instance here
sel = editor.getSelection(), // text selection
obj = sel.getStartElement().$, // the element the selected text resides in
range = editor.getSelection().getRanges(), // range of selection
container = range[0].startContainer.$, // get the DOM node of the selected text, probably a textnode
textlen = typeof obj.textContent === "undefined" ? obj.innerText.length : obj.textContent.length, // get the length of the text in the container
offset = range[0].startOffset; // get the offset from the beginning of the text in the container to the caret
if (container.nodeType === 3) { // if the container is a text node
while (container.previousSibling) { // add the length of all the preceding text nodes and elements in the same parent element
// Returns true about 50% of the time, false about 50% of the time.
export default const maybe = () => Math.random() < .5;
// This should be closer to .5 the more iterations you run.
export const tester = iterations => {
let yes = 0;
for (let i = 0; i < iterations; i++) maybe() && yes++;
return yes/iterations;
}
@hperrin
hperrin / frontend.js
Last active May 10, 2018 19:56
Equivalent SQL Query from Frontend
function titleSeach (title, archived) {
return fetch(
'/api/titlesearch.php?title=' +
encodeURIComponent(title) +
'&archived=' +
encodeURIComponent(JSON.stringify(archived))
).then(res => {
if (!res.ok) return Promise.reject(res);
return res.json()
});
@hperrin
hperrin / nymphquery.js
Last active May 10, 2018 00:42
Example Nymph Query from Frontend
try {
const entities = await Nymph.getEntities(
{'class': BlogPost.class},
{'type': '&',
'like': ['title', '%easy%'],
'equal': ['archived', false]
}
);
console.log(entities);
} catch (e) {
@hperrin
hperrin / Slim.php
Last active May 9, 2018 01:05
PHP Slim archiving class. Slim is a portable file archive format based on JSON. It can be self extracting in multiple languages.
<?php
/**
* Slim archiving class.
*
* Slim is a portable file archive format based on JSON. It can be self
* extracting in multiple languages.
*
* @license https://www.apache.org/licenses/LICENSE-2.0
* @author Hunter Perrin <hperrin@gmail.com>
@hperrin
hperrin / index.js
Last active May 9, 2018 00:01
JavaScript strRepeat. (Ridiculously efficient.)
export default function strRepeat (str, repeat) {
let curStr = str, i = 1, result = '';
while (true) {
if (i & repeat) result += curStr;
i *= 2;
if (i >= repeat) break;
curStr += curStr;
}
return result;
}
@hperrin
hperrin / index.js
Created March 14, 2018 01:26
insertInOrder JavaScript Array method. (Insert item into a sorted array.)
Array.prototype.insertInOrder = function(item) {
for (var i = 0; this[i] < item && i < this.length; i++);
this.splice(i, 0, item);
};