Difference between revisions of "Extension:PdfBook"
(redo the main book-construction code) |
m (redo the main book-construction code) |
||
Line 89: | Line 89: | ||
$ttext = $title->getPrefixedText(); | $ttext = $title->getPrefixedText(); | ||
if (!in_array($ttext,$exclude)) { | if (!in_array($ttext,$exclude)) { | ||
− | |||
− | |||
$tmp = array($wgArticlePath,$wgScriptPath,$wgScript); | $tmp = array($wgArticlePath,$wgScriptPath,$wgScript); | ||
$wgArticlePath = $wgServer.$wgArticlePath; | $wgArticlePath = $wgServer.$wgArticlePath; | ||
$wgScriptPath = $wgServer.$wgScriptPath; | $wgScriptPath = $wgServer.$wgScriptPath; | ||
$wgScript = $wgServer.$wgScript; | $wgScript = $wgServer.$wgScript; | ||
+ | $article = new Article($title); | ||
+ | $text = $article->getContent(); | ||
$opt = new ParserOptions; | $opt = new ParserOptions; | ||
$opt->setRemoveComments(false); # allow HTML comments | $opt->setRemoveComments(false); # allow HTML comments | ||
Line 100: | Line 100: | ||
$wgOut->setHTMLTitle($ttext); # use this so DISPLAYTITLE magic works | $wgOut->setHTMLTitle($ttext); # use this so DISPLAYTITLE magic works | ||
$out = $wgParser->parse($text,$title,$opt,true,true); | $out = $wgParser->parse($text,$title,$opt,true,true); | ||
− | |||
$ttext = $wgOut->getHTMLTitle(); | $ttext = $wgOut->getHTMLTitle(); | ||
$html .= "<h1>$ttext</h1>".$out->getText()."\n"; | $html .= "<h1>$ttext</h1>".$out->getText()."\n"; | ||
+ | list($wgArticlePath,$wgScriptPath,$wgScript) = $tmp; | ||
} | } | ||
} | } |
Revision as of 13:00, 8 August 2007
<?php
- Extension:PdfBook
Template:PhpCategory:Extensions created with Template:Extension
- - Licenced under LGPL (http://www.gnu.org/copyleft/lesser.html)
- - Author: User:Nad
- - Started: 2007-08-08
if (!defined('MEDIAWIKI')) die('Not an entry point.');
define('PDFBOOK_VERSION','0.0.0, 2007-08-08');
$wgPdfBookMagic = "book"; $wgExtensionFunctions[] = 'wfSetupPdfBook'; $wgHooks['LanguageGetMagic'][] = 'wfPdfBookLanguageGetMagic';
$wgExtensionCredits['parserhook'][] = array( 'name' => 'Pdf Book', 'author' => 'User:Nad', 'description' => 'Composes a book from articles in a category and exports as a PDF book', 'url' => 'http://www.mediawiki.org/wiki/Extension:Pdf_Book', 'version' => PDFBOOK_VERSION );
class PdfBook {
# Constructor function PdfBook() { global $wgHooks,$wgParser,$wgPdfBookMagic; $wgParser->setFunctionHook($wgPdfBookMagic,array($this,'magicBook')); $wgHooks['UnknownAction'][] = $this;
# Add a new pdf log type global $wgLogTypes,$wgLogNames,$wgLogHeaders,$wgLogActions; $wgLogTypes[] = 'pdf'; $wgLogNames ['pdf'] = 'pdflogpage'; $wgLogHeaders['pdf'] = 'pdflogpagetext'; $wgLogActions['pdf/book'] = 'pdflogentry'; }
# Expand the book-magic function magicBook(&$parser) {
# Populate $argv with both named and numeric parameters $argv = array(); foreach (func_get_args() as $arg) if (!is_object($arg)) { if (preg_match('/^(.+?)\\s*=\\s*(.+)$/',$arg,$match)) $argv[$match[1]] = $match[2]; else $argv[] = $arg; }
# Return result with available parser flags return array( $text, found => true, nowiki => false, noparse => false, noargs => false, isHTML => false ); }
function onUnknownAction($action,$article) { global $wgOut,$wgUser,$wgTitle,$wgParser,$wgArticlePath,$wgScriptPath,$wgUploadPath,$wgScript; if($action == 'pdfbook') {
# Log the export $msg = $wgUser->getUserPage()->getPrefixedText().' exported as a PDF book'; $log = new LogPage('pdf',false); $log->addEntry('book',$wgTitle,$msg);
# Initialise PDF variables $layout = '--firstpage toc'; if (!xwGetProperty($properties,'pdf/left-margin',$left)) $left = '1cm'; if (!xwGetProperty($properties,'pdf/right-margin',$right)) $right = '1cm'; if (!xwGetProperty($properties,'pdf/top-margin',$top)) $top = '1cm'; if (!xwGetProperty($properties,'pdf/bottom-margin',$bottom)) $bottom = '5mm'; if (!xwGetProperty($properties,'pdf/font-name',$font)) $font = 'Arial'; if (!xwGetProperty($properties,'pdf/font-size',$size)) $size = '8'; if (!xwGetProperty($properties,'pdf/links',$links)) $links = '217A28'; if (!xwGetProperty($properties,'pdf/toc-levels',$levels)) $levels = '2'; if (xwGetProperty($properties,'pdf/exclude',$exclude)) $exclude = split('\\s*,\\s*',$exclude); else $exclude = array();
# Select all article titles in category $cat = $article->getTitle()->getText(); $db = &wfGetDB(DB_SLAVE); $cl = $db->tableName('categorylinks'); $result = $db->query("SELECT cl_from FROM $cl WHERE cl_to = '$cat' ORDER BY cl_sortkey"); # Format the article's as a single HTML document with absolute URL's $html = ; while ($row = mysql_fetch_row($result)) { $title = Title::newFromID($row[0]); $ttext = $title->getPrefixedText(); if (!in_array($ttext,$exclude)) { $tmp = array($wgArticlePath,$wgScriptPath,$wgScript); $wgArticlePath = $wgServer.$wgArticlePath; $wgScriptPath = $wgServer.$wgScriptPath; $wgScript = $wgServer.$wgScript; $article = new Article($title); $text = $article->getContent(); $opt = new ParserOptions; $opt->setRemoveComments(false); # allow HTML comments $opt->setEditSection(false); # remove section-edit links $wgOut->setHTMLTitle($ttext); # use this so DISPLAYTITLE magic works $out = $wgParser->parse($text,$title,$opt,true,true); $ttext = $wgOut->getHTMLTitle();
$html .= "
$ttext
".$out->getText()."\n";
list($wgArticlePath,$wgScriptPath,$wgScript) = $tmp; } }
# Write the HTML to a tmp file $file = "$wgUploadPath/".uniqid('pdf-book'); $fh = fopen($file,'w+'); fwrite($fh,$html); fclose($fh);
# Send the file to the client via htmldoc converter while (@ob_end_clean()); header("Content-Type: application/pdf"); header("Content-Disposition: attachment; filename=\"$file\""); flush(); passthru("htmldoc -t pdf --left $left --right $right --top $top --bottom $bottom --header ... --footer .1. --headfootsize 8 --quiet --jpeg --color --bodyfont $font --fontsize $size --linkstyle plain --linkcolor $links --toclevels $levels --format pdf14 --numbered $layout $file"); @unlink($file); die; } }
# Needed in some versions to prevent Special:Version from breaking function __toString() { return 'PdfBook'; }
}
- Called from $wgExtensionFunctions array when initialising extensions
function wfSetupPdfBook() { global $wgPdfBook; $wgPdfBook = new PdfBook(); }
- Needed in MediaWiki >1.8.0 for magic word hooks to work properly
function wfPdfBookLanguageGetMagic(&$magicWords,$langCode = 0) { global $wgPdfBookMagic; $magicWords[$wgPdfBookMagic] = array(0,$wgPdfBookMagic); return true; }
?>