|
|
| (24 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)) {
| |
| − | $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 .= "<h1>$ttext</h1>".$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;
| |
| − | }
| |
| − | | |
| − | ?>
| |