*/\r
function generatePanel(entry, drawitem, renderto, closed) {\r
// プラグインを実行\r
- if( typeof ($("#" + renderto).feedblog_contents_plugin) == "function") {\r
+ if ( typeof ($("#" + renderto).feedblog_contents_plugin) == "function") {\r
$("#" + renderto).feedblog_contents_plugin({\r
entry : entry,\r
mainPageUrl : mainPageUrl,\r
latestXml = $("#feedblog_latestxml").val();\r
logXmlUrl = $("#feedblog_loglistxmlurl").val();\r
showLength = parseInt($("#feedblog_showlength").val());\r
- if(isNaN(showLength)) {\r
+ if (isNaN(showLength)) {\r
showLength = 1;\r
}\r
validateMode = $("#feedblog_validatemode").val();\r
initialize();\r
\r
// 制御に必要な各種パラメタを取得する\r
- var tag = getTagFromUrl();\r
+ var tag = getParamFromUrl("tag");\r
+ var id = getParamFromUrl("id");\r
var urlhash = getHashFromUrl();\r
\r
// ハッシュが空か、ハッシュ形式の正規表現に一致しないようなら通常モードで実行\r
- if(urlhash.length == 0 && tag.length == 0) {\r
+ if (urlhash.length == 0 && tag.length == 0 && id.length == 0) {\r
fullWriteMode(latestXml);\r
logXMLLoader();\r
- } else if(urlhash.length == 0) {\r
+ } else if (urlhash.length == 0 && id.length == 0) {\r
// タグが指定されているのでタグ探索モード\r
searchTagMode(tag);\r
logXMLLoader();\r
+ } else if (urlhash.length == 0) {\r
+ // IDが指定されているのでID探索モード\r
+ searchIdMode(id);\r
+ logXMLLoader();\r
} else {\r
// ハッシュ形式の正規表現に一致したら探索モード\r
searchHashMode(urlhash);\r
*/\r
function Entry(obj) {\r
this.title = $("title:first", obj).text();\r
- if(this.title == "")\r
+ if (this.title == "")\r
requiredElementError(obj, "title");\r
this.title = validateText(this.title);\r
this.content = $("content:first", obj).text();\r
this.content = validateText(this.content);\r
this.id = $("id:first", obj).text();\r
- if(this.id == "")\r
+ if (this.id == "")\r
requiredElementError(obj, "id");\r
this.date = $("updated:first", obj).text();\r
- if(this.date == "")\r
+ if (this.date == "")\r
requiredElementError(obj, "updated");\r
this.date = validateData(this.date);\r
this.category = $("category", obj);\r
*/\r
function validateText(contents) {\r
// <br/>タグを挿入する\r
- if(validateMode == 0) {\r
+ if (validateMode == 0) {\r
contents = contents.replace(/[\n\r]|\r\n/g, "<br />");\r
}\r
\r
}\r
\r
/**\r
- * URLã\81\8bã\82\89ã\82¿ã\82°を取得するための関数\r
+ * URLã\81\8bã\82\89ã\83\91ã\83©ã\83¡ã\82¿を取得するための関数\r
*/\r
-function getTagFromUrl() {\r
+function getParamFromUrl(paramName) {\r
// GETパラメタよりタグを取得する\r
var tag = "";\r
- if(location.search.length > 1) {\r
+ if (location.search.length > 1) {\r
var queries = location.search.substring(1).split('&');\r
- for(var i = 0; i < queries.length; i++) {\r
- if(("" + queries[i].split('=')[0]) == "tag") {\r
+ for (var i = 0; i < queries.length; i++) {\r
+ if (("" + queries[i].split('=')[0]) == paramName) {\r
tag = "" + queries[i].split('=')[1];\r
}\r
}\r
* セマフォ初期化用の関数です\r
*/\r
Semaphore.prototype.init = function() {\r
- while(this.xhrs.length > 0) {\r
+ while (this.xhrs.length > 0) {\r
this.xhrs.shift().abort();\r
}\r
this.id = Math.random();\r
// 読み込んだ要素をStoreに格納して表示\r
var boxBuffer = [];\r
boxBuffer.push("<form class='feedblog_logselecter' name='feedblog_logform'><select class='feedblog_logselecter' id='feedblog_logbox' onchange='fullWriteMode(this.options[this.selectedIndex].value)'>");\r
- for(var i = 0; i < separateTag.length; i++) {\r
+ for (var i = 0; i < separateTag.length; i++) {\r
boxBuffer.push("<option value='" + separateTag[i].getElementsByTagName("path")[0].firstChild.nodeValue + "'>" + separateTag[i].getElementsByTagName("display")[0].firstChild.nodeValue + "</option>");\r
}\r
boxBuffer.push("</select></form>");\r
loadedEntries = [];\r
\r
// メモリ上の変数に全ての記事要素を格納します\r
- for(var i = 0; i < separateTag.length; i++) {\r
+ for (var i = 0; i < separateTag.length; i++) {\r
loadedEntries.push(new Entry(separateTag[i]));\r
}\r
\r
var urls = new Array(separateTag.length);\r
\r
// すべてのファイルパスを配列に格納する\r
- for(var i = 0; i < separateTag.length; i++) {\r
+ for (var i = 0; i < separateTag.length; i++) {\r
// "path"ノードの値を格納\r
urls[i] = separateTag[i].getElementsByTagName("path")[0].firstChild.nodeValue;\r
}\r
fetchEntriesSemaphore.count = urls.length;\r
\r
// ファイルパス配列に格納されているすべての記事に対し、探索を開始する\r
- for(var i = 0; i < separateTag.length; i++) {\r
+ for (var i = 0; i < separateTag.length; i++) {\r
// ファイルパス配列の要素からリクエストを生成し、対象データをロードする\r
var xhr = new jQuery.ajax({\r
url : urls[i],\r
// entry要素のみを切り出す\r
var entries = xmlData.getElementsByTagName("entry");\r
\r
- for(var i = 0; i < entries.length; i++) {\r
+ for (var i = 0; i < entries.length; i++) {\r
+ // entryタグ内部のidノードの値のみ抽出し、入力されたhashと比較を行う\r
+ var entry = new Entry(entries[i]);\r
+\r
+ // idの値と比較を行う\r
+ if (urlhash == entry.id) {\r
+ // 一致した場合は該当記事を表示する\r
+ $("#feedblog_writearea").html('<div id="feedblog_drawpanel" class="feedblog_drawpanel"><div id="feedblog_drawitem" class="feedblog_drawitem"> <\/div><\/div>');\r
+ generatePanel(entry, "feedblog_drawitem", "feedblog_drawpanel", false);\r
+\r
+ fetchEntriesSemaphore.buf.push(entry);\r
+ return true;\r
+ }\r
+\r
+ // セマフォのカウンタを減少させます (Ajaxとの同期のため)\r
+ fetchEntriesSemaphore.count--;\r
+\r
+ // 最後のファイルまで探索しても記事が見つからなかった場合はエラーを表示します。\r
+ if (fetchEntriesSemaphore.count == 0) {\r
+ var entries = fetchEntriesSemaphore.buf;\r
+\r
+ if (entries.length == 0) {\r
+ notFoundError();\r
+ return false;\r
+ }\r
+ }\r
+ }\r
+}\r
+\r
+/**\r
+ * 渡された文字列と一致するfeed1.0:id(sha-1)要素を持った記事を検索し、表示します\r
+ * @param {String} urlhash feed1.0:id(sha-1)要素と一致する文字列\r
+ */\r
+function searchIdMode(urlhash) {\r
+ // ロードエフェクト表示\r
+ loadingEffect();\r
+\r
+ // ログXMLファイルを読み込む\r
+ var loader = new jQuery.ajax({\r
+ url : logXmlUrl + '?time=' + (+new Date()),\r
+ method : "GET",\r
+ error : showError,\r
+ success : function(xmlData) {\r
+ // ファイルパスの要素のみを抽出する\r
+ var separateTag = xmlData.getElementsByTagName("file");\r
+ var urls = new Array(separateTag.length);\r
+\r
+ // すべてのファイルパスを配列に格納する\r
+ for (var i = 0; i < separateTag.length; i++) {\r
+ // "path"ノードの値を格納\r
+ urls[i] = separateTag[i].getElementsByTagName("path")[0].firstChild.nodeValue;\r
+ }\r
+\r
+ // セマフォを初期化\r
+ fetchEntriesSemaphore.init();\r
+ fetchEntriesSemaphore.urls = urls;\r
+ fetchEntriesSemaphore.count = urls.length;\r
+\r
+ // ファイルパス配列に格納されているすべての記事に対し、探索を開始する\r
+ for (var i = 0; i < separateTag.length; i++) {\r
+ // ファイルパス配列の要素からリクエストを生成し、対象データをロードする\r
+ var xhr = new jQuery.ajax({\r
+ url : urls[i],\r
+ method : "GET",\r
+ success : fetchIdEntries\r
+ });\r
+ fetchEntriesSemaphore.xhrs.push(xhr);\r
+ }\r
+ }\r
+ });\r
+}\r
+\r
+/**\r
+ * ID検索用のjQueryコールバック関数\r
+ */\r
+function fetchIdEntries(xmlData) {\r
+ // IDを取得\r
+ var id = getParamFromUrl("id");\r
+\r
+ // entry要素のみを切り出す\r
+ var entries = xmlData.getElementsByTagName("entry");\r
+\r
+ for (var i = 0; i < entries.length; i++) {\r
// entryタグ内部のidノードの値のみ抽出し、入力されたhashと比較を行う\r
var entry = new Entry(entries[i]);\r
\r
// idの値と比較を行う\r
- if(urlhash == entry.id) {\r
+ if (id == CryptoJS.SHA1(entry.id).toString()) {\r
// 一致した場合は該当記事を表示する\r
$("#feedblog_writearea").html('<div id="feedblog_drawpanel" class="feedblog_drawpanel"><div id="feedblog_drawitem" class="feedblog_drawitem"> <\/div><\/div>');\r
generatePanel(entry, "feedblog_drawitem", "feedblog_drawpanel", false);\r
\r
+ fetchEntriesSemaphore.buf.push(entry);\r
return true;\r
}\r
\r
fetchEntriesSemaphore.count--;\r
\r
// 最後のファイルまで探索しても記事が見つからなかった場合はエラーを表示します。\r
- if(fetchEntriesSemaphore.count == 0) {\r
+ if (fetchEntriesSemaphore.count == 0) {\r
var entries = fetchEntriesSemaphore.buf;\r
\r
- if(entries.length == 0) {\r
+ if (entries.length == 0) {\r
notFoundError();\r
return false;\r
}\r
var urls = new Array(separateTag.length);\r
\r
// すべてのファイルパスを配列に格納する\r
- for(var i = 0; i < separateTag.length; i++) {\r
+ for (var i = 0; i < separateTag.length; i++) {\r
// "path"ノードの値を格納\r
urls[i] = separateTag[i].getElementsByTagName("path")[0].firstChild.nodeValue;\r
}\r
fetchEntriesSemaphore.count = urls.length;\r
\r
// ファイルパス配列に格納されているすべての記事に対し、探索を開始する\r
- for(var i = 0; i < separateTag.length; i++) {\r
+ for (var i = 0; i < separateTag.length; i++) {\r
// ファイルパス配列の要素からリクエストを生成し、対象データをロードする\r
var xhr = new jQuery.ajax({\r
url : urls[i],\r
*/\r
function fetchTagEntries(xmlData) {\r
// タグを取得する\r
- var tag = getTagFromUrl();\r
+ var tag = getParamFromUrl("tag");\r
\r
// entry要素のみを切り出す\r
var entries = xmlData.getElementsByTagName("entry");\r
\r
- for(var j = 0; j < entries.length; j++) {\r
+ for (var j = 0; j < entries.length; j++) {\r
var entry = new Entry(entries[j]);\r
\r
- for(var k = 0; k < entry.category.length; k++) {\r
+ for (var k = 0; k < entry.category.length; k++) {\r
// タグのIDが一致したら格納\r
- if(tag == entry.category.eq(k).attr("term")) {\r
+ if (tag == entry.category.eq(k).attr("term")) {\r
// entryを格納する\r
fetchEntriesSemaphore.buf.push(entry);\r
}\r
// セマフォのカウンタを減少させます (Ajaxとの同期のため)\r
fetchEntriesSemaphore.count--;\r
\r
- if(fetchEntriesSemaphore.count == 0) {\r
+ if (fetchEntriesSemaphore.count == 0) {\r
var entries = fetchEntriesSemaphore.buf;\r
\r
- if(entries.length == 0) {\r
+ if (entries.length == 0) {\r
notFoundError();\r
return false;\r
}\r
var entries = loadedEntries;\r
\r
// 表示インデックスが範囲外の場合はエラーパネルを表示して終了\r
- if(startIndex < 0 || (entries.length <= startIndex && entries.length != 0)) {\r
+ if (startIndex < 0 || (entries.length <= startIndex && entries.length != 0)) {\r
showError();\r
return;\r
}\r
menuMoveBuffer.push("<li class='feedblog_pager_blank'></li>");\r
\r
// 左パネルの表示制御\r
- if(startIndex - showLength >= 0) {\r
+ if (startIndex - showLength >= 0) {\r
menuMoveBuffer.push("\<li class='feedblog_pager_goback'><span class='feedblog_pager_goback' onclick='showEntriesRange(" + showLength + ", " + (startIndex - showLength) + "); return false;'>\< 前の" + showLength + "件を表示</span\></li>");\r
} else {\r
menuMoveBuffer.push("\<li class='feedblog_pager_goback'>\< 前の" + showLength + "件を表示</a\></li>");\r
// 中央のパネルの表示制御\r
menuMoveBuffer.push("<li class='feedblog_pager_center'>[ ");\r
var menuNumbers = Math.ceil(entries.length / showLength);\r
- for( i = 0; i < menuNumbers; i++) {\r
- if(startIndex / showLength == i) {\r
+ for ( i = 0; i < menuNumbers; i++) {\r
+ if (startIndex / showLength == i) {\r
menuMoveBuffer.push(i + " ");\r
} else {\r
menuMoveBuffer.push("<span class='feedblog_pager_center' onclick='showEntriesRange(" + showLength + ", " + (i * showLength) + "); return false;'>");\r
menuMoveBuffer.push("]</li>");\r
\r
// 右パネルの表示制御\r
- if(entries.length > startIndex + showLength) {\r
+ if (entries.length > startIndex + showLength) {\r
menuMoveBuffer.push("\<li class='feedblog_pager_gonext'><span class='feedblog_pager_gonext' onclick='showEntriesRange(" + showLength + ", " + (startIndex + showLength) + "); return false;'>\次の" + showLength + "件を表示 \></span\></li>");\r
} else {\r
menuMoveBuffer.push("\<li class='feedblog_pager_gonext'>次の" + showLength + "件を表示 \></li>");\r
stringBuffer.push("</div>");\r
\r
// 記事描画部分のパネルを生成します\r
- for(var i = startIndex; i < loopLimit; i++) {\r
+ for (var i = startIndex; i < loopLimit; i++) {\r
stringBuffer.push('<div class="feedblog_drawpanel" id="feedblog_drawpanel');\r
stringBuffer.push(i);\r
stringBuffer.push('"><div class="feedblog_drawitem" id="feedblog_drawitem');\r
\r
$("#feedblog_writearea").html(stringBuffer.join(""));\r
\r
- for(var i = startIndex; i < loopLimit; i++) {\r
+ for (var i = startIndex; i < loopLimit; i++) {\r
// 各要素をオブジェクトに格納します\r
var entry = entries[i];\r
\r