Created
March 20, 2017 10:57
-
-
Save lebbe/e42d884da1f9fe3700b2ac8822a82aee to your computer and use it in GitHub Desktop.
Sorter varer på kolonial.no.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* Dette programmet sorterer varer på kolonial.no. | |
* Du må gå helt inn i en spesifikk kategori før du starter sorteringen. | |
* | |
* Kjør programmet ved å åpne opp utviklerverktøy, og lim koden inn i konsollet. | |
* Når du vil sortere en annen kategori senere, holder det å trykke "Pil opp" | |
* og så "Enter" for å sortere på nytt. | |
* | |
* ALL BRUK GJØRES PÅ EGET ANSVAR. Denne koden er med vilje IKKE gjort om til | |
* noen browser-plugin. Med en gang kolonial.no gjør kode-endringer kan dette | |
* programmet slutte å fungere. Jeg kan på ingen måte garantere at kolonial.no | |
* fungerer som intendert etter at koden har kjørt. | |
* | |
* Koden er originalt skrevet av Lars-Erik Bruce, men kan anses som "public | |
* domain". Ingen kopiretter eller andre rettigheter er forbeholdt meg. | |
* | |
* Det er ingen samarbeid mellom meg eller kolonial.no. Opplever du problemer | |
* SLUTT Å BRUKE KODEN UMIDDELBART og refresh browser. Hvis du ikke kan | |
* JavaScript selv, IKKE BEGYNN Å BRUKE KODEN. Alt skjer på eget ansvar. | |
*/ | |
(function() { | |
// "jQuery" in codegolf version. Are you able to shorten it? :-) | |
var $=(q,s)=>Array.from((s||document).querySelectorAll(q)) | |
$.insertAfter = function insertAfter(newNode, referenceNode) { | |
referenceNode.parentNode.insertBefore(newNode, referenceNode.nextSibling); | |
} | |
$.create = function(name, content, style) { | |
var element = document.createElement(name) | |
if(content) element.textContent = content | |
if(style) element.setAttribute('style', style) | |
return element | |
} | |
// Variables. Hopefully, if kolonial.no changes their DOM, I only have | |
// to replace some of these variables | |
var products = '.product-list-item' | |
var unitPrice = '.unit-price' | |
var pricePerUnit = /([0-9]*,[0-9]*) per ([a-z]*)/ | |
var productHeader = '.product-category-header' | |
var oldProductContainer = '.product-category-list' | |
// Setting up the DOM | |
var productContainer = $.create('div') | |
$.insertAfter(productContainer, $(productHeader)[0]) | |
$(oldProductContainer)[0].setAttribute('style', 'display: none') | |
// Finding, sorting and placing products | |
var units = Object.create(null) | |
var unitMapper = { | |
l: 'Liter', | |
stk: 'Stykkpris', | |
kg: 'Kilo', // TODO: Konvertere gram til Kilogram? | |
g: 'Gram', | |
'm': 'Meter' | |
} | |
$(products).forEach(product => { | |
var pricePerUnitText = $(unitPrice, product)[0].textContent | |
var matches = pricePerUnit.exec(pricePerUnitText) | |
var price = matches[1].replace(',', '.') | |
var unit = matches[2] | |
units[unit] = units[unit] || [] | |
product.setAttribute('style', 'display: inline-block') | |
units[unit].push({ | |
price: parseFloat(price), | |
elem: product | |
}) | |
}) | |
for(key in units) { | |
var unit = units[key] | |
// Sort products in unit | |
unit.sort((a, b) => a.price - b.price) | |
// Insert unit header | |
var header = $.create('h2', unitMapper[key] || key) | |
productContainer.appendChild(header) | |
// Insert products | |
unit.forEach(product => productContainer.appendChild(product.elem)) | |
} | |
})() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment