User:Nigelk/ConcatPages

From Meta, a Wikimedia project coordination wiki
Jump to navigation Jump to search
Blue Glass Arrow.svg MediaWiki logo.png
This page should be moved to MediaWiki.org.
Please do not move the page by hand. It will be imported by a MediaWiki.org administrator with the full edit history. In the meantime, you may continue to edit the page as normal.

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() );
}

?>