diff options
Diffstat (limited to 'lib/dokuwiki/inc/parser/metadata.php')
-rw-r--r-- | lib/dokuwiki/inc/parser/metadata.php | 483 |
1 files changed, 483 insertions, 0 deletions
diff --git a/lib/dokuwiki/inc/parser/metadata.php b/lib/dokuwiki/inc/parser/metadata.php new file mode 100644 index 000000000..fc60e5774 --- /dev/null +++ b/lib/dokuwiki/inc/parser/metadata.php @@ -0,0 +1,483 @@ +<?php +/** + * Renderer for metadata + * + * @author Esther Brunner <wikidesign@gmail.com> + */ +if(!defined('DOKU_INC')) die('meh.'); + +if ( !defined('DOKU_LF') ) { + // Some whitespace to help View > Source + define ('DOKU_LF',"\n"); +} + +if ( !defined('DOKU_TAB') ) { + // Some whitespace to help View > Source + define ('DOKU_TAB',"\t"); +} + +require_once DOKU_INC . 'inc/parser/renderer.php'; + +/** + * The Renderer + */ +class Doku_Renderer_metadata extends Doku_Renderer { + + var $doc = ''; + var $meta = array(); + var $persistent = array(); + + var $headers = array(); + var $capture = true; + var $store = ''; + var $firstimage = ''; + + function getFormat(){ + return 'metadata'; + } + + function document_start(){ + global $ID; + + $this->headers = array(); + + // external pages are missing create date + if(!$this->persistent['date']['created']){ + $this->persistent['date']['created'] = filectime(wikiFN($ID)); + } + if(!isset($this->persistent['creator'])){ + $this->persistent['creator'] = ''; + } + // reset metadata to persistent values + $this->meta = $this->persistent; + } + + function document_end(){ + global $ID; + + // store internal info in metadata (notoc,nocache) + $this->meta['internal'] = $this->info; + + if (!isset($this->meta['description']['abstract'])){ + // cut off too long abstracts + $this->doc = trim($this->doc); + if (strlen($this->doc) > 500) + $this->doc = utf8_substr($this->doc, 0, 500).'…'; + $this->meta['description']['abstract'] = $this->doc; + } + + $this->meta['relation']['firstimage'] = $this->firstimage; + + if(!isset($this->meta['date']['modified'])){ + $this->meta['date']['modified'] = filemtime(wikiFN($ID)); + } + + } + + function toc_additem($id, $text, $level) { + global $conf; + + //only add items within configured levels + if($level >= $conf['toptoclevel'] && $level <= $conf['maxtoclevel']){ + // the TOC is one of our standard ul list arrays ;-) + $this->meta['description']['tableofcontents'][] = array( + 'hid' => $id, + 'title' => $text, + 'type' => 'ul', + 'level' => $level-$conf['toptoclevel']+1 + ); + } + + } + + function header($text, $level, $pos) { + if (!isset($this->meta['title'])) $this->meta['title'] = $text; + + // add the header to the TOC + $hid = $this->_headerToLink($text,'true'); + $this->toc_additem($hid, $text, $level); + + // add to summary + if ($this->capture && ($level > 1)) $this->doc .= DOKU_LF.$text.DOKU_LF; + } + + function section_open($level){} + function section_close(){} + + function cdata($text){ + if ($this->capture) $this->doc .= $text; + } + + function p_open(){ + if ($this->capture) $this->doc .= DOKU_LF; + } + + function p_close(){ + if ($this->capture){ + if (strlen($this->doc) > 250) $this->capture = false; + else $this->doc .= DOKU_LF; + } + } + + function linebreak(){ + if ($this->capture) $this->doc .= DOKU_LF; + } + + function hr(){ + if ($this->capture){ + if (strlen($this->doc) > 250) $this->capture = false; + else $this->doc .= DOKU_LF.'----------'.DOKU_LF; + } + } + + function strong_open(){} + function strong_close(){} + + function emphasis_open(){} + function emphasis_close(){} + + function underline_open(){} + function underline_close(){} + + function monospace_open(){} + function monospace_close(){} + + function subscript_open(){} + function subscript_close(){} + + function superscript_open(){} + function superscript_close(){} + + function deleted_open(){} + function deleted_close(){} + + /** + * Callback for footnote start syntax + * + * All following content will go to the footnote instead of + * the document. To achieve this the previous rendered content + * is moved to $store and $doc is cleared + * + * @author Andreas Gohr <andi@splitbrain.org> + */ + function footnote_open() { + if ($this->capture){ + // move current content to store and record footnote + $this->store = $this->doc; + $this->doc = ''; + } + } + + /** + * Callback for footnote end syntax + * + * All rendered content is moved to the $footnotes array and the old + * content is restored from $store again + * + * @author Andreas Gohr + */ + function footnote_close() { + if ($this->capture){ + // restore old content + $this->doc = $this->store; + $this->store = ''; + } + } + + function listu_open(){ + if ($this->capture) $this->doc .= DOKU_LF; + } + + function listu_close(){ + if ($this->capture && (strlen($this->doc) > 250)) $this->capture = false; + } + + function listo_open(){ + if ($this->capture) $this->doc .= DOKU_LF; + } + + function listo_close(){ + if ($this->capture && (strlen($this->doc) > 250)) $this->capture = false; + } + + function listitem_open($level){ + if ($this->capture) $this->doc .= str_repeat(DOKU_TAB, $level).'* '; + } + + function listitem_close(){ + if ($this->capture) $this->doc .= DOKU_LF; + } + + function listcontent_open(){} + function listcontent_close(){} + + function unformatted($text){ + if ($this->capture) $this->doc .= $text; + } + + function php($text){} + + function phpblock($text){} + + function html($text){} + + function htmlblock($text){} + + function preformatted($text){ + if ($this->capture) $this->doc .= $text; + } + + function file($text, $lang = null, $file = null){ + if ($this->capture){ + $this->doc .= DOKU_LF.$text; + if (strlen($this->doc) > 250) $this->capture = false; + else $this->doc .= DOKU_LF; + } + } + + function quote_open(){ + if ($this->capture) $this->doc .= DOKU_LF.DOKU_TAB.'"'; + } + + function quote_close(){ + if ($this->capture){ + $this->doc .= '"'; + if (strlen($this->doc) > 250) $this->capture = false; + else $this->doc .= DOKU_LF; + } + } + + function code($text, $language = NULL, $file = null){ + if ($this->capture){ + $this->doc .= DOKU_LF.$text; + if (strlen($this->doc) > 250) $this->capture = false; + else $this->doc .= DOKU_LF; + } + } + + function acronym($acronym){ + if ($this->capture) $this->doc .= $acronym; + } + + function smiley($smiley){ + if ($this->capture) $this->doc .= $smiley; + } + + function entity($entity){ + if ($this->capture) $this->doc .= $entity; + } + + function multiplyentity($x, $y){ + if ($this->capture) $this->doc .= $x.'×'.$y; + } + + function singlequoteopening(){ + global $lang; + if ($this->capture) $this->doc .= $lang['singlequoteopening']; + } + + function singlequoteclosing(){ + global $lang; + if ($this->capture) $this->doc .= $lang['singlequoteclosing']; + } + + function apostrophe() { + global $lang; + if ($this->capture) $this->doc .= $lang['apostrophe']; + } + + function doublequoteopening(){ + global $lang; + if ($this->capture) $this->doc .= $lang['doublequoteopening']; + } + + function doublequoteclosing(){ + global $lang; + if ($this->capture) $this->doc .= $lang['doublequoteclosing']; + } + + function camelcaselink($link) { + $this->internallink($link, $link); + } + + function locallink($hash, $name = NULL){} + + /** + * keep track of internal links in $this->meta['relation']['references'] + */ + function internallink($id, $name = NULL){ + global $ID; + + if(is_array($name)) + $this->_firstimage($name['src']); + + $default = $this->_simpleTitle($id); + + // first resolve and clean up the $id + resolve_pageid(getNS($ID), $id, $exists); + list($page, $hash) = explode('#', $id, 2); + + // set metadata + $this->meta['relation']['references'][$page] = $exists; + // $data = array('relation' => array('isreferencedby' => array($ID => true))); + // p_set_metadata($id, $data); + + // add link title to summary + if ($this->capture){ + $name = $this->_getLinkTitle($name, $default, $id); + $this->doc .= $name; + } + } + + function externallink($url, $name = NULL){ + if(is_array($name)) + $this->_firstimage($name['src']); + + if ($this->capture){ + if ($name) $this->doc .= $name; + else $this->doc .= '<'.$url.'>'; + } + } + + function interwikilink($match, $name = NULL, $wikiName, $wikiUri){ + if(is_array($name)) + $this->_firstimage($name['src']); + + if ($this->capture){ + list($wikiUri, $hash) = explode('#', $wikiUri, 2); + $name = $this->_getLinkTitle($name, $wikiName.'>'.$wikiUri); + $this->doc .= $name; + } + } + + function windowssharelink($url, $name = NULL){ + if(is_array($name)) + $this->_firstimage($name['src']); + + if ($this->capture){ + if ($name) $this->doc .= $name; + else $this->doc .= '<'.$url.'>'; + } + } + + function emaillink($address, $name = NULL){ + if(is_array($name)) + $this->_firstimage($name['src']); + + if ($this->capture){ + if ($name) $this->doc .= $name; + else $this->doc .= '<'.$address.'>'; + } + } + + function internalmedia($src, $title=NULL, $align=NULL, $width=NULL, + $height=NULL, $cache=NULL, $linking=NULL){ + if ($this->capture && $title) $this->doc .= '['.$title.']'; + $this->_firstimage($src); + } + + function externalmedia($src, $title=NULL, $align=NULL, $width=NULL, + $height=NULL, $cache=NULL, $linking=NULL){ + if ($this->capture && $title) $this->doc .= '['.$title.']'; + $this->_firstimage($src); + } + + function rss($url,$params) { + $this->meta['relation']['haspart'][$url] = true; + + $this->meta['date']['valid']['age'] = + isset($this->meta['date']['valid']['age']) ? + min($this->meta['date']['valid']['age'],$params['refresh']) : + $params['refresh']; + } + + function table_open($maxcols = NULL, $numrows = NULL){} + function table_close(){} + + function tablerow_open(){} + function tablerow_close(){} + + function tableheader_open($colspan = 1, $align = NULL, $rowspan = 1){} + function tableheader_close(){} + + function tablecell_open($colspan = 1, $align = NULL, $rowspan = 1){} + function tablecell_close(){} + + //---------------------------------------------------------- + // Utils + + /** + * Removes any Namespace from the given name but keeps + * casing and special chars + * + * @author Andreas Gohr <andi@splitbrain.org> + */ + function _simpleTitle($name){ + global $conf; + + if(is_array($name)) return ''; + + if($conf['useslash']){ + $nssep = '[:;/]'; + }else{ + $nssep = '[:;]'; + } + $name = preg_replace('!.*'.$nssep.'!','',$name); + //if there is a hash we use the anchor name only + $name = preg_replace('!.*#!','',$name); + return $name; + } + + /** + * Creates a linkid from a headline + * + * @param string $title The headline title + * @param boolean $create Create a new unique ID? + * @author Andreas Gohr <andi@splitbrain.org> + */ + function _headerToLink($title, $create=false) { + if($create){ + return sectionID($title,$this->headers); + }else{ + $check = false; + return sectionID($title,$check); + } + } + + /** + * Construct a title and handle images in titles + * + * @author Harry Fuecks <hfuecks@gmail.com> + */ + function _getLinkTitle($title, $default, $id=NULL) { + global $conf; + + $isImage = false; + if (is_null($title)){ + if (useHeading('content') && $id){ + $heading = p_get_first_heading($id,false); + if ($heading) return $heading; + } + return $default; + } else if (is_string($title)){ + return $title; + } else if (is_array($title)){ + return '['.$title['title'].']'; + } + } + + function _firstimage($src){ + if($this->firstimage) return; + global $ID; + + list($src,$hash) = explode('#',$src,2); + if(!preg_match('/^https?:\/\//i',$src)){ + resolve_mediaid(getNS($ID),$src, $exists); + } + if(preg_match('/.(jpe?g|gif|png)$/i',$src)){ + $this->firstimage = $src; + } + } +} + +//Setup VIM: ex: et ts=4 enc=utf-8 : |