// ==UserScript==
// @name Thing Remix Attribution Maker
// @namespace http://poikilos.org/
// @version 2.0.2
// @description Format the license information from a thing page
// @author Poikilos (Jake Gustafson)
// @include https://www.thingiverse.com/thing:*
// @grant none
// @run-at document-end
// @downloadURL none
// ==/UserScript==
(function() {
// formerly @match https://www.thingiverse.com/thing:*
var checkTimer = null;
var madeDivClassName = "ThingPage__madeBy";
var licenseClauseImgPrefix = "License__img";
var licenseAnchorPrefix = "License__link"; // INFO: it could be author OR license link
var titlePrefix = "ThingPage__modelName";
var headingCreatedPrefix = "ThingPage__createdBy";
var doneDivPrefixes = [titlePrefix, headingCreatedPrefix];
var clausesContainerPrefix = "License__ccLicense";
var doneDivPrefixesMain = [clausesContainerPrefix];
function getElementsWhereClassStartsWith(str) {
// console.log("getElementsWhereClassStartsWith...");
var els = [];
var all = document.getElementsByTagName("*");
for (var i=0, max=all.length; i < max; i++) {
var el = all[i];
if (el.className.startsWith(str)) {
els.push(el);
}
}
return els;
}
function getDivsWhereClassStartsWith(str) {
// console.log("getDivsWhereClassStartsWith...");
var els = [];
var all = document.getElementsByTagName("div");
for (var i=0, max=all.length; i < max; i++) {
var el = all[i];
if (el.className.startsWith(str)) {
els.push(el);
}
else {
// console.log(el.className + " does not start with it.");
}
}
// console.log("Div count: " + all.length);
return els;
}
function getWhereClassStartsWithIn(el, str) {
if (el === undefined) {
console.log("[getWhereClassStartsWithIn] Error: el is undefined.");
return [];
}
// console.log("getWhereClassStartsWithIn...");
// console.log(" el: " + JSON.stringify(el));
// console.log(" el.className: "+el.className);
// console.log(" el.childNodes.length:"+el.childNodes.length+"...");
var els = [];
var all = el.childNodes;
for (var i=0, max=all.length; i < max; i++) {
var el = all[i];
if (el.className.startsWith(str)) {
els.push(el);
}
else {
// console.log(el.className + " does not start with it.");
}
}
// console.log(" done (div count: " + all.length + ")");
return els;
}
function hasAllDivPrefixes(prefixes) {
var found = 0;
for (var i=0, max=prefixes.length; i < max; i++) {
if (getDivsWhereClassStartsWith(prefixes[i]).length > 0) {
found++;
}
}
return found >= prefixes.length;
}
function elementHasAllPrefixes(el, prefixes) {
var found = 0;
for (var i=0, max=prefixes.length; i < max; i++) {
if (getWhereClassStartsWithIn(el, prefixes[i]).length > 0) {
found++;
}
}
return found >= prefixes.length;
}
function getImgsWhereClassStartsWith(str) {
var els = [];
var all = document.images; // document.getElementsByTagName("img");
for (var i=0, max=all.length; i < max; i++) {
var el = all[i];
if (el.className.startsWith(str)) {
els.push(el);
}
}
return els;
}
function getAnchorsWhereClassStartsWith(str) {
var els = [];
var all = document.getElementsByTagName("a");
for (var i=0, max=all.length; i < max; i++) {
var el = all[i];
if (el.className.startsWith(str)) {
els.push(el);
}
}
return els;
}
function addButton() {
'use strict';
// This should run when ThingPage_galleryHeader* gets filled in, but only once to prevent an infinite loop.
var info = {};
// var pageInfoEs = document.getElementsByClassName("item-page-info");
// NOTE: now ThingiVerse is a React app, so you must use inspect to see the HTML.
// "ThingPage__madeBy*" includes parts such as:
// - `ThingPage__modelName*`
// - `
by UserNameMON D, YYYY`
var pageInfoEs = getDivsWhereClassStartsWith(madeDivClassName);
if (pageInfoEs.length >= 1) {
var pageInfoE = pageInfoEs[0];
// There should only be one.
// pageInfoE.innerHTML += "";
//or:
// See https://www.w3schools.com/jsref/met_document_createelement.asp
var btn = document.createElement("BUTTON"); // Create a