// ==UserScript== // @name AO3: Fic's Style and Bookmarks // @namespace https://greasyfork.org/it/users/12632-schegge // @version 2.0 // @description Change font, size, width.. + estimated reading time + full screen mode + bookmarks: save the position you stopped reading a fic // @author Schegge // @include http://archiveofourown.org/* // @include https://archiveofourown.org/* // @grant none // @icon data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAC4AAAAuCAYAAABXuSs3AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyBpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBXaW5kb3dzIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjEyNjY3MDJGMzdDODExRTVBODNDREE0MEFBNDM2OTNGIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjEyNjY3MDMwMzdDODExRTVBODNDREE0MEFBNDM2OTNGIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6MTI2NjcwMkQzN0M4MTFFNUE4M0NEQTQwQUE0MzY5M0YiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6MTI2NjcwMkUzN0M4MTFFNUE4M0NEQTQwQUE0MzY5M0YiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz4OJ/TxAAAGAUlEQVR42tSZeWxUVRTG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 // @downloadURL none // ==/UserScript== (function($) { // BOOKMARKS var Bookmarks = { getAll: function() { var bookmarks = localStorage.getItem("ficstyle_bookmarks"); if ( !bookmarks ) { bookmarks = ""; localStorage.setItem("ficstyle_bookmarks", bookmarks); } return bookmarks; }, getSingles: function() { var all = this.getAll(); return all.split("@"); }, getElements: function() { // 0 = url, 1 = title, 2 = scrolltop var els = []; var singles = this.getSingles(); for(var i = 1; i < singles.length; i++) { // from 1 because the first element is empty (storage starts with a @) els.push( singles[i].split("#") ); } return els; }, getUrl: window.location.pathname.split("/works/")[1], // work id getTitle: function() { var title = $("#workskin .preface.group h2.title.heading").text().trim(); title = title.substring(0, 28); // to cut long titles if ( /chapters/.test(window.location.pathname) ) { // if chapter by chapter, also storaging the number of the chapter var chapter = $("#chapters > .chapter > div.chapter.preface.group > h3 > a").text(); chapter = chapter.replace("Chapter ", "ch"); title += " (" + chapter + ")"; } title = title.replace(/#/g, " "); // just in case title = title.replace(/@/g, " "); return title; }, getNewBook : function() { var newbook = $(document).scrollTop(); // current position of the scroll bar var chs = $("dl.stats dd.chapters").text(); // # chapters if ( /(\d+)\/\1/.test(chs) || /chapters/.test(window.location.pathname) ) { // if work completed (if number/number is the same) or chapter by chapter view newbook = ( newbook / $(document).height() ).toFixed(4) + "%"; // calculate in percent } return newbook; }, checkIfExist: function(a) { var url = this.getUrl; var els = this.getElements(); for(var i = 0; i < els.length; i++) { if ( els[i][0] == url ) { // if a bookmark already existed for the current fic if ( a == "book" ) { // retrieve the bookmark var book = els[i][2]; if ( book.indexOf("%") !== -1 ) { book = book.replace("%", ""); book = parseFloat(book); book = book * $(document).height(); } book = parseFloat(book); return book; } else if ( a == "cancel" ) { // delete the old bookmark return "@" + els[i][0] + "#" + els[i][1] + "#" + els[i][2]; } else { return true; } } } }, cancel: function() { var newBookmarks = this.getAll(); var cancel = this.checkIfExist("cancel"); if ( cancel ) { newBookmarks = newBookmarks.replace(cancel, ""); } return newBookmarks; }, getNew: function() { var url = this.getUrl; var title = this.getTitle(); var newbook = this.getNewBook(); var newBookmarks = this.cancel(); // if the the fic was already bookmarked, delete the old bookmark newBookmarks += "@" + url + '#' + title + '#' + newbook; // add new bookmark localStorage.setItem("ficstyle_bookmarks", newBookmarks); } }; // create bookmarks' menu $("#header > ul").append( '
").remove(); // replace '
' with paragraphs
// the options displayed on the page
$options = $("