// ==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