www/public_html/lib/plugins/pagetitle/action.php

143 lines
5.3 KiB
PHP

<?php
/**
* DokuWiki Plugin PageTitle; Action component
*
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
* @author Satoshi Sahara <sahara.satoshi@gmail.com>
*/
if(!defined('DOKU_INC')) die();
class action_plugin_pagetitle extends DokuWiki_Action_Plugin {
/**
* register the event handlers
*/
function register(Doku_Event_Handler $controller) {
//$controller->register_hook('DOKUWIKI_STARTED', 'BEFORE', $this, 'deleteObsoletedSingleClass');
$controller->register_hook('INDEXER_VERSION_GET', 'BEFORE', $this, '_indexer_version');
$controller->register_hook('INDEXER_PAGE_ADD', 'BEFORE', $this, '_indexer_pagetitle');
$controller->register_hook('PARSER_METADATA_RENDER', 'AFTER', $this, '_parser_render');
$controller->register_hook('PARSER_CACHE_USE', 'BEFORE', $this, '_prepare_cache');
}
/**
* Delete syntax.php which is obsoleted since multi-components syntax structure
*/
function deleteObsoletedSingleClass(Doku_Event $event) {
$legacyFile = dirname(__FILE__).'/syntax.php';
if (file_exists($legacyFile)) { unlink($legacyFile); }
}
/**
* INDEXER_VERSION_GET
* Set a version string to the metadata index so that
* the index will be re-created when the version increased
*/
function _indexer_version(Doku_Event $event, $param) {
$event->data['plgin_pagetitle'] = '1.'.$this->getConf('usePersistent');
}
/**
* INDEXER_PAGE_ADD
* Add id of the page to metadata index, relevant pages should be found
* in data/index/plugin_pagetitle_w.idx file
*/
function _indexer_pagetitle(Doku_Event $event, $param) {
$id = p_get_metadata($event->data['page'], 'plugin pagetitle');
if ($id) {
$event->data['metadata']['plugin_pagetitle'] = $id;
}
}
/**
* PAESER_METADATA_RENDER
* Use this event to update/reflesh metadata they may have set elseware.
* The page metadata is passed including both the current and persistent arrays.
*/
function _parser_render(Doku_Event $event, $param) {
global $ID;
/*
* The PageTitle plugin will overwrite "title" metadata of the page
* with "pagetitle" specified in page source. The page must be rendered
* first in xhtml mode to get pagetitle and to stote it on metadata
* storage.
* Each metadata storage (.meta file) may be expired or refleshed by
* DokuWiki or any plugins at elsewhere in any stage. For example,
* metadata will be expired when main config modified. DokuWiki will set
* again title metadata through calls p_get_first_heading() depending on
* $conf['useheading"] setting.
*
* Since page text is not changed, instruction and xhtml cache files are
* used to set title metadata, there is no chance to handle/render page
* source to get pagetitle and to overwite title metadata.
* Therfore, the value of "title" metadata will remain wrong with that
* pagetitle plugin intended.
*
* For the purpose to trigger PageTitle plugin's renderer, we tentatively
* set $ID as "title" to tell DokuWiki caching mechanism so that old
* cache need to be purged and metadata must be rebuild again.
*/
$meta =& $event->data['current'];
$persistent =& $event->data['persistent'];
// check metadata index whether pagetitle had used in the wiki page
$pages = idx_get_indexer()->getPages('plugin_pagetitle');
$pageTitled = in_array($ID, $pages);
if (!$pageTitled) return;
// check whether page has rendered by pagetitle plugin
if (!isset($meta['plugin']['pagetitle'])) {
// tentatively assign full id as page title, just to distinguish
// with normal setting noNS($ID) and to purge .meta file later
$meta['title'] = $ID;
}
// unnecessary persistent metadata should be removed in syntax component,
// however it may be possible to remove it here
if (!$this->getConf('usePersistent')) {
unset($persistent['title']);
}
}
/**
* PARSER_CACHE_USE
* prepare the cache object for default _useCache action
*/
function _prepare_cache(Doku_Event $event, $param) {
$cache =& $event->data;
// we're only interested in wiki pages
if (!isset($cache->page)) return;
// check metadata index whether pagetitle had used in the wiki page
$pages = idx_get_indexer()->getPages('plugin_pagetitle');
$pageTitled = in_array($cache->page, $pages);
if (!$pageTitled) return;
// check title metadata whether cache files should be purged
$title = p_get_metadata($cache->page, 'title', METADATA_DONT_RENDER);
switch ($cache->mode) {
case 'metadata': // metadata cache?
$request = ($title == $cache->page) ? true : false;
break;
case 'i': // instruction cache
$request = ($title == $cache->page) ? true : false;
break;
case 'xhtml': // xhtml cache
$request = ($title == $cache->page) ? true : false;
break;
}
// request purge if necessary
$cache->depends['purge'] = $request;
}
}