MediaWiki:Common.js
From Makerpedia
Note: After publishing, you may have to bypass your browser's cache to see the changes.
- Firefox / Safari: Hold Shift while clicking Reload, or press either Ctrl-F5 or Ctrl-R (⌘-R on a Mac)
- Google Chrome: Press Ctrl-Shift-R (⌘-Shift-R on a Mac)
- Internet Explorer / Edge: Hold Ctrl while clicking Refresh, or press Ctrl-F5
- Opera: Press Ctrl-F5.
/* Any JavaScript here will be loaded for all users on every page load. */
window.µ = function (id, elem) {
var ret;
var root = ((elem) ? elem : document);
switch (id.charAt(0)) {
case '|':
ret = root;
break;
case '+':
ret = document.createElement(id.substring(1));
if (elem) elem.appendChild(ret);
break;
case '#':
ret = root.querySelector(id);
break;
default:
ret = Array.prototype.slice.call(root.querySelectorAll(id));
break;
}
return ret;
};
window.pageParams = {};
const urlParams = new URLSearchParams(window.location.search);
for (const [key, value] of urlParams.entries()) {
window.pageParams[key] = value;
}
window.makers = {};
window.makerSkills = [
{name: "3D Printing", image:"images/badges/3dprinting.png", super: "Digital Fab"},
{name: "Airbrushing", image:"images/badges/airbrushing.png", super: "Crafts"},
{name: "Button Making", image:"images/badges/button.png", super: "Crafts"},
{name: "Music and Sound", image:"images/badges/cassette.png", super: "Crafts"},
{name: "Crafting", image:"images/badges/crafting.png", super: "Crafts"},
{name: "Handsewing", image:"images/badges/handsewing.png", super: "Textiles"},
{name: "Graphic Design", image:"images/badges/graphic.png", super: "Software"},
{name: "Laser Cutting", image:"images/badges/laser.png", super: "Digital Fab"},
{name: "Machining", image:"images/badges/machining.png", super: "Fabrication"},
{name: "3D Modeling", image:"images/badges/modeling.png", super: "Software"},
{name: "Programming", image:"images/badges/programming.png", super: "Electronics"},
{name: "Soldering", image:"images/badges/soldering.png", super: "Electronics"},
{name: "Technical Design", image:"images/badges/technical.png", super: "Software"},
{name: "Textiles", image:"images/badges/textile.png", super: "Textiles"},
{name: "Welding", image:"images/badges/welding.png", super: "Fabrication"},
{name: "Woodworking", image:"images/badges/woodworking.png", super: "Fabrication"},
];
//Knitting, crocheting, weaving, detail painting, miniatures, wood carving, resin and mold making, plaster, clay and ceramics, printmaking, milling, turning, cnc milling, cnc plasma cutting
window.makerTools = [
{name: "Makerspace Tools", super: "Makerspace Tools"},
{name: "Machine Shop Tools", super: "Machine Shop Tools"},
{name: "Wood Shop Tools", super: "Wood Shop Tools"},
{name: "Instrument Shop Tools", super: "Instrument Shop Tools"},
];
window.toolCats = [
{name: "Horizontal Bandsaws", super: "Bandsaws"},
{name: "Vertical Bandsaws", super: "Bandsaws"},
{name: "Vertical Knee Mills", super: "Mills"},
{name: "Vertical Bed Mills", super: "Mills"},
{name: "Drill Presses", super: "Drill Presses"},
{name: "SLS 3D Printers", super: "3D Printers"},
{name: "SLA 3D Printers", super: "3D Printers"},
{name: "FDM 3D Printers", super: "3D Printers"},
{name: "Toolroom Lathe", super: "Lathes"},
{name: "Drills", super: "Power Hand Tools"},
{name: "Drivers", super: "Power Hand Tools"},
{name: "Portabands", super: "Power Hand Tools, Bandsaws"},
{name: "Hand Sanders", super: "Power Hand Tools, Sanders"}
];
//makers.categories = Array.from(new Set(makers.skills.map(x=>x.super)));
//console.log(makers.categories);
console.log('starting widgets');
mw.loader.using(['mediawiki.api', 'jquery']).then(()=>{
if(window.widgets){
for(let i=0; i<window.widgets.length; i++){
window.widgets[i]();
}
}
});
/* add additional edit button in bottom right corner -- styled in Common.css */
/* Takes them to visual editor if available/logged in; if not, takes them to normal edit mode; if they are not logged in at all, takes them to login page */
let editLinkQuery = document.querySelector("#ca-ve-edit a") ? "#ca-ve-edit a" : (document.querySelector("#ca-edit a") ? "#ca-edit a" : "#pt-login a");
document.getElementById("content").innerHTML += '<a href='+document.querySelector(editLinkQuery).href+'><button class="big-edit-button"><p>EDIT</p></button></a>';
// Individual Project pages (and potentially tools): if page is part of a category, insert any corresponding skill badges at top of page
if(document.getElementById("catlinks") != null) {
document.querySelectorAll("#catlinks li a").forEach((cat) => {
let query = "#firstHeading";
if(cat.title.includes("Category:Airbrushing")) {
insertImage('File:Airbrushing_badge_small.png', query, "padding-left:.3em;", "Fabrication", true, "Airbrushing");
}
if(cat.title.includes("Category:Button Pressing")) {
insertImage('File:Button_badge_small.png', query, "padding-left:.3em;", "Crafts", true, "Button Pressing");
}
if(cat.title.includes("Category:Cassette Making")) {
insertImage('File:Cassette_badge_small.png', query, "padding-left:.3em;", "Crafts", true, "Cassette Making");
}
if(cat.title.includes("Category:Crafting")) {
insertImage('File:Crafting_badge_small.png', query, "padding-left:.3em;", "Crafts", true, "Crafting");
}
if(cat.title.includes("Category:Graphic Design")) {
insertImage('File:Graphic_badge_small.png', query, "padding-left:.3em;", "Design", true, "Graphic Design");
}
if(cat.title.includes("Category:Hand Sewing")) {
insertImage('File:Handsewing_badge_small.png', query, "padding-left:.3em;", "Textiles", true, "Hand Sewing");
}
if(cat.title.includes("Category:Laser Cutting")) {
insertImage('File:Laser_badge_small.png', query, "padding-left:.3em;", "CNC-Laser", true, "Laser Cutting");
}
if(cat.title.includes("Category:Machining")) {
insertImage('File:Machining_badge_small.png', query, "padding-left:.3em;", "CNC-Laser", true, "Machining");
}
if(cat.title.includes("Category:3D Modeling")) {
insertImage('File:Modeling_badge_small.png', query, "padding-left:.3em;", "Design", true, "3D Modeling");
}
if(cat.title.includes("Category:3D Printing")) {
insertImage('File:Printing_badge_small.png', query, "padding-left:.3em;", "Fabrication", true, "3D Printing");
}
if(cat.title.includes("Category:Programming")) {
insertImage('File:Programming_badge_small.png', query, "padding-left:.3em;", "Design", true, "Programming");
}
if(cat.title.includes("Category:Soldering")) {
insertImage('File:Soldering_badge_small.png', query, "padding-left:.3em;", "Metalworking", true, "Soldering");
}
if(cat.title.includes("Category:Technical Design")) {
insertImage('File:Technical_badge_small.png', query, "padding-left:.3em;", "Design", true, "Technical Design");
}
if(cat.title.includes("Category:Textiles")) {
insertImage('File:Textile_badge_small.png', query, "padding-left:.3em;", "Textiles", true, "Textiles");
}
if(cat.title.includes("Category:Welding")) {
insertImage('File:Welding_badge_small.png', query, "padding-left:.3em;", "Metalworking", true, "Welding");
}
if(cat.title.includes("Category:Woodworking")) {
insertImage('File:Woodworking_badge_small.png', query, "padding-left:.3em;", "Fabrication", true, "Woodworking");
}
})
}
// uses api to insert image at given selector element in html, using image in mediawiki format (eg [[File:filename...]])
// optional style parameter gets applied
// if asLinkedSkillBadge is true, styles as skill badge (image wrapped in <a> link)
function insertImage(image, selector, style="", linkFilter="", asLinkedSkillBadge=false, tooltip=image) {
$.getJSON(
mw.util.wikiScript( 'api' ), {
format: 'json',
action: 'query',
titles: image,
prop: 'imageinfo',
iiprop: 'url'
},
function( obj ) {
let pages = obj.query.pages;
let result1 = pages[Object.keys(pages)[0]];
let url = result1.imageinfo[0].url;
let alt = result1.title; // set alt text to image title
let urlSub = url.substring(url.indexOf("/")); // get just later part of url as link to image (after first slash)
if(asLinkedSkillBadge) { // insert as linked skill badge (image wrapped in <a> with link to prefiltered Project Tutorials page)
document.querySelector(selector).innerHTML += '<a href="./Project_Tutorials?title=Project_Tutorials&filter='+linkFilter+'" title="'+tooltip+'"><img class="skill-badge-img" src="'+urlSub+'" alt="'+alt+'" style="'+style+'"></a>';
}
else { // insert as regular image
document.querySelector(selector).innerHTML += '<img src="'+urlSub+'" alt="'+alt+'" style="'+style+'">';
}
}
);
}
/* like button. Only appears on "Main" Namespace pages that aren't sidebar pages (should be restricted to content pages like articles).*/
/* Styled in common.css*/
if (mw.config.get('wgNamespaceNumber') == 0 && mw.config.get('wgPageName') !== 'Project_Tutorials' && mw.config.get('wgPageName') !== 'Tools' && mw.config.get('wgPageName') !== 'Spaces' && mw.config.get('wgPageName') !== 'Home') {
// if page is favorited we should show unfavorite button instead. Direct to login if not logged in.
if (document.querySelector("#ca-favorite")) {
document.getElementById("firstHeading").innerHTML += '<a href=/wiki/index.php?title='+mw.config.get('wgPageName')+'&action=favorite&returnto='+mw.config.get('wgPageName')+'><button class="favorite"></button></a>';
} else if (document.querySelector("#ca-unfavorite")) {
document.getElementById("firstHeading").innerHTML += '<a href=/wiki/index.php?title='+mw.config.get('wgPageName')+'&action=unfavorite&returnto='+mw.config.get('wgPageName')+'><button class="unfavorite"></button></a>';
// occurs if the user is not logged in:
} else {
document.getElementById("firstHeading").innerHTML += '<a href='+document.querySelector("#pt-login a").href+'><button class="favorite"></button></a>';
};
};
// open any <a> wrapped in <u class="plainlinks"> in same tab (generally internal links that must be treated as external links in order to give url parameters)
$('u.plainlinks a').each(function() { $(this).attr('target', "_self")});