<?
- XmlWiki Category Extension - 2005-08-25 - see discussion page
global $xwIsProperties;
$update = $GLOBALS['xwSave'];
$apply = true;
- Don't apply if page is a category, or if action isn't view or submit
if ( ($action != 'view') && ($action != ) && !$update ) $apply = false;
- If a category page, add class attribute to table since the MediaWiki fellas didn't for some reason
if ( ereg( '^Category:.+$', $title ) ) {
# If event is view, adjust rendered output, else add this to view event
if ( $event == 'view' ) {
# Add CSS class to headings (see, not just me who hardwires styles!)
$article = preg_replace( '/
([A-Z]( cont\\.)?<\\/h3>)/i', '
$1', $article );
}
else xwSetProperty( $properties, 'xpath:/properties:view', $tTitle );
$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
$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];
# Groups auto-categorisation
foreach ( xwGetListByTagname( $article, 'groups' ) as $group )
$categories[] = "Group:$group";
$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 ) {
$id = Title::makeTitle( $ns, $t );
$id = $update = $id->getArticleID();
}
# 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
$sk =& $GLOBALS['wgParser']->mOptions->getSkin();
foreach ( $tmp as $cat => $sortkey ) {
# Add to wiki-output
$nt = Title::makeTitle( NS_CATEGORY, $cat );
$GLOBALS[wgParser]->mOutput->addCategoryLink( $sk->makeLinkObj($nt, $cat) );
# Inherit properties from this cat if it has any
xwMergeDOM( $properties, xwArticleProperties( "Category:$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')" );
}
}
}
?>