Advertisement
Kaanbaltlak

AO3: kudosed and seen history - español

Jun 7th, 2024
614
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. // ==UserScript==
  2. // @name        AO3: Kudosed and seen history
  3. // @description Highlight or hide works you kudosed/marked as seen.
  4. // @namespace   https://greasyfork.org/scripts/5835-ao3-kudosed-and-seen-history
  5. // @author  Min
  6. // @version 2.2.1
  7. // @history 2.2.1 - fix for bookmarked blurbs
  8. // @history 2.2 - separate kudosed and seen settings, smaller icons
  9. // @history 2.1 - fix for reversi
  10. // @history 2.0 - rewrite, click actions for blurbs, new highlighting
  11. // @history 1.5 - import/export seen list
  12. // @history 1.4 - thinner stripes, remembers bookmarks you left
  13. // @history 1.3 - option to collapse blurbs of seen works
  14. // @history 1.2.1 - double click on date marks work as seen
  15. // @history 1.2 - check for bookmarks you left, changes to the menu
  16. // @grant       none
  17. // @require     https://ajax.googleapis.com/ajax/libs/jquery/1.9.0/jquery.min.js
  18. // @include     http://*archiveofourown.org/*
  19. // @include     https://*archiveofourown.org/*
  20. // @downloadURL https://update.greasyfork.org/scripts/5835/AO3%3A%20Kudosed%20and%20seen%20history.user.js
  21. // @updateURL https://update.greasyfork.org/scripts/5835/AO3%3A%20Kudosed%20and%20seen%20history.meta.js
  22. // ==/UserScript==
  23.  
  24.  
  25. (function ($) {
  26.  
  27.     var DEBUG = false;
  28.  
  29.     // newest more-or-less major version, for the update notice
  30.     var current_version = '2.02';
  31.  
  32.     var kudos_history = {}, seen_buttons = {}, saved_settings = {};
  33.     var main = $('#main');
  34.  
  35.     // check if reversi
  36.     var body_bg_color = window.getComputedStyle(document.body).backgroundColor;
  37.     if (body_bg_color == 'rgb(51, 51, 51)') {
  38.         main.addClass('kh-reversi');
  39.     }
  40.  
  41.     // uncomment the next five lines if you need to clear your local lists (then comment them again after refreshing the page once)
  42.     // localStorage.removeItem('kudoshistory_kudosed');
  43.     // localStorage.removeItem('kudoshistory_checked');
  44.     // localStorage.removeItem('kudoshistory_seen');
  45.     // localStorage.removeItem('kudoshistory_bookmarked');
  46.     // localStorage.removeItem('kudoshistory_skipped');
  47.  
  48.     var KHList = {
  49.         init: function init(name, max_length) {
  50.             this.name = name;
  51.             this.max_length = max_length || 200000;
  52.             this.list = localStorage.getItem('kudoshistory_' + this.name) || ',';
  53.             return this;
  54.         },
  55.  
  56.         reload: function reload() {
  57.             this.list = localStorage.getItem('kudoshistory_' + this.name) || this.list;
  58.             return this;
  59.         },
  60.         save: function save() {
  61.             try {
  62.                 localStorage.setItem('kudoshistory_' + this.name, this.list.slice(0, this.max_length));
  63.             }
  64.             catch (e) {
  65.                 localStorage.setItem('kudoshistory_' + this.name, this.list.slice(0, this.list.length * 0.9));
  66.             }
  67.             return this;
  68.         },
  69.         hasId: function hasId(work_id) {
  70.  
  71.             if (this.list.indexOf(',' + work_id + ',') > -1) {
  72.                 this.list = ',' + work_id + this.list.replace(',' + work_id + ',', ',');
  73.                 return true;
  74.             }
  75.             else {
  76.                 return false;
  77.             }
  78.         },
  79.         add: function add(work_id) {
  80.             this.list = ',' + work_id + this.list.replace(',' + work_id + ',', ',');
  81.             return this;
  82.         },
  83.         remove: function remove(work_id) {
  84.             this.list = this.list.replace(',' + work_id + ',', ',');
  85.             return this;
  86.         },
  87.     };
  88.  
  89.     var KHSetting = {
  90.         init: function init(setting) {
  91.             this.name = setting.name;
  92.             this.label = setting.label;
  93.             this.description = setting.description;
  94.             this.options = setting.options;
  95.             this.current = saved_settings[this.name] || setting.default_value;
  96.             return this;
  97.         },
  98.  
  99.         next: function next() {
  100.             this.current = this.options[this.options.indexOf(this.current) + 1] || this.options[0];
  101.             this.updateButton();
  102.             this.save();
  103.             addMainClass(true);
  104.         },
  105.         getButton: function getButton() {
  106.             this.button_link = $('<a></a>').text(this.label + ': ' + this.current.toUpperCase()).prop('title', this.options.join(' / ').toUpperCase());
  107.             this.button = $('<li class="kh-menu-setting"></li>').append(this.button_link);
  108.             var this_setting = this;
  109.             this.button.click(function () {
  110.                 this_setting.next();
  111.             });
  112.             return this.button;
  113.         },
  114.         updateButton: function updateButton() {
  115.             this.button_link.text(this.label + ': ' + this.current.toUpperCase());
  116.         },
  117.         changeValue: function changeValue(value) {
  118.             this.current = value;
  119.             this.updateButton();
  120.             this.updateSettingRow();
  121.             this.save();
  122.             addMainClass(true);
  123.         },
  124.         getSettingRow: function getSettingRow() {
  125.             var setting_row_info = $('<p class="kh-setting-info kh-hide-element">' + this.description + '</p>');
  126.             var setting_row_info_button = $('<a class="help symbol question kh-setting-info-button"><span class="symbol question"><span>?</span></span></a>');
  127.             var setting_row_label = $('<span class="kh-setting-label">' + this.label + ': </span>').append(setting_row_info_button);
  128.             this.setting_row_options = $('<span class="kh-setting-options"></span>');
  129.             this.setting_row = $('<p class="kh-setting-row"></p>').append(setting_row_label, this.setting_row_options, setting_row_info);
  130.             this.updateSettingRow();
  131.             setting_row_info_button.click(function () {
  132.                 setting_row_info.toggleClass('kh-hide-element');
  133.             });
  134.             return this.setting_row;
  135.         },
  136.         updateSettingRow: function updateSettingRow() {
  137.             var this_setting = this;
  138.             this_setting.setting_row_options.empty();
  139.             this.options.forEach(function (option) {
  140.                 var option_link = $('<a class="kh-setting-option"></a>');
  141.                 option_link.click(function () {
  142.                     this_setting.changeValue(option);
  143.                 });
  144.  
  145.                 if (this_setting.current == option) {
  146.                     option_link.html('<strong>' + option.toUpperCase() + '</strong>').addClass('kh-setting-option-selected');
  147.                 }
  148.                 else {
  149.                     option_link.text(option.toUpperCase());
  150.                 }
  151.  
  152.                 this_setting.setting_row_options.append(' ', option_link, ' <span class="kh-setting-separator">&bull;</span>');
  153.             });
  154.         },
  155.         save: function save() {
  156.             saved_settings[this.name] = this.current;
  157.             localStorage.setItem('kudoshistory_settings', JSON.stringify(saved_settings));
  158.         },
  159.         check: function check(compare) {
  160.             return (this.current === (compare || 'yes'));
  161.         },
  162.     };
  163.  
  164.     var settings_list = [
  165.         {
  166.             name: 'kudosed_display',
  167.             label: 'Obras kudoseadas',
  168.             description: 'Ocultar las obras en las listas, mostrar toda la descripción o mostrar sólo la cabecera.',
  169.             options: ['hide', 'show', 'collapse'],
  170.             default_value: 'collapse',
  171.         },
  172.         {
  173.             name: 'seen_display',
  174.             label: 'Obras vistas',
  175.             description: 'Ocultar las obras en las listas, mostrar toda la descripción o mostrar sólo la cabecera.',
  176.             options: ['hide', 'show', 'collapse'],
  177.             default_value: 'collapse',
  178.         },
  179.         {
  180.             name: 'skipped_display',
  181.             label: 'Obras omitidas',
  182.             description: 'Ocultar las obras de las listas, sustituir el contenido de la descripción por "Omitido" o mostrar sólo la cabecera.',
  183.             options: ['hide', 'placeholder', 'collapse'],
  184.             default_value: 'placeholder',
  185.         },
  186.         {
  187.             name: 'toggles_display',
  188.             label: 'Opciones del blurb',
  189.             description: 'Los controles de la parte superior derecha de la cajita que le permiten marcar/desmarcar la obra como vista u omitida de la lista.',
  190.             options: ['hide', 'show', 'on hover'],
  191.             default_value: 'on hover',
  192.         },
  193.         {
  194.             name: 'highlight_bookmarked',
  195.             label: 'Resaltar bookmarks',
  196.             description: 'Muestra una raya (sí) a la derecha para las obras que has marcado como favoritas.',
  197.             options: ['yes', 'no'],
  198.             default_value: 'yes',
  199.         },
  200.         {
  201.             name: 'highlight_new',
  202.             label: 'Resaltar nuevos',
  203.             description: 'Muestra una fina franja de color a la izquierda de la descripción para las obras que ve por primera vez. Sólo se muestra en las listas.',
  204.             options: ['yes', 'no'],
  205.             default_value: 'yes',
  206.         },
  207.         {
  208.             name: 'autoseen',
  209.             label: 'Marcar como "visto" al abrir',
  210.             description: 'Marcar automáticamente como visto al abrir la página de trabajo.',
  211.             options: ['yes', 'no'],
  212.             default_value: 'no',
  213.         },
  214.     ];
  215.  
  216.     if (typeof (Storage) !== 'undefined') {
  217.  
  218.         saved_settings = JSON.parse(localStorage.getItem('kudoshistory_settings')) || {};
  219.  
  220.         kudos_history = {
  221.             kudosed: Object.create(KHList).init('kudosed'),
  222.             checked: Object.create(KHList).init('checked'),
  223.             seen: Object.create(KHList).init('seen', 2000000),
  224.             bookmarked: Object.create(KHList).init('bookmarked'),
  225.             skipped: Object.create(KHList).init('skipped'),
  226.  
  227.             username: localStorage.getItem('kudoshistory_username'),
  228.  
  229.             saveLists: function () {
  230.                 DEBUG && console.log('saving lists');
  231.                 this.kudosed.save();
  232.                 this.checked.save();
  233.                 this.seen.save();
  234.                 this.bookmarked.save();
  235.                 this.skipped.save();
  236.             },
  237.         };
  238.  
  239.         settings_list.forEach(function (setting) {
  240.             kudos_history[setting.name] = Object.create(KHSetting).init(setting);
  241.         });
  242.  
  243.         var userlink = $('#greeting li.dropdown > a[href^="/users/"]');
  244.  
  245.         if (!kudos_history.username) { localStorage.setItem('kudoshistory_lastver', current_version); }
  246.  
  247.         // if logged in
  248.         if (userlink.length) {
  249.             var found_username = userlink.attr('href').split('/')[2];
  250.             DEBUG && console.log('found username: ' + found_username);
  251.  
  252.             if (kudos_history.username !== found_username) {
  253.                 kudos_history.username = found_username;
  254.                 localStorage.setItem('kudoshistory_username', kudos_history.username);
  255.             }
  256.         }
  257.         // if not logged in, but remembers username
  258.         else if (!!kudos_history.username) {
  259.             DEBUG && console.log("didn't find username on page, saved username: " + kudos_history.username);
  260.         }
  261.         else {
  262.             kudos_history.username = prompt('AO3: Kudosed and seen history\n\nYour AO3 username:');
  263.             localStorage.setItem('kudoshistory_username', kudos_history.username);
  264.         }
  265.  
  266.         $(document).ajaxStop(function () {
  267.             kudos_history.saveLists();
  268.         });
  269.  
  270.         // add css rules for kudosed works
  271.         addCss();
  272.  
  273.         var works_and_bookmarks = $('li.work.blurb, li.bookmark.blurb');
  274.  
  275.         // if there's a list of works or bookmarks
  276.         if (works_and_bookmarks.length) {
  277.             addSeenMenu();
  278.  
  279.             var blurb_index = $('.index');
  280.  
  281.             // click on header to collapse/expand
  282.             blurb_index.on('click', '.header', function (e) {
  283.                 if (!$(e.target).is('a') && !$(e.target).is('span')) {
  284.                     $(this).closest('.blurb').toggleClass('collapsed-blurb');
  285.                     e.stopPropagation();
  286.                 }
  287.             });
  288.  
  289.             // toggle seen/skipped
  290.             blurb_index.on('click', '.kh-toggle', function (e) {
  291.                 changeBlurbStatus($(this).closest('.blurb'), $(this).data('list'), true);
  292.                 e.stopPropagation();
  293.             });
  294.  
  295.             // click on delete bookmark
  296.             blurb_index.on('click', '.own.user a[data-method="delete"]', function () {
  297.                 var work_id = $(this).closest('.blurb').data('work_id');
  298.  
  299.                 if (work_id) {
  300.                     kudos_history.bookmarked.reload().remove(work_id).save();
  301.                 }
  302.             });
  303.  
  304.             // for each work and bookmark blurb
  305.             works_and_bookmarks.not('.deleted').each(function () {
  306.                 blurbCheck($(this));
  307.             });
  308.         }
  309.  
  310.         // if it's the first time after an update
  311.         addNotice();
  312.  
  313.         // if it's a work page
  314.         if ($('#workskin').length) {
  315.  
  316.             var work_meta = $('dl.work.meta.group');
  317.  
  318.             // get work id
  319.             var work_id = $('#kudo_commentable_id').val();
  320.             DEBUG && console.log('work_id ' + work_id);
  321.  
  322.             if (kudos_history.autoseen.check()) {
  323.                 kudos_history.seen.add(work_id);
  324.             }
  325.  
  326.             // check if work id is on the seen list
  327.             var is_seen = kudos_history.seen.hasId(work_id);
  328.  
  329.             if (is_seen) {
  330.                 work_meta.addClass('marked-seen');
  331.             }
  332.  
  333.             addSeenButtons();
  334.  
  335.             // if work id is on the kudosed list
  336.             if (kudos_history.kudosed.hasId(work_id)) {
  337.                 work_meta.addClass('has-kudos');
  338.                 DEBUG && console.log('- on kudosed list');
  339.             }
  340.             else {
  341.                 // check if there are kudos from the user
  342.                 var user_kudos = $('#kudos').find('[href="/users/' + kudos_history.username + '"]');
  343.  
  344.                 if (user_kudos.length) {
  345.                     // highlight blurb and add work id to kudosed list
  346.                     kudos_history.kudosed.add(work_id);
  347.                     kudos_history.checked.remove(work_id);
  348.                     work_meta.addClass('has-kudos');
  349.                 }
  350.                 else {
  351.                     // add work id to checked list
  352.                     kudos_history.checked.add(work_id);
  353.  
  354.                     $('#new_kudo').one('click', function () {
  355.                         kudos_history.kudosed.reload().add(work_id).save();
  356.                         kudos_history.checked.reload().remove(work_id).save();
  357.                         work_meta.addClass('has-kudos');
  358.                     });
  359.                 }
  360.             }
  361.  
  362.             // check if it's bookmarked
  363.             var bookmark_button_text = $('a.bookmark_form_placement_open').filter(':first').text();
  364.  
  365.             if (bookmark_button_text.indexOf('Edit') > -1) {
  366.                 // highlight blurb
  367.                 kudos_history.bookmarked.add(work_id);
  368.                 work_meta.addClass('is-bookmarked');
  369.             }
  370.             else {
  371.                 kudos_history.bookmarked.remove(work_id);
  372.             }
  373.         }
  374.  
  375.         // save all lists
  376.         kudos_history.saveLists();
  377.     }
  378.  
  379.     // check if work is on lists
  380.     function blurbCheck(blurb) {
  381.  
  382.         var work_id;
  383.         var blurb_id = blurb.attr('id');
  384.  
  385.         if (blurb.hasClass('work')) {
  386.             work_id = blurb_id.replace('work_', '');
  387.         }
  388.         else if (blurb.hasClass('bookmark')) {
  389.             var work_link = blurb.find('h4 a:first').attr('href');
  390.  
  391.             // if it's not a deleted work and not a series or external bookmark
  392.             if (!!work_link && work_link.indexOf('series') === -1 && work_link.indexOf('external_work') === -1) {
  393.                 work_id = work_link.split('/').pop();
  394.  
  395.                 // if it's your own bookmark
  396.                 var own_bookmark = blurb.find('div.own.user.module.group');
  397.                 if (own_bookmark.length) {
  398.                     kudos_history.bookmarked.add(work_id);
  399.                 }
  400.             }
  401.         }
  402.  
  403.         blurb.data('work_id', work_id);
  404.  
  405.         DEBUG && console.log('blurb check ' + blurb_id + ', work_id: ' + work_id);
  406.  
  407.         if (!work_id) {
  408.             return false;
  409.         }
  410.  
  411.         var found_on_list = false;
  412.         var blurb_classes = 'blurb-with-toggles';
  413.         blurb.prepend('<div class="kh-toggles">marcar/desmarcar como: <a class="kh-toggle" data-list="seen">visto</a> &bull; <a class="kh-toggle" data-list="skipped">omitido</a>');
  414.  
  415.         // if work id is on the kudosed list
  416.         if (kudos_history.kudosed.hasId(work_id)) {
  417.             DEBUG && console.log('- is kudosed');
  418.             blurb_classes += ' has-kudos collapsed-blurb';
  419.             found_on_list = true;
  420.         }
  421.  
  422.         // if work id is on the seen list
  423.         if (kudos_history.seen.hasId(work_id)) {
  424.             DEBUG && console.log('- is seen');
  425.             blurb_classes += ' marked-seen collapsed-blurb';
  426.             found_on_list = true;
  427.         }
  428.  
  429.         // not on the kudosed/seen list
  430.         if (!found_on_list) {
  431.  
  432.             // if work id is on the checked list
  433.             if (kudos_history.checked.hasId(work_id)) {
  434.                 DEBUG && console.log('- is checked');
  435.             }
  436.             else {
  437.                 blurb_classes += ' new-blurb';
  438.                 loadKudos(blurb);
  439.             }
  440.         }
  441.  
  442.         // if work id is on the bookmarked list
  443.         if (kudos_history.bookmarked.hasId(work_id)) {
  444.             DEBUG && console.log('- is bookmarked');
  445.             blurb_classes += ' is-bookmarked';
  446.         }
  447.  
  448.         // if work id is on the skipped list
  449.         if (kudos_history.skipped.hasId(work_id)) {
  450.             DEBUG && console.log('- is skipped');
  451.             blurb_classes += ' skipped-work collapsed-blurb';
  452.         }
  453.  
  454.         blurb.addClass(blurb_classes);
  455.     }
  456.  
  457.     // load kudos for blurb
  458.     function loadKudos(blurb) {
  459.  
  460.         var work_id = blurb.data('work_id');
  461.  
  462.         if (!work_id) {
  463.             return false;
  464.         }
  465.  
  466.         DEBUG && console.log('- loading kudos for ' + work_id);
  467.  
  468.         // add a div to the blurb that will house the kudos
  469.         var kudos_container = $('<div style="display: none;"></div>');
  470.         blurb.append(kudos_container);
  471.  
  472.         // retrieve a list of kudos from the work
  473.         var work_url = window.location.protocol + '//' + window.location.hostname + '/works/' + work_id + '/kudos #kudos';
  474.         kudos_container.load(work_url, function () {
  475.             // check if there are kudos from the user
  476.             var user_kudos = kudos_container.find('[href="/users/' + kudos_history.username + '"]');
  477.  
  478.             if (user_kudos.length) {
  479.                 // highlight blurb and add work id to kudosed list
  480.                 blurb.addClass('has-kudos collapsed-blurb');
  481.                 kudos_history.kudosed.add(work_id);
  482.             }
  483.             else {
  484.                 // add work id to checked list
  485.                 kudos_history.checked.add(work_id);
  486.             }
  487.         });
  488.     }
  489.  
  490.     // mark all works on the page as seen
  491.     function markPageSeen() {
  492.  
  493.         kudos_history.seen.reload();
  494.  
  495.         // for each blurb
  496.         works_and_bookmarks.not('.marked-seen').not('.has-kudos').not('.deleted').each(function () {
  497.             changeBlurbStatus($(this), 'seen', false, true);
  498.         });
  499.  
  500.         kudos_history.seen.save();
  501.     }
  502.  
  503.     // mark all works on the page as unseen
  504.     function markPageUnseen() {
  505.  
  506.         kudos_history.seen.reload();
  507.  
  508.         // for each blurb
  509.         works_and_bookmarks.not('.deleted').each(function () {
  510.             changeBlurbStatus($(this), 'seen', false, false);
  511.         });
  512.  
  513.         kudos_history.seen.save();
  514.     }
  515.  
  516.     // mark/unmark blurb as X
  517.     function changeBlurbStatus(blurb, list, save_list, add_to_list) {
  518.  
  519.         var work_id = blurb.data('work_id');
  520.  
  521.         if (work_id) {
  522.  
  523.             save_list && kudos_history[list].reload();
  524.  
  525.             var blurb_class = {
  526.                 seen: 'marked-seen',
  527.                 skipped: 'skipped-work'
  528.             };
  529.  
  530.             if (add_to_list == undefined) {
  531.                 add_to_list = !kudos_history[list].hasId(work_id);
  532.             }
  533.  
  534.             if (add_to_list) {
  535.                 DEBUG && console.log('marking as ' + list + ' ' + work_id);
  536.                 kudos_history[list].add(work_id);
  537.                 blurb.addClass(blurb_class[list] + ' collapsed-blurb');
  538.             }
  539.             else {
  540.                 DEBUG && console.log('unmarking as ' + list + ' ' + work_id);
  541.                 kudos_history[list].remove(work_id);
  542.                 blurb.removeClass(blurb_class[list]);
  543.             }
  544.  
  545.             save_list && kudos_history[list].save();
  546.         }
  547.     }
  548.  
  549.     // re-check the page for kudos
  550.     function recheckKudos() {
  551.  
  552.         kudos_history.kudosed.reload();
  553.         kudos_history.checked.reload();
  554.  
  555.         // for each non-kudosed blurb
  556.         works_and_bookmarks.not('.has-kudos').not('.deleted').each(function () {
  557.             loadKudos($(this));
  558.         });
  559.     }
  560.  
  561.     // check the page for bookmarks
  562.     function checkForBookmarks() {
  563.  
  564.         kudos_history.bookmarked.reload();
  565.  
  566.         // for each work and bookmark blurb
  567.         works_and_bookmarks.not('.deleted').each(function () {
  568.  
  569.             var blurb = $(this);
  570.             var work_id = blurb.data('work_id');
  571.  
  572.             if (!work_id) {
  573.                 return false;
  574.             }
  575.  
  576.             DEBUG && console.log('- loading bookmark buttons for ' + work_id);
  577.  
  578.             // add a div to the blurb that will house the kudos
  579.             var bookmark_container = $('<div style="display: none;"></div>');
  580.             blurb.append(bookmark_container);
  581.  
  582.             // retrieve the bookmark button from the work
  583.             var work_url = window.location.protocol + '//' + window.location.hostname + '/works/' + work_id + ' a.bookmark_form_placement_open:first';
  584.             bookmark_container.load(work_url, function () {
  585.                 // check if there is a bookmark from the user
  586.                 var bookmark_button_text = bookmark_container.find('a').text();
  587.  
  588.                 if (bookmark_button_text.indexOf('Edit') > -1) {
  589.                     // highlight blurb
  590.                     blurb.addClass('is-bookmarked');
  591.                     kudos_history.bookmarked.add(work_id);
  592.                 }
  593.                 else {
  594.                     blurb.removeClass('is-bookmarked');
  595.                     kudos_history.bookmarked.remove(work_id);
  596.                 }
  597.             });
  598.         });
  599.     }
  600.  
  601.     // show the box with import/export options
  602.     function importExport() {
  603.  
  604.         var importexport_bg = $('<div id="importexport-bg"></div>');
  605.  
  606.         var importexport_box = $('<div id="importexport-box"></div>');
  607.  
  608.         var box_button_save = $('<input type="button" id="importexport-button-save" value="Import lists" />');
  609.         box_button_save.click(function () {
  610.  
  611.             var confirmed = confirm('Sure you want to replace your saved lists?');
  612.  
  613.             if (confirmed) {
  614.                 var import_lists = JSON.parse($('#import-seen-list').val());
  615.  
  616.                 for (var list_name in import_lists) {
  617.                     if (kudos_history[list_name]) {
  618.                         kudos_history[list_name].list = import_lists[list_name];
  619.                         kudos_history[list_name].save();
  620.                     }
  621.                 }
  622.  
  623.                 $('#importexport-save').prepend('Lists imported! ');
  624.             }
  625.         });
  626.  
  627.         var box_button_close = $('<input type="button" id="importexport-button-close" value="Close" />');
  628.  
  629.         var export_lists = {
  630.             kudosed: kudos_history.kudosed.reload().list,
  631.             seen: kudos_history.seen.reload().list,
  632.             bookmarked: kudos_history.bookmarked.reload().list,
  633.             skipped: kudos_history.skipped.reload().list,
  634.             checked: kudos_history.checked.reload().list,
  635.         };
  636.  
  637.         importexport_box.append(
  638.             $('<p class="actions"></p>').append(box_button_close),
  639.             $('<h3></h3>').text('Settings'),
  640.         );
  641.  
  642.         settings_list.forEach(function (setting) {
  643.             importexport_box.append(kudos_history[setting.name].getSettingRow());
  644.         });
  645.  
  646.         importexport_box.append(
  647.             $('<h3 style="margin-top: 1.5em;"></h3>').text('Exportar tus listas'),
  648.             $('<p></p>').text('Copia tus listas actuales (kudos, vistas, bookmarked, omitidas) del campo de abajo y guárdalas donde quieras como copia de seguridad.'),
  649.             $('<input type="text" id="export-seen-list" />').val(JSON.stringify(export_lists)),
  650.             $('<h3 style="margin-top: 1.5em;"></h3>').text('Importar tus listas'),
  651.             $('<p></p>').html('Pon tus listas guardadas en el campo de abajo y selecciona el botón "Importar listas". <b>Advertencia:</b> <u>reemplazará</u> tus listas actuales.'),
  652.             $('<input type="text" id="import-seen-list" />'),
  653.             $('<p class="actions" id="importexport-save"></p>').append(box_button_save),
  654.         );
  655.  
  656.         $('body').append(importexport_bg);
  657.         main.append(importexport_box);
  658.  
  659.         box_button_close.add(importexport_bg).click(function () {
  660.             importexport_box.detach();
  661.             importexport_bg.detach();
  662.         });
  663.     }
  664.  
  665.     // add the seen/unseen buttons
  666.     function addSeenButtons() {
  667.  
  668.         seen_buttons = {
  669.             is_seen: is_seen,
  670.             buttons_links: [],
  671.  
  672.             change: function () {
  673.                 DEBUG && console.log(this);
  674.                 this.is_seen = !this.is_seen;
  675.                 kudos_history.seen.reload();
  676.  
  677.                 if (this.is_seen) {
  678.                     kudos_history.seen.add(work_id);
  679.                     work_meta.addClass('marked-seen');
  680.                 }
  681.                 else {
  682.                     kudos_history.seen.remove(work_id);
  683.                     work_meta.removeClass('marked-seen');
  684.                 }
  685.  
  686.                 kudos_history.seen.save();
  687.                 this.updateButtons();
  688.                 DEBUG && console.log(this);
  689.             },
  690.             getButton: function () {
  691.                 var button_link = $('<a></a>').html(this.is_seen ? 'Unseen &cross;' : 'Seen &check;');
  692.                 var button = $('<li class="kh-seen-button"></li>').append(button_link);
  693.                 var this_setting = this;
  694.                 button.click(function () {
  695.                     this_setting.change();
  696.                 });
  697.                 this.buttons_links.push(button_link);
  698.                 return button;
  699.             },
  700.             updateButtons: function () {
  701.                 for (var i = 0; i < this.buttons_links.length; i++) {
  702.                     this.buttons_links[i].html(this.is_seen ? 'Unseen &cross;' : 'Seen &check;');
  703.                 }
  704.             },
  705.         };
  706.  
  707.         $('li.bookmark').after(seen_buttons.getButton());
  708.         $('#new_kudo').parent().after(seen_buttons.getButton());
  709.     }
  710.  
  711.     // attach the menu
  712.     function addSeenMenu() {
  713.  
  714.         // create a button for the menu
  715.         function getMenuButton(button_text, on_click) {
  716.             var button = $('<li><a>' + button_text + '</a></li>');
  717.             if (on_click) {
  718.                 button.click(on_click);
  719.                 button.addClass('kh-menu-setting');
  720.             }
  721.             else {
  722.                 button.addClass('kh-menu-header');
  723.             }
  724.             return button;
  725.         }
  726.  
  727.         // get the header menu
  728.         var header_menu = $('ul.primary.navigation.actions');
  729.  
  730.         // create menu button
  731.         var seen_menu = $('<li class="dropdown"></li>').html('<a>Obras vistas</a>');
  732.  
  733.         // create dropdown menu
  734.         var drop_menu = $('<ul class="menu dropdown-menu"></li>');
  735.  
  736.         // append buttons to the dropdown menu
  737.         drop_menu.append(
  738.             getMenuButton('Configuración e importar/exportar', importExport),
  739.             getMenuButton('&mdash; Para todas las obras de esta página: &mdash;'),
  740.             getMenuButton('Marcar como vistas', markPageSeen),
  741.             getMenuButton('Desmarcar como vistas', markPageUnseen),
  742.             getMenuButton('Checar por kudos', recheckKudos),
  743.             getMenuButton('Checar por bookmarks', checkForBookmarks),
  744.             getMenuButton('&mdash; Configuración (click para cambiar): &mdash;'),
  745.         );
  746.  
  747.         settings_list.forEach(function (setting) {
  748.             drop_menu.append(kudos_history[setting.name].getButton());
  749.         });
  750.  
  751.         seen_menu.append(drop_menu);
  752.         header_menu.find('li.search').before(seen_menu);
  753.     }
  754.  
  755.     // add a notice about an update
  756.     function addNotice() {
  757.  
  758.         var last_version = localStorage.getItem('kudoshistory_lastver') || current_version;
  759.  
  760.         if (last_version < current_version) {
  761.  
  762.             var update_2_2 = "<h3>version 2.2</h3>\
  763.                <p><b>&bull; Separate settings for kudosed and seen works.</b> Now you can hide/collapse one but not the other if you want.</p>\
  764.                <p><b>&bull; Smaller icons on a collapsed blurb.</b> Saving us some screen space.</p>";
  765.  
  766.             var update_notice = $('<div id="kudoshistory-update" class="notice"></div>');
  767.  
  768.             update_notice.append("<h3><b>Kudosed and seen history userscript updated!</b></h3>", update_2_2, "<p style='text-align: right;'><b><a id='kudoshistory-hide-update'>Don't show this again</a></b></p>");
  769.  
  770.             main.prepend(update_notice);
  771.  
  772.             $('#kudoshistory-hide-update').click(function () {
  773.                 localStorage.setItem('kudoshistory_lastver', current_version);
  774.                 update_notice.detach();
  775.             });
  776.         }
  777.     }
  778.  
  779.     // add css rules to page head
  780.     function addCss() {
  781.         var css = '.has-kudos.marked-seen,.has-kudos{background:url("https://i.imgur.com/jK7d4jh.png") left no-repeat,url("https://i.imgur.com/ESdBCSX.png") left repeat-y !important;padding-left:50px !important}@media screen and (max-width: 42em){.has-kudos.marked-seen,.has-kudos{background-size:20px !important;padding-left:30px !important}}.marked-seen{background:url("https://i.imgur.com/ESdBCSX.png") left repeat-y !important;padding-left:50px !important}@media screen and (max-width: 42em){.marked-seen{background-size:20px !important;padding-left:30px !important}}.kh-highlight-bookmarked-yes .is-bookmarked,dl.is-bookmarked{background:url("https://i.imgur.com/qol1mWZ.png") right repeat-y !important;padding-right:50px !important}@media screen and (max-width: 42em){.kh-highlight-bookmarked-yes .is-bookmarked,dl.is-bookmarked{background-size:20px !important;padding-right:30px !important}}.kh-highlight-bookmarked-yes .is-bookmarked.has-kudos,dl.is-bookmarked.has-kudos,.kh-highlight-bookmarked-yes .is-bookmarked.has-kudos.marked-seen,dl.is-bookmarked.has-kudos.marked-seen{background:url("https://i.imgur.com/jK7d4jh.png") left no-repeat,url("https://i.imgur.com/ESdBCSX.png") left repeat-y,url("https://i.imgur.com/qol1mWZ.png") right repeat-y !important}@media screen and (max-width: 42em){.kh-highlight-bookmarked-yes .is-bookmarked.has-kudos,dl.is-bookmarked.has-kudos,.kh-highlight-bookmarked-yes .is-bookmarked.has-kudos.marked-seen,dl.is-bookmarked.has-kudos.marked-seen{background-size:20px !important}}.kh-highlight-bookmarked-yes .is-bookmarked.marked-seen,dl.is-bookmarked.marked-seen{background:url("https://i.imgur.com/ESdBCSX.png") left repeat-y,url("https://i.imgur.com/qol1mWZ.png") right repeat-y !important}@media screen and (max-width: 42em){.kh-highlight-bookmarked-yes .is-bookmarked.marked-seen,dl.is-bookmarked.marked-seen{background-size:20px !important}}#kudoshistory-update a,.kh-menu-setting a,.kh-seen-button a{cursor:pointer}.kh-menu-header a{padding:.5em .5em .25em !important;text-align:center;font-weight:bold}#kudoshistory-update{padding:.5em 1em 1em 1em}#kudoshistory-update img{max-width:300px;height:auto}#importexport-box{position:fixed;top:0px;bottom:0px;left:0px;right:0px;width:60%;height:80%;max-width:800px;margin:auto;overflow-y:auto;border:10px solid #eee;box-shadow:0px 0px 8px 0px rgba(0,0,0,.2);padding:0 20px;background-color:#fff;z-index:999}#importexport-box input[type=button]{height:auto;cursor:pointer}#importexport-box p.actions{float:none;text-align:right}#importexport-box .kh-setting-row{line-height:1.6em}#importexport-box .kh-setting-label{display:inline-block;min-width:13.5em}@media screen and (max-width: 42em){#importexport-box .kh-setting-label{display:block;min-width:auto}}#importexport-box .kh-setting-label .kh-setting-info-button{font-size:.8em;cursor:pointer}#importexport-box .kh-setting-option{padding:0 3px;border-radius:4px;border:0;color:#111;background:#eee;cursor:pointer}#importexport-box .kh-setting-option.kh-setting-option-selected{color:#fff;background:#900}#importexport-box .kh-setting-separator:last-child{display:none}#importexport-box .kh-setting-info{position:relative;border:1px solid;padding:1px 5px}#importexport-box .kh-setting-info:before{content:" ";position:absolute;top:-12px;border:6px solid transparent;border-bottom-color:initial}#importexport-bg{position:fixed;width:100%;height:100%;background-color:#000;opacity:.7;z-index:998}.kh-toggles{display:none;position:absolute;top:-22px;font-size:10px;line-height:10px;right:-1px;background:#fff;border:1px solid #ddd;padding:5px}.kh-toggles a{cursor:pointer}.kh-reversi #importexport-box{background-color:#333;border-color:#222}.kh-reversi #importexport-box .kh-setting-option-selected{background:#5998d6}.kh-reversi .kh-toggles{background:#333;border-color:#555}.kh-hide-element{display:none}.kh-highlight-bookmarked-yes .bookmark.is-bookmarked p.status{padding-right:40px}@media screen and (max-width: 42em){.kh-highlight-bookmarked-yes .bookmark.is-bookmarked p.status{padding-right:20px}}.kh-skipped-display-collapse .collapsed-blurb.skipped-work h6.landmark.heading,.kh-seen-display-collapse .collapsed-blurb.marked-seen h6.landmark.heading,.kh-kudosed-display-collapse .collapsed-blurb.has-kudos h6.landmark.heading,.kh-skipped-display-collapse .collapsed-blurb.skipped-work>ul,.kh-seen-display-collapse .collapsed-blurb.marked-seen>ul,.kh-kudosed-display-collapse .collapsed-blurb.has-kudos>ul,.kh-skipped-display-collapse .collapsed-blurb.skipped-work blockquote.userstuff.summary,.kh-seen-display-collapse .collapsed-blurb.marked-seen blockquote.userstuff.summary,.kh-kudosed-display-collapse .collapsed-blurb.has-kudos blockquote.userstuff.summary,.kh-skipped-display-collapse .collapsed-blurb.skipped-work dl.stats,.kh-seen-display-collapse .collapsed-blurb.marked-seen dl.stats,.kh-kudosed-display-collapse .collapsed-blurb.has-kudos dl.stats,.kh-skipped-display-collapse .collapsed-blurb.skipped-work .header .fandoms.heading,.kh-seen-display-collapse .collapsed-blurb.marked-seen .header .fandoms.heading,.kh-kudosed-display-collapse .collapsed-blurb.has-kudos .header .fandoms.heading{display:none !important}.kh-skipped-display-collapse .collapsed-blurb.skipped-work .required-tags,.kh-seen-display-collapse .collapsed-blurb.marked-seen .required-tags,.kh-kudosed-display-collapse .collapsed-blurb.has-kudos .required-tags,.kh-skipped-display-collapse .collapsed-blurb.skipped-work .mystery .icon,.kh-seen-display-collapse .collapsed-blurb.marked-seen .mystery .icon,.kh-kudosed-display-collapse .collapsed-blurb.has-kudos .mystery .icon{opacity:.6;transform:scale(0.4);transform-origin:top left}.kh-skipped-display-collapse .collapsed-blurb.skipped-work .header,.kh-seen-display-collapse .collapsed-blurb.marked-seen .header,.kh-kudosed-display-collapse .collapsed-blurb.has-kudos .header{min-height:22px;cursor:zoom-in}.kh-skipped-display-collapse .collapsed-blurb.skipped-work .header .heading,.kh-seen-display-collapse .collapsed-blurb.marked-seen .header .heading,.kh-kudosed-display-collapse .collapsed-blurb.has-kudos .header .heading{margin-left:32px}.kh-skipped-display-collapse .skipped-work:not(.collapsed-blurb) .header,.kh-seen-display-collapse .marked-seen:not(.collapsed-blurb) .header,.kh-kudosed-display-collapse .has-kudos:not(.collapsed-blurb) .header{cursor:zoom-out}.kh-kudosed-display-hide:not(.bookmarks-show) li.has-kudos{display:none !important}.kh-seen-display-hide:not(.bookmarks-show) li.marked-seen{display:none !important}.kh-skipped-display-hide .skipped-work{display:none}.kh-skipped-display-placeholder .skipped-work>*{display:none}.kh-skipped-display-placeholder .skipped-work:before{content:"Skipped"}.kh-highlight-new-yes li.new-blurb{border-left:5px solid #900}.kh-highlight-new-yes.kh-reversi#main li.new-blurb{border-left-color:#5998d6}.kh-toggles-display-on-hover li.blurb-with-toggles:hover>.kh-toggles{display:block}.kh-toggles-display-show li.blurb-with-toggles{margin-top:31px}.kh-toggles-display-show li.blurb-with-toggles .kh-toggles{display:block}';
  782.  
  783.         var style = $('<style type="text/css"></style>').appendTo($('head'));
  784.         style.html(css);
  785.  
  786.         addMainClass();
  787.     }
  788.  
  789.     function addMainClass(update) {
  790.  
  791.         var classes_to_remove = [];
  792.         var classes_to_add = [];
  793.  
  794.         settings_list.forEach(function (setting) {
  795.             var setting_class_name = setting.name.replace('_', '-');
  796.             classes_to_add.push('kh-' + setting_class_name + '-' + kudos_history[setting.name].current.replace(' ', '-'));
  797.  
  798.             if (update) {
  799.                 setting.options.forEach(function (option) {
  800.                     classes_to_remove.push('kh-' + setting_class_name + '-' + option.replace(' ', '-'));
  801.                 });
  802.             }
  803.         });
  804.  
  805.         if (update) {
  806.             main.removeClass(classes_to_remove.join(' '));
  807.         }
  808.  
  809.         main.addClass(classes_to_add.join(' '));
  810.     }
  811. })(jQuery);
  812.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement