Auto Readable

Auto readable on load.

  1. // ==UserScript==
  2. // @name Auto Readable
  3. // @description:en Auto readable on load.
  4. // @version 0.1
  5. // @namespace https://twitter.com/foldrr
  6. // @include http://*
  7. // @description Auto readable on load.
  8. // ==/UserScript==
  9. (function(){
  10. var d = document;
  11. var href = d.location.href;
  12. var body = d.getElementsByTagName('body')[0];
  13. // 設定
  14. var DEBUG = false;
  15. var includes = [
  16. "/blog.livedoor.jp/",
  17. "/blogs.yahoo.co.jp/",
  18. "/ameblo.jp/",
  19. "/gigazine.net/",
  20. ".fc2.com/"
  21. ];
  22. var MARGIN_LEFT = body.offsetWidth * 0.20;
  23. var MARGIN_RIGHT = body.offsetWidth * 0.25;
  24. var BODY_WIDTH = body.offsetWidth * 0.60;
  25. // 指定したサイト以外なら終了。
  26. for(var i = 0, n = includes.length; i < n; i++){
  27. if(0 <= href.indexOf(includes[i])){
  28. break;
  29. }
  30. }
  31. if(i == includes.length){
  32. return;
  33. }
  34. // String拡張: タグを削除する。
  35. String.prototype.stripTags = function(){
  36. return this.replace(/^.+?>/, "")
  37. .replace(/<\/.+/, "")
  38. .replace(/<!.+/, "");
  39. };
  40. // String拡張: 改行を削除する。
  41. String.prototype.chomp = function(){
  42. return this.replace(/(\r|\n)/, "");
  43. };
  44. // メイン処理
  45. (function(){
  46. // 本文への目印としてヘッダーを取得。
  47. var heads = [];
  48. pushHeaders(heads, "h3");
  49. pushHeaders(heads, "h2");
  50. pushHeaders(heads, "h1");
  51. // ページタイトルに似ているヘッダから本文を判別。
  52. var title = d.title;
  53. var target = null;
  54. for(var i = 0, n = heads.length; i < n; i++){
  55. var text = getText(heads[i]);
  56. p(text);
  57. if(10 < text.length){
  58. if(title.indexOf(text) !== -1){
  59. target = heads[i];
  60. break;
  61. }
  62. }
  63. }
  64. // 本文が見つかればページを編集。
  65. p("target = " + !!target);
  66. if(target){
  67. // スタイルを無効化。
  68. for(var i = 0, n = d.styleSheets.length; i < n; i++){
  69. d.styleSheets[i].disabled = true;
  70. }
  71. // ページ内容を生成。
  72. var parent = target.parentNode.parentNode;
  73. target.parentNode.style.width = BODY_WIDTH + "px";
  74. // 本文のタイトルを削除。
  75. target.parentNode.removeChild(target);
  76. // 本文のタイトルを再設定。
  77. var a = d.createElement("a");
  78. a.innerHTML = title;
  79. a.href = href;
  80. var t = d.createElement("h1");
  81. t.appendChild(a);
  82. parent.insertBefore(t, parent.childNodes[0]);
  83. // BODYを設定。
  84. body.style.marginLeft = MARGIN_LEFT + "px";
  85. body.style.marginRight = MARGIN_RIGHT + "px";
  86. body.innerHTML = parent.innerHTML;
  87. }
  88. })();
  89. // 指定したタグ名の要素を配列に加える。
  90. function pushHeaders(dst, tagName){
  91. var es = d.getElementsByTagName(tagName);
  92. for(var i = 0, n = es.length; i < n; i++){
  93. dst.push(es[i]);
  94. }
  95. }
  96. // ヘッダのテキストを取得する。
  97. function getText(x){
  98. return x.innerHTML.stripTags().chomp();
  99. }
  100. // デバッグプリント。
  101. function p(x){
  102. if(DEBUG){
  103. GM_log(x.toString());
  104. }
  105. }
  106. })();