5 * EDIT Toolbar Initialization.
6 * The default/themes/toolbar.js is from Mediawiki, this PHP is written from scratch.
9 * - save-preview and formatting buttons from mediawiki
10 * - Search&Replace from walterzorn.de
11 * - pageinsert popup by Reini Urban (TODO: should be a pulldown, use acdropdown)
16 function EditToolbar() {
19 $this->tokens = array();
21 //FIXME: enable Undo button for all other buttons also, not only the search/replace button
22 if (JS_SEARCHREPLACE) {
23 $this->tokens['JS_SEARCHREPLACE'] = 1;
24 $undo_btn = $WikiTheme->getImageURL("ed_undo.png");
25 $undo_d_btn = $WikiTheme->getImageURL("ed_undo_d.png");
26 // JS_SEARCHREPLACE from walterzorn.de
28 uri_undo_btn = '".$undo_btn."'
29 msg_undo_alt = '"._("Undo")."'
30 uri_undo_d_btn = '".$undo_d_btn."'
31 msg_undo_d_alt = '"._("Undo disabled")."'
32 msg_do_undo = '"._("Operation undone")."'
33 msg_replfound = '"._("Substring \"\\1\" found \\2 times. Replace with \"\\3\"?")."'
34 msg_replnot = '"._("String \"%s\" not found.")."'
35 msg_repl_title = '"._("Search & Replace")."'
36 msg_repl_search = '"._("Search for")."'
37 msg_repl_replace_with = '"._("Replace with")."'
38 msg_repl_ok = '"._("OK")."'
39 msg_repl_close = '"._("Close")."'
41 if (empty($WikiTheme->_headers_printed)) {
42 $WikiTheme->addMoreHeaders($js);
43 $WikiTheme->addMoreAttr('body', "SearchReplace"," onload='define_f()'");
44 } else { // from an actionpage: WikiBlog, AddComment, WikiForum
48 $WikiTheme->addMoreAttr('body', "editfocus", "document.getElementById('edit-content]').editarea.focus()");
51 if (ENABLE_EDIT_TOOLBAR) {
52 $js = JavaScript('',array('src' => $WikiTheme->_findData("toolbar.js")));
53 if (empty($WikiTheme->_headers_printed))
54 $WikiTheme->addMoreHeaders($js);
55 else { // from an actionpage: WikiBlog, AddComment, WikiForum
57 printXML(JavaScript('define_f()'));
61 require_once("lib/WikiPluginCached.php");
62 $cache = WikiPluginCached::newCache();
63 $dbi = $GLOBALS['request']->getDbh();
64 // regenerate if number of pages changes (categories, pages, templates)
65 $key = $dbi->numPages();
66 $key .= '+categories+plugin';
67 if (TOOLBAR_PAGELINK_PULLDOWN) {
70 if (TOOLBAR_TEMPLATE_PULLDOWN) {
71 $key .= "+templates_" . $dbi->getTimestamp();
73 $id = $cache->generateId($key);
74 $content = $cache->get($id, 'toolbarcache');
76 if (!empty($content)) {
77 $this->tokens['EDIT_TOOLBAR'] =& $content;
79 $content = $this->_generate();
80 // regenerate buttons every 3600 seconds
81 $cache->save($id, $content, '+3600', 'toolbarcache');
82 $this->tokens['EDIT_TOOLBAR'] =& $content;
86 function getTokens () {
90 function _generate () {
91 global $WikiTheme, $request;
93 $toolbar = "document.writeln(\"<div class=\\\"edit-toolbar\\\" id=\\\"toolbar\\\">\");\n";
94 $accessKeyPrefix = $WikiTheme->tooltipAccessKeyPrefix();
96 if (ENABLE_EDIT_TOOLBAR) {
97 $username = $request->_user->UserName();
98 if (DISABLE_MARKUP_WIKIWORD or (!isWikiWord($username))) {
99 $username = '['.$username.']';
101 $signature = " --".$username." ".CTime();
104 "image"=>"ed_format_bold.png",
107 "sample"=>_("Bold text"),
108 "title"=>_("Bold text [alt-b]")),
109 array("image"=>"ed_format_italic.png",
112 "sample"=>_("Italic text"),
113 "title"=>_("Italic text [alt-i]")),
114 array("image"=>"ed_format_strike.png",
117 "sample"=>_("Strike-through text"),
118 "title"=>_("Strike")),
119 array("image"=>"ed_format_color.png",
120 "open"=>"%color=green% ",
122 "sample"=>_("Color text"),
123 "title"=>_("Color")),
124 array("image"=>"ed_pagelink.png",
127 "sample"=>_("PageName|optional label"),
128 "title"=>_("Link to page")),
129 array("image"=>"ed_link.png",
132 "sample"=>_("http://www.example.com|optional label"),
133 "title"=>_("External link (remember http:// prefix)")),
134 array("image"=>"ed_headline.png",
137 "sample"=>_("Headline text"),
138 "title"=>_("Level 1 headline")),
139 array("image"=>"ed_nowiki.png",
140 "open"=>"\\<verbatim\\>\\n",
141 "close"=>"\\n\\</verbatim\\>",
142 "sample"=>_("Insert non-formatted text here"),
143 "title"=>_("Ignore wiki formatting")),
144 array("image"=>"ed_sig.png",
145 "open" => $signature,
148 "title"=>_("Your signature")),
149 array("image"=>"ed_hr.png",
150 "open"=>"\\n----\\n",
153 "title"=>_("Horizontal line")),
154 array("image"=>"ed_table.png",
155 "open"=>"\\n{| class=\"bordered\"\\n|+ This is the table caption\\n|= This is the table summary\\n|-\\n| Cell A1 || Cell B1 || Cell C1\\n|-\\n| Cell A2 || Cell B2 || Cell C2\\n|-\\n| Cell A3 || Cell B3 || Cell C3\\n|}\\n",
158 "title"=>_("Sample table")),
159 array("image"=>"ed_enumlist.png",
160 "open"=>"\\n# Item 1\\n# Item 2\\n# Item 3\\n",
163 "title"=>_("Enumeration")),
164 array("image"=>"ed_list.png",
165 "open"=>"\\n* Item 1\\n* Item 2\\n* Item 3\\n",
169 array("image"=>"ed_toc.png",
170 "open"=>"<<CreateToc with_toclink||=1>>\\n",
173 "title"=>_("Table of Contents")),
174 array("image"=>"ed_redirect.png",
175 "open"=>"<<RedirectTo page=\"",
177 "sample"=>_("Page Name"),
178 "title"=>_("Redirect")),
179 array("image"=>"ed_templateplugin.png",
182 "sample"=>_("Template Name"),
183 "title"=>_("Template"))
185 $btn = new SubmitImageButton(_("Save"), "edit[save]", 'toolbar',
186 $WikiTheme->getImageURL("ed_save.png"));
187 $btn->addTooltip(_("Save"));
188 $btn->setAccesskey("s");
189 $toolbar .= ('document.writeln("'.addslashes($btn->asXml()).'");'."\n");
190 // preview not supported yet on Wikiblog
191 if (empty($WikiTheme->_headers_printed)) {
192 $btn = new SubmitImageButton(_("Preview"), "edit[preview]", 'toolbar',
193 $WikiTheme->getImageURL("ed_preview.png"));
194 $btn->addTooltip(_("Preview"));
195 $btn->setAccesskey("p");
196 $toolbar .= ('document.writeln("'.addslashes($btn->asXml()).'");'."\n");
199 foreach ($toolarray as $tool) {
201 $image = $WikiTheme->getImageURL($tool["image"]);
202 $open = $tool["open"];
203 $close = $tool["close"];
204 $sample = addslashes( $tool["sample"] );
205 // Note that we use the title both for the ALT tag and the TITLE tag of the image.
206 // Older browsers show a "speedtip" type message only for ALT.
207 // Ideally these should be different, realistically they
208 // probably don't need to be.
209 $tool = $WikiTheme->fixAccesskey($tool);
210 $title = addslashes( $tool["title"] );
211 $toolbar .= ("addTagButton('$image','$title','$open','$close','$sample');\n");
213 $toolbar .= ("addInfobox('"
214 . addslashes( _("Click a button to get an example text") )
218 if (JS_SEARCHREPLACE) {
219 $undo_d_btn = $WikiTheme->getImageURL("ed_undo_d.png");
220 //$redo_btn = $WikiTheme->getImageURL("ed_redo.png");
221 $sr_btn = $WikiTheme->getImageURL("ed_replace.png");
222 //TODO: generalize the UNDO button and fix it for Search & Replace
223 $sr_html = HTML(HTML::img
224 (array('class'=>"toolbar",
227 'title'=>_("Undo Search & Replace"),
228 'alt' =>_("Undo Search & Replace"),
229 //'disabled'=>"disabled", //non-XHTML conform
230 //'onfocus' =>"if(this.blur && undo_buffer_index==0) this.blur()",
231 'onclick' =>"do_undo()")),
233 (array('class'=>"toolbar",
235 'alt' =>_("Search & Replace"),
236 'title'=>_("Search & Replace")." [$accessKeyPrefix-h]",
238 'onclick'=>"replace()")));
243 //TODO: Delegate this to run-time with showing an hidden input at the right, and do
244 // a seperate moacdropdown and xmlrpc:titleSearch.
246 // Button to generate categories, display in extra window as popup and insert
247 $sr_html = HTML($sr_html, $this->categoriesPulldown());
248 // Button to generate plugins, display in extra window as popup and insert
249 $sr_html = HTML($sr_html, $this->pluginPulldown());
251 // Button to generate pagenames, display in extra window as popup and insert
252 if (TOOLBAR_PAGELINK_PULLDOWN)
253 $sr_html = HTML($sr_html, $this->pagesPulldown(TOOLBAR_PAGELINK_PULLDOWN));
254 // Button to insert from an template, display pagename in extra window as popup and insert
255 if (TOOLBAR_TEMPLATE_PULLDOWN)
256 $sr_html = HTML($sr_html, $this->templatePulldown(TOOLBAR_TEMPLATE_PULLDOWN));
258 // Button to add images, display in extra window as popup and insert
259 if (TOOLBAR_IMAGE_PULLDOWN)
260 $sr_html = HTML($sr_html, $this->imagePulldown(TOOLBAR_IMAGE_PULLDOWN));
262 // don't use document.write for replace, otherwise self.opener is not defined.
263 $toolbar_end = "document.writeln(\"</div>\");";
265 return HTML(Javascript($toolbar),
266 "\n", $sr_html, "\n",
267 Javascript($toolbar_end));
269 return HTML(Javascript($toolbar . $toolbar_end));
273 function categoriesPulldown() {
276 require_once('lib/TextSearchQuery.php');
277 $dbi =& $GLOBALS['request']->_dbi;
278 // KEYWORDS formerly known as $KeywordLinkRegexp
279 $pages = $dbi->titleSearch(new TextSearchQuery(KEYWORDS, true));
281 $categories = array();
282 while ($p = $pages->next()) {
283 $page = $p->getName();
284 $categories[] = "['$page', '%5B%5B".$page."%5D%5D']";
286 if (!$categories) return '';
287 // Ensure this to be inserted at the very end. Hence we added the id to the function.
288 $more_buttons = HTML::img(array('class'=> "toolbar",
289 'id' => 'tb-categories',
290 'src' => $WikiTheme->getImageURL("ed_category.png"),
291 'title'=>_("AddCategory"),
292 'alt'=>"AddCategory", // to detect this at js
293 'onclick'=>"showPulldown('".
294 _("Insert Categories (double-click)")
295 ."',[".join(",",$categories)."],'"
297 ._("Close")."','tb-categories')"));
298 return HTML("\n", $more_buttons);
303 // result is cached. Esp. the args are expensive
304 function pluginPulldown() {
307 $plugin_dir = 'lib/plugin';
308 if (defined('PHPWIKI_DIR'))
309 $plugin_dir = PHPWIKI_DIR . "/$plugin_dir";
310 $pd = new fileSet($plugin_dir, '*.php');
311 $plugins = $pd->getFiles();
314 if (!empty($plugins)) {
316 require_once("lib/WikiPlugin.php");
317 $w = new WikiPluginLoader;
318 foreach ($plugins as $plugin) {
319 $pluginName = str_replace(".php", "", $plugin);
320 $p = $w->getPlugin($pluginName, false); // second arg?
321 // trap php files which aren't WikiPlugin~s
322 if (strtolower(substr(get_parent_class($p), 0, 10)) == 'wikiplugin') {
324 $desc = $p->getArgumentsDescription();
325 $src = array("\n",'"',"'",'|','[',']','\\');
326 $replace = array('%0A','%22','%27','%7C','%5B','%5D','%5C');
327 $desc = str_replace("<br />",' ',$desc->asXML());
329 $plugin_args = ' '.str_replace($src, $replace, $desc);
330 $toinsert = "%0A<<".$pluginName.$plugin_args.">>"; // args?
331 $plugin_js .= ",['$pluginName','$toinsert']";
334 $plugin_js = substr($plugin_js, 1);
335 $more_buttons = HTML::img(array('class'=>"toolbar",
336 'id' => 'tb-plugins',
337 'src' => $WikiTheme->getImageURL("ed_plugins.png"),
338 'title'=>_("AddPlugin"),
339 'alt'=>_("AddPlugin"),
340 'onclick'=>"showPulldown('".
341 _("Insert Plugin (double-click)")
342 ."',[".$plugin_js."],'"
344 ._("Close")."','tb-plugins')"));
345 return HTML("\n", $more_buttons);
350 // result is cached. Esp. the args are expensive
351 function pagesPulldown($query, $case_exact=false, $regex='auto') {
352 require_once('lib/TextSearchQuery.php');
353 $dbi =& $GLOBALS['request']->_dbi;
354 $page_iter = $dbi->titleSearch(new TextSearchQuery($query, $case_exact, $regex));
355 if ($page_iter->count()) {
358 while ($p = $page_iter->next()) {
359 $page = $p->getName();
360 if (DISABLE_MARKUP_WIKIWORD or (!isWikiWord($page)))
361 $pages[] = "['$page', '%5B".$page."%5D']";
363 $pages[] = "['$page', '$page']";
365 return HTML("\n", HTML::img(array('class'=>"toolbar",
367 'src' => $WikiTheme->getImageURL("ed_pages.png"),
368 'title'=>_("AddPageLink"),
369 'alt'=>_("AddPageLink"),
370 'onclick'=>"showPulldown('".
371 _("Insert PageLink (double-click)")
372 ."',[".join(",",$pages)."],'"
374 ._("Close")."','tb-pages')")));
379 // result is cached. Esp. the args are expensive
380 function imagePulldown($query, $case_exact=false, $regex='auto') {
384 if (defined('UPLOAD_FILE_PATH'))
385 $image_dir = UPLOAD_FILE_PATH . "/$image_dir";
386 $pd = new fileSet($image_dir, '*');
387 $images = $pd->getFiles();
390 if (!empty($images)) {
392 foreach ($images as $image) {
393 // Select only files ending in ".png", ".gif", ".jpg", ".jpeg"
394 if (is_image($image)) {
395 $image_js .= ",['$image','{{".$image."}}']";
398 $image_js = substr($image_js, 1);
399 $more_buttons = HTML::img(array('class'=>"toolbar",
401 'src' => $WikiTheme->getImageURL("ed_image.png"),
402 'title'=>_("AddImage"),
403 'alt'=>_("AddImage"),
404 'onclick'=>"showPulldown('".
405 _("Insert Image (double-click)")
406 ."',[".$image_js."],'"
408 ._("Close")."','tb-images')"));
409 return HTML("\n", $more_buttons);
414 // result is cached. Esp. the args are expensive
416 function templatePulldown($query, $case_exact=false, $regex='auto') {
418 require_once('lib/TextSearchQuery.php');
419 $dbi =& $request->_dbi;
420 $page_iter = $dbi->titleSearch(new TextSearchQuery($query, $case_exact, $regex));
422 if ($page_iter->count()) {
425 while ($p = $page_iter->next()) {
426 $rev = $p->getCurrentRevision();
427 $toinsert = str_replace(array("\n",'"'), array('_nl','_quot'), $rev->_get_content());
428 //$toinsert = str_replace("\n",'\n',addslashes($rev->_get_content()));
429 $pages_js .= ",['".$p->getName()."','_nl$toinsert']";
431 $pages_js = substr($pages_js, 1);
432 if (!empty($pages_js))
433 return HTML("\n", HTML::img
434 (array('class'=>"toolbar",
435 'id' => 'tb-templates',
436 'src' => $WikiTheme->getImageURL("ed_template.png"),
437 'title'=>_("AddTemplate"),
438 'alt'=>_("AddTemplate"),
439 'onclick'=>"showPulldown('".
440 _("Insert Template (double-click)")
441 ."',[".$pages_js."],'"
443 ._("Close")."','tb-templates')")));
451 $Log: not supported by cvs2svn $
452 Revision 1.17 2008/08/06 09:25:56 vargenau
453 Button to add images, display in extra window as popup and insert
455 Revision 1.16 2008/08/03 15:21:45 vargenau
456 Less arguments for CreateToc button
458 Revision 1.15 2008/04/02 18:07:05 vargenau
459 New Edit Toolbar icons for TOC and Color text
461 Revision 1.14 2008/02/19 19:07:23 vargenau
462 More icons for toolbar
464 Revision 1.13 2007/07/14 12:03:12 rurban
467 Revision 1.12 2007/06/02 18:23:36 rurban
470 Revision 1.11 2007/02/17 14:16:21 rurban
471 move define_f after toolbar.js
473 Revision 1.10 2007/01/07 18:42:19 rurban
474 Improve id: edit: to edit-. Move search&replace js from body (defined in EditToolbar) to the toolbar.js. Support actionpages. Add tb-name argument to showPulldown
476 Revision 1.9 2007/01/02 13:18:26 rurban
477 fix id to edit:content
479 Revision 1.8 2006/12/22 00:17:06 rurban
480 add time to signature
482 Revision 1.7 2006/09/06 05:45:26 rurban
483 use html tags for emphasis. workaround ^* problem
485 Revision 1.6 2006/08/30 05:25:40 rurban
486 Handle inserting DISABLE_MARKUP_WIKIWORD and non wikiword links.
488 Revision 1.5 2005/10/29 14:16:17 rurban
491 Revision 1.4 2005/09/29 23:07:58 rurban
494 Revision 1.3 2005/09/26 06:25:50 rurban
495 EditToolbar enhancements by Thomas Harding: add plugins args, properly quote control chars. added plugin method getArgumentsDescription to override the default description string
497 Revision 1.3 2005/09/22 13:40:00 tharding
498 add modules arguments
500 Revision 1.2 2005/05/06 18:43:41 rurban
501 add AddTemplate EditToolbar icon
503 Revision 1.1 2005/01/25 15:19:09 rurban
504 extract Toolbar code from editpage.php
511 // c-hanging-comment-ender-p: nil
512 // indent-tabs-mode: nil