diff options
Diffstat (limited to 'platform/www/lib/plugins/blog/action.php')
-rw-r--r-- | platform/www/lib/plugins/blog/action.php | 259 |
1 files changed, 259 insertions, 0 deletions
diff --git a/platform/www/lib/plugins/blog/action.php b/platform/www/lib/plugins/blog/action.php new file mode 100644 index 0000000..61ffd9e --- /dev/null +++ b/platform/www/lib/plugins/blog/action.php @@ -0,0 +1,259 @@ +<?php +/** + * @license GPL 2 (http://www.gnu.org/licenses/gpl.html) + * @author Esther Brunner <wikidesign@gmail.com> + */ + +class action_plugin_blog extends DokuWiki_Action_Plugin { + + /** + * register the eventhandlers + * @param Doku_Event_Handler $contr + */ + function register(Doku_Event_Handler $contr) { + $contr->register_hook('ACTION_ACT_PREPROCESS', 'BEFORE', $this, 'handle_act_preprocess', array()); + $contr->register_hook('FEED_ITEM_ADD', 'BEFORE', $this, 'handle_feed_item'); + $contr->register_hook('PARSER_CACHE_USE', 'BEFORE', $this, 'handle_cache'); + } + + /** + * Checks if 'newentry' was given as action, if so we + * do handle the event our self and no further checking takes place + * @param Doku_Event $event + * @param $param + */ + function handle_act_preprocess(Doku_Event $event, $param) { + if ($event->data != 'newentry') return; // nothing to do for us + + $event->data = $this->_handle_newEntry($event); + } + + /** + * Removes draft entries from feeds + * + * @param Doku_Event $event + * @param $param + * + * @author Michael Klier <chi@chimeric.de> + */ + function handle_feed_item(Doku_Event $event, $param) { + global $conf; + + $url = parse_url($event->data['item']->link); + $base_url = getBaseURL(); + + // determine page id by rewrite mode + switch($conf['userewrite']) { + case 0: + preg_match('#id=([^&]*)#', $url['query'], $match); + if($base_url != '/') { + $id = cleanID(str_replace($base_url, '', $match[1])); + } else { + $id = cleanID($match[1]); + } + break; + + case 1: + if($base_url != '/') { + $id = cleanID(str_replace('/',':',str_replace($base_url, '', $url['path']))); + } else { + $id = cleanID(str_replace('/',':', $url['path'])); + } + break; + + case 2: + preg_match('#doku.php/([^&]*)#', $url['path'], $match); + if($base_url != '/') { + $id = cleanID(str_replace($base_url, '', $match[1])); + } else { + $id = cleanID($match[1]); + } + break; + } + + // don't add drafts to the feed + if(p_get_metadata($id, 'type') == 'draft') { + $event->preventDefault(); + return; + } + } + + /** + * Creates a new entry page + * + * @param Doku_Event $event + * @return string + */ + function _handle_newEntry(Doku_Event $event) { + global $ID, $INFO; + + $ns = cleanID($_REQUEST['ns']); + $title = str_replace(':', '', $_REQUEST['title']); + $ID = $this->_newEntryID($ns, $title); + $INFO = pageinfo(); + + // check if we are allowed to create this file + if ($INFO['perm'] >= AUTH_CREATE) { + + // prepare the new thread file with default stuff + if (!@file_exists($INFO['filepath'])) { + + //check if locked by anyone - if not lock for my self + if ($INFO['locked']) return 'locked'; + else lock($ID); + + global $TEXT; + + $TEXT = pageTemplate($ID); + if (!$TEXT) { + // if there is no page template, load our custom one + $TEXT = io_readFile(DOKU_PLUGIN.'blog/_template.txt'); + } + + $data = array('id' => $ID, 'ns' => $ns, 'title' => $_REQUEST['title']); + // Apply replacements regardless if they have already been applied by DokuWiki in order to + // make custom replacements like @TITLE@ available in standard page templates. + $TEXT = $this->_pageTemplate($TEXT, $data); + + return 'preview'; + } else { + return 'edit'; + } + } else { + return 'show'; + } + } + + /** + * Adapted version of pageTemplate() function + * + * @param $text + * @param $data + * @return string|string[] + */ + function _pageTemplate($text, $data) { + global $conf, $INFO; + + $id = $data['id']; + $user = $_SERVER['REMOTE_USER']; + + // standard replacements + $replace = array( + '@ID@' => $id, + '@NS@' => $data['ns'], + '@PAGE@' => strtr(noNS($id),'_',' '), + '@USER@' => $user, + '@NAME@' => $INFO['userinfo']['name'], + '@MAIL@' => $INFO['userinfo']['mail'], + '@DATE@' => strftime($conf['dformat']), + ); + + // additional replacements + $replace['@TITLE@'] = $data['title']; + + // tag if tag plugin is available + if ((@file_exists(DOKU_PLUGIN.'tag/syntax/tag.php')) + && (!plugin_isdisabled('tag'))) { + $replace['@TAG@'] = "\n\n{{tag>}}"; + } else { + $replace['@TAG@'] = ''; + } + + // discussion if discussion plugin is available + if ((@file_exists(DOKU_PLUGIN.'discussion/syntax/comments.php')) + && (!plugin_isdisabled('discussion'))) { + $replace['@DISCUSSION@'] = "~~DISCUSSION~~"; + } else { + $replace['@DISCUSSION@'] = ''; + } + + // linkbacks if linkback plugin is available + if ((@file_exists(DOKU_PLUGIN.'linkback/syntax.php')) + && (!plugin_isdisabled('linkback'))) { + $replace['@LINKBACK@'] = "~~LINKBACK~~"; + } else { + $replace['@LINKBACK@'] = ''; + } + + // do the replace + return str_replace(array_keys($replace), array_values($replace), $text); + } + + /** + * Returns the ID of a new entry based on its namespace, title and the date prefix + * + * @param $ns + * @param $title + * @return mixed|string|string[]|null + * + * @author Michael Arlt <michael.arlt@sk-chwanstetten.de> + * @author Esther Brunner <wikidesign@gmail.com> + */ + function _newEntryID($ns, $title) { + $dateprefix = $this->getConf('dateprefix'); + if (substr($dateprefix, 0, 1) == '<') { + // <9?%y1-%y2:%d.%m._ -> 05-06:31.08._ | 06-07:01.09._ + list($newmonth, $dateprefix) = explode('?', substr($dateprefix, 1)); + if (intval(strftime("%m")) < intval($newmonth)) { + $longyear2 = strftime("%Y"); + $longyear1 = $longyear2 - 1; + } else { + $longyear1 = strftime("%Y"); + $longyear2 = $longyear1 + 1; + } + $shortyear1 = substr($longyear1, 2); + $shortyear2 = substr($longyear2, 2); + $dateprefix = str_replace( + array('%Y1', '%Y2', '%y1', '%y2'), + array($longyear1, $longyear2, $shortyear1, $shortyear2), + $dateprefix + ); + } + $pre = strftime($dateprefix); + return cleanID(($ns ? $ns.':' : '').$pre.$title); + } + + /** + * Expire the renderer cache of archive pages whenever a page is updated or a comment or linkback is added + * + * @param Doku_Event $event + * @param $params + * + * @author Michael Hamann <michael@content-space.de> + */ + function handle_cache(Doku_Event $event, $params) { + global $conf; + /** @var cache_parser $cache */ + $cache = $event->data; + if (!in_array($cache->mode, array('xhtml', 'metadata'))) return; + $page = $cache->page; + + // try to extract the page id from the file if possible + if (empty($page)) { + if (strpos($cache->file, $conf['datadir']) === 0) { + $page = pathID(substr($cache->file, strlen($conf['datadir'])+1)); + } else { + return; + } + } + + $meta = p_get_metadata($page, 'plugin_blog'); + if ($meta === null) return; + + if (isset($meta['purgefile_cache'])) { + $cache->depends['files'][] = $conf['cachedir'].'/purgefile'; + $cache->depends['files'][] = $conf['metadir'].'/_comments.changes'; + $cache->depends['files'][] = $conf['metadir'].'/_linkbacks.changes'; + } + + // purge the cache when a page is listed that the current user can't access + if (isset($meta['archive_pages'])) { + foreach ($meta['archive_pages'] as $page) { + if (auth_quickaclcheck($page) < AUTH_READ) { + $cache->depends['purge'] = true; + return; + } + } + } + } +} |