OSDN Git Service

- add id access new mode.
authorKureha Hisame <kureha@gmail.com>
Thu, 12 Sep 2013 15:07:00 +0000 (00:07 +0900)
committerKureha Hisame <kureha@gmail.com>
Thu, 12 Sep 2013 15:07:00 +0000 (00:07 +0900)
index.html
js/lunardial/feedblog.js
js/lunardial/plugins/feedblog.contents.js
search.html
xml/diary.xml

index 72e7ca9..439a00c 100644 (file)
@@ -14,7 +14,9 @@
                <!-- css include end -->\r
                <!-- js include start -->\r
                <script type="text/javascript" src="./js/jquery/jquery-1.9.1.js"></script>\r
+               <script type="text/javascript" src="./js/crypto-js/rollups/hmac-sha1.js"></script>\r
                <script type="text/javascript" src="./js/lunardial/feedblog.js"></script>\r
+               <script type="text/javascript" src="./js/lunardial/plugins/feedblog.contents.js"></script>\r
                <!-- please include your own js -->\r
                <!-- js include end -->\r
        </head>\r
index c9db9d1..e0fb5c3 100644 (file)
@@ -44,7 +44,7 @@ var fetchEntriesSemaphore = new Semaphore();
  */\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
@@ -106,7 +106,7 @@ function initialize() {
        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
@@ -120,17 +120,22 @@ $(document).ready(function() {
        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
@@ -151,16 +156,16 @@ function closePanel(id) {
  */\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
@@ -253,7 +258,7 @@ function validateData(data) {
  */\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
@@ -261,15 +266,15 @@ function validateText(contents) {
 }\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
@@ -310,7 +315,7 @@ function Semaphore() {
  * セマフォ初期化用の関数です\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
@@ -333,7 +338,7 @@ function logXMLLoader() {
                        // 読み込んだ要素を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
@@ -365,7 +370,7 @@ function fullWriteMode(fileName) {
                        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
@@ -395,7 +400,7 @@ function searchHashMode(urlhash) {
                        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
@@ -406,7 +411,7 @@ function searchHashMode(urlhash) {
                        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
@@ -429,16 +434,99 @@ function fetchHashEntries(xmlData) {
        // 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">&nbsp;<\/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">&nbsp;<\/div><\/div>');\r
                        generatePanel(entry, "feedblog_drawitem", "feedblog_drawpanel", false);\r
 \r
+                       fetchEntriesSemaphore.buf.push(entry);\r
                        return true;\r
                }\r
 \r
@@ -446,10 +534,10 @@ function fetchHashEntries(xmlData) {
                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
@@ -476,7 +564,7 @@ function searchTagMode(tag) {
                        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
@@ -487,7 +575,7 @@ function searchTagMode(tag) {
                        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
@@ -505,17 +593,17 @@ function searchTagMode(tag) {
  */\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
@@ -525,10 +613,10 @@ function fetchTagEntries(xmlData) {
        // セマフォのカウンタを減少させます (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
@@ -558,7 +646,7 @@ function showEntriesRange(showLength, startIndex) {
        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
@@ -585,7 +673,7 @@ function showEntriesRange(showLength, startIndex) {
        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
@@ -594,8 +682,8 @@ function showEntriesRange(showLength, startIndex) {
        // 中央のパネルの表示制御\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
@@ -606,7 +694,7 @@ function showEntriesRange(showLength, startIndex) {
        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
@@ -624,7 +712,7 @@ function showEntriesRange(showLength, startIndex) {
        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
@@ -640,7 +728,7 @@ function showEntriesRange(showLength, startIndex) {
 \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
index 37149fe..293c86d 100644 (file)
@@ -21,6 +21,7 @@
                        return str.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;').replace(/^[ ]+/mg, "&nbsp;").replace(/^[\t]+/mg, "");\r
                };\r
                var contentUrl = escapeXmlAttr(options.mainPageUrl) + '#' + escapeXmlAttr(options.entry.id);\r
+               contentUrl = mainPageUrl + "?id=" + CryptoJS.SHA1(options.entry.id).toString();\r
 \r
                // 追加する文字列を生成\r
                // 開始タグを生成\r
index 55d650d..ab3a143 100644 (file)
@@ -12,7 +12,9 @@
                <!-- css include end -->\r
                <!-- js include start -->\r
                <script type="text/javascript" src="./js/jquery/jquery-1.9.1.js"></script>\r
+               <script type="text/javascript" src="./js/crypto-js/rollups/hmac-sha1.js"></script>\r
                <script type="text/javascript" src="./js/lunardial/feedblog_search.js"></script>\r
+               <script type="text/javascript" src="./js/lunardial/plugins/feedblog.contents.js"></script>\r
                <!-- please include your own js -->\r
                <!-- js include end -->\r
        </head>\r
index c31f2ab..41e1fba 100644 (file)
@@ -27,6 +27,9 @@
 ・&lt;a href=&quot;http://msdn.microsoft.com/ja-jp/library/ms256190(VS.80).aspx&quot; target=&quot;_blank&quot; &gt;文字参照とエンティティ参照[XMl標準]&lt;/a&gt; (MSDN)&lt;br&gt;\r
 ・&lt;a href=&quot;http://gogodiet.net/z/xml/3_10.htm&quot; target=&quot;_blank&quot; &gt;XML エンティティ参照(エスケープ文字)&lt;/a&gt; &lt;br&gt;\r
 </content>\r
+<category term="testTag1" label="テストタグ1" />\r
+<category term="testTag2" label="テストタグ2" />\r
+<category term="testTag3" label="テストタグ3" />\r
 </entry>\r
 \r
 <entry>\r
@@ -39,6 +42,7 @@
 <content type="html"> この日記はテスト日記です。&lt;br&gt;\r
  基本的な機能、及び正常に表示できているかを確認するのにご使用下さい。&lt;br&gt;\r
 </content>\r
+<category term="testTag2" label="テストタグ2" />\r
 </entry>\r
 \r
 </feed>
\ No newline at end of file