|
|
Line 34: |
Line 34: |
| $nt = Title::newFromText($title); | | $nt = Title::newFromText($title); |
| $ns = $nt->getNamespace(); | | $ns = $nt->getNamespace(); |
| + | $pt = $title; |
| + | $xml = false; |
| | | |
| # Extract category information from article's content and properties | | # Extract category information from article's content and properties |
− | if ( $xml = eregi( '^xml:(.+)$', $title, $match ) ) { | + | if ( eregi( '^xml:(.+)$', $title, $match ) ) { |
| $content = xwArticleContent( $title = $match[1], false ); | | $content = xwArticleContent( $title = $match[1], false ); |
| preg_match_all( "/$category_match/i", $content, $match ); | | preg_match_all( "/$category_match/i", $content, $match ); |
Line 63: |
Line 65: |
| # Only do the rest if this is the top level article | | # Only do the rest if this is the top level article |
| # - the embeds still had to have their cat-links removed | | # - the embeds still had to have their cat-links removed |
− | if ($title == $GLOBALS['xwArticleTitle']) { | + | if ($pt == $GLOBALS['xwArticleTitle']) { |
| | | |
| # Title used in db-tables | | # Title used in db-tables |
Revision as of 05:26, 28 February 2006
<?
- XmlWiki Category Extension - 2005-08-25
- 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
- Only apply this transform for the root article, not embeds
$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 ($event != 'data') $apply = false;
- 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 {
# If already in view event now, add a CSS class to letter-headings
$article = preg_replace("/
([A-Z]( cont\\.)?<\\/h3>)/i", '
$1', $article);
}
# Just let wiki-parser handle category-links for category pages
$apply = false;
}
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?";
$nt = Title::newFromText($title);
$ns = $nt->getNamespace();
$pt = $title;
$xml = false;
# 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 had to have their cat-links removed
if ($pt == $GLOBALS['xwArticleTitle']) {
# Title used in db-tables
$t = addslashes($nt->getDBkey());
# Auto-Category: Language
if ($language) $categories[] = strtoupper($language);
# 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')");
}
# Update links table from main article
if ($xml) {
xwMessage("Attempting link-update for \"$title\"",'red');
$nt = Title::newFromText( $title );
$ns = $nt->getNamespace();
$result = $db->query("SELECT cur_id FROM $cur WHERE cur_title='$title' AND cur_namespace='$ns' LIMIT 1");
if ( $row = mysql_fetch_assoc($result) ) fixLinksFromArticle( $row['cur_id'] );
}
}
}
?>