User:Nigelk/ConcatPages
See the [demonstration]. this version works with navmaps, and has only been tested very lightly with mw 1.5.5 on php 5.0.4.
to use this, you must have the NavMap Extension 0.6 or later.
<?php $wgExtensionFunctions[] = "wfExtensionConcatPages"; $wgExtensionCredits['other'][] = array( 'name' => 'SpecialConcatPages', 'description' => 'Concatenates one or more pages, either from a sequence of a NavMap, or from an list of unrelated pages', 'url' => 'http://meta.wikimedia.org/wiki/User:Nigelk/ConcatPages', 'author' => 'Nigel Kerr', 'version'=>'0.1'); require_once("$IP/includes/SpecialPage.php"); class SpecialConcatPages extends SpecialPage { function SpecialConcatPages() { SpecialPage::SpecialPage('ConcatPages'); } function removeNavMapLinks( $text, $map = '[^<>]+') { $pattern = '/<nav(map)?( [^>]*)?>\\s*' . preg_quote($map) . '\\s*<\\/nav(map)?>/s'; $repl = ''; return preg_replace( $pattern, $repl, $text ); } function getRawTextOfPage( $page ) { global $wgTitle; global $wgArticle; /* remove these when we go non-globals... */ $oldTitle = $wgTitle; $oldArticle = $wgArticle; $title = trim($page); $article = new Article( Title::newFromText( $title ) ); $content = $article->getContent(false); $wgTitle = $oldTitle; $wgArticle = $oldArticle; /* end global shuffling */ return $content; } function outputConcatPagesForm( $t ) { global $wgOut; $action = $t->escapeLocalURL( 'action=submit' ); $wgOut->addHTML( "<form method='post' action=\"$action\"><input type='hidden' name='action' value='submit' />"); $wgOut->addHTML( wfMsg('concatpagesmappagelabel') ); $wgOut->addHTML( "<input name='map'/><br />" ); $wgOut->addHTML( wfMsg('concatpagesstartpagelabel') ); $wgOut->addHTML("<input name='start'/><br />" ); $wgOut->addHTML( wfMsg('concatpagesendpagelabel') ); $wgOut->addHTML("<input name='end'/><br /><input type='submit' /></form>" ); } function outputBadNavMapMessage( $p ) { return wfMsg( 'badnavmapmessage', $p['map'], $p['start'], $p['end']); } function getPageParams() { global $wgRequest; $p = array(); if( $wgRequest->getVal( 'action' ) == 'submit') { $p['map'] = trim($wgRequest->getText( 'map' )); $p['start'] = trim($wgRequest->getText( 'start' )); $p['end'] = trim($wgRequest->getText( 'end' )); } return $p; } function outputPagesFromMap($p = array()) { global $wgOut; $nav = new NavMap( $p['map'] ); $somethingWrong = true; if ( $nav->isValid()) { $pageseq = $nav->getPageSequence( $p['start'], $p['end'] ); if ( is_array($pageseq) && count($pageseq) > 0 ) { $somethingWrong = false; $wgOut->addHTML("<style type='text/css'>" . wfMsg('concatpagesdivstyle') . "</style>\n"); foreach ( $pageseq as $key => $page ) { $wgOut->addHTML("<div class='concat-page'>"); $c = $this->removeNavMapLinks($this->getRawTextOfPage($page), $p['map']); if ( ! is_null($c) && trim($c) != '' ) { $wgOut->addWikiText("= [[$page]] =\n\n"); $wgOut->addWikiText($c); } else { $wgOut->addWikiText("=== [[$page]] ===\n\n"); $wgOut->addWikiText("[[$page]] does not have substantive content yet.\n\n"); } $wgOut->addHTML("</div>"); } } } if ($somethingWrong) { $wgOut->addWikiText( $this->outputBadNavMapMessage($p) ); } } function execute() { global $wgOut; $p = $this->getPageParams(); $titleObj = Title::makeTitle( NS_SPECIAL, "ConcatPages" ); if ( $p['map'] != '' || $p['start'] != '' || $p['end'] != '' ) { $this->outputPagesFromMap($p); } else { $this->outputConcatPagesForm($titleObj, $wgOut); } } } function wfExtensionConcatPages() { global $wgMessageCache; $wgMessageCache->addMessages( array( 'concatpages' => 'Concatenation of Pages', 'concatpagesdivstyle' => '.concat-page { padding: .5em; margin: .5em; border: thin grey solid; }', 'concatpagesmappagelabel' => 'Map Page:', 'concatpagesstartpagelabel' => 'Start Page:', 'concatpagesendpagelabel' => 'End Page:', 'badnavmapmessage' => '<p><strong>ERROR</strong> problems with making a map of [[$1]] to assemble pages from [[$2]] to [[$3]]. Inspect the map for structural problems or if you have the right names.</p>', ) ); SpecialPage::addPage( new SpecialConcatPages() ); } ?>