UNPKG

4.04 kBJavaScriptView Raw
1/*! Corredor : Neo (@Neos21) http://neos21.hatenablog.com/ */
2(function(d, c, i, s) {
3 // Body 要素に任意のクラス名が存在するか確認する
4 var hasClass = function(className) {
5 return ~(s + d.body.className + s).replace(/[\n\t]/g, s).indexOf(s + className + s);
6 };
7
8 // 記事ごとにシェアリンクを追加する
9 var appendShareLinks = function(articlesClassName, destClassName) {
10 // テンプレートの ul 要素 #n-st (share-template) を取得する
11 var template = d[i]('n-st');
12 // 複製するので ID 属性を削除しておく
13 template.removeAttribute('id');
14
15 // 記事ごとにシェアリンクを複製して作っていく
16 [].forEach.call(d[c](articlesClassName), function(article) {
17 // 記事情報を取得する。記事タイトルのみ URL 用にエンコードしておく
18 var entryTitleLink = article[c]('entry-title-link')[0];
19 var title = encodeURIComponent(entryTitleLink.innerText);
20 var permalink = entryTitleLink.getAttribute('href');
21
22 // テンプレート (ul#n-st) を複製する
23 var clone = template.cloneNode(true);
24
25 // リンク属性を設定する関数 : a.n-s-xx-l は要素特定のためだけに使うクラス
26 var setLink = function(snsName, url) {
27 clone[c]('n-s-' + snsName + '-l')[0].setAttribute('href', url);
28 }
29
30 // はてブ用リンク:http://b.hatena.ne.jp/entry/{Permalink}
31 setLink('ha', 'http://b.hatena.ne.jp/entry/' + permalink);
32 // Twitter 用リンク:https://twitter.com/share?url={Permalink}&text={Title}
33 setLink('tw', 'https://twitter.com/share?url=' + permalink + '&text=' + title);
34 // Facebook 用リンク:http://www.facebook.com/share.php?u={Permalink}
35 setLink('fb', 'http://www.facebook.com/share.php?u=' + permalink);
36 // Pocket 用リンク:http://getpocket.com/edit?url={Permalink}&title={Title}
37 setLink('po', 'http://getpocket.com/edit?url=' + permalink + '&title=' + title);
38
39 // 記事下部に挿入する
40 article[c](destClassName)[0].appendChild(clone);
41 });
42
43 // ラッパー要素 div#n-stw (share-template-wrapper) からテンプレート ul#n-st を削除する
44 d[i]('n-stw').removeChild(template);
45 };
46
47 // フッタの AdSense をページ1つ目の記事の最下部に移す
48 var replaceFooterAdSense = function(articleClassName) {
49 var footerAdSense = d[i]('n-gaf'); // google-adsense-footer
50 var clone = footerAdSense.cloneNode(true);
51 footerAdSense.parentNode.removeChild(footerAdSense);
52 d[c](articleClassName)[0].appendChild(clone);
53 };
54
55 // Body 要素のクラス名に応じて記事と挿入先のクラス名が異なるので判定する
56 var exec = function() {
57 if(hasClass('page-index')) {
58 // トップページの場合
59 appendShareLinks('hentry', 'customized-footer');
60 replaceFooterAdSense('hentry');
61 }
62 else if(hasClass('page-archive')) {
63 // アーカイブページ (月別・カテゴリ別・検索結果) の場合
64 appendShareLinks('archive-entry', 'archive-entry-body');
65 replaceFooterAdSense('archive-entry');
66 }
67 else if(hasClass('page-entry')) {
68 // 記事ページはフッタ AdSense の移動のみ
69 replaceFooterAdSense('hentry');
70 }
71
72 // タッチ時の反応をさせるため空の関数を設定する
73 d.addEventListener('touchstart', function() { });
74 };
75
76 // フォールバック読み込み時は実行タイミングが変わるので調整する
77 if(!d.readyState || d.readyState === 'interactive') {
78 window.addEventListener('load', exec);
79 }
80 else if(d.readyState === 'loading') {
81 d.addEventListener('DOMContentLoaded', exec);
82 }
83 else {
84 exec();
85 }
86
87 // 検証用オブジェクト・プロパティを定義しておく
88 if(!Neos21) {
89 Neos21 = {};
90 }
91 Neos21.scriptLoaded = true;
92})(document, 'getElementsByClassName', 'getElementById', ' ');