Difference between revisions of "Categories.php"

From Organic Design wiki
(Add document.css to transform exceptions)
(Attempt adding property inheritence from cats...)
Line 1: Line 1:
 
<?
 
<?
# XmlWiki Category Extension - 2005-08-25
+
# XmlWiki Category Extension - 2005-08-25 - see discussion page
# This data-transform replaces the current MediaWiki category parsing
 
# - It allows categories to be included in either the article content or its XML properties
 
# - Maintains rules-based auto-categorisation
 
 
global $xwIsProperties;
 
global $xwIsProperties;
 
$update = $GLOBALS['xwSave'];
 
$update = $GLOBALS['xwSave'];
Line 13: Line 10:
 
# If a category page, add class attribute to table since the MediaWiki fellas didn't for some reason
 
# If a category page, add class attribute to table since the MediaWiki fellas didn't for some reason
 
if ( ereg( '^Category:.+$', $title ) ) {
 
if ( ereg( '^Category:.+$', $title ) ) {
# Add this transform to the view stack to adjust page after it's built
+
# If event is view, adjust rendered output, else add this to view event
if ( $event == 'data' ) xwSetProperty( $properties, 'xpath:/properties:view', $tTitle );
+
if ( $event == 'view' ) {
else $article = preg_replace("/<h3>([A-Z]( cont\\.)?<\\/h3>)/i", '<h3 class="category-heading">$1', $article);
+
# Add CSS class to headings (see, not just me who hardwires styles!)
 +
$article = preg_replace( '/<h3>([A-Z]( cont\\.)?<\\/h3>)/i', '<h3 class="category-heading">$1', $article );
 +
}
 +
else xwSetProperty( $properties, 'xpath:/properties:view', $tTitle );
 
$apply = false; # Just let wiki-parser handle category-links for category pages
 
$apply = false; # Just let wiki-parser handle category-links for category pages
 
}
 
}
Line 22: Line 22:
  
 
# Begin extracting category-link info - first get stuff we'll be needing
 
# Begin extracting category-link info - first get stuff we'll be needing
$sk =& $GLOBALS['wgParser']->mOptions->getSkin();
+
$db =& wfGetDB( DB_SLAVE );
$db =& wfGetDB(DB_SLAVE);
+
$cur = $db->tableName( 'cur' );
$cur = $db->tableName('cur');
+
$cl = $db->tableName( 'categorylinks' );
$cl = $db->tableName('categorylinks');
 
 
$category_match = "\\[{2}\\s*category\\s*:\\s*(.+?)\\s*]]\\n?";
 
$category_match = "\\[{2}\\s*category\\s*:\\s*(.+?)\\s*]]\\n?";
 
$pt = $title;
 
$pt = $title;
Line 37: Line 36:
 
if ( !$language ) $language = xwArticleType( $title, $content );
 
if ( !$language ) $language = xwArticleType( $title, $content );
 
}
 
}
elseif ( eregi('^sys:(.+)$', $title, $match) ) {
+
elseif ( eregi( '^sys:(.+)$', $title, $match ) ) {
 
$title = $match[1];
 
$title = $match[1];
 
$ns = NS_USER;
 
$ns = NS_USER;
Line 43: Line 42:
 
preg_match_all( "/$category_match/i", $content, $match );
 
preg_match_all( "/$category_match/i", $content, $match );
 
$categories = $match[1];
 
$categories = $match[1];
foreach ( xwGetListByTagname($article, 'groups') as $group )
+
# Groups auto-categorisation
if ( ($group != $GLOBALS['xwUserName']) && ($group != 'anyone') )
+
foreach ( xwGetListByTagname( $article, 'groups' ) as $group )
$categories[] = "$group Group Members";
+
$categories[] = "Group:$group";
 
$language = '';
 
$language = '';
 
}
 
}
Line 86: Line 85:
 
# Get the db-key of this article
 
# Get the db-key of this article
 
if ( $update ) {
 
if ( $update ) {
$result = $db->query( "SELECT cur_id FROM $cur WHERE cur_title='$t' AND cur_namespace='$ns' LIMIT 1" );
+
$id = Title::makeTitle( $ns, $t );
if ( $row = mysql_fetch_assoc($result) ) $id = $row['cur_id'];
+
$id = $update = $id->getArticleID();
else $id = $update = false;
 
 
}
 
}
  
Line 104: Line 102:
 
if ( !$tmp[$cat] = $sortkey ) $tmp[$cat] = $t;
 
if ( !$tmp[$cat] = $sortkey ) $tmp[$cat] = $t;
 
}
 
}
ksort($tmp);
+
ksort( $tmp );
  
 
# Loop through categories and process each
 
# Loop through categories and process each
 +
$sk =& $GLOBALS['wgParser']->mOptions->getSkin();
 
foreach ( $tmp as $cat => $sortkey ) {
 
foreach ( $tmp as $cat => $sortkey ) {
# Add to wiki-output if not properties
+
 
 +
# Add to wiki-output
 
$nt = Title::makeTitle( NS_CATEGORY, $cat );
 
$nt = Title::makeTitle( NS_CATEGORY, $cat );
 
$GLOBALS[wgParser]->mOutput->addCategoryLink( $sk->makeLinkObj($nt, $cat) );
 
$GLOBALS[wgParser]->mOutput->addCategoryLink( $sk->makeLinkObj($nt, $cat) );
 +
# Inherit properties from this cat if it has any
 +
xwMerge( $properties, xwArticleProperties( "Category:$cat" ) );
 +
 
# Update db if saving and db-key known
 
# Update db if saving and db-key known
$cat = addslashes( str_replace(' ', '_', $cat) );
+
$cat = addslashes( str_replace( ' ', '_', $cat ) );
if ($update) $db->query( "INSERT INTO $cl (cl_from,cl_to,cl_sortkey) VALUES('$id','$cat','$sortkey')" );
+
if ( $update ) $db->query( "INSERT INTO $cl (cl_from,cl_to,cl_sortkey) VALUES('$id','$cat','$sortkey')" );
 +
 
 
}
 
}
 
}
 
}
 
}
 
}
 +
 
?>
 
?>

Revision as of 06:34, 13 March 2006

<?

  1. XmlWiki Category Extension - 2005-08-25 - see discussion page

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 ) ) { # 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 xwMerge( $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')" ); } } } ?>