register_hook( 'HTML_EDITFORM_OUTPUT', 'BEFORE', $this, 'handle_editform_output' ); } /** * Create the additional fields for the edit form. */ function handle_editform_output( &$event, $param ) { $pos = $event->data->findElementByAttribute( 'type', 'submit' ); if ( !$pos ){ return; } $prefixHidden = empty( $event->data->_hidden['prefix'] ); $suffixHidden = empty( $event->data->_hidden['suffix'] ); if ( $prefixHidden || ! $suffixHidden ){ return; } // get all tags $tagns = $this->getConf( 'namespace' ); if ( $thlp =& plugin_load( 'helper', 'tag' ) ) { if ( $this->getConf( 'tagsrc' ) == 'Pagenames in tag NS' ) { $tagnst = $thlp->getConf( 'namespace' ); if ( !empty( $tagnst ) ) $tagns = $tagnst; } } if ( $this->getConf( 'tagsrc' ) == 'All tags' && $thlp ) { $alltags = array_map( 'trim', idx_getIndex( 'subject', '_w' ) ); } else { $alltags = $this->_getpages( $tagns ); } // get already assigned tags for this page $assigned = false; if ( 1 ) { // parse wiki-text to pick up tags for draft/prevew $wikipage = ''; $wt = $event->data->findElementByType( 'wikitext' ); if ( $wt !== false ) { $wikipage = $event->data->_content[$wt]['_text']; } if ( !empty( $wikipage ) ){ if ( preg_match( '@\{\{tag>(.*?)\}\}@', $wikipage, $m ) ) { $assigned = explode( ' ', $m[1] ); } } } if ( !is_array( $assigned ) ) { // those are from the prev. saved version. global $ID; $meta = array(); $meta = p_get_metadata( $ID ); $assigned = $meta['subject']; } $options = array( 'blacklist' => explode( ' ', $this->getConf( 'blacklist' ) ), 'assigned' => $assigned, ); $out = '
'; $out .= $this->_format_tags( $alltags, $options ); $out .= '
'; $event->data->insertElement( $pos++, $out ); } /** * callback function for dokuwiki search() * * Build a list of tags from the tag namespace * $opts['ns'] is the namespace to browse */ function _tagentry_search_tagpages( &$data, $base, $file, $type, $lvl, $opts ) { $return = true; $item = array(); if ( $type == 'd' ) { // TODO: check if namespace mismatch -> break recursion early. return true; } elseif ( $type == 'f' && !preg_match( '#\.txt$#', $file ) ) { return false; } $id = pathID( $file ); if ( getNS( $id ) != $opts['ns'] ) return false; if ( isHiddenPage( $id ) ) { return false; } if ( $type == 'f' && auth_quickaclcheck( $id ) < AUTH_READ ) { return false; } $data[] = noNS( $id ); return $return; } /** * list all tags from the topic index. * (requires newer version of the tag plugin) * * @param $thlp pointer to tag plugin's helper * @return array list of tag names, sorted by frequency */ function _gettags( &$thlp ) { $data = array(); if ( !is_array( $thlp->topic_idx ) ) return $data; foreach ( $thlp->topic_idx as $k => $v ) { if ( !is_array( $v ) || empty( $v ) || ( !trim( $v[0] ) ) ) continue; $data[$k] = count( $v ); } arsort( $data ); return ( array_keys( $data ) ); } /** * list all pages in the namespace. * * @param $tagns namespace to search. * @return array list of tag names. */ function _getpages( $tagns = 'wiki:tags' ) { global $conf; require_once( DOKU_INC . 'inc/search.php' ); $data = array(); search( $data, $conf['datadir'], array( $this, '_tagentry_search_tagpages' ), array( 'ns' => $tagns ) ); return ( $data ); } function clipstring( $s, $len = 22 ) { return substr( $s, 0, $len ) . ( ( strlen( $s ) > $len ) ? '..' : '' ); } function escapeJSstring( $o ) { return ( // TODO: use JSON ?! str_replace( "\n", '\\n', str_replace( "\r", '', str_replace( '\'', '\\\'', str_replace( '\\', '\\\\', $o ) ) ) ) ); } /** case insenstive in_array();. */ function in_iarray( $needle, $haystack ) { if ( !is_array( $haystack ) ) return false; foreach ( $haystack as $t ) { if ( strcasecmp( $needle, $t ) == 0 ) return true; } return false; } /** * render and return the tag-select box. * * @param $alltags array of tags to display. * @param $options array * @return string XHTML form. */ function _format_tags( $alltags, $options ) { $rv = ''; if ( !is_array( $alltags ) ){ return $rv; } if ( count( $alltags ) < 1 ){ return $rv; } //$rv .= '
'; //$rv .= '
'; $rv .= '
'; //$rv .= '
'; // Trie les tags natcasesort( $alltags ); // Boucle sur les tags $i = 0; foreach ( $alltags as $tagname ) { // Blacklist $hasBlacklist = is_array( $options['blacklist'] ); $inBlacklist = $this->in_iarray( $tagname, $options['blacklist'] ); if ( $hasBlacklist && $inBlacklist ){ continue; } $i++; $rv .= ''; //$rv.=' /> '.$this->clipstring($tagname).' '; // MODIF : 23/12/2013 14:43:26 $rv .= "\n"; } //$rv .= '
'; //$rv .= '
'; return ( $rv ); } // MODIF : 23/12/2013 14:55:07 /** * Return Header title or tag name * @param $tagname The name of tag without namespace * @return Title of the tag page or tag name formatted */ function _getTagTitle( $tagname ) { global $conf; if ( $conf['useheading'] ) { $tagplugin = plugin_load( 'helper', 'tag' ); if ( plugin_isdisabled( 'tag' ) || !$tagplugin ) { msg( 'The Tag Plugin must be installed to display tagentry.', -1 ); return $this->clipstring( $tagname ); } $id = $tagname; $exist = false; resolve_pageID( $tagplugin->namespace, $id, $exist ); if ( $exist ) { return p_get_first_heading( $id, false ); } } return $this->clipstring( $tagname ); } // MODIF : 23/12/2013 14:55:07 }