<?php if (!defined('PmWiki')) exit(); /* Copyright 2006 Ben Wilson This file is marklets.php; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License. */ SDV($MarkletAddTextToEnd, 0); SDV($MarkletCategories, array()); SDV($MarkletDateFmt, '[-[%b %e, %Y (%I:%M %p)]-]'); SDV($MarkletDeleteText,'Delete'); SDV($MarkletDuplicateMark, '%red% (duplicate)'); SDV($MarkletEnableReturn, 0); SDV($MarkletRedirectDelay, 4); #SDV($MarkletCategorySplitPoint, '.Bookmarks'); #SDV($MarkletCategorySplitPoint, '\.'); SDV($MarkletCategorySplitPoint, '-'); # Default SDV($MarkletCategoriesFunction, 'MarkletDefaultCategories'); SDV($MarkletMultiple, 0); Markup('markletdupe', 'inline', '/\(:marklet-dup:\)/', $MarkletDuplicateMark); Markup('makemark', 'inline', '/\\(:marklet-codelets\\s*(.*?):\\)/e', "Keep(MarkletCreateLinks(\$pagename,'$1'))"); Markup("marklet-delete", "<if", '/\(:marklet-delete-(.*?):\)/e', "MarkletDeleteMarkup('$pagename', '$1');"); $HandleActions['makemark'] = 'MarkletHandleAdd'; $HandleActions['makemarklet'] = 'MarkletAdd'; $HandleActions['marklet-delete'] = 'MarkletHandleDelete'; function MarkletDeleteMarkup($pagename, $argv) { global $ScriptUrl, $MarkletDeleteText; $text = (isset($MarkletDeleteText)) ? $MarkletDeleteText : 'Delete'; $link = "<a class='markletdelete' href='$ScriptUrl" ."?n=$pagename&action=marklet-delete&mid=$argv" ."'>$text</a>"; $html = "(:if auth edit:)[=$link=](:if:)"; return $html; } function MarkletHandleDelete() { global $pagename; if (isset($_REQUEST['mid'])) { $mid = $_REQUEST['mid']; $mid = stripmagic($mid); $page = RetrieveAuthPage($pagename, 'edit', true); if (!$page) Abort('?cannot read $pagename'); $new = $page; $new['text'] = preg_replace("/^(.*?)\(:marklet-delete-$mid:\).*?\n/m", '', $page['text'], 1); PostPage($pagename, $page, $new); MarkletRedirect($pagename, "Deleted"); } else { Redirect($pagename); } } function MarkletSplitPagename($page) { global $MarkletCategorySplitPoint; return split($MarkletCategorySplitPoint, $page); } function MarkletAdd($pagename, $argv) { global $Now, $PageRedirectFmt, $HandleActions; global $HTMLStylesFmt, $HTMLHeaderFmt; global $MarkletRedirectDelay, $MarkletDateFmt, $MarkletAddText; global $MarkletRedirectMessage, $MarkletAddTextToEnd; global $MarkletCategorySplitPoint, $MarkletCategories; $title = stripslashes($_REQUEST['title']); $url = $_REQUEST['url']; $summary = $_REQUEST['summary']; $category = ($_REQUEST['new_category']) ? $_REQUEST['new_category'] : $_REQUEST['category']; list($pre, $post) = MarkletSplitPagename($pagename); $time = strftime($MarkletDateFmt, $Now); $key = md5($url); $link = ($title) ? "[[$url|$title]]" : "[[$url]]"; SDV($MarkletAddText, "* $link $summary $time (:marklet-delete-$key:)\n"); $MarkletAddText = stripslashes($MarkletAddText); if (!$category) $category = $post; foreach((array) $category as $cat) { $newpage = ($cat) ? join($MarkletCategorySplitPoint, array($pre, $cat)) : $pagename; $page = RetrieveAuthPage($newpage, 'edit'); if (!$page) Abort("?cannot edit $pagename"); $text = $page['text']; if (preg_match("/$key/", $text)) { $MarkletAddText = preg_replace("/(\* )/", "$1(:marklet-dup:)", $MarkletAddText); } if (@$_REQUEST['url']) { $text = (IsEnabled($MarkletAddTextToEnd,0)) ? "$text$MarkletAddText" : "$MarkletAddText$text"; } $page['text'] = $text; $page['text'] .= $vote; WritePage($newpage, $page); } $newpage = preg_replace('/\./', '/', $newpage); if ($_REQUEST['return']) { $HTMLHeaderFmt['marklet'] = "<meta http-equiv='Refresh' " ."Content='$MarkletRedirectDelay; URL=$url' />"; } MarkletRedirect($newpage, "New bookmark: $url."); } function MarkletDuplicateCheck($test, $key) { #MarkletDuplicateCheck($test, $key); } # function to create the bookmarklet function MarkletCreateLinks($pagename, $linkpage) { global $MarkletEnableReturn; $return = ($MarkletEnableReturn) ? '&return=1' : ''; if ($linkpage) $pagename = MakePageName($pagename, $linkpage); $first = FmtPageName("<a href=\"javascript:document.location.href='\$PageUrl?action=makemark&url='+encodeURIComponent(document.location.href)+'$return&title='+encodeURIComponent(document.title),'bookmark'\">+=$pagename</a>", $pagename); $first .= FmtPageName("<br /><a href=\"javascript:document.location.href='\$PageUrl?action=makemark&hurry=1$return&url='+encodeURIComponent(document.location.href)+'&title='+encodeURIComponent(document.title),'bookmark'\">+=$pagename (hurrymode)</a>", $pagename); return $first; } # function to handle ?action=addlink (prepends the url to the page and # then passes control to the edit function). function MarkletHandleAdd($pagename) { global $HandleActions, $EnableAddLinkToEnd, $AddLinkText; Lock(2); $link = $_REQUEST['url']; $title = stripslashes($_REQUEST['title']); if ($_REQUEST['hurry']) { MarkletAdd($pagename, ''); } $form = MakeMarkForm($pagename, $link, $title); print $form; } function MakeMarkForm($pagename, $link, $title) { global $ScriptUrl; global $MarkletCategorySplitPoint, $MarkletCategories; global $MarkletCategoriesFunction, $MarkletMultiple; $cats = array(); $categories = $MarkletCategoriesFunction($pagename); foreach($categories as $c) $cats[] = "<option>$c</option>"; $return = ($_REQUEST['return']) ? "<input type='hidden' name='return' value='1' />" : ''; array_unshift($cats, "<option selected></option>"); $categories = join("\n", $cats); if ($MarkletMultiple) { $multiple = "multiple size='$MarkletMultiple' name='category[]'"; } else { $multiple = "name='category'"; } $form =<<<MAKELINKFORM <form id='' class='odoform' action='$ScriptUrl/$pagename' method='post'> <table border='0' > <tr><td>Title:</td><td><input type='text' size='60' name='title' value='$title' /></td></tr> <tr><td>Link:</td><td><input type='text' size='60' name='url' value='$link' /></td></tr> <tr><td>Create in Category:</td><td><select $multiple>$categories</select></td></tr> <tr><td>Add Category: </td><td><input type='text' size='40' name='new_category' /></td></tr> <tr><td valign='top'>Summary: </td> <td><input type='hidden' name='action' value='makemarklet' />$return <textarea cols='60' rows='5' name='summary'> </textarea></td></tr> <tr><td colspan='2'><input type='submit' /></td></tr> </table> </form> MAKELINKFORM; return $form; } function MarkletRedirect($page, $msg) { global $PageRedirectFmt, $HTMLStylesFmt; $HTMLStylesFmt[marklets] = " /* styling of marklet messages */ #markletMessage { padding: 0.5em; margin-bottom: 1em; background: #FFD; border: 3px double red; text-align: center; } "; $_GET['from'] = 1; $PageRedirectFmt = "<div id='markletMessage'>$msg</div>"; HandleBrowse($page); exit(); } function MarkletDefaultCategories($pn) { global $MarkletCategories; $cats = array(); if (sizeof((array)$MarkletCategories) && $MarkletCategories[0] !='') { foreach((array)$MarkletCategories as $c) $cats[] = $c; } else { $pages = ListPages("/^$pn*/"); foreach ($pages as $p) { list(, $c) = MarkletSplitPagename($p); if ($c != '') $cats[] = $c; } } sort($cats); return $cats; }