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' . (isBrowserSafari() ? '+safari' : '');
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! Header A !! Header B !! Header C\\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 /* Fails with Chrome */
214 if (!isBrowserSafari()) {
215 $toolbar .= ("addInfobox('"
216 . addslashes( _("Click a button to get an example text") )
221 if (JS_SEARCHREPLACE) {
222 $undo_d_btn = $WikiTheme->getImageURL("ed_undo_d.png");
223 //$redo_btn = $WikiTheme->getImageURL("ed_redo.png");
224 $sr_btn = $WikiTheme->getImageURL("ed_replace.png");
225 //TODO: generalize the UNDO button and fix it for Search & Replace
226 $sr_html = HTML(HTML::img
227 (array('class'=>"toolbar",
230 'title'=>_("Undo Search & Replace"),
231 'alt' =>_("Undo Search & Replace"),
232 //'disabled'=>"disabled", //non-XHTML conform
233 //'onfocus' =>"if(this.blur && undo_buffer_index==0) this.blur()",
234 'onclick' =>"do_undo()")),
236 (array('class'=>"toolbar",
238 'alt' =>_("Search & Replace"),
239 'title'=>_("Search & Replace")." [$accessKeyPrefix-h]",
241 'onclick'=>"replace()")));
246 //TODO: Delegate this to run-time with showing an hidden input at the right, and do
247 // a seperate moacdropdown and xmlrpc:titleSearch.
249 // Button to generate categories, display in extra window as popup and insert
250 $sr_html = HTML($sr_html, $this->categoriesPulldown());
251 // Button to generate plugins, display in extra window as popup and insert
252 $sr_html = HTML($sr_html, $this->pluginPulldown());
254 // Button to generate pagenames, display in extra window as popup and insert
255 if (TOOLBAR_PAGELINK_PULLDOWN)
256 $sr_html = HTML($sr_html, $this->pagesPulldown(TOOLBAR_PAGELINK_PULLDOWN));
257 // Button to insert from an template, display pagename in extra window as popup and insert
258 if (TOOLBAR_TEMPLATE_PULLDOWN)
259 $sr_html = HTML($sr_html, $this->templatePulldown(TOOLBAR_TEMPLATE_PULLDOWN));
261 // Button to add images, display in extra window as popup and insert
262 if (TOOLBAR_IMAGE_PULLDOWN)
263 $sr_html = HTML($sr_html, $this->imagePulldown(TOOLBAR_IMAGE_PULLDOWN));
265 // don't use document.write for replace, otherwise self.opener is not defined.
266 $toolbar_end = "document.writeln(\"</div>\");";
268 return HTML(Javascript($toolbar),
269 "\n", $sr_html, "\n",
270 Javascript($toolbar_end));
272 return HTML(Javascript($toolbar . $toolbar_end));
276 function categoriesPulldown() {
279 require_once('lib/TextSearchQuery.php');
280 $dbi =& $GLOBALS['request']->_dbi;
281 // KEYWORDS formerly known as $KeywordLinkRegexp
282 $pages = $dbi->titleSearch(new TextSearchQuery(KEYWORDS, true));
284 $categories = array();
285 while ($p = $pages->next()) {
286 $page = $p->getName();
287 if (defined('GFORGE') and GFORGE) {
288 $categories[] = "['$page', '%5B%5B".$page."%5D%5D']";
289 } else if (DISABLE_MARKUP_WIKIWORD or (!isWikiWord($page))) {
290 $categories[] = "['$page', '%5B".$page."%5D']";
292 $categories[] = "['$page', '$page']";
295 if (!$categories) return '';
296 // Ensure this to be inserted at the very end. Hence we added the id to the function.
297 $more_buttons = HTML::img(array('class'=> "toolbar",
298 'id' => 'tb-categories',
299 'src' => $WikiTheme->getImageURL("ed_category.png"),
300 'title'=>_("AddCategory"),
301 'alt'=>"AddCategory", // to detect this at js
302 'onclick'=>"showPulldown('".
303 _("Insert Categories (double-click)")
304 ."',[".join(",",$categories)."],'"
306 ._("Close")."','tb-categories')"));
307 return HTML("\n", $more_buttons);
312 // result is cached. Esp. the args are expensive
313 function pluginPulldown() {
316 $plugin_dir = 'lib/plugin';
317 if (defined('PHPWIKI_DIR'))
318 $plugin_dir = PHPWIKI_DIR . "/$plugin_dir";
319 $pd = new fileSet($plugin_dir, '*.php');
320 $plugins = $pd->getFiles();
323 if (!empty($plugins)) {
325 require_once("lib/WikiPlugin.php");
326 $w = new WikiPluginLoader;
327 foreach ($plugins as $plugin) {
328 $pluginName = str_replace(".php", "", $plugin);
329 $p = $w->getPlugin($pluginName, false); // second arg?
330 // trap php files which aren't WikiPlugin~s
331 if (strtolower(substr(get_parent_class($p), 0, 10)) == 'wikiplugin') {
333 $desc = $p->getArgumentsDescription();
334 $src = array("\n",'"',"'",'|','[',']','\\');
335 $replace = array('%0A','%22','%27','%7C','%5B','%5D','%5C');
336 $desc = str_replace("<br />",' ',$desc->asXML());
338 $plugin_args = ' '.str_replace($src, $replace, $desc);
339 $toinsert = "%0A<<".$pluginName.$plugin_args.">>"; // args?
340 $plugin_js .= ",['$pluginName','$toinsert']";
343 $plugin_js = substr($plugin_js, 1);
344 $more_buttons = HTML::img(array('class'=>"toolbar",
345 'id' => 'tb-plugins',
346 'src' => $WikiTheme->getImageURL("ed_plugins.png"),
347 'title'=>_("AddPlugin"),
348 'alt'=>_("AddPlugin"),
349 'onclick'=>"showPulldown('".
350 _("Insert Plugin (double-click)")
351 ."',[".$plugin_js."],'"
353 ._("Close")."','tb-plugins')"));
354 return HTML("\n", $more_buttons);
359 // result is cached. Esp. the args are expensive
360 function pagesPulldown($query, $case_exact=false, $regex='auto') {
361 require_once('lib/TextSearchQuery.php');
362 $dbi =& $GLOBALS['request']->_dbi;
363 $page_iter = $dbi->titleSearch(new TextSearchQuery($query, $case_exact, $regex));
364 if ($page_iter->count()) {
367 while ($p = $page_iter->next()) {
368 $page = $p->getName();
369 if (DISABLE_MARKUP_WIKIWORD or (!isWikiWord($page)))
370 $pages[] = "['$page', '%5B".$page."%5D']";
372 $pages[] = "['$page', '$page']";
374 return HTML("\n", HTML::img(array('class'=>"toolbar",
376 'src' => $WikiTheme->getImageURL("ed_pages.png"),
377 'title'=>_("AddPageLink"),
378 'alt'=>_("AddPageLink"),
379 'onclick'=>"showPulldown('".
380 _("Insert PageLink (double-click)")
381 ."',[".join(",",$pages)."],'"
383 ._("Close")."','tb-pages')")));
388 // result is cached. Esp. the args are expensive
389 function imagePulldown($query, $case_exact=false, $regex='auto') {
393 if (defined('UPLOAD_FILE_PATH'))
394 $image_dir = UPLOAD_FILE_PATH . "/$image_dir";
395 $pd = new fileSet($image_dir, '*');
396 $images = $pd->getFiles();
399 if (!empty($images)) {
401 foreach ($images as $image) {
402 // Select only files ending in ".png", ".gif", ".jpg", ".jpeg"
403 if (is_image($image)) {
404 $image_js .= ",['$image','{{".$image."}}']";
407 $image_js = substr($image_js, 1);
408 $more_buttons = HTML::img(array('class'=>"toolbar",
410 'src' => $WikiTheme->getImageURL("ed_image.png"),
411 'title'=>_("AddImage"),
412 'alt'=>_("AddImage"),
413 'onclick'=>"showPulldown('".
414 _("Insert Image (double-click)")
415 ."',[".$image_js."],'"
417 ._("Close")."','tb-images')"));
418 return HTML("\n", $more_buttons);
423 // result is cached. Esp. the args are expensive
425 function templatePulldown($query, $case_exact=false, $regex='auto') {
427 require_once('lib/TextSearchQuery.php');
428 $dbi =& $request->_dbi;
429 $page_iter = $dbi->titleSearch(new TextSearchQuery($query, $case_exact, $regex));
431 if ($page_iter->count()) {
434 while ($p = $page_iter->next()) {
435 $rev = $p->getCurrentRevision();
436 $toinsert = str_replace(array("\n",'"'), array('_nl','_quot'), $rev->_get_content());
437 //$toinsert = str_replace("\n",'\n',addslashes($rev->_get_content()));
438 $pages_js .= ",['".$p->getName()."','_nl$toinsert']";
440 $pages_js = substr($pages_js, 1);
441 if (!empty($pages_js))
442 return HTML("\n", HTML::img
443 (array('class'=>"toolbar",
444 'id' => 'tb-templates',
445 'src' => $WikiTheme->getImageURL("ed_template.png"),
446 'title'=>_("AddTemplate"),
447 'alt'=>_("AddTemplate"),
448 'onclick'=>"showPulldown('".
449 _("Insert Template (double-click)")
450 ."',[".$pages_js."],'"
452 ._("Close")."','tb-templates')")));
460 $Log: not supported by cvs2svn $
461 Revision 1.17 2008/08/06 09:25:56 vargenau
462 Button to add images, display in extra window as popup and insert
464 Revision 1.16 2008/08/03 15:21:45 vargenau
465 Less arguments for CreateToc button
467 Revision 1.15 2008/04/02 18:07:05 vargenau
468 New Edit Toolbar icons for TOC and Color text
470 Revision 1.14 2008/02/19 19:07:23 vargenau
471 More icons for toolbar
473 Revision 1.13 2007/07/14 12:03:12 rurban
476 Revision 1.12 2007/06/02 18:23:36 rurban
479 Revision 1.11 2007/02/17 14:16:21 rurban
480 move define_f after toolbar.js
482 Revision 1.10 2007/01/07 18:42:19 rurban
483 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
485 Revision 1.9 2007/01/02 13:18:26 rurban
486 fix id to edit:content
488 Revision 1.8 2006/12/22 00:17:06 rurban
489 add time to signature
491 Revision 1.7 2006/09/06 05:45:26 rurban
492 use html tags for emphasis. workaround ^* problem
494 Revision 1.6 2006/08/30 05:25:40 rurban
495 Handle inserting DISABLE_MARKUP_WIKIWORD and non wikiword links.
497 Revision 1.5 2005/10/29 14:16:17 rurban
500 Revision 1.4 2005/09/29 23:07:58 rurban
503 Revision 1.3 2005/09/26 06:25:50 rurban
504 EditToolbar enhancements by Thomas Harding: add plugins args, properly quote control chars. added plugin method getArgumentsDescription to override the default description string
506 Revision 1.3 2005/09/22 13:40:00 tharding
507 add modules arguments
509 Revision 1.2 2005/05/06 18:43:41 rurban
510 add AddTemplate EditToolbar icon
512 Revision 1.1 2005/01/25 15:19:09 rurban
513 extract Toolbar code from editpage.php
520 // c-hanging-comment-ender-p: nil
521 // indent-tabs-mode: nil