Categories.php

From Organic Design wiki
Revision as of 10:08, 8 March 2006 by Nad (talk | contribs) (Add document.css to transform exceptions)

<?

  1. XmlWiki Category Extension - 2005-08-25
  2. This data-transform replaces the current MediaWiki category parsing
  3. - It allows categories to be included in either the article content or its XML properties
  4. - Maintains rules-based auto-categorisation

global $xwIsProperties; $update = $GLOBALS['xwSave']; $apply = true;

  1. Don't apply if page is a category, or if action isn't view or submit

if ( ($action != 'view') && ($action != ) && !$update ) $apply = false;

  1. If a category page, add class attribute to table since the MediaWiki fellas didn't for some reason

if ( ereg( '^Category:.+$', $title ) ) { # Add this transform to the view stack to adjust page after it's built if ( $event == 'data' ) xwSetProperty( $properties, 'xpath:/properties:view', $tTitle );

else $article = preg_replace("/

([A-Z]( cont\\.)?<\\/h3>)/i", '

$1', $article); $apply = false; # Just let wiki-parser handle category-links for category pages } if ( $apply ) { # Begin extracting category-link info - first get stuff we'll be needing $sk =& $GLOBALS['wgParser']->mOptions->getSkin(); $db =& wfGetDB(DB_SLAVE); $cur = $db->tableName('cur'); $cl = $db->tableName('categorylinks'); $category_match = "\\[{2}\\s*category\\s*:\\s*(.+?)\\s*]]\\n?"; $pt = $title; # Extract category information from article's content and properties if ( eregi( '^xml:(.+)$', $title, $match ) ) { $content = xwArticleContent( $title = $match[1], false ); preg_match_all( "/$category_match/i", $content, $match ); $categories = array_merge( xwGetListByTagname( $article, 'category' ), $match[1] ); xwGetProperty( $article, 'language', $language ); if ( !$language ) $language = xwArticleType( $title, $content ); } elseif ( eregi('^sys:(.+)$', $title, $match) ) { $title = $match[1]; $ns = NS_USER; $content = xwArticleContent( "User:$title", false ); preg_match_all( "/$category_match/i", $content, $match ); $categories = $match[1]; foreach ( xwGetListByTagname($article, 'groups') as $group ) if ( ($group != $GLOBALS['xwUserName']) && ($group != 'anyone') ) $categories[] = "$group Group Members"; $language = ; } else { $categories = xwGetListByTagname( $properties, 'category' ); # Must remove category-links from article so wiki-parser doesn't process them xwGetProperty( $properties, 'language', $language ); if ( !$language ) $article = preg_replace( "/$category_match/ie", '($categories[]="$1")?"":""', $article ); } # Only do the rest if this is the top level article # - the embeds still have to have their cat-links removed if ( $pt == $GLOBALS['xwArticleTitle'] ) { $nt = Title::newFromText( $title ); $ns = $nt->getNamespace(); $t = addslashes( $nt->getDBkey() ); # Title used in db-tables $ul = strtoupper( $language ); # Auto-Category: Language if ( $language ) $categories[] = $ul; # Auto-Category: Transforms # - CSS and XSLT are included unconditionally # - PHP included if writable only by dev or admin # - XML included if DocType DTD is xmlwiki-properties (but not Xml:name) $transformExceptions = array( 'Xmlwiki.php', 'Default-properties.xml', 'Document.php', 'Geshi.php', 'Default-skin.php', 'LocalSettings.php', 'Transform-changes.php', 'Transform-all-pages-list.php', 'Categories.php', 'Properties.php', 'Calendar.php', 'Document.css' ); if ( $ul == 'CSS' or $ul == 'XSLT' ) $categories[] = 'Transforms'; elseif ( in_array( $title, $transformExceptions ) ) 0; elseif ( $ul == 'PHP' and count( preg_grep( '/^(admin)|(dev)$/i', xwGetListByTagname( xwArticleProperties( $title ), 'write' ) ) ) ) $categories[] = 'Transforms'; elseif ( $ul == 'XML' and preg_match( '/<!DOCTYPE[^>]+?xmlwiki-properties.dtd"\\s*>/', xwArticleContent( $title ) ) ) $categories[] = 'Transforms'; # Get the db-key of this article if ( $update ) { $result = $db->query( "SELECT cur_id FROM $cur WHERE cur_title='$t' AND cur_namespace='$ns' LIMIT 1" ); if ( $row = mysql_fetch_assoc($result) ) $id = $row['cur_id']; else $id = $update = false; } # Delete all current category links from this title if ( $update ) { $db->query( "DELETE FROM $cl WHERE cl_from='$id'" ); # Stop parser from clearing them again after we repopulate it $GLOBALS['wgUseCategoryMagic'] = false; } # Remove duplicates and sort categories $tmp = array(); foreach ( $categories as $cat ) { list( $cat, $sortkey ) = explode( '|', ucfirst($cat) ); if ( !$tmp[$cat] = $sortkey ) $tmp[$cat] = $t; } ksort($tmp); # Loop through categories and process each foreach ( $tmp as $cat => $sortkey ) { # Add to wiki-output if not properties $nt = Title::makeTitle( NS_CATEGORY, $cat ); $GLOBALS[wgParser]->mOutput->addCategoryLink( $sk->makeLinkObj($nt, $cat) ); # Update db if saving and db-key known $cat = addslashes( str_replace(' ', '_', $cat) ); if ($update) $db->query( "INSERT INTO $cl (cl_from,cl_to,cl_sortkey) VALUES('$id','$cat','$sortkey')" ); } } } ?>