Custom reddit top posts

Allows selecting a custom time interval for subreddit top posts

当前为 2016-06-02 提交的版本,查看 最新版本

  1. // ==UserScript==
  2. // @name Custom reddit top posts
  3. // @description Allows selecting a custom time interval for subreddit top posts
  4. // @namespace Jonas Högman
  5. // @include https://*.reddit.com/r/*/top/*
  6. // @include http://*.reddit.com/r/*/top/*
  7. // @require http://cdn.jsdelivr.net/jquery/2.1.3/jquery.min.js
  8. // @require https://cdnjs.cloudflare.com/ajax/libs/pickadate.js/3.5.6/compressed/picker.js
  9. // @require https://cdnjs.cloudflare.com/ajax/libs/pickadate.js/3.5.6/compressed/picker.date.js
  10. // @require https://cdnjs.cloudflare.com/ajax/libs/pickadate.js/3.5.6/compressed/picker.time.js
  11. // @version 1.07
  12. // @grant GM_addStyle
  13. // @grant GM_openInTab
  14. // @grant GM_xmlhttpRequest
  15. // ==/UserScript==
  16. GM_addStyle('.picker__footer,.picker__header,.picker__table{text-align:center}.picker__day--highlighted,.picker__select--month:focus,.picker__select--year:focus{border-color:#0089ec}.picker__box{padding:0 1em}.picker__header{position:relative;margin-top:.75em}.picker__month,.picker__year{font-weight:500;display:inline-block;margin-left:.25em;margin-right:.25em}.picker__year{color:#999;font-size:.8em;font-style:italic}.picker__select--month,.picker__select--year{border:1px solid #b7b7b7;height:2em;padding:.5em;margin-left:.25em;margin-right:.25em}.picker__select--month{width:35%}.picker__select--year{width:22.5%}.picker__nav--next,.picker__nav--prev{position:absolute;padding:.5em 1.25em;width:1em;height:1em;box-sizing:content-box;top:-.25em}.picker__nav--prev{left:-1em;padding-right:1.25em}.picker__nav--next{right:-1em;padding-left:1.25em}@media (min-width:24.5em){.picker__select--month,.picker__select--year{margin-top:-.5em}.picker__nav--next,.picker__nav--prev{top:-.33em}.picker__nav--prev{padding-right:1.5em}.picker__nav--next{padding-left:1.5em}}.picker__nav--next:before,.picker__nav--prev:before{content:" ";border-top:.5em solid transparent;border-bottom:.5em solid transparent;border-right:.75em solid #000;width:0;height:0;display:block;margin:0 auto}.picker__nav--next:before{border-right:0;border-left:.75em solid #000}.picker__nav--next:hover,.picker__nav--prev:hover{cursor:pointer;color:#000;background:#b1dcfb}.picker__nav--disabled,.picker__nav--disabled:before,.picker__nav--disabled:before:hover,.picker__nav--disabled:hover{cursor:default;background:0 0;border-right-color:#f5f5f5;border-left-color:#f5f5f5}.picker--focused .picker__day--highlighted,.picker__day--highlighted:hover,.picker__day--infocus:hover,.picker__day--outfocus:hover{color:#000;cursor:pointer;background:#b1dcfb}.picker__table{border-collapse:collapse;border-spacing:0;table-layout:fixed;font-size:inherit;width:100%;margin-top:.75em;margin-bottom:.5em}@media (min-height:33.875em){.picker__table{margin-bottom:.75em}}.picker__table td{margin:0;padding:0}.picker__weekday{width:14.285714286%;font-size:.75em;padding-bottom:.25em;color:#999;font-weight:500}@media (min-height:33.875em){.picker__weekday{padding-bottom:.5em}}.picker__day{padding:.3125em 0;font-weight:200;border:1px solid transparent}.picker__day--today{position:relative}.picker__day--today:before{content:" ";position:absolute;top:2px;right:2px;width:0;height:0;border-top:.5em solid #0059bc;border-left:.5em solid transparent}.picker__day--disabled:before{border-top-color:#aaa}.picker__day--outfocus{color:#ddd}.picker--focused .picker__day--selected,.picker__day--selected,.picker__day--selected:hover{background:#0089ec;color:#fff}.picker--focused .picker__day--disabled,.picker__day--disabled,.picker__day--disabled:hover{background:#f5f5f5;border-color:#f5f5f5;color:#ddd;cursor:default}.picker__day--highlighted.picker__day--disabled,.picker__day--highlighted.picker__day--disabled:hover{background:#bbb}.picker__button--clear,.picker__button--close,.picker__button--today{border:1px solid #fff;background:#fff;font-size:.8em;padding:.66em 0;font-weight:700;width:33%;display:inline-block;vertical-align:bottom}.picker__button--clear:hover,.picker__button--close:hover,.picker__button--today:hover{cursor:pointer;color:#000;background:#b1dcfb;border-bottom-color:#b1dcfb}.picker__button--clear:focus,.picker__button--close:focus,.picker__button--today:focus{background:#b1dcfb;border-color:#0089ec;outline:0}.picker__button--clear:before,.picker__button--close:before,.picker__button--today:before{position:relative;display:inline-block;height:0}.picker__button--clear:before,.picker__button--today:before{content:" ";margin-right:.45em}.picker__button--today:before{top:-.05em;width:0;border-top:.66em solid #0059bc;border-left:.66em solid transparent}.picker__button--clear:before{top:-.25em;width:.66em;border-top:3px solid #e20}.picker__button--close:before{content:"\D7";top:-.1em;vertical-align:top;font-size:1.1em;margin-right:.35em;color:#777}.picker__button--today[disabled],.picker__button--today[disabled]:hover{background:#f5f5f5;border-color:#f5f5f5;color:#ddd;cursor:default}.picker__button--today[disabled]:before{border-top-color:#aaa}');
  17. GM_addStyle('.picker{font-size:16px;text-align:left;line-height:1.2;color:#000;position:absolute;z-index:10000;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.picker__input{cursor:default}.picker__input.picker__input--active{border-color:#0089ec}.picker__holder{width:100%;overflow-y:auto;-webkit-overflow-scrolling:touch;position:fixed;transition:background .15s ease-out,-webkit-transform 0s .15s;transition:background .15s ease-out,transform 0s .15s;-webkit-backface-visibility:hidden} .picker__frame,.picker__holder{top:0;bottom:0;left:0;right:0;-webkit-transform:translateY(100%);-ms-transform:translateY(100%);transform:translateY(100%)}.picker__frame{position:absolute;margin:0 auto;min-width:256px;max-width:666px;width:100%;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";filter:alpha(opacity=0);-moz-opacity:0;opacity:0;transition:all .15s ease-out}.picker__wrap{display:table;width:100%;height:100%}@media (min-height:33.875em){.picker__frame{overflow:visible;top:auto;bottom:-100%;max-height:80%}.picker__wrap{display:block}}.picker__box{background:#fff;display:table-cell;vertical-align:middle}@media (min-height:26.5em){.picker__box{font-size:1.25em}}@media (min-height:33.875em){.picker__box{display:block;font-size:1.33em;border:1px solid #777;border-top-color:#898989;border-bottom-width:0;border-radius:5px 5px 0 0;box-shadow:0 12px 36px 16px rgba(0,0,0,.24)}}@media (min-height:40.125em){.picker__frame{margin-bottom:7.5%}.picker__box{font-size:1.5em;border-bottom-width:1px;border-radius:5px}}.picker--opened .picker__holder{-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0);zoom:1;background:rgba(0,0,0,.32);transition:background .15s ease-out}.picker--opened .picker__frame{-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0);-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)";filter:alpha(opacity=100);-moz-opacity:1;opacity:1}@media (min-height:33.875em){.picker--opened .picker__frame{top:auto;bottom:0}}');
  18.  
  19. $(".drop-choices").append('<form method="POST" action="https://www.reddit.com/r/leagueoflegends/top/"><input name="t" value="year" type="hidden"><a href="#" class="choice custom">custom</a>');
  20.  
  21.  
  22. $(document).ready(function() {
  23. $('.custom').click(function() {
  24. $('.calendar').slideToggle("fast");
  25. });
  26. });
  27.  
  28.  
  29. $(".menuarea").append('<div class="calendar" style="display: none;"><fieldset> <input type="text" id="input_from"> </fieldset> <fieldset> <input type="text" id="input_to"> </fieldset> <p id="myNumberSum">&nbsp;</p> <button id="gmAddNumsBtn" type="button">Search</button> <button id="gmCloseDlgBtn" type="button">Close</button> </div>');
  30.  
  31. //--- Use jQuery to activate the dialog buttons.
  32. $("#gmAddNumsBtn").click(function() {
  33. //Variable to check if button has been clicked, for autoloading detection
  34. $('.sitetable.linklisting').slideToggle('fast');
  35. $('.thing.link').not('.promoted').hide();
  36.  
  37.  
  38.  
  39. function replaceResults(link) {
  40. var ret = GM_xmlhttpRequest({
  41. method: "GET",
  42. url: link,
  43. onload: function(res) {
  44. var search_html = (res.responseText);
  45. parser = new DOMParser();
  46. //html_doc = parser.parseFromString(search_html, "text/html");
  47. html_doc = $.parseHTML(search_html);
  48. //search_elements = html_doc.getElementsByClassName('search-result search-result-link no-linkflair');
  49. search_elements = $('.search-result.search-result-link.no-linkflair', html_doc);
  50. //$('.thing.link').not('.promoted').each(function(i) {
  51. // $(this).replaceWith(search_elements[i]);
  52. //console.log(search_elements[i]);
  53. //});
  54. console.log(search_elements);
  55. search_elements.appendTo('.sitetable.linklisting');
  56. $('.sitetable.linklisting').slideToggle('fast');
  57. next_link = $(html_doc).find("a[rel*='next']").attr('href');
  58. $(".next").attr("href", next_link);
  59. console.log(next_link);
  60. return next_link;
  61. },
  62.  
  63. });
  64. }
  65.  
  66.  
  67.  
  68.  
  69. // Logs the contents of search result
  70. var next_link = replaceResults('https://www.reddit.com/r/' + window.location.href.split('/')[4] + '/search?sort=top&q=timestamp:' + from_picker.get('select').pick / 1000 + '..' + to_picker.get('select').pick / 1000 + '&syntax=cloudsearch&restrict_sr=on');
  71.  
  72. $(document).on('DOMNodeInserted', function(e) {
  73. if ($(e.target).hasClass('NERPageMarker')) {
  74. next_link = replaceResults(next_link)
  75.  
  76. }
  77.  
  78. });
  79.  
  80. });
  81.  
  82. //Detect new page being loaded with RES autoload
  83. //if (== true){
  84. //}
  85.  
  86. $("#gmCloseDlgBtn").click(function() {
  87. $(".calendar").slideToggle("fast");
  88. });
  89.  
  90.  
  91. var from_$input = $('#input_from').pickadate(),
  92. from_picker = from_$input.pickadate('picker');
  93.  
  94. var to_$input = $('#input_to').pickadate(),
  95. to_picker = to_$input.pickadate('picker');
  96.  
  97.  
  98. // Check if there’s a “from” or “to” date to start with.
  99. if (from_picker.get('value')) {
  100. to_picker.set('min', from_picker.get('select'));
  101. }
  102. if (to_picker.get('value')) {
  103. from_picker.set('max', to_picker.get('select'));
  104. }
  105.  
  106. // When something is selected, update the “from” and “to” limits.
  107. from_picker.on('set', function(event) {
  108. if (event.select) {
  109. to_picker.set('min', from_picker.get('select'));
  110. } else if ('clear' in event) {
  111. to_picker.set('min', false);
  112. }
  113. });
  114. to_picker.on('set', function(event) {
  115. if (event.select) {
  116. from_picker.set('max', to_picker.get('select'));
  117. } else if ('clear' in event) {
  118. from_picker.set('max', false);
  119. }
  120. });