Skip to content

Instantly share code, notes, and snippets.

Avatar

Viktor Yaffle

View GitHub Profile
@Yaffle
Yaffle / test.js
Last active Aug 4, 2020
get/set caret position in contexteditable
View test.js
// Usage:
// var x = document.querySelector('[contenteditable]');
// var caretPosition = getSelectionDirection(x) !== 'forward' ? getSelectionStart(x) : getSelectionEnd(x);
// setSelectionRange(x, caretPosition + 1, caretPosition + 1);
// var value = getValue(x);
// it will not work with "<img /><img />" and, perhaps, in many other cases.
function isAfter(container, offset, node) {
var c = node;
@Yaffle
Yaffle / BigDecimal.js
Last active Jul 13, 2020
A polyfill for https://github.com/tc39/proposal-decimal/issues/17 based on native BigInt, (!) it needs testing
View BigDecimal.js
/*jslint bigint: true, vars: true, indent: 2*/
// Usage:
// BigDecimal.BigDecimal(bigint)
// BigDecimal.BigDecimal(string)
// BigDecimal.BigDecimal(number) (only integers)
// BigDecimal.toBigInt(a) (not in the spec)
// BigDecimal.toNumber(a) (not in the spec, only integers)
// BigDecimal.unaryMinus(a)
// BigDecimal.add(a, b[, rounding])
@Yaffle
Yaffle / decodeURIComponent.js
Last active Apr 23, 2020
decodeURIComponent using TextDecoder
View decodeURIComponent.js
// Implementation of the standard decodeURIComponent using TextDecoder.
// The original JavaScript specification does not separate UTF-8 decoding this way.
// The purpose is to show the possible implementation in JavaScript language.
function hexDigit(code) {
if (code >= '0'.charCodeAt(0) && code <= '9'.charCodeAt(0)) {
return code - '0'.charCodeAt(0);
} else if (code >= 'A'.charCodeAt(0) && code <= 'F'.charCodeAt(0)) {
return code + (10 - 'A'.charCodeAt(0));
} else if (code >= 'a'.charCodeAt(0) && code <= 'f'.charCodeAt(0)) {
View gist:40c58eb0c8075949313b3348bbb5f2b0
/*jslint strict:global*/
/*global self, fetch, caches, console, Promise, Request*/
"use strict";
var CACHE_NAME_PREFIX = "ru~";
var CACHE_NAME = "ru~20180818T075107Z";
var URLS_TO_CACHE = "./;js.js?20180818T075107Z;css.css?20180818T075107";
self.addEventListener("install", function (event) {
View gist:af5498d9e4fa5674fe5f4164a70fa506
function replaceSimpleDigit(code) {
if (code >= 0x0660 && code <= 0x669) {
return {code: code - 0x0660 + 48, name: "arab"};
}
if (code >= 0x06F0 && code <= 0x6f9) {
return {code: code - 0x06F0 + 48, name: "arabext"};
}
if (code >= 0x0966 && code <= 0x96f) {
return {code: code - 0x0966 + 48, name: "deva"};
}
@Yaffle
Yaffle / index.html
Last active May 10, 2017
isSafeInteger #jsbench #jsperf (http://jsbench.github.io/#ba6a3ecbe65fe3b16e9fb60ff6816723) #jsbench #jsperf
View index.html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<title>isSafeInteger #jsbench #jsperf</title>
<script src="https://cdnjs.cloudflare.com/ajax/libs/benchmark/1.0.0/benchmark.min.js"></script>
<script src="./suite.js"></script>
</head>
<body>
<h1>Open the console to view the results</h1>
View index.html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<title>Math.cbrt #jsbench #jsperf</title>
<script src="https://cdnjs.cloudflare.com/ajax/libs/benchmark/1.0.0/benchmark.min.js"></script>
<script src="./suite.js"></script>
</head>
<body>
<h1>Open the console to view the results</h1>
@Yaffle
Yaffle / index.html
Last active Dec 21, 2016
Math.trunc vs Math.floor #jsbench #jsperf (http://jsbench.github.io/#da9d5dbe6f00bc69c5c1328b6a3f6cee) #jsbench #jsperf
View index.html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<title>Math.trunc vs Math.floor #jsbench #jsperf</title>
<script src="https://cdnjs.cloudflare.com/ajax/libs/benchmark/1.0.0/benchmark.min.js"></script>
<script src="./suite.js"></script>
</head>
<body>
<h1>Open the console to view the results</h1>
@Yaffle
Yaffle / Math.fma.js
Last active Mar 19, 2017
Math.fma - fused multiply–add (FMA) or fused multiply–accumulate (FMAC) in JavaScript
View Math.fma.js
// a * b + c
// Math.fma - fused multiply–add (FMA) or fused multiply–accumulate (FMAC) in JavaScript
// For implementation details, see "The Handbook of Applied Cryptography"
// http://www.cacr.math.uwaterloo.ca/hac/about/chap14.pdf
// and
// https://github.com/JuliaLang/openlibm/blob/master/src/s_fma.c
//!? BUGGY
(function () {
@Yaffle
Yaffle / sort.js
Last active Sep 8, 2018
merge sort
View sort.js
// `Array#sort` implementation using the merge sort
// Notes:
// 1) calls comparator for undefined values, holes, values from the prototype chain;
// 2*) replaces holes with undefined values or values from the prototype chain;
// 3*) does not use `ToObject(this)`, `ToLength(this.length)`;
// 4*) does not throw errors for non-undefined non-function `comparefn`.
// 5*) uses `Math`, `Math.floor`, `String`, `Array`.
// 6*) calls setters of `Array.prototype` during internal buffer initialization.
// * This behaviour is inconsistent across browsers even for built-in `Array#sort`.
You can’t perform that action at this time.