|
|
(23 intermediate revisions by the same user not shown) |
Line 1: |
Line 1: |
− | <?php
| + | {{svn|http://svn.wikimedia.org/viewvc/mediawiki/trunk/extensions/PdfBook}} |
− | # Extension:PdfBook{{Category:Extensions|PdfBook}}{{php}}{{Category:Extensions created with Template:Extension}}
| |
− | # - Licenced under LGPL (http://www.gnu.org/copyleft/lesser.html)
| |
− | # - Author: [http://www.organicdesign.co.nz/nad User:Nad]
| |
− | # - Started: 2007-08-08
| |
| | | |
− | if (!defined('MEDIAWIKI')) die('Not an entry point.');
| + | == Other free PDF libraries == |
− | | + | *[http://www.tcpdf.org/ TCPDF] |
− | define('PDFBOOK_VERSION','0.0.0, 2007-08-08');
| + | *[http://www.mpdf1.com mPDF] |
− | | |
− | $wgPdfBookMagic = "book";
| |
− | $wgExtensionFunctions[] = 'wfSetupPdfBook';
| |
− | $wgHooks['LanguageGetMagic'][] = 'wfPdfBookLanguageGetMagic';
| |
− | | |
− | $wgExtensionCredits['parserhook'][] = array(
| |
− | 'name' => 'Pdf Book',
| |
− | 'author' => '[http://www.organicdesign.co.nz/nad 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)) {
| |
− | $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 .= "<h1>$ttext</h1>".$out->getText()."\n";
| |
− | }
| |
− | }
| |
− | | |
− | # 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;
| |
− | }
| |
− | | |
− | ?>
| |