tokens = array(); //FIXME: enable Undo button for all other buttons also, not only the search/replace button if (JS_SEARCHREPLACE) { $this->tokens['JS_SEARCHREPLACE'] = 1; $undo_btn = $WikiTheme->getImageURL("ed_undo.png"); $undo_d_btn = $WikiTheme->getImageURL("ed_undo_d.png"); // JS_SEARCHREPLACE from walterzorn.de $js = Javascript(" uri_undo_btn = '" . $undo_btn . "' msg_undo_alt = '" . _("Undo") . "' uri_undo_d_btn = '" . $undo_d_btn . "' msg_undo_d_alt = '" . _("Undo disabled") . "' msg_do_undo = '" . _("Operation undone") . "' msg_replfound = '" . _("Substring \"\\1\" found \\2 times. Replace with \"\\3\"?") . "' msg_replnot = '" . _("String \"%s\" not found.") . "' msg_repl_title = '" . _("Search & Replace") . "' msg_repl_search = '" . _("Search for") . "' msg_repl_replace_with = '" . _("Replace with") . "' msg_repl_ok = '" . _("OK") . "' msg_repl_close = '" . _("Close") . "' "); if (empty($WikiTheme->_headers_printed)) { $WikiTheme->addMoreHeaders($js); $WikiTheme->addMoreAttr('body', "SearchReplace", " onload='define_f()'"); } else { // from an actionpage: WikiBlog, AddComment, WikiForum printXML($js); } } else { $WikiTheme->addMoreAttr('body', "editfocus", "document.getElementById('edit-content]').editarea.focus()"); } if (ENABLE_EDIT_TOOLBAR) { $js = JavaScript('', array('src' => $WikiTheme->_findData("toolbar.js"))); if (empty($WikiTheme->_headers_printed)) { $WikiTheme->addMoreHeaders($js); } else { // from an actionpage: WikiBlog, AddComment, WikiForum printXML($js); printXML(JavaScript('define_f()')); } } require_once 'lib/WikiPluginCached.php'; $cache = WikiPluginCached::newCache(); $dbi = $GLOBALS['request']->getDbh(); // regenerate if number of pages changes (categories, pages, templates) $key = $dbi->numPages(); $key .= '+categories+plugin' . (isBrowserSafari() ? '+safari' : ''); if (TOOLBAR_PAGELINK_PULLDOWN) { $key .= "+pages"; } if (TOOLBAR_TEMPLATE_PULLDOWN) { $key .= "+templates_" . $dbi->getTimestamp(); } $id = $cache->generateId($key); $content = $cache->get($id, 'toolbarcache'); if (!empty($content)) { $this->tokens['EDIT_TOOLBAR'] =& $content; } else { $content = $this->_generate(); // regenerate buttons every 1 hr/6 hrs $cache->save($id, $content, DEBUG ? '+3600' : '+21600', 'toolbarcache'); $this->tokens['EDIT_TOOLBAR'] =& $content; } } function getTokens() { return $this->tokens; } function _generate() { global $WikiTheme, $request; $toolbar = "document.writeln(\"
\");\n"; if (ENABLE_EDIT_TOOLBAR) { $username = $request->_user->UserName(); if ((defined('FUSIONFORGE') and FUSIONFORGE) or DISABLE_MARKUP_WIKIWORD or (!isWikiWord($username))) { $username = '[[' . $username . ']]'; } $signature = " ––" . $username . " " . CTime(); $toolarray = array( array( "image" => "ed_format_bold.png", "open" => "**", "close" => "**", "sample" => _("Bold text"), "title" => _("Bold text [alt-b]")), array("image" => "ed_format_italic.png", "open" => "//", "close" => "//", "sample" => _("Italic text"), "title" => _("Italic text [alt-i]")), array("image" => "ed_format_strike.png", "open" => "", "close" => "", "sample" => _("Strike-through text"), "title" => _("Strike")), array("image" => "ed_format_color.png", "open" => "%color=green% ", "close" => " %%", "sample" => _("Color text"), "title" => _("Color")), array("image" => "ed_pagelink.png", "open" => "[[", "close" => "]]", "sample" => _("PageName|optional label"), "title" => _("Link to page")), array("image" => "ed_link.png", "open" => "[[", "close" => "]]", "sample" => _("http://www.example.com|optional label"), "title" => _("External link (remember http:// prefix)")), array("image" => "ed_headline.png", "open" => "\\n== ", "close" => " ==\\n", "sample" => _("Headline text"), "title" => _("Level 1 headline")), array("image" => "ed_nowiki.png", "open" => "\\\\n", "close" => "\\n\\", "sample" => _("Insert non-formatted text here"), "title" => _("Ignore wiki formatting")), array("image" => "ed_sig.png", "open" => $signature, "close" => "", "sample" => "", "title" => _("Your signature")), array("image" => "ed_hr.png", "open" => "\\n----\\n", "close" => "", "sample" => "", "title" => _("Horizontal line")), array("image" => "ed_table.png", "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", "close" => "", "sample" => "", "title" => _("Sample table")), array("image" => "ed_enumlist.png", "open" => "\\n# Item 1\\n# Item 2\\n# Item 3\\n", "close" => "", "sample" => "", "title" => _("Enumeration")), array("image" => "ed_list.png", "open" => "\\n* Item 1\\n* Item 2\\n* Item 3\\n", "close" => "", "sample" => "", "title" => _("List")), array("image" => "ed_toc.png", "open" => "<>\\n", "close" => "", "sample" => "", "title" => _("Table of Contents")), array("image" => "ed_redirect.png", "open" => "< "\">>", "sample" => _("Page Name"), "title" => _("Redirect")), array("image" => "ed_templateplugin.png", "open" => "{{", "close" => "}}", "sample" => _("Template Name"), "title" => _("Template")) ); $btn = new SubmitImageButton(_("Save"), "edit[save]", 'toolbar', $WikiTheme->getImageURL("ed_save.png")); $btn->addTooltip(_("Save")); $btn->setAccesskey("s"); $toolbar .= ('document.writeln("' . addslashes($btn->asXml()) . '");' . "\n"); // preview not supported yet on Wikiblog if (empty($WikiTheme->_headers_printed)) { $btn = new SubmitImageButton(_("Preview"), "edit[preview]", 'toolbar', $WikiTheme->getImageURL("ed_preview.png")); $btn->addTooltip(_("Preview")); $btn->setAccesskey("p"); $toolbar .= ('document.writeln("' . addslashes($btn->asXml()) . '");' . "\n"); } foreach ($toolarray as $tool) { $image = $WikiTheme->getImageURL($tool["image"]); $open = $tool["open"]; $close = $tool["close"]; $sample = addslashes($tool["sample"]); // Note that we use the title both for the ALT tag and the TITLE tag of the image. // Older browsers show a "speedtip" type message only for ALT. // Ideally these should be different, realistically they // probably don't need to be. $tool = $WikiTheme->fixAccesskey($tool); $title = addslashes($tool["title"]); $toolbar .= ("addTagButton('$image','$title','$open','$close','$sample');\n"); } /* Fails with Chrome */ if (!isBrowserSafari()) { $toolbar .= ("addInfobox('" . addslashes(_("Click a button to get an example text")) . "');\n"); } } if (JS_SEARCHREPLACE) { $undo_d_btn = $WikiTheme->getImageURL("ed_undo_d.png"); //$redo_btn = $WikiTheme->getImageURL("ed_redo.png"); $sr_btn = $WikiTheme->getImageURL("ed_replace.png"); //TODO: generalize the UNDO button and fix it for Search & Replace $sr_html = HTML(HTML::img (array('class' => "toolbar", 'id' => "sr_undo", 'src' => $undo_d_btn, 'title' => _("Undo Search & Replace"), 'alt' => _("Undo Search & Replace"), //'disabled'=>"disabled", //non-XHTML conform //'onfocus' =>"if(this.blur && undo_buffer_index==0) this.blur()", 'onclick' => "do_undo()")), HTML::img (array('class' => "toolbar", 'src' => $sr_btn, 'alt' => _("Search & Replace"), 'title' => _("Search & Replace"), 'onclick' => "replace()"))); } else { $sr_html = ''; } //TODO: Delegate this to run-time with showing an hidden input at the right, and do // a separate moacdropdown and xmlrpc:titleSearch. // Button to generate categories, display in extra window as popup and insert $sr_html = HTML($sr_html, $this->categoriesPulldown()); // Button to generate plugins, display in extra window as popup and insert $sr_html = HTML($sr_html, $this->pluginPulldown()); // Button to generate pagenames, display in extra window as popup and insert if (TOOLBAR_PAGELINK_PULLDOWN) $sr_html = HTML($sr_html, $this->pagesPulldown(TOOLBAR_PAGELINK_PULLDOWN)); // Button to insert from an template, display pagename in extra window as popup and insert if (TOOLBAR_TEMPLATE_PULLDOWN) $sr_html = HTML($sr_html, $this->templatePulldown(TOOLBAR_TEMPLATE_PULLDOWN)); // Button to add images, display in extra window as popup and insert if (TOOLBAR_IMAGE_PULLDOWN) $sr_html = HTML($sr_html, $this->imagePulldown(TOOLBAR_IMAGE_PULLDOWN)); // don't use document.write for replace, otherwise self.opener is not defined. $toolbar_end = "document.writeln(\"
\");"; if ($sr_html) return HTML(Javascript($toolbar), "\n", $sr_html, "\n", Javascript($toolbar_end)); else return HTML(Javascript($toolbar . $toolbar_end)); } //result is cached function categoriesPulldown() { global $WikiTheme; require_once 'lib/TextSearchQuery.php'; $dbi =& $GLOBALS['request']->_dbi; // KEYWORDS formerly known as $KeywordLinkRegexp $pages = $dbi->titleSearch(new TextSearchQuery(KEYWORDS, true)); if ($pages) { $categories = array(); while ($p = $pages->next()) { $page = $p->getName(); if ((defined('FUSIONFORGE') and FUSIONFORGE)) { $categories[] = "['$page', '%0A----%0A%5B%5B" . $page . "%5D%5D']"; } elseif (DISABLE_MARKUP_WIKIWORD or (!isWikiWord($page))) { $categories[] = "['$page', '%0A%5B" . $page . "%5D']"; } else { $categories[] = "['$page', '%0A" . $page . "']"; } } if (!$categories) return ''; // Ensure this to be inserted at the very end. Hence we added the id to the function. $more_buttons = HTML::img(array('class' => "toolbar", 'id' => 'tb-categories', 'src' => $WikiTheme->getImageURL("ed_category.png"), 'title' => _("Insert Categories"), 'alt' => "Insert Categories", // to detect this at js 'onclick' => "showPulldown('" . _("Insert Categories") . "',[" . join(",", $categories) . "],'" . _("Insert") . "','" . _("Close") . "','tb-categories')")); return HTML("\n", $more_buttons); } return ''; } // result is cached. Esp. the args are expensive function pluginPulldown() { global $WikiTheme; global $AllAllowedPlugins; $plugin_dir = 'lib/plugin'; if (defined('PHPWIKI_DIR')) $plugin_dir = PHPWIKI_DIR . "/$plugin_dir"; $pd = new fileSet($plugin_dir, '*.php'); $plugins = $pd->getFiles(); unset($pd); sort($plugins); if (!empty($plugins)) { $plugin_js = ''; require_once 'lib/WikiPlugin.php'; $w = new WikiPluginLoader(); foreach ($plugins as $plugin) { $pluginName = str_replace(".php", "", $plugin); if (in_array($pluginName, $AllAllowedPlugins)) { $p = $w->getPlugin($pluginName, false); // second arg? // trap php files which aren't WikiPlugin~s if (strtolower(substr(get_parent_class($p), 0, 10)) == 'wikiplugin') { $plugin_args = ''; $desc = $p->getArgumentsDescription(); $src = array("\n", '"', "'", '|', '[', ']', '\\'); $replace = array('%0A', '%22', '%27', '%7C', '%5B', '%5D', '%5C'); $desc = str_replace("
", ' ', $desc->asXML()); if ($desc) $plugin_args = ' ' . str_replace($src, $replace, $desc); $toinsert = "%0A<<" . $pluginName . $plugin_args . ">>"; // args? $plugin_js .= ",['$pluginName','$toinsert']"; } } } $plugin_js = substr($plugin_js, 1); $more_buttons = HTML::img(array('class' => "toolbar", 'id' => 'tb-plugins', 'src' => $WikiTheme->getImageURL("ed_plugins.png"), 'title' => _("Insert Plugin"), 'alt' => _("Insert Plugin"), 'onclick' => "showPulldown('" . _("Insert Plugin") . "',[" . $plugin_js . "],'" . _("Insert") . "','" . _("Close") . "','tb-plugins')")); return HTML("\n", $more_buttons); } return ''; } // result is cached. Esp. the args are expensive function pagesPulldown($query, $case_exact = false, $regex = 'auto') { require_once 'lib/TextSearchQuery.php'; $dbi =& $GLOBALS['request']->_dbi; $page_iter = $dbi->titleSearch(new TextSearchQuery($query, $case_exact, $regex)); if ($page_iter->count() > 0) { global $WikiTheme; $pages = array(); while ($p = $page_iter->next()) { $page = $p->getName(); if (DISABLE_MARKUP_WIKIWORD or (!isWikiWord($page))) $pages[] = "['$page', '%5B" . $page . "%5D']"; else $pages[] = "['$page', '$page']"; } return HTML("\n", HTML::img(array('class' => "toolbar", 'id' => 'tb-pages', 'src' => $WikiTheme->getImageURL("ed_pages.png"), 'title' => _("Insert PageLink"), 'alt' => _("Insert PageLink"), 'onclick' => "showPulldown('" . _("Insert PageLink") . "',[" . join(",", $pages) . "],'" . _("Insert") . "','" . _("Close") . "','tb-pages')"))); } return ''; } // result is cached. Esp. the args are expensive function imagePulldown($query, $case_exact = false, $regex = 'auto') { global $WikiTheme; $image_dir = getUploadFilePath(); $pd = new fileSet($image_dir, '*'); $images = $pd->getFiles(); unset($pd); if (UPLOAD_USERDIR) { $image_dir .= "/" . $request->_user->_userid; $pd = new fileSet($image_dir, '*'); $images = array_merge($images, $pd->getFiles()); unset($pd); } sort($images); if (!empty($images)) { $image_js = ''; foreach ($images as $image) { // Select only image and video files if (is_image($image) or is_video($image)) { $image_js .= ",['$image','{{" . $image . "}}']"; } } $image_js = substr($image_js, 1); $more_buttons = HTML::img(array('class' => "toolbar", 'id' => 'tb-images', 'src' => $WikiTheme->getImageURL("ed_image.png"), 'title' => _("Insert Image or Video"), 'alt' => _("Insert Image or Video"), 'onclick' => "showPulldown('" . _("Insert Image or Video") . "',[" . $image_js . "],'" . _("Insert") . "','" . _("Close") . "','tb-images')")); return HTML("\n", $more_buttons); } return ''; } // result is cached. Esp. the args are expensive // FIXME! function templatePulldown($query, $case_exact = false, $regex = 'auto') { global $request; require_once 'lib/TextSearchQuery.php'; $dbi =& $request->_dbi; $page_iter = $dbi->titleSearch(new TextSearchQuery($query, $case_exact, $regex)); $count = 0; if ($page_iter->count()) { global $WikiTheme; $pages_js = ''; while ($p = $page_iter->next()) { $rev = $p->getCurrentRevision(); $toinsert = str_replace(array("\n", '"'), array('_nl', '_quot'), $rev->_get_content()); //$toinsert = str_replace("\n",'\n',addslashes($rev->_get_content())); $pages_js .= ",['" . $p->getName() . "','_nl$toinsert']"; } $pages_js = substr($pages_js, 1); if (!empty($pages_js)) return HTML("\n", HTML::img (array('class' => "toolbar", 'id' => 'tb-templates', 'src' => $WikiTheme->getImageURL("ed_template.png"), 'title' => _("Insert Template"), 'alt' => _("Insert Template"), 'onclick' => "showPulldown('" . _("Insert Template") . "',[" . $pages_js . "],'" . _("Insert") . "','" . _("Close") . "','tb-templates')"))); } return ''; } } // Local Variables: // mode: php // tab-width: 8 // c-basic-offset: 4 // c-hanging-comment-ender-p: nil // indent-tabs-mode: nil // End: