JavaScriptのみで記述されたブログツール・ソフトウェアです。表示にExt JSを使用します
修訂 | b05fbd099c69b53aca4c654326a2c0fc8c65b00e (tree) |
---|---|
時間 | 2009-07-14 23:44:46 |
作者 | elixirel <elixirel@user...> |
Commiter | elixirel |
Integration mixi-wrapper to feedblog_gen.
@@ -50,8 +50,11 @@ | ||
50 | 50 | </td> |
51 | 51 | <td style="width: 10px;"> |
52 | 52 | </td> |
53 | - <td class="formnavi"> | |
54 | - オプション | |
53 | + <td class="forminput"> | |
54 | + <input type="checkbox" value="1" id="addContentBr"> | |
55 | + <label for='addContentBr'> | |
56 | + 通常出力時、<content>要素の改行位置に<br>を挿入する | |
57 | + </label> | |
55 | 58 | </td> |
56 | 59 | </tr> |
57 | 60 | <tr> |
@@ -65,9 +68,9 @@ | ||
65 | 68 | <td> |
66 | 69 | </td> |
67 | 70 | <td class="forminput"> |
68 | - <input type="checkbox" value="1" id="addContentBr"> | |
69 | - <label for='addContentBr'> | |
70 | - 出力時、<content>要素の改行位置に<br>を挿入する | |
71 | + <input type="checkbox" value="1" id="isCoverBlockTag" checked="checked"> | |
72 | + <label for='isCoverBlockTag'> | |
73 | + mixi用出力時、ブロック要素のタグを---で囲む | |
71 | 74 | </label> |
72 | 75 | </td> |
73 | 76 | </tr> |
@@ -187,7 +190,7 @@ | ||
187 | 190 | </tbody> |
188 | 191 | </table> |
189 | 192 | <br> |
190 | - <input type="button" value="追加/編集" onclick="javascript:applyChange();"> <input type="button" value="選択中の記事を削除" onclick="javascript:removeEntry()"> <input type="button" value="リセット" onclick="javascript:initLoad()"> <input type="button" value="全記事を削除" onclick="javascript:allRemoveEntry()"> | |
193 | + <input type="button" value="追加/編集" onclick="javascript:applyChange();"> <input type="button" value="選択中の記事を削除" onclick="javascript:removeEntry()"> <input type="button" value="リセット" onclick="javascript:initLoad()"> <input type="button" value="全記事を削除" onclick="javascript:allRemoveEntry()"> <input type="button" value="選択中の日記をmixi用に変換" onclick="javascript:openMixiWindow();"> | |
191 | 194 | <br> |
192 | 195 | <br> |
193 | 196 | </td> |
@@ -60,8 +60,8 @@ function applyChange(){ | ||
60 | 60 | entryList[editIndex].title = document.getElementById("entry_title").value; |
61 | 61 | entryList[editIndex].updated = getDate(); |
62 | 62 | entryList[editIndex].content = document.getElementById("entry_stdin").value.replace(/\r\n/g, "\n"); |
63 | - | |
64 | - document.getElementById("logBox").options[parseInt(editIndex) + 1].text = entryList[editIndex].title; | |
63 | + | |
64 | + document.getElementById("logBox").options[parseInt(editIndex) + 1].text = entryList[editIndex].title; | |
65 | 65 | } |
66 | 66 | |
67 | 67 | document.getElementById("stdout").value = toXml(feedInfo, entryList); |
@@ -70,6 +70,28 @@ function applyChange(){ | ||
70 | 70 | document.getElementById("previewArea").innerHTML = entryList[editIndex].content.replace(/\n/g, "<br>"); |
71 | 71 | } |
72 | 72 | |
73 | +/** | |
74 | + * mixi用に記事を変換し、ウインドウを立ち上げて表示します | |
75 | + */ | |
76 | +function openMixiWindow(){ | |
77 | + // 日記が選択されていない場合は何もしない | |
78 | + if (editIndex < 0) { | |
79 | + return; | |
80 | + } | |
81 | + | |
82 | + // HTMLを生成します | |
83 | + var window_str = '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>FeedBlog Mixi用変換</title><style type="text/css">body {font-size: 12px;line-height: 18px;color: #004488;margin-top: 10px; margin-bottom: 10px;}td.default {font-size: 12px;line-height: 18px;color: #004488;border: 1px solid #8888ff;text-align: left;vertical-align: top;}div {text-align: left;}div.code {background: #f8f8ff;border: 1px solid #c8c8ff;padding: 10px;margin: 10px;margin-left: 0px;border-left: 5px solid #e8e8ff;font-size: 12px;line-height: 18px;}table.pager {padding: 0px;margin: 0px;border: 1px solid #8888ff;}td.pager {border: 1px solid #8888ff;padding-left: 3px;}td.formheader {font-size: 9pt;line-height: 13pt;font-family: sans-serif;font-weight: bold;padding: 3px;border: 1px solid #C5C5DE;background-color: #FAFAFF;}td.forminput {font-size: 9pt;line-height: 13pt;font-family: sans-serif;padding: 5px;border: 1px dotted #C5C5DE;}input {font-size: 9pt;line-height: 13pt;font-family: sans-serif;color: #1E4080;border: 1px dotted #BABAFE;background-color: #F5F5FF;}textarea {font-size: 9pt;line-height: 13pt;font-family: sans-serif;color: #1E4080;border: 1px dotted #BABAFE;background-color: #F5F5FF;}</style></head><body><center><table align="center" style="width: 800px;"><tbody><tr><td class="default" colspan="2" style="padding: 5px; text-align: center; vertical-align: bottom;"><table style="width: 100%"><tbody><tr><td class="formheader" style="text-align: center; width: 100px;">タイトル</td><td class="forminput" style="padding: 0px 5px 0px 3px;"><input type="text" id="entry_title" style="width: 100%" value="' + | |
84 | + entryList[editIndex].title + | |
85 | + '"></td></tr><tr><td class="formheader" style="text-align: center;">本文</td><td class="forminput" style="padding: 0px 5px 0px 3px;"><textarea id="entry_stdin" rows="20" style="width: 100%">' + | |
86 | + mixiWrapper(entryList[editIndex].content) + | |
87 | + '</textarea></td></tr></tbody></table></td></tr></tbody></table><br><input type="button" value="ウインドウを閉じる" onclick="javascript: window.close();"></center></body></html>'; | |
88 | + | |
89 | + // ウインドウに書き出します | |
90 | + var mixi_win = window.open('', 'feedblog_mixi_wrapper', 'width = 850, height = 490, scrollbars=yes'); | |
91 | + mixi_win.document.open(); | |
92 | + mixi_win.document.write(window_str); | |
93 | + mixi_win.document.close(); | |
94 | +} | |
73 | 95 | |
74 | 96 | /** |
75 | 97 | * mixi用に通常のHTMLを変換します |
@@ -104,8 +126,7 @@ function mixiWrapper(contents){ | ||
104 | 126 | } |
105 | 127 | |
106 | 128 | // ブロック要素のタグが存在した場合、改行をその後に挿入します。 |
107 | - // if (document.getElementById("isCoverBlockTag").checked) { | |
108 | - if (true) { | |
129 | + if (document.getElementById("isCoverBlockTag").checked) { | |
109 | 130 | contents = contents.replace(/<(div|h\d|p)[^>]*>/ig, "-----------------------------------------------------------------------------\n"); |
110 | 131 | contents = contents.replace(/(\n|)<\/(div|h\d|p)>/ig, "\n-----------------------------------------------------------------------------\n"); |
111 | 132 | } |
@@ -1,249 +0,0 @@ | ||
1 | -/** | |
2 | - * FeedBlog MixiWrapper | |
3 | - * | |
4 | - * @copyright 2009 FeedBlog Project (http://sourceforge.jp/projects/feedblog/) | |
5 | - * @author Kureha Hisame (http://lunardial.sakura.ne.jp/) & Yui Naruse (http://airemix.com/) | |
6 | - * @since 2009/06/03 | |
7 | - * @version 3.0.0.0 | |
8 | - */ | |
9 | -// ログのリストが書かれたXMLのファイルパスを記入してください | |
10 | -var logXmlUrl = "./xml/loglist.xml"; | |
11 | -// Feex XMLの<content>要素で、<br>を使用しているか? | |
12 | -var inputValidateMode = 0; | |
13 | - | |
14 | -// フィードの基本情報を記録する変数 | |
15 | -var feedInfo; | |
16 | -// 記事リストを格納する変数 | |
17 | -var entryList; | |
18 | -// 現在編集中の記事の位置を示す変数 | |
19 | -var viewIndex; | |
20 | -// コンボボックスの横幅を指定します | |
21 | -var comboWidth = 300; | |
22 | - | |
23 | -/** | |
24 | - * 全DOMが使用可能になり次第、自動的に呼ばれる関数 | |
25 | - */ | |
26 | -function initLoad(){ | |
27 | - logXMLLoader(); | |
28 | -} | |
29 | - | |
30 | -/** | |
31 | - * ログファイル選択用のコンボボックスをid名:logSelecterに生成します | |
32 | - */ | |
33 | -function logXMLLoader(){ | |
34 | - // ログ用のXMLを読み込みます | |
35 | - jQuery.ajax({ | |
36 | - url: logXmlUrl, | |
37 | - method: "GET", | |
38 | - // error: showError, | |
39 | - success: function(xmlData){ | |
40 | - var separateTag = xmlData.getElementsByTagName("file"); | |
41 | - var fileList = new Array(separateTag.length); | |
42 | - var initUrl; | |
43 | - | |
44 | - // 読み込んだ要素をStoreに格納して表示 | |
45 | - var boxBuffer = []; | |
46 | - boxBuffer.push("<form name='logform'><select name='logbox' style='width: " + comboWidth + "px' onchange='xmlLoader(this.options[this.selectedIndex].value)'>"); | |
47 | - for (var i = 0; i < separateTag.length; i++) { | |
48 | - if (i == 0) { | |
49 | - initUrl = separateTag[i].getElementsByTagName("path")[0].firstChild.nodeValue; | |
50 | - } | |
51 | - 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 | - } | |
53 | - boxBuffer.push("</select></form>"); | |
54 | - | |
55 | - // コンボボックス要素を生成 | |
56 | - document.getElementById("logSelecter").innerHTML = boxBuffer.join(""); | |
57 | - | |
58 | - // 最新の日記をローディングする | |
59 | - xmlLoader(initUrl); | |
60 | - } | |
61 | - }); | |
62 | -} | |
63 | - | |
64 | -/** | |
65 | - * URLを指定し、指定されたFeedXmlを読み込み、解析を行います | |
66 | - * @param {String} url | |
67 | - */ | |
68 | -function xmlLoader(url){ | |
69 | - // 日記本体のデータをローディングする | |
70 | - var loader = new jQuery.ajax({ | |
71 | - url: url, | |
72 | - method: "GET", | |
73 | - error: showError, | |
74 | - success: analyzeTargetXml | |
75 | - }); | |
76 | -} | |
77 | - | |
78 | -/** | |
79 | - * 引数に存在するXMLデータを解析し、画面に反映します | |
80 | - * @param {Object} xmlData | |
81 | - */ | |
82 | -function analyzeTargetXml(xmlData){ | |
83 | - var rootTag = xmlData.getElementsByTagName("feed"); | |
84 | - var entryTag = xmlData.getElementsByTagName("entry"); | |
85 | - | |
86 | - // グローバル変数を初期化 | |
87 | - feedInfo = null; | |
88 | - entryList = []; | |
89 | - | |
90 | - for (var i = 0; i < entryTag.length; i++) { | |
91 | - entryList.push(new Entry(entryTag[i])); | |
92 | - } | |
93 | - | |
94 | - refleshEntrylistBox(); | |
95 | - entryLoader(0); | |
96 | -} | |
97 | - | |
98 | -/** | |
99 | - * HTMLの内容をFeedInfoに変換します | |
100 | - */ | |
101 | -function applyFeedinfo(){ | |
102 | - var finfo = new Object(); | |
103 | - finfo.title = document.getElementById("feed_title").value; | |
104 | - finfo.subtitle = document.getElementById("feed_subtitle").value; | |
105 | - finfo.self = document.getElementById("feed_self").value; | |
106 | - finfo.alternate = document.getElementById("feed_alternate").value; | |
107 | - finfo.id = document.getElementById("feed_id").value; | |
108 | - finfo.rights = document.getElementById("feed_rights").value; | |
109 | - finfo.authorname = document.getElementById("feed_authorname").value; | |
110 | - finfo.authoremail = document.getElementById("feed_authoremail").value; | |
111 | - | |
112 | - return finfo; | |
113 | -} | |
114 | - | |
115 | -/** | |
116 | - * 指定したEntryList上のインデックスの記事をロードします | |
117 | - * @param {int} index | |
118 | - */ | |
119 | -function entryLoader(index){ | |
120 | - document.getElementById("entry_title").value = entryList[index].title; | |
121 | - document.getElementById("entry_stdin").value = validateText(entryList[index].content); | |
122 | - viewIndex = index; | |
123 | -} | |
124 | - | |
125 | -/** | |
126 | - * 記事一覧の情報を表示するセレクトボックスにentryListの情報を反映させます | |
127 | - */ | |
128 | -function refleshEntrylistBox(){ | |
129 | - var stringBuffer = []; | |
130 | - stringBuffer.push("<form name='logform'><select id='logBox' style='width: " + comboWidth + "px' onchange='entryLoader(this.options[this.selectedIndex].value)'>"); | |
131 | - for (var i = 0; i < entryList.length; i++) { | |
132 | - stringBuffer.push("<option value='" + i + "'/>" + entryList[i].title + "</option>"); | |
133 | - } | |
134 | - stringBuffer.push("</select></form>"); | |
135 | - // コンボボックス要素を生成 | |
136 | - document.getElementById("entrySelect").innerHTML = stringBuffer.join(""); | |
137 | -} | |
138 | - | |
139 | -/** | |
140 | - * Feed基本情報保持クラス | |
141 | - * @param {Object} obj | |
142 | - */ | |
143 | -function FeedInfo(obj){ | |
144 | - this.title = xmlAttrContentUnescape($("title:first", obj).text()); | |
145 | - this.subtitle = xmlAttrContentUnescape($("subtitle:first", obj).text()); | |
146 | - this.self = xmlAttrContentUnescape($("link[rel=self]", obj).attr("href")); | |
147 | - this.alternate = xmlAttrContentUnescape($("link[rel=alternate]", obj).attr("href")); | |
148 | - this.updated = xmlAttrContentUnescape($("updated:first", obj).text()); | |
149 | - this.id = xmlAttrContentUnescape($("id:first", obj).text()); | |
150 | - this.rights = xmlAttrContentUnescape($("rights:first", obj).text()); | |
151 | - this.authorname = xmlAttrContentUnescape($("author>name", obj).text()); | |
152 | - this.authoremail = xmlAttrContentUnescape($("author>email", obj).text()); | |
153 | -} | |
154 | - | |
155 | -/** | |
156 | - * 記事クラス | |
157 | - * @param {Object} obj entry 要素の DOM オブジェクト | |
158 | - */ | |
159 | -function Entry(obj){ | |
160 | - this.id = xmlAttrContentUnescape($("id:first", obj).text()); | |
161 | - this.title = xmlAttrContentUnescape($("title:first", obj).text()); | |
162 | - this.summary = xmlAttrContentUnescape($("summary:first", obj).text()); | |
163 | - this.published = xmlAttrContentUnescape($("published:first", obj).text()); | |
164 | - this.updated = xmlAttrContentUnescape($("updated:first", obj).text()); | |
165 | - this.link = xmlAttrContentUnescape($("link:first", obj).attr("href")); | |
166 | - this.content = xmlAttrContentUnescape($("content:first", obj).text()); | |
167 | - | |
168 | - if (inputValidateMode == 0) { | |
169 | - this.content = this.content.replace(/[\r\n]|\r\n/g, ""); | |
170 | - this.content = this.content.replace(/<br>/ig, "\n"); | |
171 | - } | |
172 | -} | |
173 | - | |
174 | -/** | |
175 | - * 日記本文のバリデーション処理を行います | |
176 | - * @param {String} contents 日記の本文が格納されている文字列 | |
177 | - */ | |
178 | -function validateText(contents){ | |
179 | - // 置換に使用する変数 | |
180 | - var target_tag; | |
181 | - var target_element; | |
182 | - | |
183 | - // ニコニコ動画のタグを置換 | |
184 | - while (target_tag = contents.match(/<iframe[^>]*src=["']http:\/\/ext.nicovideo.jp\/thumb\/[A-Za-z]*\d*["'][^>]*>[^<]*<\/iframe>/i)) { | |
185 | - // src="..."の部分だけ抜き出す | |
186 | - target_element = target_tag[0].match(/src=["'][^"']*["']/i); | |
187 | - target_element = '<externalvideo src="NC:' + target_element[0].replace(/src=["']http:\/\/ext.nicovideo.jp\/thumb\/|["']/ig, "") + ':D">'; | |
188 | - // iframeタグ全体を置換する | |
189 | - contents = contents.replace(target_tag, target_element); | |
190 | - } | |
191 | - | |
192 | - // Aタグを変換する | |
193 | - while (contents.match(/<a[^>]*>/)) { | |
194 | - // 置換対象のAタグを抽出する | |
195 | - target_tag = contents.match(/<a[^>]*>/i); | |
196 | - // href="..."の部分のみを抜き出す | |
197 | - target_element = target_tag[0].match(/href=["'][^"']*["']/i); | |
198 | - // 相対URIが検出された場合、フルに置換する | |
199 | - var baseUri = document.location.href.replace(/[^\/]+$/, ''); | |
200 | - target_element = target_element[0].replace(/\.\//, baseUri).replace(/\.\.\//g, ""); | |
201 | - // Aタグ全体を消去し、再度Aクローズタグの置換を行う | |
202 | - contents = contents.replace(target_tag, ""); | |
203 | - contents = contents.replace(/<\/a>/i, " ( " + target_element.replace(/href=|["']/g, "") + " ) "); | |
204 | - } | |
205 | - | |
206 | - // ブロック要素のタグが存在した場合、改行をその後に挿入します。 | |
207 | - if (document.getElementById("isCoverBlockTag").checked) { | |
208 | - contents = contents.replace(/<(div|h\d|p)[^>]*>/ig, "-----------------------------------------------------------------------------\n"); | |
209 | - contents = contents.replace(/(\n|)<\/(div|h\d|p)>/ig, "\n-----------------------------------------------------------------------------\n"); | |
210 | - } | |
211 | - else { | |
212 | - contents = contents.replace(/<\/(div|h\d|p)>/ig, "\n"); | |
213 | - } | |
214 | - | |
215 | - // 通常のタグすべてを削除する | |
216 | - contents = contents.replace(/<[^>]*>|<\/[^>]*>/ig, ""); | |
217 | - | |
218 | - // 通常のタグ置換後、ニコニコ動画のタグを元に戻す | |
219 | - contents = contents.replace(/<externalvideo src="NC:/g, "<externalvideo src='NC:"); | |
220 | - contents = contents.replace(/:D">/, ":D'>"); | |
221 | - | |
222 | - // 半角を置換する | |
223 | - contents = contents.replace(/ /g, " "); | |
224 | - | |
225 | - return contents; | |
226 | -} | |
227 | - | |
228 | -/** | |
229 | - * エラーメッセージを表示するメソッドです | |
230 | - */ | |
231 | -function showError(){ | |
232 | - alert("XMLファイルが読み込めません!パスの設定を確認してください。"); | |
233 | -} | |
234 | - | |
235 | -/** | |
236 | - * XMLのエスケープを行う関数 | |
237 | - * @param {String} str エスケープを行う文字列 | |
238 | - */ | |
239 | -function xmlAttrContentEscape(str){ | |
240 | - return str.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/"/g, '"').replace(/^[ ]+/mg, " ").replace(/^[\t]+/mg, ""); | |
241 | -} | |
242 | - | |
243 | -/** | |
244 | - * XMLの逆エスケープを行う関数 | |
245 | - * @param {String} str 逆エスケープを行う文字列 | |
246 | - */ | |
247 | -function xmlAttrContentUnescape(str){ | |
248 | - return str.replace(/^[\t]+/mg, "").replace(/^[ ]+/mg, " ").replace(/"/g, '"').replace(/>/g, ">").replace(/</g, "<").replace(/&/g, "&"); | |
249 | -} |
@@ -1,123 +0,0 @@ | ||
1 | -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> | |
2 | -<html> | |
3 | - <head> | |
4 | - <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> | |
5 | - <title>FeedAtom MIXIラッパー</title> | |
6 | - <link rel="stylesheet" href="./js/lunardial/gen_stylesheet.css" type="text/css"/> | |
7 | - <link rel="alternate" type="application/atom+xml" title="Atom" href="./xml/diary.xml"/> | |
8 | - <script type="text/javascript" src="./js/jquery/jquery-1.3.2.min.js"> | |
9 | - </script> | |
10 | - <script type="text/javascript" src="./js/lunardial/feedblog_mixi.js"> | |
11 | - </script> | |
12 | - <style type="text/css"> | |
13 | - body { | |
14 | - font-size: 12px; | |
15 | - line-height: 18px; | |
16 | - color: #004488; | |
17 | - margin-top: 30px; | |
18 | - margin-bottom: 30px; | |
19 | - } | |
20 | - | |
21 | - td.default { | |
22 | - font-size: 12px; | |
23 | - line-height: 18px; | |
24 | - color: #004488; | |
25 | - border: 1px solid #8888ff; | |
26 | - text-align: left; | |
27 | - vertical-align: top; | |
28 | - } | |
29 | - | |
30 | - div { | |
31 | - text-align: left; | |
32 | - } | |
33 | - | |
34 | - div.code { | |
35 | - background: #f8f8ff; | |
36 | - border: 1px solid #c8c8ff; | |
37 | - padding: 10px; | |
38 | - margin: 10px; | |
39 | - margin-left: 0px; | |
40 | - border-left: 5px solid #e8e8ff; | |
41 | - font-size: 12px; | |
42 | - line-height: 18px; | |
43 | - } | |
44 | - | |
45 | - table.pager { | |
46 | - padding: 0px; | |
47 | - margin: 0px; | |
48 | - border: 1px solid #8888ff; | |
49 | - } | |
50 | - | |
51 | - td.pager { | |
52 | - border: 1px solid #8888ff; | |
53 | - padding-left: 3px; | |
54 | - } | |
55 | - </style> | |
56 | - </head> | |
57 | - <body onload="javascript:initLoad();"> | |
58 | - <center> | |
59 | - <table align="center" style="width: 800px;"> | |
60 | - <tbody> | |
61 | - <tr> | |
62 | - <td class="default" colspan="2" style="padding: 5px; text-align: center; vertical-align: bottom;"> | |
63 | - <table style="width: 100%"> | |
64 | - <tbody> | |
65 | - <tr> | |
66 | - <td class="formnavi" style="padding: 0px 20px 0px 20px;"> | |
67 | - 表示するファイル | |
68 | - </td> | |
69 | - <td class="forminput"> | |
70 | - <div id="logSelecter"> | |
71 | - </div> | |
72 | - </td> | |
73 | - <td style="width: 10px;"> | |
74 | - </td> | |
75 | - <td class="formnavi"> | |
76 | - オプション | |
77 | - </td> | |
78 | - </tr> | |
79 | - <tr> | |
80 | - <td class="formnavi" style="padding: 0px 20px 0px 20px;"> | |
81 | - 表示する記事名 | |
82 | - </td> | |
83 | - <td class="forminput"> | |
84 | - <div id="entrySelect"> | |
85 | - </div> | |
86 | - </td> | |
87 | - <td> | |
88 | - </td> | |
89 | - <td class="forminput"> | |
90 | - <input type="checkbox" id="isCoverBlockTag" checked="checked" onclick="entryLoader(document.getElementById('logBox').selectedIndex);">ブロック要素のタグを---で囲む | |
91 | - </td> | |
92 | - </tr> | |
93 | - </tbody> | |
94 | - </table> | |
95 | - <br> | |
96 | - <table style="width: 100%"> | |
97 | - <tbody> | |
98 | - <tr> | |
99 | - <td class="formheader" style="text-align: center; width: 100px;"> | |
100 | - タイトル | |
101 | - </td> | |
102 | - <td class="forminput" style="padding: 0px 5px 0px 3px;"> | |
103 | - <input type="text" id="entry_title" style="width: 100%"> | |
104 | - </td> | |
105 | - </tr> | |
106 | - <tr> | |
107 | - <td class="formheader" style="text-align: center;"> | |
108 | - 本文 | |
109 | - </td> | |
110 | - <td class="forminput" style="padding: 0px 5px 0px 3px;"> | |
111 | - <textarea id="entry_stdin" rows="20" style="width: 100%"> | |
112 | - </textarea> | |
113 | - </td> | |
114 | - </tr> | |
115 | - </tbody> | |
116 | - </table> | |
117 | - </td> | |
118 | - </tr> | |
119 | - </tbody> | |
120 | - </table> | |
121 | - </center> | |
122 | - </body> | |
123 | -</html> |