NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript== // @name Amazon Star percent to number // @namespace http://www.example.com/chacham/ // @description Replace percent with rounded number (and percent) // @include http://*.amazon.com/dp/* // @include https://*.amazon.com/dp/* // @include http://*.amazon.com/*/dp/* // @include https://*.amazon.com/*/dp/* // @include http://*.amazon.com/review/* // @include https://*.amazon.com/review/* // @include http://*.amazon.com/*/product/* // @include https://*.amazon.com/*/product/* // @include http://*.amazon.com/product-reviews/* // @include https://*.amazon.com/product-reviews/* // @include http://*.amazon.com/*/product-reviews/* // @include https://*.amazon.com/*/product-reviews/* // @include http://*.amazon.com/*/customer-reviews/* // @include https://*.amazon.com/*/customer-reviews/* // @grant none // @version 1.7 // ==/UserScript== // product page and product-reviews page are implemented the same way, // though the product-reviews page has an actual number which could be used instead // Stars are in different locations depending on the page: // // 1) Main product page // 2) Star-level reviews page, for example, when looking at all 2 star reviews. // 3) Single review page, when seeing a single review, such as after clicking a review's title, there is a review box on the right side // // We'll check for cases 2 and 3, and default to case 1 without a specific check. // The checks are done on the url, which starts by the forwardslash after "amazon.com". /////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // declarations /////////////////////////////////////////////////////////////////////////////////////////////////////////////////// var total; var percent; var i; var star_line; /////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // functions /////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // ts = thousands separator // Only works when comma is the separator. // Todo: internationalize function ts_remove(number) { return number.replace(',', ''); } function ts_add(number) { return number.replace(/(\d)(?=(\d{3})+(?!\d))/g, "$1,"); } // the total line can have completely different names and html setup // also, the same name may be used elsewhere for something else // put them together for clarity and reuse function get_total(section) { var total; switch(section) { case 'crAvgStars': total = document.getElementsByClassName('crAvgStars')[0].childNodes[2].textContent.split(" ", 1)[0]; break; case 'totalReviewCount': total = document.getElementsByClassName('a-size-medium totalReviewCount')[0].textContent; break; case 'summaryStars': total = document.getElementById('summaryStars').childNodes[1].childNodes[2].textContent.trim(); break; } // remove any thousands separators return ts_remove(total); } // the star lines can also be completely different function replace_star_line(section, percent_child_node) { if(section == 'histoCount') { var star_line = document.getElementsByClassName('histoCount'); for (i = 0; i < star_line.length; i++) { percent = star_line[i]; percent.textContent = ts_add(Math.round(total * percent.textContent.slice(0, -1) * .01).toString()) + ' (' + percent.textContent + ')'; } } else { var star_table; star_table = document.getElementById('histogramTable'); for (i = 0; i < star_table.rows.length; i++) { percent = star_table.rows[i].cells[2].childNodes[percent_child_node]; percent.textContent = ts_add(Math.round(total * percent.textContent.slice(0, -1) * .01).toString()) + ' (' + percent.textContent + ')'; } } } /////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // case 3 Single review page /////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // review doesn't use an html table. With no commonality with the other two cases, we'll modify it first and exit. if( (window.location.pathname.indexOf("/review/") === 0) || (window.location.pathname.indexOf("/customer-reviews/") > 0) ) { // Get the total and remove comma as thousands separator total = get_total('crAvgStars'); replace_star_line('histoCount'); return; } // Cases 1 and 2 // product and reviews use the same mechanism, with some variation. Define what we need, then do the common work. if(window.location.pathname.indexOf("/product-reviews/") >= 0) { total = get_total('totalReviewCount'); replace_star_line('histogramTable', 0); } else // (product, and the default) { // summaryStars does not seem to be used anymore, instead using totalReviewCount. // So, we'll just add it at the end. Not so sure about adding structure to something // that changes all the time. if(document.getElementById('summaryStars')) { total = get_total('summaryStars'); replace_star_line('histogramTable', 2); } else { if(document.getElementById('crAvgStars')) { total = get_total('crAvgStars'); replace_star_line('histoCount'); } else { total = get_total('totalReviewCount'); replace_star_line('histogramTable', 0); } } } ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////