|
<!-- for related posts list --> |
|
<div id="relatedPosts"></div> |
|
|
|
<script> |
|
<!-- |
|
(function($) { |
|
$(function() { |
|
// Blogger で動作する 関連記事一覧生成スクリプト |
|
// ページの最初の投稿と同じタグが付いた投稿をリスト表示する |
|
|
|
// 00 preparation |
|
var MAX_NUM = 5; |
|
var FEED_URL = '/feeds/posts/summary?alt=json&max-results=200'; |
|
var THUMBNAIL_SIZE = 12; |
|
|
|
/** |
|
* Define String#trim() |
|
*/ |
|
if (typeof(String.prototype.trim) === "undefined") { |
|
String.prototype.trim = function() { |
|
return this.replace(/^\s+|\s+$/g, ''); |
|
}; |
|
} |
|
|
|
// 01 ページ内の最初の投稿のタイトルを取得 |
|
var postTitles = $('.post-title'); |
|
if (postTitles.length < 1) return false; |
|
var firstPostTitle = postTitles.first().text().trim(); |
|
|
|
|
|
// 02 フィード JSON からページ内の最初の投稿と同じタグを持った投稿を指定件数取得して表示 |
|
$.getJSON(FEED_URL, function(json) { |
|
|
|
// 02a フィードから投稿一覧を取得 |
|
var entries = json.feed.entry; |
|
if (entries.length < 1) return false; |
|
|
|
// 02b 投稿一覧からページ内の最初の投稿のタグを取得 |
|
// ページの最初の投稿そのものはおすすめ記事一覧には含めたくないのでここで削除 |
|
var firstPostTags = getEntryTagsByTitle(firstPostTitle, entries); |
|
if (firstPostTags.length < 1) return false; |
|
|
|
// 02c ページ内の最初の投稿と同じタグを持つ投稿を取得 最大 MAX_NUM 件 |
|
var relatedPosts = getEntriesWithTag(firstPostTags, entries, MAX_NUM); |
|
if (relatedPosts.length < 1) return false; |
|
|
|
// 02d ページ内の最初の投稿と同じタグを持つ投稿のリストを dl としてページに挿入 |
|
var newDl = $('<dl>'); |
|
relatedPosts.forEach(function(rp) { |
|
var newImg = $('<img>').attr({ |
|
src: rp.thumbnail, |
|
width: THUMBNAIL_SIZE, |
|
height: THUMBNAIL_SIZE |
|
}); |
|
var newDt = $('<dt>').append($('<a>').attr('href', rp.link).append(newImg)); |
|
var newDd = $('<dd>').append($('<a>').text(rp.title).attr('href', rp.link)); |
|
newDl.append(newDt).append(newDd); |
|
}); |
|
$('#relatedPosts').append(newDl); |
|
}); |
|
|
|
/** |
|
* Define a function to test if 2 arrays have common element or not |
|
* @param array a1 |
|
* @param array a2 |
|
*/ |
|
function commonElementExist(a1, a2) { |
|
for (var i = 0; i < a1.length; i++) { |
|
if (a2.indexOf(a1[i]) != -1) return true; |
|
}; |
|
return false; |
|
}; |
|
|
|
/** |
|
* Define a function to get tags for 1 entry object |
|
* @param object entry |
|
*/ |
|
function getTags(entry) { |
|
return entry.category.map(function(x) { return x.term; }); |
|
} |
|
|
|
/** |
|
* Define a function to get tags of entry with specific title |
|
* @param array targetEntryTitle |
|
*/ |
|
function getEntryTagsByTitle(targetEntryTitle, entries) { |
|
var length = entries.length; |
|
for (var i = 0; i < length; i++) { |
|
var trimmedTitle = entries[i].title.$t.trim(); |
|
if (trimmedTitle === targetEntryTitle) { |
|
var tags = getTags(entries[i]); |
|
entries.splice(i, 1); |
|
return tags; |
|
} |
|
}; |
|
return []; |
|
} |
|
|
|
/** |
|
* Define a function to get entries with specific tags |
|
* @param array targetTags |
|
* @param array entries |
|
* @param integer max_num |
|
*/ |
|
function getEntriesWithTag(targetTags, entries, max_num) { |
|
var relatedPosts = []; |
|
var length = entries.length; |
|
for (var i = 0; i < length; i++) { |
|
if (relatedPosts.length >= max_num) break; |
|
var e = entries[i]; |
|
if (commonElementExist(getTags(e), targetTags)) { |
|
relatedPosts.push({ |
|
thumbnail: e.media$thumbnail ? e.media$thumbnail.url : '', |
|
title: e.title.$t.trim(), |
|
link: e.link[4].href |
|
}); |
|
} |
|
}; |
|
return relatedPosts; |
|
} |
|
|
|
}); |
|
})(jQuery); |
|
--> |
|
</script> |