OSDN Git Service

translated by yu
[nucleus-jp/nucleus-jp-ancient.git] / utf8 / nucleus / bookmarklet.php
1 <?php\r
2 /**\r
3   * Nucleus: PHP/MySQL Weblog CMS (http://nucleuscms.org/) \r
4   * Copyright (C) 2002-2005 The Nucleus Group\r
5   *\r
6   * This program is free software; you can redistribute it and/or\r
7   * modify it under the terms of the GNU General Public License\r
8   * as published by the Free Software Foundation; either version 2\r
9   * of the License, or (at your option) any later version.\r
10   * (see nucleus/documentation/index.html#license for more info)\r
11   *\r
12   * This script allows adding items to Nucleus through bookmarklets. The member must be logged in\r
13   * in order to use this.\r
14   *\r
15   * $Id: bookmarklet.php,v 1.3 2005-03-12 06:19:03 kimitake Exp $\r
16   $ $NucleusJP$\r
17   */\r
18 \r
19 // bookmarklet is part of admin area (might need XML-RPC)\r
20 $CONF = array();\r
21 $CONF['UsingAdminArea'] = 1;\r
22 \r
23 // include all classes and config data \r
24 include('../config.php');\r
25 \r
26 $action = requestVar('action');\r
27 \r
28 if ($action == 'contextmenucode') {\r
29         bm_doContextMenuCode();\r
30         exit;\r
31 }\r
32 \r
33 if (!$member->isLoggedIn()) {\r
34         bm_loginAndPassThrough();\r
35         exit;\r
36 }\r
37 \r
38 // on successfull login\r
39 if (($action == 'login') && ($member->isLoggedIn()))\r
40         $action = requestVar('nextaction');\r
41 if ($action == '')\r
42         $action = 'add';\r
43         \r
44 sendContentType('application/xhtml+xml', 'bookmarklet-'.$action);       \r
45 \r
46 // check ticket\r
47 $action = strtolower($action);\r
48 $aActionsNotToCheck = array('login', 'add', 'edit');\r
49 if (!in_array($action, $aActionsNotToCheck))\r
50 {\r
51         if (!$manager->checkTicket())\r
52                 bm_doError(_ERROR_BADTICKET);\r
53\r
54 \r
55 \r
56 // find out what to do\r
57 switch ($action) {\r
58         case 'additem':\r
59                 bm_doAddItem();         // adds the item for real\r
60                 break;\r
61         case 'edit':\r
62                 bm_doEditForm();        // shows the edit item form\r
63                 break;\r
64         case 'edititem':                // edits the item for real\r
65                 bm_doEditItem();\r
66                 break;\r
67         case 'login':                   // on login, 'action' gets changed to 'nextaction'\r
68                 bm_doError('Something went wrong');\r
69                 break;\r
70         case 'add':\r
71         default:\r
72                 bm_doShowForm();        // shows the fill in form\r
73                 break;\r
74 }\r
75         \r
76 function bm_doAddItem() {\r
77         global $member, $manager, $CONF;\r
78         \r
79         $manager->loadClass('ITEM');\r
80         $result = ITEM::createFromRequest();\r
81         \r
82         if ($result['status'] == 'error')\r
83                 bm_doError($result['message']);\r
84 \r
85         $blogid = getBlogIDFromItemID($result['itemid']);\r
86         $blog =& $manager->getBlog($blogid);\r
87         \r
88         if ($result['status'] == 'newcategory') {\r
89                 $message = 'アイテムは追加され、新しいカテゴリーが作成されました。 <a href="index.php?action=categoryedit&amp;blogid='.$blogid.'&amp;catid='.$result['catid'].'" onclick="if (event &amp;&amp; event.preventDefault) event.preventDefault(); window.open(this.href); return false;" title="Opens in new window">ここをクリックしてカテゴリーの名前と説明を編集してください。</a>';\r
90                 $extrahead = '';\r
91         } elseif ((postVar('actiontype') == 'addnow') && $blog->pingUserland()) {\r
92                 $message = 'アイテムの追加に成功しました。現在weblogs.comにpingを送っています。しばらくの間お待ちください...';\r
93                 $pingUrl = $manager->addTicketToUrl($CONF['AdminURL'] . 'index.php?action=sendping&blogid=' . intval($blogid));\r
94                 $extrahead = '<meta http-equiv="refresh" content="1; url=' . htmlspecialchars($pingUrl). '" />';\r
95         } else {\r
96                 $message = _ITEM_ADDED;\r
97                 $extrahead = '';\r
98         }\r
99         \r
100         bm_message(_ITEM_ADDED, _ITEM_ADDED, $message,$extrahead);\r
101 }\r
102 \r
103 function bm_doEditItem() {\r
104         global $member, $manager, $CONF;\r
105         \r
106         $itemid         = intRequestVar('itemid');\r
107         $catid          = postVar('catid');\r
108         \r
109         // only allow if user is allowed to alter item\r
110         if (!$member->canUpdateItem($itemid, $catid))\r
111                 bm_doError(_ERROR_DISALLOWED);\r
112 \r
113         $body           = postVar('body');\r
114         $title          = postVar('title');\r
115         $more           = postVar('more');\r
116         $closed         = intPostVar('closed');\r
117         $actiontype = postVar('actiontype');\r
118         \r
119         // redirect to admin area on delete (has delete confirmation)\r
120         if ($actiontype == 'delete') {\r
121                 redirect('index.php?action=itemdelete&itemid='.$itemid);\r
122                 exit;   \r
123         }\r
124         \r
125         // create new category if needed (only on edit/changedate)\r
126         if (strstr($catid,'newcat')) {\r
127                 // get blogid \r
128                 list($blogid) = sscanf($catid,"newcat-%d");\r
129 \r
130                 // create\r
131                 $blog =& $manager->getBlog($blogid);\r
132                 $catid = $blog->createNewCategory();\r
133 \r
134                 // show error when sth goes wrong\r
135                 if (!$catid) \r
136                         bm_doError('Could not create new category');\r
137         } \r
138 \r
139         // only edit action is allowed for bookmarklet edit\r
140         switch ($actiontype) {\r
141                 case 'changedate':\r
142                         $publish = 1;\r
143                         $wasdraft = 0;\r
144                         $timestamp = mktime(postVar('hour'), postVar('minutes'), 0, postVar('month'), postVar('day'), postVar('year'));\r
145                         break;\r
146                 case 'edit':\r
147                         $publish = 1;\r
148                         $wasdraft = 0;\r
149                         $timestamp = 0;\r
150                         break;\r
151                 default:\r
152                         bm_doError('Something went wrong');\r
153         }\r
154         \r
155         // update item for real\r
156         ITEM::update($itemid, $catid, $title, $body, $more, $closed, $wasdraft, $publish, $timestamp);\r
157         \r
158         // show success message\r
159         if ($catid != intPostVar('catid'))\r
160                 bm_message(_ITEM_UPDATED, _ITEM_UPDATED, 'アイテムは追加され、新しいカテゴリーが作成されました。<a href="index.php?action=categoryedit&amp;blogid='.$blog->getID().'&amp;catid='.$catid.'" onclick="if (event &amp;&amp; event.preventDefault) event.preventDefault(); window.open(this.href); return false;" title="Opens in new window">ここをクリックしてカテゴリーの名前と説明を編集してください。</a>', '');\r
161         else\r
162                 bm_message(_ITEM_UPDATED, _ITEM_UPDATED, _ITEM_UPDATED, '');\r
163 }\r
164 \r
165 function bm_loginAndPassThrough() {\r
166 \r
167         $blogid = intRequestVar('blogid');\r
168         $log_text = requestVar('logtext');\r
169         $log_link = requestVar('loglink');\r
170         $log_linktitle = requestVar('loglinktitle');\r
171         \r
172         ?>\r
173 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">\r
174         <html xmlns="http://www.w3.org/1999/xhtml">\r
175         <head>\r
176                 <meta http-equiv="Content-Type" content="text/html; charset=<?php echo _CHARSET ?>" />\r
177                 <title>Nucleus</title>\r
178                 <?php bm_style(); ?>\r
179         </head>\r
180         <body>\r
181         <h1><?php echo _LOGIN_PLEASE?></h1>\r
182         \r
183         <form method="post" action="bookmarklet.php">\r
184         <p>\r
185                 <input name="action" value="login" type="hidden" />\r
186                 <input name="blogid" value="<?php echo  htmlspecialchars($blogid) ?>" type="hidden" />\r
187                 <input name="logtext" value="<?php echo  htmlspecialchars($log_text) ?>" type="hidden" />\r
188                 <input name="loglink" value="<?php echo  htmlspecialchars($log_link) ?>" type="hidden" />\r
189                 <input name="loglinktitle" value="<?php echo  htmlspecialchars($log_linktitle) ?>" type="hidden" />\r
190                 <?php echo _LOGINFORM_NAME?>:\r
191                 <br /><input name="login" />\r
192                 <br /><?php echo _LOGINFORM_PWD?>:\r
193                 <br /><input name="password" type="password" />\r
194                 <br /><br />\r
195                 <br /><input type="submit" value="<?php echo _LOGIN?>" />\r
196         </p>\r
197         </form>\r
198         <p><a href="bookmarklet.php" onclick="window.close();"><?php echo _POPUP_CLOSE?></a></p>\r
199         </body>\r
200         </html>\r
201         <?php\r
202 }\r
203 \r
204 function bm_doShowForm() {\r
205         global $member;\r
206         \r
207         $blogid = intRequestVar('blogid');\r
208         $log_text = trim(requestVar('logtext'));\r
209         $log_link = requestVar('loglink');\r
210         $log_linktitle = requestVar('loglinktitle');\r
211 \r
212         $log_text = uniDecode($log_text,_CHARSET);\r
213         $log_linktitle = uniDecode($log_linktitle,_CHARSET);\r
214         \r
215         if (!BLOG::existsID($blogid))\r
216                 bm_doError(_ERROR_NOSUCHBLOG);\r
217 \r
218         if (!$member->isTeamMember($blogid))\r
219                 bm_doError(_ERROR_NOTONTEAM);\r
220         \r
221         $logje = '';\r
222         if ($log_text)\r
223                 $logje .= '<blockquote><div>"' . htmlspecialchars($log_text) .'"</div></blockquote>' . "\n";\r
224         if (!$log_linktitle)\r
225                 $log_linktitle = $log_link;\r
226         if ($log_link) \r
227                 $logje .= '<a href="'. htmlspecialchars($log_link) . '">'. htmlspecialchars($log_linktitle).'</a>';\r
228                 \r
229 \r
230         $item['body'] = $logje;\r
231         $item['title'] = htmlspecialchars($log_linktitle);\r
232 \r
233         $factory = new PAGEFACTORY($blogid);\r
234         $factory->createAddForm('bookmarklet',$item);\r
235 }\r
236 \r
237 function bm_doEditForm() {\r
238         global $member, $manager;\r
239         \r
240         $itemid = intRequestVar('itemid');\r
241         \r
242         if (!$manager->existsItem($itemid, 0, 0)) \r
243                 bm_doError(_ERROR_NOSUCHITEM);\r
244                 \r
245         if (!$member->canAlterItem($itemid))\r
246                 bm_doError(_ERROR_DISALLOWED);\r
247                 \r
248         $item =& $manager->getItem($itemid,1,1);\r
249         $blog =& $manager->getBlog(getBlogIDFromItemID($itemid));\r
250         \r
251         $manager->notify('PrepareItemForEdit', array('item' => &$item));\r
252 \r
253         if ($blog->convertBreaks()) {\r
254                 $item['body'] = removeBreaks($item['body']);\r
255                 $item['more'] = removeBreaks($item['more']);\r
256         }\r
257 \r
258         $formfactory = new PAGEFACTORY($blog->getID());\r
259         $formfactory->createEditForm('bookmarklet',$item);              \r
260 \r
261 }\r
262 \r
263 function bm_doError($msg) {\r
264         bm_message(_ERROR,_ERRORMSG,$msg);\r
265         die;\r
266 }\r
267 \r
268 function bm_message($title, $head, $msg, $extrahead = '') {\r
269         ?>\r
270 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">\r
271         <html xmlns="http://www.w3.org/1999/xhtml">\r
272         <head>\r
273                 <meta http-equiv="Content-Type" content="text/html; charset=<?php echo _CHARSET ?>" />\r
274                 <title><?php echo  $title ?></title>\r
275                 <?php bm_style(); ?>\r
276                 <?php echo $extrahead?>\r
277         </head>\r
278         <body>\r
279         <h1><?php echo  $head ?></h1>\r
280         <p><?php echo  $msg ?></p>\r
281         <p><a href="bookmarklet.php" onclick="window.close();"><?php echo _POPUP_CLOSE?></a></p>\r
282         </body>\r
283         </html>\r
284         \r
285         <?php }\r
286 \r
287 function bm_style() {\r
288         echo '<link rel="stylesheet" type="text/css" href="styles/bookmarklet.css" />';\r
289         echo '<link rel="stylesheet" type="text/css" href="styles/addedit.css" />';     \r
290 }\r
291 \r
292 function bm_doContextMenuCode() {\r
293         global $CONF;\r
294         ?>\r
295 <script type="text/javascript" defer="defer">\r
296 doc=external.menuArguments.document;\r
297 lt=escape(doc.selection.createRange().text);\r
298 loglink=escape(external.menuArguments.location.href);\r
299 loglinktitle=escape(doc.title);\r
300 wingm=window.open('<?php echo $CONF['AdminURL']?>bookmarklet.php?blogid=<?php echo intGetVar('blogid')?>&logtext='+lt+'&loglink='+loglink+'&loglinktitle='+loglinktitle,'nucleusbm','scrollbars=yes,width=600,height=500,left=10,top=10,status=yes,resizable=yes');\r
301 wingm.focus();\r
302 </script>       \r
303         <?php\r
304 }\r
305 \r
306 function uniDecode($str,$charcode){\r
307   $text = preg_replace_callback("/%u[0-9A-Za-z]{4}/",toUtf8,$str);\r
308   return mb_convert_encoding($text, $charcode, 'utf-8');\r
309 }\r
310 function toUtf8($ar){\r
311   foreach($ar as $val){\r
312     $val = intval(substr($val,2),16);\r
313     if($val < 0x7F){        // 0000-007F\r
314         $c .= chr($val);\r
315     }elseif($val < 0x800) { // 0080-0800\r
316         $c .= chr(0xC0 | ($val / 64));\r
317         $c .= chr(0x80 | ($val % 64));\r
318     }else{                // 0800-FFFF\r
319         $c .= chr(0xE0 | (($val / 64) / 64));\r
320         $c .= chr(0x80 | (($val / 64) % 64));\r
321         $c .= chr(0x80 | ($val % 64));\r
322     }\r
323   }\r
324   return $c;\r
325 }\r
326 \r
327 ?>\r