// ==UserScript==
// @name flaggy
// @description generates avatars with deterministic pseudorandomness
// @match https://www.metaculus.com/*
// @grant GM_addStyle
// @version 1.0
// @author casens
// @namespace https://gf.qytechs.cn/users/673939
// ==/UserScript==
const svgNameSpace = 'http://www.w3.org/2000/svg';
function bigChungus(input) {
//
// DO NOT ROLL YOUR OWN CRYPTO
//
// DO NOT USE THIS FOR ANYTHING IMPORTANT
//
// the sum of the 4 components is less than 9 * 10 ** 15, aka BigInt.
// you can't do precise modulus on BigInts!
// the sum is always greater than 10**12, so 9_999_999_967 is a prime less
// than that.
//
// this function has slightly different output in chrome v firefox
//
const num = Math.floor(input);
const val = Math.floor( ( ((5 ** (1 / 3)) ** (52 + (num % 13)))
+ ((2 ** (1 / 2)) ** (54 + (num % 47)))
+ ((3 ** (1 / 7)) ** (115 + (num % 109)))
+ ((7 ** (1 / 23)) ** (194 + (num % 223)))
) % 9999999967
);
return val;
}
function createSvg() {
const svg = document.createElementNS(svgNameSpace, 'svg');
svg.setAttribute('version', '1.1');
svg.setAttribute('baseProfile', 'full');
return svg;
}
function setBg(seed, color) {
const svg = createSvg();
const determiner = (seed % 101) / 101
svg.isCircle = false;
const dimensions = [];
if (determiner < .3) {
dimensions.push(50);
dimensions.push(50);
} else if (determiner < .43) {
dimensions.push(59);
dimensions.push(42);
} else if (determiner < .56) {
dimensions.push(42);
dimensions.push(59);
} else if (determiner < .69) {
dimensions.push(67);
dimensions.push(37);
} else {
dimensions.push(56);
dimensions.push(56);
svg.style.borderRadius = '28px';
svg.isCircle = true;
}
svg.setAttribute('width', dimensions[0]);
svg.setAttribute('height', dimensions[1]);
const bgLayer = drawRect(dimensions[0], dimensions[1], color);
bgLayer.setAttribute('transform', `translate(${dimensions[0]/2},${dimensions[1]/2})`);
svg.appendChild(bgLayer);
return svg;
}
function drawCircle(radius, inputColor) {
const circle = document.createElementNS(svgNameSpace, 'circle');
const color = `hsl(${inputColor[0]}, ${inputColor[1]}%, ${inputColor[2]}%)`;
circle.setAttribute('r', radius);
circle.setAttribute('fill', color);
return circle;
}
function drawLine(start, finish, thickness, inputColor) {
const line = document.createElementNS(svgNameSpace, 'line');
const color = `hsl(${inputColor[0]}, ${inputColor[1]}%, ${inputColor[2]}%)`;
line.setAttribute('x1', start[0]);
line.setAttribute('y1', start[1]);
line.setAttribute('x2', finish[0]);
line.setAttribute('y2', finish[1]);
line.setAttribute('stroke-width', thickness);
line.setAttribute('stroke', color);
return line;
}
function drawRect(width, height, inputColor) {
const rect = document.createElementNS(svgNameSpace, 'rect');
const color = `hsl(${inputColor[0]}, ${inputColor[1]}%, ${inputColor[2]}%)`;
rect.setAttribute('x', -width / 2);
rect.setAttribute('y', -height / 2);
rect.setAttribute('width', width);
rect.setAttribute('height', height);
rect.setAttribute('fill', color);
return rect;
}
function drawRhombus(axisX, axisY, inputColor) {
const rhom = document.createElementNS(svgNameSpace, 'polygon');
const color = `hsl(${inputColor[0]}, ${inputColor[1]}%, ${inputColor[2]}%)`;
const points = [
`0,${-axisY / 2}`,
`${axisX / 2},0`,
`0,${axisY / 2}`,
`${-axisX / 2},0`
];
rhom.setAttribute('points', points.join(' '));
rhom.setAttribute('fill', color);
return rhom;
}
function drawTriangle(sideLength, inputColor) {
const triangle = document.createElementNS(svgNameSpace, 'polygon');
const color = `hsl(${inputColor[0]}, ${inputColor[1]}%, ${inputColor[2]}%)`;
const pt1 = `0,${sideLength / (3 ** 0.5)}`;
const pt2 = `${sideLength / 2},${-(sideLength / (2 * (3 ** 0.5)))}`;
const pt3 = `${-(sideLength / 2)},${-(sideLength / (2 * (3 ** 0.5)))}`;
triangle.setAttribute('points', pt1 + ' ' + pt2 + ' ' + pt3);
triangle.setAttribute('fill', color);
return triangle;
}
function drawPent(sideLength, inputColor) {
const pent = document.createElementNS(svgNameSpace, 'polygon');
const color = `hsl(${inputColor[0]}, ${inputColor[1]}%, ${inputColor[2]}%)`;
const points = [
`0,${-sideLength * 0.85}`,
`${sideLength * 0.81},${-sideLength * 0.26}`,
`${sideLength / 2},${sideLength * 0.69}`,
`${-sideLength / 2},${sideLength * 0.69}`,
`${-sideLength * 0.81},${-sideLength * 0.26}`
];
pent.setAttribute('points', points.join(' '));
pent.setAttribute('fill', color);
return pent;
}
function drawStar(sideLength, inputColor) {
const pent = document.createElementNS(svgNameSpace, 'polygon');
const color = `hsl(${inputColor[0]}, ${inputColor[1]}%, ${inputColor[2]}%)`;
// sideLength in this case refers to distance from star-end to neighboring
// (non-connected) end. aka, the length of one point edge plus a central
// pentagon edge. aka, one point edge * 1.618
const points = [
`0,${-sideLength * 0.85}`,
`${sideLength / 2},${sideLength * 0.69}`,
`${-sideLength * 0.81},${-sideLength * 0.26}`,
`${sideLength * 0.81},${-sideLength * 0.26}`,
`${-sideLength / 2},${sideLength * 0.69}`
];
pent.setAttribute('points', points.join(' '));
pent.setAttribute('fill', color);
return pent;
}
function drawHex(sideLength, inputColor) {
const hex = document.createElementNS(svgNameSpace, 'polygon');
const color = `hsl(${inputColor[0]}, ${inputColor[1]}%, ${inputColor[2]}%)`;
const points = [
`${-sideLength / 2},${-sideLength * (3 ** 0.5) / 2}`,
`${sideLength / 2},${-sideLength * (3 ** 0.5) / 2}`,
`${sideLength}, 0`,
`${sideLength / 2},${sideLength * (3 ** 0.5) / 2}`,
`${-sideLength / 2},${sideLength * (3 ** 0.5) / 2}`,
`${-sideLength}, 0`
];
hex.setAttribute('points', points.join(' '));
hex.setAttribute('fill', color);
return hex;
}
function selectLightness(seed, numOfSelections) {
const colors = ['color'];
let colorCount = 1;
// sometimes this loop will run with no effect. it's not count i up to num
for (let i = 0; colors.length < numOfSelections; i++) {
const determiner = (bigChungus(seed + 4312774567655 + i) % 241) / 241
if ((determiner < .16) && (!colors.includes('black'))) {
colors.push('black');
} else if ((determiner < .30) && (!colors.includes('white'))) {
colors.push('white');
} else if ((determiner < .42) && (!colors.includes('gray'))) {
colors.push('gray');
} else if (determiner < (1 - (colorCount * .18))) {
// colorCount decreases the chances of multiple colors being selected
colorCount++;
colors.push('color');
}
if (i > 49) { break; }
}
// * chef's kiss *
const shuffleDeterminer = seed % 6;
const shuffledColors = [];
shuffledColors.push(colors.splice((shuffleDeterminer % 3), 1)[0]);
shuffledColors.push(colors.splice((shuffleDeterminer % 2), 1)[0]);
shuffledColors.push(colors[0]);
return shuffledColors;
}
function selectHues(inputColors, seed) {
// only guanateed to pass when you have less than 4 hues to select.
// (you could get more if you narrowed the hue contrast.
// current min contrast val = 75)
const colors = [];
const hues = [];
for (let index = 0; index < inputColors.length; index++) {
if (inputColors[index] === 'white') {
colors.push([0, 0, 100]);
} else if (inputColors[index] === 'black') {
colors.push([0, 0, 0]);
} else if (inputColors[index] === 'gray') {
colors.push([0, 0, 25 + (bigChungus(seed + (69 * index)) % 47)]);
} else {
// colors, presumably
// if no hues exist yet
if (hues[0] === undefined) {
let val = (bigChungus(seed + index) % 360);
hues.push(val);
} else {
// generate new hue with minimum hue contrast
const huesNeeded = hues.length + 1;
for (let salt = 0; hues.length < huesNeeded; salt++) {
const hue = bigChungus(seed + (index * 10000) + salt) % 360;
let hueAllowed = true;
const minContrast = 75;
hues.forEach((oldHue) => {
if ( ( (hue > (oldHue - minContrast ) )
&&(hue < (oldHue + minContrast ) ) )
||( (hue > (oldHue - minContrast + 360) )
&&(hue < (oldHue + minContrast + 360) ) )
||( (hue > (oldHue - minContrast - 360) )
&&(hue < (oldHue + minContrast - 360) ) )
) {
hueAllowed = false;
}
});
if (hueAllowed) {
hues.push(hue);
}
if (salt > 99) {
colors[index][0] = hue;
hues.push(699);
console.log('hue selection broke somehow');
break;
}
}
}
const saturation = 100 - (bigChungus(seed + (500 * index)) % 53);
const lightness = 25 + (bigChungus(seed + (8888 * index)) % 47);
colors.push([ hues[hues.length - 1], saturation, lightness ]);
}
}
let salt = 0;
// lightness contrast
for (let i = 0; i + 1 < colors.length; i++) {
if (colors[i][2] == 0
||colors[i][2] == 100
||colors[i + 1][2] == 0
||colors[i + 1][2] == 100 ) {
// do nothing
} else if (Math.abs(colors[i][2] - colors[i + 1][2]) < 29) {
colors[i + 1][2] = 19 + (bigChungus(seed + 3861533478814 + salt) % 63);
i--;
}
salt++;
}
return colors;
}
function selectColors(seed) {
const lightVals = selectLightness(seed, 3);
const colors = selectHues(lightVals, seed);
return colors;
}
function selectLayer(seed, dimensions, colors, colorCount, isCircle) {
const sortedLengths = dimensions.slice().sort();
if (isCircle) {sortedLengths[0] *= 0.8}
const layerGroup = document.createElementNS(svgNameSpace, 'g');
layerGroup.noEmblem = false;
const rotGroup = document.createElementNS(svgNameSpace, 'g');
const rotGroupTop = document.createElementNS(svgNameSpace, 'g');
layerGroup.append(rotGroup);
layerGroup.append(rotGroupTop);
layerGroup.setAttribute('transform', `translate(${dimensions[0]/2},${dimensions[1]/2})`);
const diagThickness = (dimensions[0] * dimensions[1]) / ((dimensions[0] ** 2) + (dimensions[1] ** 2)) ** 0.5;
const bandThickness = (seed % 69877) / 69877;
const rotDeterminer = (seed % 81353) / 81353;
const posDeterminer = (seed % 28711) / 28711;
const doubleBandsDet = (seed % 2137) / 2137;
const determiner = (seed % 1009) / 1009;
if (determiner < .15) {
//console.log('half horizontal bands');
const layer = drawRect(dimensions[0], dimensions[1] / 2, colors[1]);
layer.setAttribute('transform', `translate(0, ${-dimensions[1] / 4})`);
layerGroup.appendChild(layer);
if (colorCount > 1) {
//console.log('three horizontal bands');
layer.setAttribute('transform', `translate(0, ${-dimensions[1] / 12})`);
const layerTop = drawRect(dimensions[0], dimensions[1] / 3, colors[2]);
layerTop.setAttribute('transform', `translate(0, ${-dimensions[1] / 3})`);
layerGroup.appendChild(layerTop);
}
} else if (determiner < .30) {
//console.log('half vertical band');
const layer = drawRect(dimensions[0] / 2, dimensions[1], colors[1]);
layer.setAttribute('transform', `translate(${-dimensions[0] / 4})`);
layerGroup.appendChild(layer);
if (colorCount > 1) {
//console.log('three vertical bands');
layer.setAttribute('transform', `translate(${-dimensions[0] / 12})`);
const layerTop = drawRect(dimensions[0] / 3, dimensions[1], colors[2]);
layerTop.setAttribute('transform', `translate(${-dimensions[0] / 3})`);
layerGroup.appendChild(layerTop);
}
} else if (determiner < .45) {
//console.log('half diagonal');
layerGroup.setAttribute('transform', `translate(0)`);
const layer = drawLine([-dimensions[0] / 2, dimensions[1]], [dimensions[0], -dimensions[1] / 2], diagThickness, colors[1]);
layerGroup.appendChild(layer);
if (colorCount > 1) {
//console.log('three diag bands');
const layerTop = drawLine([-dimensions[0] / 2, dimensions[1]], [dimensions[0], -dimensions[1] / 2], diagThickness, colors[2]);
layer.setAttribute('transform', `translate(${dimensions[0] / 6}, ${dimensions[1] / 6})`);
layerTop.setAttribute('transform', `translate(${-dimensions[0] / 6}, ${-dimensions[1] / 6})`);
if (isCircle) {
layer.setAttribute('transform', `translate(${dimensions[0] * 3 / 24}, ${dimensions[1] * 3 / 24})`);
layerTop.setAttribute('transform', `translate(${-dimensions[0] * 3 / 24}, ${-dimensions[1] * 3 / 24})`);
}
layerGroup.appendChild(layerTop);
}
} else if (determiner < .60) {
//console.log('half other diagonal');
layerGroup.setAttribute('transform', `translate(0)`);
const layer = drawLine([0, -dimensions[1] / 2], [dimensions[0] * 3 / 2, dimensions[1]], diagThickness, colors[1]);
layerGroup.appendChild(layer);
if (colorCount > 1) {
//console.log('three diag bands');
const layerTop = drawLine([0, -dimensions[1] / 2], [dimensions[0] * 3 / 2, dimensions[1]], diagThickness, colors[2]);
layer.setAttribute('transform', `translate(${-dimensions[0] / 6}, ${dimensions[1] / 6})`);
layerTop.setAttribute('transform', `translate(${dimensions[0] / 6}, ${-dimensions[1] / 6})`);
layerGroup.appendChild(layerTop);
if (isCircle) {
layer.setAttribute('transform', `translate(${-dimensions[0] * 3 / 24}, ${dimensions[1] * 3 / 24})`);
layerTop.setAttribute('transform', `translate(${dimensions[0] * 3 / 24}, ${-dimensions[1] * 3 / 24})`);
}
}
} else if (determiner < .90) {
//console.log('radial rays');
if (posDeterminer < .66 && dimensions[0] !== dimensions[1]) {
// offset for nordic style cross
layerGroup.noEmblem = true;
if (!isCircle) {
layerGroup.setAttribute('transform', `translate(${sortedLengths[0]/2},${sortedLengths[0]/2})`);
}
}
const baseRay = [[0, 0], [0, -sortedLengths[1]]];
let rayCount = 2 + ((seed % 577) % 6)
if (rayCount === 7) {rayCount++}
const rayThickness = 4 + ((bandThickness * 26) * (sortedLengths[0] / sortedLengths[1]) / (rayCount ** 0.7))
if (rayCount === 2) {
const ray1 = drawLine(baseRay[0], baseRay[1], rayThickness, colors[1]);
const ray2 = ray1.cloneNode()
ray2.setAttribute('transform', `rotate(180)`);
if (doubleBandsDet < .4) {
const bgRay1 = drawLine(baseRay[0], baseRay[1], rayThickness * 1.23, colors[0]);
const trimRay1 = drawLine(baseRay[0], baseRay[1], rayThickness * 1.42, colors[1]);
const bgRay2 = bgRay1.cloneNode()
const trimRay2 = trimRay1.cloneNode()
bgRay2.setAttribute('transform', `rotate(180)`);
trimRay2.setAttribute('transform', `rotate(180)`);
rotGroup.appendChild(trimRay1);
rotGroup.appendChild(trimRay2);
rotGroup.appendChild(bgRay1);
rotGroup.appendChild(bgRay2);
}
rotGroupTop.appendChild(ray1);
rotGroupTop.appendChild(ray2);
layerGroup.setAttribute('transform', `translate(${dimensions[0] / 2},${dimensions[1] / 2})`);
} else if ((doubleBandsDet < .7) && (colorCount > 1)) {
// overlapping colors
for (let i = 0; i < rayCount; i++) {
ray1 = drawLine(baseRay[0], baseRay[1], rayThickness, colors[1]);
ray1.setAttribute('transform', `rotate(${i * 360 / rayCount})`);
let thicknessRatio = .5
if (doubleBandsDet < .35) {
thicknessRatio = .354
}
ray2 = drawLine(baseRay[0], baseRay[1], rayThickness * thicknessRatio, colors[2]);
ray2.setAttribute('transform', `rotate(${i * 360 / rayCount})`);
rotGroup.appendChild(ray1);
rotGroupTop.appendChild(ray2);
}
} else if (rayCount % 2 == 0) {
// alternating color rays
for (let i = 0; i < rayCount; i++) {
let colorSwitch = 1
if (colorCount > 1 && rayCount > 5) {
colorSwitch = 1 + (i % 2)
}
ray = drawLine(baseRay[0], baseRay[1], rayThickness, colors[colorSwitch]);
ray.setAttribute('transform', `rotate(${i * 360 / rayCount})`);
if (i % 2 === 0) {
rotGroup.appendChild(ray);
} else {
rotGroupTop.appendChild(ray);
}
}
} else {
// monocolor rays
for (let i = 0; i < rayCount; i++) {
ray = drawLine(baseRay[0], baseRay[1], rayThickness, colors[1]);
ray.setAttribute('transform', `rotate(${i * 360 / rayCount})`);
rotGroup.appendChild(ray);
}
}
let degrees = 0
if (rotDeterminer < .4) {
degrees += 180 / rayCount
}
if ((rotDeterminer * 100) % 10 < 5) {
degrees += 360 / rayCount
}
if ((rotDeterminer * 1000) % 10 < 4) {
degrees += 90
}
if ((rayCount === 2) && ((rotDeterminer * 10000) % 10 < 5)) {
degrees += 45
}
//console.log('deg', degrees);
rotGroup.setAttribute('transform', `rotate(${degrees})`);
rotGroupTop.setAttribute('transform', `rotate(${degrees})`);
} else {
// out of 1009
//console.log('diagonal bands and crosses');
layerGroup.setAttribute('transform', 'translate(0)');
let thicknessRatio = .5
if (doubleBandsDet < .5) {
thicknessRatio = .354
}
const miniDeterminer = (seed % 643) / 643
if (miniDeterminer < .30) {
// diagonal nw to se
const layer1 = drawLine([0, 0], [dimensions[0], dimensions[1]], 3 + bandThickness * 20, colors[1]);
layerGroup.appendChild(layer1);
if (colorCount > 1) {
const layer2 = drawLine([0, 0], [dimensions[0], dimensions[1]], 3 + bandThickness * thicknessRatio * 20, colors[2]);
layerGroup.appendChild(layer2);
}
} else if (miniDeterminer < .60) {
//diagonal ne to sw
const layer1 = drawLine([0, dimensions[1]], [dimensions[0], 0], 3 + bandThickness * 20, colors[1]);
layerGroup.appendChild(layer1);
if (colorCount > 1) {
const layer2 = drawLine([0, dimensions[1]], [dimensions[0], 0], 3 + bandThickness * thicknessRatio * 20, colors[2]);
layerGroup.appendChild(layer2);
}
} else {
// cross
const layer1 = drawLine([0, 0], [dimensions[0], dimensions[1]], (bandThickness * 16) + 3, colors[1]);
const layer2 = drawLine([0, dimensions[1]], [dimensions[0], 0], (bandThickness * 16) + 3, colors[1]);
layerGroup.appendChild(layer2);
layerGroup.appendChild(layer1);
if (colorCount > 1) {
const layer3 = drawLine([0, 0], [dimensions[0], dimensions[1]], (bandThickness * thicknessRatio * 16) + 3, colors[2]);
const layer4 = drawLine([0, dimensions[1]], [dimensions[0], 0], (bandThickness * thicknessRatio * 16) + 3, colors[2]);
layerGroup.appendChild(layer3);
layerGroup.appendChild(layer4);
}
}
}
if ((seed % 52391 ) / 52391 > .83) {layerGroup.noEmblem = true}
return layerGroup;
}
function selectEmblem(seed, dimensions, color, bgIsCircle) {
let smallestSide = dimensions[0];
if (dimensions[0] > dimensions[1]) { smallestSide = dimensions[1]; }
emblemSide = smallestSide
if (bgIsCircle) { emblemSide *= 0.82; }
emblemSide *= 0.91;
const sizeDeterminer = (seed % 30529) / 30529
const sizeVariance = 3.2
const sizeLimit = 2.1
emblemSide *= 1 + ((((sizeDeterminer - .5) / sizeVariance) ** 3) / (sizeLimit * (sizeVariance ** 3)))
const rotateDeterminer = (seed % 74897) / 74897
const determiner = (seed % 997) / 997
const layerGroup = document.createElementNS(svgNameSpace, 'g');
let emblem;
if (determiner < .16) {
//console.log('circle');
emblem = drawCircle((emblemSide * 0.28), color);
} else if (determiner < .23) {
//console.log('hex');
emblem = drawHex((emblemSide * 0.3), color);
let degrees = 0;
if (rotateDeterminer > .5) {degrees = 30}
emblem.setAttribute('transform', `rotate(${degrees})`);
} else if (determiner < .31) {
//console.log('pent');
emblem = drawPent((emblemSide * 0.39), color);
let degrees = 0;
if (rotateDeterminer > .5) {degrees = 36}
emblem.setAttribute('transform', `rotate(${degrees})`);
} else if (determiner < .41) {
//console.log('rhomb root 3');
emblem = drawRhombus((emblemSide * 0.43), (emblemSide * 0.74), color);
let degrees = 0;
if (rotateDeterminer > .5) {degrees = 90}
emblem.setAttribute('transform', `rotate(${degrees})`);
} else if (determiner < .51) {
//console.log('rhomb root 2');
emblem = drawRhombus((emblemSide * 0.47), (emblemSide * 0.67), color);
let degrees = 0;
if (rotateDeterminer > .5) {degrees = 90}
emblem.setAttribute('transform', `rotate(${degrees})`);
} else if (determiner < .71) {
//console.log('star');
emblem = drawStar((emblemSide * 0.44), color);
let degrees = 0;
if (rotateDeterminer > .5) {degrees = 36}
if (rotateDeterminer * 19 > 13) {degrees += 90}
emblem.setAttribute('transform', `rotate(${degrees})`);
} else if (determiner < .83) {
//console.log('square');
emblem = drawRect((emblemSide * 0.56), (emblemSide * 0.56), color);
let degrees = 0;
if (rotateDeterminer > .5) {degrees = 45}
emblem.setAttribute('transform', `rotate(${degrees})`);
} else {
//console.log('triangle');
emblem = drawTriangle((emblemSide * 0.65), color);
let degrees = 0;
if (rotateDeterminer > .5) {degrees = 60}
if (rotateDeterminer * 19 > 12) {degrees += 90}
emblem.setAttribute('transform', `rotate(${degrees})`);
}
const outlineDeterminer = (seed % 66883) / 66883
if (outlineDeterminer < .35) {
emblem.setAttribute('stroke', `hsl(${color[0]}, ${color[1]}%, ${color[2]}%)`);
emblem.setAttribute('stroke-width', (smallestSide * 0.04));
emblem.setAttribute('fill-opacity', 0);
}
layerGroup.setAttribute('transform', `translate(${dimensions[0]/2},${dimensions[1]/2})`);
layerGroup.appendChild(emblem);
return layerGroup;
}
function selectFormat(seed, dimensions, colors, isCircle) {
const determiner = (seed % 397) / 397
const layerGroup = document.createElementNS(svgNameSpace, 'g');
if (determiner < .35) {
const layer = selectLayer(seed, dimensions, colors, 2, isCircle);
layerGroup.appendChild(layer);
} else if (determiner < .50) {
// emblem with no bg layer
const emblem = selectEmblem(seed, dimensions, colors[1], isCircle);
layerGroup.appendChild(emblem);
} else {
// emblem plus mono layer
const layer = selectLayer(seed, dimensions, colors, 1, isCircle);
layerGroup.appendChild(layer);
if (!layer.noEmblem) {
const emblem = selectEmblem(seed, dimensions, colors[2], isCircle);
layerGroup.appendChild(emblem);
}
}
return layerGroup;
}
function createAvatar(inputID) {
const seed = bigChungus(inputID);
const colors = selectColors(seed);
//console.log('these are the colors', colors);
const svg = setBg(seed, colors[0]);
const width = svg.width.baseVal.value;
const height = svg.height.baseVal.value;
const dimensions = [width, height];
svg.appendChild(selectFormat(seed, dimensions, colors, svg.isCircle));
return svg;
}
function createAvatarContainer() {
const div = document.createElement('div');
div.classList.add('avatar-container-div');
div.style.width = 0;
div.style.height = 0;
return div;
}
function styleRankingsTable(rankingsTable) {
const rows = rankingsTable.children[0].rows;
rows[0].insertCell(1).outerHTML = "<th>Avatar</th>";
for (let i = 1; i < rows.length; i++) {
if (i % 2 === 1) {
rows[i].style.background = '#8883';
}
rows[i].style.height = '5em';
let userID = rows[i].children[1].children[0].href.match(/\d+\/?/)[0];
//console.log(rows[i].children[1].children[0].textContent); // username!!
const avatar = createAvatar(userID);
rows[i].insertCell(1).appendChild(avatar);
//rows[i][1].classList.add('avatar-container');
}
}
function styleComments(commentNodeList) {
commentNodeList.forEach(commentNode => {
let userID = commentNode.href.match(/\d+\/$/)[0];
userID = userID.slice(0, (userID.length - 1));
const div = createAvatarContainer();
avatars.push(div);
//console.log(commentNode.innerText); // that's the user's username >:3
const avatar = createAvatar(userID);
avatar.style.position = 'relative';
avatar.style.right = `${avatar.width.baseVal.value + 16}px`;
div.appendChild(avatar);
const commentContainer= commentNode.parentElement.parentElement.parentElement;
if ( commentContainer.querySelector('.comment__prediction') !== null) {
movePrediction(commentContainer, avatar.width.baseVal.value);
}
commentNode.prepend(div);
});
}
function movePrediction(commentContainer, distance) {
const prediction = commentContainer.querySelector('.comment__prediction');
prediction.style.left = `${-(distance - 16) / 16}em`;
}
//function clearAvatars() {
// console.log('clearing avatars');
// avatars = document.querySelectorAll('.avatar-container');
// avatars.forEach(div => div.remove());
//}
//function addListeners() {
// const loadMoreBtns = document.querySelectorAll('._load-more');
// loadMoreBtns.forEach(btn => btn.addEventListener('click', () => {
// document.addEventListener('readystatechange', event => {
// if (event.target.readyState === "complete") {
// main();
// }
// });
// clearAvatars();
// }));
//}
function main() {
const commentNodeList = document.querySelectorAll('.comment__author');
if (commentNodeList.length > 0) {
styleComments(commentNodeList);
}
// on contest page these get generated by an event, not pageload
const rankingsTable = document.querySelector('.rankings-table');
if (rankingsTable !== null) {
styleRankingsTable(rankingsTable);
}
// author of question. not sure how to do this:
//const authorUsername = document.querySelector('[auth-name]');
}
const avatars = []
// necessary to wait for DOM to finish loading
document.addEventListener('readystatechange', event => {
if (event.target.readyState === "complete") {
main();
addListeners();
}
});