Advertisement
Guest User

Better Links 2ch 1.1

a guest
Jun 19th, 2014
286
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. // ==UserScript==
  2. // @name         Better Links 2ch
  3. // @namespace    http://akr.tw/
  4. // @description  Fixes the links on 2ch.net BBS. Displays anchor content directly.
  5. // @author       akiratw
  6. // @version      1.1
  7. // @license      MIT License
  8. // @include      http://*.2ch.net/*
  9. // @include      http://*.bbspink.com/*
  10. // @include      http://*.open2ch.net/*
  11. // ==/UserScript==
  12.  
  13. var init = function (doc) {
  14.     doc = doc || document;
  15.  
  16.     fixLinks(doc).fix();
  17.     displayAnchor(doc).init();
  18. };
  19.  
  20. var fixLinks = function (doc) {
  21.     var self = {};
  22.  
  23.     self.completeLinks = function () {
  24.         var responses = doc.querySelectorAll('dl.thread dd'),
  25.             regex = /(?:[^h])(ttps?:\/\/[\x21-\x7E]+)/ig,
  26.             replace = '<a href="h$1">h$1</a>';
  27.  
  28.         dom(responses).each(function (response) {
  29.             response.innerHTML = response.innerHTML.replace(regex, replace);
  30.         });
  31.     };
  32.  
  33.     self.skipLinkRedirect = function () {
  34.         var links = doc.querySelectorAll('dl.thread dd a'),
  35.             regex = /((www\d?\.|)ime\.(nu|st)\/|pinktower\.com\/|jump\.2ch\.net\/\?)/,
  36.             replace = '';
  37.  
  38.         dom(links).each(function (link) {
  39.             link.setAttribute('href', link.href.replace(regex, replace));
  40.         });
  41.     };
  42.  
  43.     return {
  44.         fix: function () {
  45.             self.completeLinks();
  46.             self.skipLinkRedirect();
  47.         }
  48.     };
  49. };
  50.  
  51. var displayAnchor = function (doc) {
  52.     var self = {};
  53.  
  54.     self.bindEvents = function () {
  55.         var links = doc.querySelectorAll('dl.thread dd a'),
  56.             regex = /^&gt;&gt;\d+$/;
  57.  
  58.         dom(links).each(function (link) {
  59.             if (!regex.test(link.innerHTML)) return;
  60.             link.addEventListener('click', self.toggleAnchor, false);
  61.         });
  62.     };
  63.  
  64.     self.toggleAnchor = function (event) {
  65.         event.preventDefault();
  66.  
  67.         var link = event.target,
  68.             href = link.getAttribute('href'),
  69.             anchor = link.nextSibling;
  70.  
  71.         if (anchor.tagName === 'DIV' && anchor.getAttribute('class').indexOf('bl2ch_anchor') > -1) {
  72.             dom(anchor).toggle();
  73.             return;
  74.         }
  75.  
  76.         anchor = document.createElement('div');
  77.         anchor.setAttribute('class', 'bl2ch_anchor');
  78.         anchor.innerHTML = '<strong>Loading...</strong>';
  79.  
  80.         link.parentNode.insertBefore(anchor, link.nextSibling);
  81.  
  82.         dom(anchor)
  83.             .addStyle({
  84.                 padding: '5px 5px 0 5px',
  85.                 borderLeft: '5px solid #CCC',
  86.                 color: '#666',
  87.                 fontSize: '13px'
  88.             })
  89.             .ajaxLoad(href, 'dl.thread', function() { init(anchor); });
  90.     };
  91.  
  92.     return {
  93.         init: function () {
  94.             self.bindEvents();
  95.         }
  96.     };
  97. };
  98.  
  99. var dom = function (dom) {
  100.     return {
  101.         each: function (func, index) {
  102.             for (var i = dom.length - 1; i >= 0; i--) {
  103.                 func(dom[i], i);
  104.             }
  105.             return this;
  106.         },
  107.         toggle: function () {
  108.             if (dom.style.display === 'none') {
  109.                 dom.style.display = 'block';
  110.             } else {
  111.                 dom.style.display = 'none';
  112.             }
  113.             return this;
  114.         },
  115.         addStyle: function(styleArray) {
  116.             for (var prop in styleArray) {
  117.                 dom.style[prop] = styleArray[prop];
  118.             }
  119.             return this;
  120.         },
  121.         ajaxLoad: function (url, selector, callback) {
  122.             var xhr = new XMLHttpRequest();
  123.             var charset = document.charset || document.characterSet;
  124.  
  125.             xhr.onreadystatechange = function () {
  126.                 if (xhr.readyState !== 4 || xhr.status !== 200) return;
  127.  
  128.                 var wrapper = document.createElement('div');
  129.                 wrapper.innerHTML = xhr.responseText.replace(/<script[^>]*>([\\S\\s]*?)<\/script>/img, '');
  130.                 dom.innerHTML = wrapper.querySelectorAll(selector)[0].outerHTML;
  131.  
  132.                 if (typeof callback === 'function') callback();
  133.             };
  134.  
  135.             xhr.open('GET', url, true);
  136.             xhr.overrideMimeType('text/html; charset=' + charset);
  137.             xhr.send();
  138.  
  139.             return this;
  140.         }
  141.     };
  142. };
  143.  
  144. init();
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement