4 * @copyright 2009 FeedBlog Project (http://sourceforge.jp/projects/feedblog/)
5 * @author Kureha Hisame (http://lunardial.sakura.ne.jp/) & Yui Naruse (http://airemix.com/)
9 // ログのリストが書かれたXMLのファイルパスを記入してください
10 var logXmlUrl = "./xml/loglist.xml";
11 // Feex XMLの<content>要素で、<br>を使用しているか?
12 var inputValidateMode = 0;
24 * 全DOMが使用可能になり次第、自動的に呼ばれる関数
31 * ログファイル選択用のコンボボックスをid名:logSelecterに生成します
33 function logXMLLoader(){
38 success: function(xmlData){
39 var separateTag = xmlData.getElementsByTagName("file");
40 var fileList = new Array(separateTag.length);
43 // 読み込んだ要素をStoreに格納して表示
45 boxBuffer.push("<form name='logform'><select name='logbox' style='width: " + comboWidth + "px' onchange='xmlLoader(this.options[this.selectedIndex].value)'>");
46 for (var i = 0; i < separateTag.length; i++) {
48 initUrl = separateTag[i].getElementsByTagName("path")[0].firstChild.nodeValue;
50 boxBuffer.push("<option value='" + separateTag[i].getElementsByTagName("path")[0].firstChild.nodeValue + "'/>" + separateTag[i].getElementsByTagName("display")[0].firstChild.nodeValue + " (" + separateTag[i].getElementsByTagName("path")[0].firstChild.nodeValue + ")" + "</option>");
52 boxBuffer.push("</select></form>");
55 document.getElementById("logSelecter").innerHTML = boxBuffer.join("");
64 * URLを指定し、指定されたFeedXmlを読み込み、解析を行います
67 function xmlLoader(url){
69 var loader = new jQuery.ajax({
72 success: analyzeTargetXml
77 * 引数に存在するXMLデータを解析し、画面に反映します
78 * @param {Object} xmlData
80 function analyzeTargetXml(xmlData){
81 var rootTag = xmlData.getElementsByTagName("feed");
82 var entryTag = xmlData.getElementsByTagName("entry");
88 for (var i = 0; i < entryTag.length; i++) {
89 entryList.push(new Entry(entryTag[i]));
92 refleshEntrylistBox();
97 * HTMLの内容をFeedInfoに変換します
99 function applyFeedinfo(){
100 var finfo = new Object();
101 finfo.title = document.getElementById("feed_title").value;
102 finfo.subtitle = document.getElementById("feed_subtitle").value;
103 finfo.self = document.getElementById("feed_self").value;
104 finfo.alternate = document.getElementById("feed_alternate").value;
105 finfo.id = document.getElementById("feed_id").value;
106 finfo.rights = document.getElementById("feed_rights").value;
107 finfo.authorname = document.getElementById("feed_authorname").value;
108 finfo.authoremail = document.getElementById("feed_authoremail").value;
114 * 指定したEntryList上のインデックスの記事をロードします
117 function entryLoader(index){
118 document.getElementById("entry_title").value = entryList[index].title;
119 document.getElementById("entry_stdin").value = validateText(entryList[index].content);
124 * 記事一覧の情報を表示するセレクトボックスにentryListの情報を反映させます
126 function refleshEntrylistBox(){
127 var stringBuffer = [];
128 stringBuffer.push("<form name='logform'><select name='logbox' style='width: " + comboWidth + "px' onchange='entryLoader(this.options[this.selectedIndex].value)'>");
129 for (var i = 0; i < entryList.length; i++) {
130 stringBuffer.push("<option value='" + i + "'/>" + entryList[i].title + "</option>");
132 stringBuffer.push("</select></form>");
134 document.getElementById("entrySelect").innerHTML = stringBuffer.join("");
139 * @param {Object} obj
141 function FeedInfo(obj){
142 this.title = xmlAttrContentUnescape($("title:first", obj).text());
143 this.subtitle = xmlAttrContentUnescape($("subtitle:first", obj).text());
144 this.self = xmlAttrContentUnescape($("link[rel=self]", obj).attr("href"));
145 this.alternate = xmlAttrContentUnescape($("link[rel=alternate]", obj).attr("href"));
146 this.updated = xmlAttrContentUnescape($("updated:first", obj).text());
147 this.id = xmlAttrContentUnescape($("id:first", obj).text());
148 this.rights = xmlAttrContentUnescape($("rights:first", obj).text());
149 this.authorname = xmlAttrContentUnescape($("author>name", obj).text());
150 this.authoremail = xmlAttrContentUnescape($("author>email", obj).text());
155 * @param {Object} obj entry 要素の DOM オブジェクト
158 this.id = xmlAttrContentUnescape($("id:first", obj).text());
159 this.title = xmlAttrContentUnescape($("title:first", obj).text());
160 this.summary = xmlAttrContentUnescape($("summary:first", obj).text());
161 this.published = xmlAttrContentUnescape($("published:first", obj).text());
162 this.updated = xmlAttrContentUnescape($("updated:first", obj).text());
163 this.link = xmlAttrContentUnescape($("link:first", obj).attr("href"));
164 this.content = xmlAttrContentUnescape($("content:first", obj).text());
166 if (inputValidateMode == 0) {
167 this.content = this.content.replace(/[\r\n]|\r\n/g, "");
168 this.content = this.content.replace(/<br>/ig, "\n");
173 * 日記本文のバリデーション処理を行います
174 * @param {String} contents 日記の本文が格納されている文字列
176 function validateText(contents){
182 while (target_tag = contents.match(/<iframe[^>]*src=["']http:\/\/ext.nicovideo.jp\/thumb\/sm\d*["'][^>]*>[^<]*<\/iframe>/i)) {
183 // src="..."の部分だけ抜き出す
184 target_element = target_tag[0].match(/src=["'][^"']*["']/i);
185 target_element = '<externalvideo src="NC:' + target_element[0].replace(/src=["']http:\/\/ext.nicovideo.jp\/thumb\/|["']/ig, "") + ':D">';
187 contents = contents.replace(target_tag, target_element);
192 var base_uri = document.location.href.replace(/[^\/]+$/, '');
193 var func = function(target, quote, url){
194 // 相対URIが検出された場合、フルに置換する
195 return '( ' + url.replace(/^(?!http)(?:\.\/)?/, base_uri) + ' )';
197 contents = contents.replace(/<a[^>]*href=(["'])(.*?)\1[^>]*>.*?<\/a>/i, func);
200 while (contents.match(/<a[^>]*>/)) {
202 target_tag = contents.match(/<a[^>]*>/i);
203 // href="..."の部分のみを抜き出す
204 target_element = target_tag[0].match(/href=["'][^"']*["']/i);
205 // 相対URIが検出された場合、フルに置換する
206 target_element = target_element[0].replace(/\.\//, document.location.href.replace(/[^\/]+$/, ''));
207 // Aタグ全体を消去し、再度Aクローズタグの置換を行う
208 contents = contents.replace(target_tag, "");
209 contents = contents.replace(/<\/a>/i, " ( " + target_element.replace(/href=|["']/g, "") + " ) ");
213 contents = contents.replace(/<[^>]*>|<\/[^>]*>/ig, "");
215 // 通常のタグ置換後、ニコニコ動画のタグを元に戻す
216 contents = contents.replace(/<externalvideo src="NC:/g, "<externalvideo src='NC:");
217 contents = contents.replace(/:D">/, ":D'>");
220 contents = contents.replace(/ /g, " ");
226 * <content>要素の変換を行います
227 * @param {String} content
229 function convertContent(content){
230 if (document.getElementById("addContentBr").checked) {
231 content = content.replace(/[\n\r]|\r\n/g, "<br>\n");
234 content = content.replace(/<br>/ig, "\n");
242 * @param {String} str エスケープを行う文字列
244 function xmlAttrContentEscape(str){
245 return str.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/"/g, '"');
250 * @param {String} str エスケープを行う文字列
252 function xmlAttrContentUnescape(str){
253 return str.replace(/"/g, '"').replace(/>/g, ">").replace(/</g, "<").replace(/&/g, "&");