Greasy Fork is available in English.
Convert Amazon units to normal units that all normal countries uses. It's check only 2 rows in a Specs table, so it's very perfomance-friendly.
// ==UserScript== // @name Amazon units converter // @name:ru Amazon конвертер величин // @namespace https://greasyfork.org/ru/users/303426-титан // @version 1.1.0 // @description Convert Amazon units to normal units that all normal countries uses. It's check only 2 rows in a Specs table, so it's very perfomance-friendly. // @description:ru Конвертирует единицы измерения Амазона из американских в нормальные. Он проверяет только 2 строчки в Характеристиках, поэтому этот скрипт не оказывает практически никакого влияния на производительность // @author Титан // @include http://www.amazon.com/*/dp/* // @include https://www.amazon.com/*/dp/* // @include http://www.amazon.co.uk/*/dp/* // @include https://www.amazon.co.uk/*/dp/* // @include http://www.amazon.fr/*/dp/* // @include https://www.amazon.fr/*/dp/* // @include http://www.amazon.de/*/dp/* // @include https://www.amazon.de/*/dp/* // @include http://www.amazon.es/*/dp/* // @include https://www.amazon.es/*/dp/* // @include http://www.amazon.ca/*/dp/* // @include https://www.amazon.ca/*/dp/* // @include http://www.amazon.in/*/dp/* // @include https://www.amazon.in/*/dp/* // @include http://www.amazon.it/*/dp/* // @include https://www.amazon.it/*/dp/* // @include http://www.amazon.co.jp/*/dp/* // @include https://www.amazon.co.jp/*/dp/* // @include http://www.amazon.com.mx/*/dp/* // @include https://www.amazon.com.mx/*/dp/* // @include http://www.amazon.com.au/*/dp/* // @include https://www.amazon.com.au/*/dp/* // @include http://www.amazon.com/*/product/* // @include https://www.amazon.com/*/product/* // @include http://www.amazon.co.uk/*/product/* // @include https://www.amazon.co.uk/*/product/* // @include http://www.amazon.fr/*/product/* // @include https://www.amazon.fr/*/product/* // @include http://www.amazon.de/*/product/* // @include https://www.amazon.de/*/product/* // @include http://www.amazon.es/*/product/* // @include https://www.amazon.es/*/product/* // @include http://www.amazon.ca/*/product/* // @include https://www.amazon.ca/*/product/* // @include http://www.amazon.in/*/product/* // @include https://www.amazon.in/*/product/* // @include http://www.amazon.it/*/product/* // @include https://www.amazon.it/*/product/* // @include http://www.amazon.co.jp/*/product/* // @include https://www.amazon.co.jp/*/product/* // @include http://www.amazon.com.mx/*/product/* // @include https://www.amazon.com.mx/*/product/* // @include http://www.amazon.com.au/*/product/* // @include https://www.amazon.com.au/*/product/* // @icon https://www.google.com/s2/favicons?domain=amazon.com // @grant none // ==/UserScript== (function() { 'use strict'; let DebugText = ":::Amazon American units to normal units extension::: "; let Debug = false; let UnitNames = ["inches", "pounds", "ounces"]; let NewUnitNames = ["cm", "kg", "gram"] let ConvertFuncs = [ConvertInchesToSm, ConvertPoundsToKg, ConvertOuncesToGram] let CheckAllRows = false; class UnitText { StartIndex Unit NewUnit UnitConvertFunc get StartIndex() { return this._Index; } set StartIndex(value) { this._Index = value; } get Unit() { return this._Unit; } set Unit(value) { this._Unit = value; } get NewUnit() { return this._NewUnit; } set NewUnit(value) { this._NewUnit = value; } get UnitConvertFunc() { return this._UnitConvertFunc; } set UnitConvertFunc(value) { this._UnitConvertFunc = value; } constructor(StartIndex, Unit, NewUnit, UnitConvertFunc) { this._Index = StartIndex; this._Unit = Unit; this._NewUnit = NewUnit; this._UnitConvertFunc = UnitConvertFunc; } } window.onload = () => { if (Debug) {console.log("Amazon unit converter started"); } let Tables = document.querySelectorAll("table"); for(let table of Tables) { if (Debug) {console.log("TABLE:"); console.log(table);} let tbody = table.firstElementChild; try { for (let tr of tbody.children) { let thNode = tr; while (thNode.firstElementChild != null) {thNode = thNode.firstElementChild} let lowerText = thNode.textContent.toLowerCase(); if (Debug) console.log("text: ", lowerText); if (lowerText.indexOf("dimensions") >= 0 || lowerText.indexOf("weight") >= 0||!CheckAllRows) { TableSearch(tr); } } } catch (e) { if(Debug) console.log(table.id+ ": "+e.message); } } } function TableSearch(tr) { if (Debug) { console.log("TableSearch td:"); console.log(tr); } let dimentionsTds = tr.querySelectorAll("td"); for (let td of dimentionsTds) { while (td.firstElementChild != null) {td = td.firstElementChild} td.textContent = ReplaceUnits(td.textContent); } } /** * * @param {string} Text Text that will be converted * @returns {string} Is something were converted (False, if nothing to convert found) * @constructor */ function ReplaceUnits(Text) { let lastStart; do { let unitTextInfo = new Array(UnitNames.length); for (let i = 0; i < UnitNames.length; i++) { unitTextInfo[i] = new UnitText(); unitTextInfo[i].StartIndex = Text.toLowerCase().indexOf(UnitNames[i]); if (unitTextInfo[i].StartIndex>0) { unitTextInfo[i].StartIndex+=UnitNames[i].length; unitTextInfo[i].Unit = UnitNames[i]; unitTextInfo[i].NewUnit = NewUnitNames[i]; unitTextInfo[i].UnitConvertFunc = ConvertFuncs[i]; } } unitTextInfo.sort((a, b) => a.StartIndex - b.StartIndex); //5,4,3,2,1 let Texts = new Array(unitTextInfo.length); lastStart = 0; for (let i = 0; i < unitTextInfo.length; i++) { if (unitTextInfo[i].StartIndex != -1) { Texts[i] = Text.slice(lastStart, unitTextInfo[i].StartIndex + 1); lastStart = unitTextInfo[i].StartIndex; Texts[i] = ReplaceUnit(Texts[i], unitTextInfo[i].Unit, unitTextInfo[i].NewUnit, unitTextInfo[i].UnitConvertFunc); } } if (lastStart == 0) break; Text = ""; for (let t of Texts) { if (t!=undefined) Text+=t; } } while (true) //do until nothing to convert left return Text; } /** * Converts all numbers in text from old unit to new unit * * @param {string} Text Text that will be converted * @param {string} UnitName Name of current unit * @param {string} NewUnitName Name of the new unit * @param {function} UnitConvertFunc Function that takes current unit float and returns new unit float * @return {string} Text with all old unit floats replaced by new unit floats */ function ReplaceUnit(Text,UnitName,NewUnitName,UnitConvertFunc) { let NewText = ""; let lastUnitTextIndex = -UnitName.length; let unitTextIndex = Text.toLowerCase().indexOf(UnitName); if (unitTextIndex===-1) return Text; let unitTextFragment = Text.slice(lastUnitTextIndex+UnitName.length, unitTextIndex) lastUnitTextIndex = unitTextIndex; while (unitTextIndex!==-1) { //while there IS a UnitName text in a string untouched let i = 0; console.log("original fragment: " + unitTextFragment); LfragmentLoop: while (i < unitTextFragment.length) { //Перебор внутри фрагмента let firstDigitPos; let lastDigitPos; for (i; ;i++) { //Searches for first digit symbol if (i === unitTextFragment.length) { //if first digit not found, exit circle if(Debug) console.log(`${DebugText}no Number found before \"${UnitName}\" text: ${NormalizeString( unitTextFragment)}`); break LfragmentLoop; } if (isFloatNumber(unitTextFragment[i])) break; //if first digit found, break } lastDigitPos = firstDigitPos = i; for (i+=1;i < unitTextFragment.length; i++) {//searches for last digit position if (isFloatNumber(unitTextFragment[i])) lastDigitPos = i; else break; } let UnitNumber = unitTextFragment.slice(firstDigitPos,lastDigitPos+1); let NewUnitNumber = UnitConvertFunc(UnitNumber).toFixed(2); unitTextFragment = unitTextFragment.slice(0,firstDigitPos) + NewUnitNumber + unitTextFragment.slice(lastDigitPos+1); let offset = NewUnitNumber.length - UnitNumber.length i+= offset; if(Debug) console.log("fragment: "+ NormalizeString(unitTextFragment)+"\nCursorpos:"+CreateSpaces(i)+"↑"); } NewText+=unitTextFragment + NewUnitName; unitTextIndex = Text.toLowerCase().indexOf(UnitName, lastUnitTextIndex+UnitName.length); if (unitTextIndex===-1) break; unitTextFragment = Text.slice(lastUnitTextIndex+UnitName.length, unitTextIndex) lastUnitTextIndex = unitTextIndex; } if (lastUnitTextIndex<Text.length) NewText+=Text.slice(lastUnitTextIndex+UnitName.length) return NewText; } function ConvertInchesToSm(Inches) { return Inches*2.54; } function ConvertPoundsToKg(Pounds) { return Pounds*0.45359237; } function ConvertOuncesToGram(Ounces) { return Ounces *28.34952313; } function isFloatNumber(c) { return c >= '0' && c <= '9' || c === '.'; } function CreateSpaces(Count){ let Spaces = ""; for (let i=Count;i--; i>0) Spaces+= " "; return Spaces; } function NormalizeString(inputString){ let normalizedString = ""; for (let i=0; i<inputString.length;i++) { switch (inputString[i]) { case '\n': normalizedString+="↵"; break; case '\t': normalizedString+="⇥"; break; case '\r': normalizedString+="␍"; break; case '\b': normalizedString+="␈"; break; case '\f': normalizedString+="↡"; break; case '\v': normalizedString+="⭳"; break; case '\0': normalizedString+="␀"; break; default: normalizedString+= inputString[i]; break; } } return normalizedString; } })();