szq2 / HN user avatars

// ==UserScript==
// @name        HN user avatars
// @namespace   Violentmonkey Scripts
// @match       *://news.ycombinator.com/item*
// @grant       none
// @version     1.0
// @author      onion2k, tomxor
// @description HN auto-generated user avatars
// @license MIT
// ==/UserScript==

// Original by: https://news.ycombinator.com/item?id=30668137  https://news.ycombinator.com/item?id=30670079

let observer = new IntersectionObserver(
  (entries) => {
    entries.forEach((entry, i) => {
      if (entry.isIntersecting) {
        observer.unobserve(entry.target);
        const p = 2;
        const c = document.createElement('canvas');
        const x = c.getContext('2d');
        c.width = 18;
        c.height = 14;
        const s = entry.target.innerText;
        const r = 1;

        if (s) {
          for (
            let s = entry.target.innerText, r = 1, i = 28 + s.length; i--;

          ) {
            // xorshift32
            (r ^= r << 13), (r ^= r >>> 17), (r ^= r << 5);
            const X = i & 3,
              Y = i >> 2;
            if (i >= 28) {
              // seed state
              r += s.charCodeAt(i - 28);
              x.fillStyle =
                '#' + ((r >> 8) & 0xffffff).toString(16).padStart(0, 6);
            }
            else {
              // draw pixel
              if (r >>> 29 > (X * X) / 3 + Y / 2)
                x.fillRect(p * 3 + p * X, p * Y, p, p),
                x.fillRect(p * 3 - p * X, p * Y, p, p);
            }
          }
        }

        entry.target.prepend(c);
      }
    });
  }, {
    rootMargin: '0px 0px 0px 0px'
  }
);

document.querySelectorAll('.hnuser').forEach((user) => {
  observer.observe(user);
});