:) When items are added to the page, they are either added above or below the form and are prefixed with the symbols given in the last argument. For example: (:todo-add-list1 above *:) creates an input form that adds new lines above it prefixed with *, creating a bulletted list entry form. The can only contain letters and numbers. When an item is added using the form, markup is added as a suffix (:todo-delete-:) that is rendered as a link. When clicked, the link will remove the item from the page. The is generated as an md5 hash of the line being added but can be anything as long as it is unique and contains only letters nad numbers. This allows one to add the (:todo-delete-:) markup to existing lines by hand if desired. To use this recipe, add the following lines to your local/config.php: // Very simple todo lists //$TodoDeleteText = "delete"; //$TodoDoneText = "done"; //$TodoUndoText = "undo"; //$TodoAddText = "New item:"; //$TodoCleanText = "Clean List:"; include_once("$FarmD/cookbook/lesssimpletodo.php"); $TodoDeleteText is the string used as the text of the delete link. $TodoAddText is the label placed in front of the input box for new items. $TodoDoneText is the string used as the text of the done link. Additionally, you can style the components using the classes "todoform" for the input form and "tododelete" for the delete link. For example: .todoform { color: #999; font-size: 80%; margin: 0; padding: 0; } .todoform input { font-weight: normal; border: 0; border-bottom: 1px solid #eee; width: 400px; } a.todoclean { color: #999 !important; font-size: 80%; text-decoration: none !important; } a.tododelete { color: #999 !important; text-transform: lowercase; font-size: 70%; text-decoration: none !important; } a.tododone { color: #999 !important; text-transform: lowercase; font-size: 70%; text-decoration: none !important; } a.todoundo { color: #999 !important; text-transform: lowercase; font-size: 70%; text-decoration: none !important; } a:hover.tododelete { color: #999 !important; text-transform: lowercase; font-size: 70%; text-decoration: underline !important; } */ Markup("todo", "block", "/\(:todo-add-(\w+?) (above|below) (.+?):\)/", "
" ."
" .(isset($TodoAddText)?$TodoAddText:'New item:')." " ."" ."" ."" ."" ."" ."
" ."
" ."".(isset($TodoCleanText)?$TodoCleanText:'Clean List')."" ."
"); Markup("todo-delete", "block", "/\(:todo-delete-(.*?):\)/", "".(isset($TodoDeleteText)?$TodoDeleteText:'Delete').""); Markup("todo-done", "block", "/\(:todo-done-(.*?):\)/", "".(isset($TodoDoneText)?$TodoDoneText:'Done').""); Markup("todo-undo", "block", "/\(:todo-undo-(.*?):\)/", "".(isset($TodoUndoText)?$TodoUndoText:'Undo').""); $HandleActions['todo-add'] = 'HandleAddTodo'; $HandleActions['todo-clean'] = 'HandleCleanList'; $HandleActions['todo-delete'] = 'HandleDeleteTodo'; $HandleActions['todo-done'] = 'HandleDoneTodo'; $HandleActions['todo-undo'] = 'HandleUndoTodo'; // Add an item to a page function HandleAddTodo() { global $pagename; if (isset($_REQUEST['tododata'])) { $todoform = $_REQUEST['todoform']; $tododata = $_REQUEST['tododata']; $tododata = stripmagic($tododata); // Escape dollar signs in the data or you end up with weird preg_replace() issues $tododata = preg_replace('/\$/', '\\\$', $tododata); $page = RetrieveAuthPage($pagename, 'edit', true); $deletetag = '(:todo-delete-'.md5($tododata).':)'; $donetag = '(:todo-done-'.md5($tododata).':)'; if (!$page) Abort('?cannot read $pagename'); $new = $page; if (preg_match("/\(:todo-add-$todoform above (.+?):\)/", $page['text'])) { $new['text'] = preg_replace("/\(:todo-add-$todoform (above|below) (.+?):\)/", "$2 $tododata $deletetag $donetag\n(:todo-add-$todoform $1 $2:)", $page['text'], 1); } else if (preg_match("/\(:todo-add-$todoform below (.+?):\)/", $page['text'])) { $new['text'] = preg_replace("/\(:todo-add-$todoform (above|below) (.+?):\)/", "(:todo-add-$todoform $1 $2:)\n$2 $tododata $deletetag $donetag", $page['text'], 1); } PostPage($pagename, $page, $new); Redirect($pagename); } } // Remove an item from a page function HandleDeleteTodo() { global $pagename; if (isset($_REQUEST['todoitem'])) { $todoitem = $_REQUEST['todoitem']; $todoitem = stripmagic($todoitem); $page = RetrieveAuthPage($pagename, 'edit', true); if (!$page) Abort('?cannot read $pagename'); $new = $page; $new['text'] = preg_replace("/^.*?\(:todo-delete-$todoitem:\).*?\n/m", "", $page['text'], 1); PostPage($pagename, $page, $new); Redirect($pagename); } } //rewrite done tasks function DoneCallback($match) { $pieces = explode(" ", $match[0]); $newtext = $pieces[0].' {-'.$pieces[1]; $i = 2; while($i < count($pieces)){ // rewrite 'done' into 'undo' if (!strncmp($pieces[$i], "(:todo-done-", 12)) $newtext = $newtext." ".str_replace("(:todo-done-", "(:todo-undo-", $pieces[$i]); elseif (!strncmp($pieces[$i], "(:todo-delete", 13)) $newtext = $newtext.'-} '.$pieces[$i]; else $newtext = $newtext." ".$pieces[$i]; $i++; } return $newtext; } // Strikeout done tasks function HandleDoneTodo() { global $pagename; if (isset($_REQUEST['todoitem'])) { $todoitem = $_REQUEST['todoitem']; $todoitem = stripmagic($todoitem); $page = RetrieveAuthPage($pagename, 'edit', true); if (!$page) Abort('?cannot read $pagename'); $new = $page; $new['text'] = preg_replace_callback("/^.*?\(:todo-done-$todoitem:\).*?\n/m", "DoneCallback", $page['text'], 1); PostPage($pagename, $page, $new); Redirect($pagename); } } //rewrite undo tasks function UndoCallback($match) { $newtext = str_replace(" {-", " ", $match[0]); $newtext = str_replace("-} ", " ", $newtext); $newtext = str_replace("(:todo-undo-", "(:todo-done-", $newtext); return $newtext; } // Strikeout done tasks function HandleUndoTodo() { global $pagename; if (isset($_REQUEST['todoitem'])) { $todoitem = $_REQUEST['todoitem']; $todoitem = stripmagic($todoitem); $page = RetrieveAuthPage($pagename, 'edit', true); if (!$page) Abort('?cannot read $pagename'); $new = $page; $new['text'] = preg_replace_callback("/^.*?\(:todo-undo-$todoitem:\).*?\n/m", "UndoCallback", $page['text'], 1); PostPage($pagename, $page, $new); Redirect($pagename); } } // remove done tasks function HandleCleanList() { global $pagename; if (isset($_REQUEST['todoitem'])) { $todoitem = $_REQUEST['todoitem']; $todoitem = stripmagic($todoitem); $page = RetrieveAuthPage($pagename, 'edit', true); if (!$page) Abort('?cannot read $pagename'); $new = $page; $new['text'] = preg_replace("/^.*?\(:todo-undo.*?\n/m", "", $page['text'], -1); PostPage($pagename, $page, $new); Redirect($pagename); } }