openrat-cms

# OpenRat Content Management System
git clone http://git.code.weiherhei.de/openrat-cms.git
Log | Files | Refs

commit fe6fc0b6b60813ecf0be037e841c46778ea65a89
parent b397bfed957fe052ceb103372ead6c3ad6933a47
Author: Jan Dankert <develop@jandankert.de>
Date:   Sat, 22 Feb 2020 22:45:05 +0100

Refactoring: Enable Autoloading, Fix namespace structure.

Diffstat:
modules/wikiparser/AbstractElement.class.php | 18------------------
modules/wikiparser/CodeElement.class.php | 14--------------
modules/wikiparser/DefinitionItemElement.class.php | 14--------------
modules/wikiparser/DefinitionListElement.class.php | 14--------------
modules/wikiparser/DocumentElement.class.php | 99-------------------------------------------------------------------------------
modules/wikiparser/EmphaticElement.class.php | 23-----------------------
modules/wikiparser/FootnoteElement.class.php | 14--------------
modules/wikiparser/HeadlineElement.class.php | 54------------------------------------------------------
modules/wikiparser/ImageElement.class.php | 14--------------
modules/wikiparser/InsertedElement.class.php | 14--------------
modules/wikiparser/LineBreakElement.class.php | 14--------------
modules/wikiparser/LinkElement.class.php | 154-------------------------------------------------------------------------------
modules/wikiparser/ListElement.class.php | 15---------------
modules/wikiparser/ListEntryElement.class.php | 13-------------
modules/wikiparser/MacroElement.class.php | 18------------------
modules/wikiparser/NumberedListElement.class.php | 14--------------
modules/wikiparser/ParagraphElement.class.php | 14--------------
modules/wikiparser/QuoteElement.class.php | 13-------------
modules/wikiparser/RawElement.class.php | 23-----------------------
modules/wikiparser/RemovedElement.class.php | 14--------------
modules/wikiparser/SpeechElement.class.php | 14--------------
modules/wikiparser/StrongElement.class.php | 28----------------------------
modules/wikiparser/TableCellElement.class.php | 16----------------
modules/wikiparser/TableElement.class.php | 23-----------------------
modules/wikiparser/TableLineElement.class.php | 14--------------
modules/wikiparser/TableOfContentElement.class.php | 14--------------
modules/wikiparser/TeletypeElement.class.php | 14--------------
modules/wikiparser/TextElement.class.php | 63---------------------------------------------------------------
modules/wikiparser/model/AbstractElement.class.php | 19+++++++++++++++++++
modules/wikiparser/model/CodeElement.class.php | 18++++++++++++++++++
modules/wikiparser/model/DefinitionItemElement.class.php | 18++++++++++++++++++
modules/wikiparser/model/DefinitionListElement.class.php | 18++++++++++++++++++
modules/wikiparser/model/DocumentElement.class.php | 101+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
modules/wikiparser/model/EmphaticElement.class.php | 26++++++++++++++++++++++++++
modules/wikiparser/model/FootnoteElement.class.php | 18++++++++++++++++++
modules/wikiparser/model/HeadlineElement.class.php | 53+++++++++++++++++++++++++++++++++++++++++++++++++++++
modules/wikiparser/model/ImageElement.class.php | 17+++++++++++++++++
modules/wikiparser/model/InsertedElement.class.php | 18++++++++++++++++++
modules/wikiparser/model/LineBreakElement.class.php | 18++++++++++++++++++
modules/wikiparser/model/LinkElement.class.php | 150+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
modules/wikiparser/model/ListElement.class.php | 19+++++++++++++++++++
modules/wikiparser/model/ListEntryElement.class.php | 17+++++++++++++++++
modules/wikiparser/model/MacroElement.class.php | 22++++++++++++++++++++++
modules/wikiparser/model/NumberedListElement.class.php | 18++++++++++++++++++
modules/wikiparser/model/ParagraphElement.class.php | 18++++++++++++++++++
modules/wikiparser/model/QuoteElement.class.php | 17+++++++++++++++++
modules/wikiparser/model/RawElement.class.php | 27+++++++++++++++++++++++++++
modules/wikiparser/model/RemovedElement.class.php | 18++++++++++++++++++
modules/wikiparser/model/SpeechElement.class.php | 18++++++++++++++++++
modules/wikiparser/model/StrongElement.class.php | 30++++++++++++++++++++++++++++++
modules/wikiparser/model/TableCellElement.class.php | 20++++++++++++++++++++
modules/wikiparser/model/TableElement.class.php | 26++++++++++++++++++++++++++
modules/wikiparser/model/TableLineElement.class.php | 18++++++++++++++++++
modules/wikiparser/model/TableOfContentElement.class.php | 18++++++++++++++++++
modules/wikiparser/model/TeletypeElement.class.php | 18++++++++++++++++++
modules/wikiparser/model/TextElement.class.php | 61+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
modules/wikiparser/parser/WikiParser.class.php | 619++++++++++++++++++++++++++++++++++++++-----------------------------------------
modules/wikiparser/renderer/DocBookRenderer.class.php | 105++++++++++++++++++++++++++++++++++++++-----------------------------------------
modules/wikiparser/renderer/HtmlDomRenderer.class.php | 479+++++++++++++++++++++++++++++++++++++++----------------------------------------
modules/wikiparser/renderer/HtmlRenderer.class.php | 740+++++++++++++++++++++++++++++++++++++++----------------------------------------
modules/wikiparser/renderer/LatexRenderer.class.php | 95+++++++++++++++++++++++++++++++++++++++----------------------------------------
modules/wikiparser/renderer/Pdf.class.php | 35-----------------------------------
modules/wikiparser/renderer/PdfRenderer.class.php | 322++++++++++++++++++++++++++++++++++++++++----------------------------------------
modules/wikiparser/renderer/TextRenderer.class.php | 172++++++++++++++++++++++++++++++++++++++++----------------------------------------
modules/wikiparser/renderer/XhtmlRenderer.class.php | 743++++++++++++++++++++++++++++++++++++++-----------------------------------------
modules/wikiparser/renderer/fpdf.php | 1726-------------------------------------------------------------------------------
modules/wikiparser/renderer/fpdf/Pdf.class.php | 35+++++++++++++++++++++++++++++++++++
modules/wikiparser/renderer/fpdf/fpdf.php | 1726+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
modules/wikiparser/require.php | 44++------------------------------------------
69 files changed, 4201 insertions(+), 4235 deletions(-)

diff --git a/modules/wikiparser/AbstractElement.class.php b/modules/wikiparser/AbstractElement.class.php @@ -1,17 +0,0 @@ -<?php - -/** - * @author $Author$ - * @version $Revision$ - * @package openrat.text - */ -class AbstractElement -{ - var $children = array(); - - var $style = ''; - var $class = ''; - var $title = ''; -} - -?>- \ No newline at end of file diff --git a/modules/wikiparser/CodeElement.class.php b/modules/wikiparser/CodeElement.class.php @@ -1,13 +0,0 @@ -<?php - -/** - * @author $Author$ - * @version $Revision$ - * @package openrat.text - */ -class CodeElement extends AbstractElement -{ - var $language; -} - -?>- \ No newline at end of file diff --git a/modules/wikiparser/DefinitionItemElement.class.php b/modules/wikiparser/DefinitionItemElement.class.php @@ -1,13 +0,0 @@ -<?php - -/** - * @author $Author$ - * @version $Revision$ - * @package openrat.text - */ -class DefinitionItemElement extends AbstractElement -{ - var $key = ''; -} - -?>- \ No newline at end of file diff --git a/modules/wikiparser/DefinitionListElement.class.php b/modules/wikiparser/DefinitionListElement.class.php @@ -1,13 +0,0 @@ -<?php - -/** - * @author $Author$ - * @version $Revision$ - * @package openrat.text - */ -class DefinitionListElement extends AbstractElement -{ - -} - -?>- \ No newline at end of file diff --git a/modules/wikiparser/DocumentElement.class.php b/modules/wikiparser/DocumentElement.class.php @@ -1,98 +0,0 @@ -<?php - -/** - * Dokument-Objekt.<br> - * Diese Objekt verk�rpert das Root-Objekt in einem DOM-Baum.<br> - * <br> - * Dieses Objekt kann Text parsen und seine Unterobjekte selbst erzeugen.<br> - * - * @author Jan Dankert, $Author$ - * @version $Revision$ - * @package openrat.text - */ -class DocumentElement extends AbstractElement -{ - var $linkedObjectIds = array(); - var $page; - - /** - * Fu�noten. - * - * @var Array - */ - var $footnotes = array(); - - var $encodeHtml = false; - - /** - * Ein Text wird geparst.<br> - * <br> - * Zerlegt den Text zeilenweise und erzeugt die Unterobjekte.<br> - * - * @param Ein- oder mehrzeiliger roher Text - * @param Art des Parsens, Default=Wiki - */ - function parse( $text, $type='wiki' ) - { - $parserClass = ucfirst(strtolower($type)).'Parser'; - $parser = new $parserClass(); - - $this->children = $parser->parse( $text ); - $this->linkedObjectIds = $parser->linkedObjectIds; - } - - - - - - /** - * Rendering des Dokumentes.<br> - * Die Art und Weise des Renderns ist in Abh�ngigkeit zum - * �bergebenen Mime-Type. - * - * @param String $mimeType Mime-Type, z.B. "text/html" - * @return String - */ - function render( $mimeType ) - { - - switch( $mimeType ) - { - case 'text/html': - $this->type = 'html'; - break; - case 'text/plain': - $this->type = 'text'; - break; - case 'application/pdf': - $this->type = 'pdf'; - break; - case 'application/html-dom': - $this->type = 'htmlDom'; - break; - case 'application/x-latex': - $this->type = 'latex'; - break; - case 'text/xhtml': - $this->type = 'xhtml'; - break; - case 'application/docbook+xml': - $this->type = 'docBook'; - break; - default: - $this->type = 'html'; - } - - $rendererClass = ucfirst($this->type).'Renderer'; - - $renderer = new $rendererClass(); - $renderer->children = $this->children; - $renderer->page = $this->page; - $renderer->linkedObjectIds = $this->linkedObjectIds; - $renderer->encodeHtml = $this->encodeHtml; - - return $renderer->render(); - } -} - -?>- \ No newline at end of file diff --git a/modules/wikiparser/EmphaticElement.class.php b/modules/wikiparser/EmphaticElement.class.php @@ -1,22 +0,0 @@ -<?php - -/** - * @author $Author$ - * @version $Revision$ - * @package openrat.text - */ -class EmphaticElement extends AbstractElement -{ - function render( $type ) - { - switch( $type ) - { - case 'html': - return '<p>'.$this->value.'</p>'; - default: - return $this->value; - } - } -} - -?>- \ No newline at end of file diff --git a/modules/wikiparser/FootnoteElement.class.php b/modules/wikiparser/FootnoteElement.class.php @@ -1,13 +0,0 @@ -<?php - -/** - * @author $Author$ - * @version $Revision$ - * @package openrat.text - */ -class FootnoteElement extends AbstractElement -{ - -} - -?>- \ No newline at end of file diff --git a/modules/wikiparser/HeadlineElement.class.php b/modules/wikiparser/HeadlineElement.class.php @@ -1,53 +0,0 @@ -<?php - -/** - * @author $Author$ - * @version $Revision$ - * @package openrat.text - */ -class HeadlineElement extends AbstractElement -{ - var $level = 1; - - - - /** - * Konstruktor. - */ - function __construct( $level=1 ) - { - $this->level = $level; - } - - - - function getText() - { - $name = ''; - foreach( $this->children as $child ) - { - if ( strtolower(get_class($child))=='textelement') - { - $name .= $child->text; - } - } - - return $name; - } - - - - function getName() - { - $name = strtolower( $this->getText() ); - -// return urlencode( $name ); - $gueltig = 'abcdefghijklmnopqrstuvwxyz0123456789.-_'; - $tmp = strtr($name, $gueltig, str_repeat('#', strlen($gueltig))); - $name = str_replace('.','',strtr($name, $tmp, str_repeat('.', strlen($tmp)))); - - return $name; - } -} - -?>- \ No newline at end of file diff --git a/modules/wikiparser/ImageElement.class.php b/modules/wikiparser/ImageElement.class.php @@ -1,13 +0,0 @@ -<?php - -/** - * @author $Author$ - * @version $Revision$ - * @package openrat.text - */ -class ImageElement extends LinkElement -{ - var $description; -} - -?>- \ No newline at end of file diff --git a/modules/wikiparser/InsertedElement.class.php b/modules/wikiparser/InsertedElement.class.php @@ -1,13 +0,0 @@ -<?php - -/** - * @author $Author$ - * @version $Revision$ - * @package openrat.text - */ -class InsertedElement extends AbstractElement -{ - -} - -?>- \ No newline at end of file diff --git a/modules/wikiparser/LineBreakElement.class.php b/modules/wikiparser/LineBreakElement.class.php @@ -1,13 +0,0 @@ -<?php - -/** - * @author $Author$ - * @version $Revision$ - * @package openrat.text - */ -class LineBreakElement extends AbstractElement -{ - -} - -?>- \ No newline at end of file diff --git a/modules/wikiparser/LinkElement.class.php b/modules/wikiparser/LinkElement.class.php @@ -1,153 +0,0 @@ -<?php - -/** - * Darstellung eines Verweises auf eine URL.<br> - * <br> - * Es wird nur das Verweisziel gespeichert.<br> - * Der verweisende Text wird nicht hier, sondern in einem der Unterelemente gespeichert. - * - * @author $Author$ - * @version $Revision$ - * @package openrat.text - */ -class LinkElement extends AbstractElement -{ - var $target; - var $mail; - var $protocol = ''; - var $objectId = 0; - var $user = ''; - var $password = ''; - var $host = ''; - var $port = ''; - var $query = ''; - var $fragment = ''; - var $path = ''; - - var $name; - - /** - * Setzt das Ziel des Links.<br> - * Als Parameter wird eine URL erwartet. - * - * @param target Verweisziel - */ - function setTarget( $target ) - { - $this->target = $target; - - $url = parse_url( $target ); - - $this->protocol = @$url['scheme']; - $this->user = @$url['user' ]; - $this->password = @$url['pass' ]; - $this->host = @$url['host' ]; - $this->port = @$url['port' ]; - $this->path = @$url['path' ]; - $this->query = @$url['query' ]; - $this->fragment = @$url['fragment']; - - if ( $this->protocol == 'object' ) - $this->objectId = intval($url['host']); - - - if ( $this->protocol == '' ) - { - if ( strpos($target,'@') !== false ) - { - $this->protocol = 'mailto'; - $this->path = $this->target; - } - - // "..."->"123" - if ( intval($url['path']) > 0 ) - { - $this->protocol = 'object'; - $this->objectId = intval($url['path']); - } - } - } - - - /** - * Ermittelt die URL des Links. - */ - function getUrl() - { - $url = ''; - - // Protokollangabe im Format <protokoll>:// - if ( $this->protocol != '') - { - $url .= $this->protocol.':'; - - // Ausnahme: Das "mailto"-Protokoll darf keinen Doppelslash haben. - if ( $this->protocol != 'mailto' ) - $url.='//'; - } - - // Benutzer und Kennwort anh�ngen. - // Format: <benutzer>:<kennwort>@ - if ( $this->user != '' ) - { - $url .= $this->user; - if ( $this->password != '' ) - { - $url .= ':'.$this->password; - } - $url .= '@'; - } - - // Hostnamen anh�ngen. - $url .= $this->host; - - // Port anh�ngen - if ( $this->port != '' ) - $url .= ':'.$this->port; - - // Den Pfad anh�ngen. - $url .= $this->url_encode($this->path); - - // Den Query-Teil mit einem "?" getrennt anh�ngen. - if ( $this->query != '' ) - $url .= '?'.$this->url_encode($this->query); -// $url .= '?'.urlencode($this->query); - - // Fragment mit "#" getrennt anh�ngen. - if ( $this->fragment != '' ) - $url .= '#'.$this->url_encode($this->fragment); - - return $url; - } - - - - /** - * Hilfsfunktion f�r #url_encode(). - * Ein Ganzzahl-Wert wird in Hexadezimal umgewandelt. - */ - private function int2hex($intega) - { - $Ziffer = "0123456789ABCDEF"; - return @$Ziffer[($intega%256)/16].$Ziffer[$intega%16]; - } - - - - /** - * Kodiert eine URL.<br> - * Alle Zeichen mit dem Ordinalwert >=129 werden kodiert. - */ - private function url_encode( $text ) - { - for($i=129;$i<255;$i++) - { - $in = chr($i); - $out = "%C3%".$this->int2hex($i-64); - $text = str_replace($in,$out,$text); - } - return $text; - } -} - -?>- \ No newline at end of file diff --git a/modules/wikiparser/ListElement.class.php b/modules/wikiparser/ListElement.class.php @@ -1,14 +0,0 @@ -<?php - -/** - * @author $Author$ - * @version $Revision$ - * @package openrat.text - */ -class ListElement extends AbstractElement -{ - - -} - -?>- \ No newline at end of file diff --git a/modules/wikiparser/ListEntryElement.class.php b/modules/wikiparser/ListEntryElement.class.php @@ -1,12 +0,0 @@ -<?php - -/** - * @author $Author$ - * @version $Revision$ - * @package openrat.text - */ -class ListEntryElement extends AbstractElement -{ -} - -?>- \ No newline at end of file diff --git a/modules/wikiparser/MacroElement.class.php b/modules/wikiparser/MacroElement.class.php @@ -1,17 +0,0 @@ -<?php - -/** - * Darstellung eines Makros. - * - * Ein Makro hat einen Namen sowie n Attribute. - * - * @author Jan Dankert - * @package openrat.text - */ -class MacroElement extends AbstractElement -{ - var $name; - var $attributes = array(); -} - -?>- \ No newline at end of file diff --git a/modules/wikiparser/NumberedListElement.class.php b/modules/wikiparser/NumberedListElement.class.php @@ -1,13 +0,0 @@ -<?php - -/** - * @author $Author$ - * @version $Revision$ - * @package openrat.text - */ -class NumberedListElement extends AbstractElement -{ - -} - -?>- \ No newline at end of file diff --git a/modules/wikiparser/ParagraphElement.class.php b/modules/wikiparser/ParagraphElement.class.php @@ -1,13 +0,0 @@ -<?php - -/** - * @author $Author$ - * @version $Revision$ - * @package openrat.text - */ -class ParagraphElement extends AbstractElement -{ - -} - -?>- \ No newline at end of file diff --git a/modules/wikiparser/QuoteElement.class.php b/modules/wikiparser/QuoteElement.class.php @@ -1,12 +0,0 @@ -<?php - -/** - * @author $Author$ - * @version $Revision$ - * @package openrat.text - */ -class QuoteElement extends AbstractElement -{ -} - -?>- \ No newline at end of file diff --git a/modules/wikiparser/RawElement.class.php b/modules/wikiparser/RawElement.class.php @@ -1,22 +0,0 @@ -<?php - -/** - * @author $Author$ - * @version $Revision$ - * @package openrat.text - */ -class RawElement extends AbstractElement -{ - var $src = ''; - - /** - * RawElement constructor. - * @param string $t - */ - function __construct($t='' ) - { - $this->src = $t; - } -} - -?>- \ No newline at end of file diff --git a/modules/wikiparser/RemovedElement.class.php b/modules/wikiparser/RemovedElement.class.php @@ -1,13 +0,0 @@ -<?php - -/** - * @author $Author$ - * @version $Revision$ - * @package openrat.text - */ -class RemovedElement extends AbstractElement -{ - -} - -?>- \ No newline at end of file diff --git a/modules/wikiparser/SpeechElement.class.php b/modules/wikiparser/SpeechElement.class.php @@ -1,13 +0,0 @@ -<?php - -/** - * @author $Author$ - * @version $Revision$ - * @package openrat.text - */ -class SpeechElement extends AbstractElement -{ - -} - -?>- \ No newline at end of file diff --git a/modules/wikiparser/StrongElement.class.php b/modules/wikiparser/StrongElement.class.php @@ -1,27 +0,0 @@ -<?php - -/** - * @author $Author$ - * @version $Revision$ - * @package openrat.text - */ -class StrongElement extends AbstractElement -{ - function render( $type ) - { - switch( $type ) - { - case 'html': - return '<p>'.$this->value.'</p>'; - default: - return $this->value; - } - } - - - - var $markup = array( 'beginswith' =>'*' , - 'endswith'=>'*' ); -} - -?>- \ No newline at end of file diff --git a/modules/wikiparser/TableCellElement.class.php b/modules/wikiparser/TableCellElement.class.php @@ -1,15 +0,0 @@ -<?php - -/** - * @author $Author$ - * @version $Revision$ - * @package openrat.text - */ -class TableCellElement extends AbstractElement -{ - var $rowSpan = 1; - var $colSpan = 1; - var $isHeading = false; -} - -?>- \ No newline at end of file diff --git a/modules/wikiparser/TableElement.class.php b/modules/wikiparser/TableElement.class.php @@ -1,22 +0,0 @@ -<?php - -/** - * @author $Author$ - * @version $Revision$ - * @package openrat.text - */ -class TableElement extends AbstractElement -{ - function render( $type ) - { - switch( $type ) - { - case 'html': - return '<p>'.$this->value.'</p>'; - default: - return $this->value; - } - } -} - -?>- \ No newline at end of file diff --git a/modules/wikiparser/TableLineElement.class.php b/modules/wikiparser/TableLineElement.class.php @@ -1,13 +0,0 @@ -<?php - -/** - * @author $Author$ - * @version $Revision$ - * @package openrat.text - */ -class TableLineElement extends AbstractElement -{ - -} - -?>- \ No newline at end of file diff --git a/modules/wikiparser/TableOfContentElement.class.php b/modules/wikiparser/TableOfContentElement.class.php @@ -1,13 +0,0 @@ -<?php - -/** - * @author $Author$ - * @version $Revision$ - * @package openrat.text - */ -class TableOfContentElement extends AbstractElement -{ - -} - -?>- \ No newline at end of file diff --git a/modules/wikiparser/TeletypeElement.class.php b/modules/wikiparser/TeletypeElement.class.php @@ -1,13 +0,0 @@ -<?php - -/** - * @author $Author$ - * @version $Revision$ - * @package openrat.text - */ -class TeletypeElement extends AbstractElement -{ - -} - -?>- \ No newline at end of file diff --git a/modules/wikiparser/TextElement.class.php b/modules/wikiparser/TextElement.class.php @@ -1,62 +0,0 @@ -<?php - -/** - * @author $Author$ - * @version $Revision$ - * @package openrat.text - */ -class TextElement extends AbstractElement -{ - var $text = ''; - - function __construct( $t='' ) - { - $this->text = $t; - - $this->parseStyleClass(); - $this->parseTitleText(); - } - - - function parseStyleClass() - { - $char1 = substr($this->text,0,1); - if ( $char1 == "(" ) - { - $pos2 = strpos($this->text,")",2); - if ( $pos2 !== false ) - { - $this->style = substr($this->text,1,$pos2-1); - $this->text = substr($this->text,$pos2+1); - - // Wenn kein Doppelpunkt in den Styleangaben vorkommt, dann - // handelt es sich um einen Klassennamen. - if ( strpos($this->style,':') === false ) - { - $this->class = $this->style; - $this->style = ''; - } - } - } - } - - - - function parseTitleText() - { - $char1 = substr($this->text,0,1); - if ( $char1 == "'" ) - { - $pos2 = strpos($this->text,"'",2); - if ( $pos2 !== false ) - { - $this->title = substr($this->text,1,$pos2-1); - $this->text = substr($this->text,$pos2+1); - } - } - } - - -} - -?>- \ No newline at end of file diff --git a/modules/wikiparser/model/AbstractElement.class.php b/modules/wikiparser/model/AbstractElement.class.php @@ -0,0 +1,18 @@ +<?php + +namespace wikiparser\model; +/** + * @author $Author$ + * @version $Revision$ + * @package openrat.text + */ +class AbstractElement +{ + var $children = array(); + + var $style = ''; + var $class = ''; + var $title = ''; +} + +?>+ \ No newline at end of file diff --git a/modules/wikiparser/model/CodeElement.class.php b/modules/wikiparser/model/CodeElement.class.php @@ -0,0 +1,17 @@ +<?php + +namespace wikiparser\model; + +use wikiparser\model\AbstractElement; + +/** + * @author $Author$ + * @version $Revision$ + * @package openrat.text + */ +class CodeElement extends AbstractElement +{ + var $language; +} + +?>+ \ No newline at end of file diff --git a/modules/wikiparser/model/DefinitionItemElement.class.php b/modules/wikiparser/model/DefinitionItemElement.class.php @@ -0,0 +1,17 @@ +<?php + +namespace wikiparser\model; + +use wikiparser\model\AbstractElement; + +/** + * @author $Author$ + * @version $Revision$ + * @package openrat.text + */ +class DefinitionItemElement extends AbstractElement +{ + var $key = ''; +} + +?>+ \ No newline at end of file diff --git a/modules/wikiparser/model/DefinitionListElement.class.php b/modules/wikiparser/model/DefinitionListElement.class.php @@ -0,0 +1,17 @@ +<?php + +namespace wikiparser\model; + +use wikiparser\model\AbstractElement; + +/** + * @author $Author$ + * @version $Revision$ + * @package openrat.text + */ +class DefinitionListElement extends AbstractElement +{ + +} + +?>+ \ No newline at end of file diff --git a/modules/wikiparser/model/DocumentElement.class.php b/modules/wikiparser/model/DocumentElement.class.php @@ -0,0 +1,100 @@ +<?php + +namespace wikiparser\model; + +use Art; +use Ein; +use wikiparser\model\AbstractElement; + +/** + * Dokument-Objekt.<br> + * Diese Objekt verk�rpert das Root-Objekt in einem DOM-Baum.<br> + * <br> + * Dieses Objekt kann Text parsen und seine Unterobjekte selbst erzeugen.<br> + * + * @author Jan Dankert, $Author$ + * @version $Revision$ + * @package openrat.text + */ +class DocumentElement extends AbstractElement +{ + var $linkedObjectIds = array(); + var $page; + + /** + * Fu�noten. + * + * @var Array + */ + var $footnotes = array(); + + var $encodeHtml = false; + + /** + * Ein Text wird geparst.<br> + * <br> + * Zerlegt den Text zeilenweise und erzeugt die Unterobjekte.<br> + * + * @param Ein- oder mehrzeiliger roher Text + * @param Art des Parsens, Default=Wiki + */ + function parse($text, $type = 'wiki') + { + $parserClass = ucfirst(strtolower($type)) . 'Parser'; + $parser = new $parserClass(); + + $this->children = $parser->parse($text); + $this->linkedObjectIds = $parser->linkedObjectIds; + } + + + /** + * Rendering des Dokumentes.<br> + * Die Art und Weise des Renderns ist in Abh�ngigkeit zum + * �bergebenen Mime-Type. + * + * @param String $mimeType Mime-Type, z.B. "text/html" + * @return String + */ + function render($mimeType) + { + + switch ($mimeType) { + case 'text/html': + $this->type = 'html'; + break; + case 'text/plain': + $this->type = 'text'; + break; + case 'application/pdf': + $this->type = 'pdf'; + break; + case 'application/html-dom': + $this->type = 'htmlDom'; + break; + case 'application/x-latex': + $this->type = 'latex'; + break; + case 'text/xhtml': + $this->type = 'xhtml'; + break; + case 'application/docbook+xml': + $this->type = 'docBook'; + break; + default: + $this->type = 'html'; + } + + $rendererClass = ucfirst($this->type) . 'Renderer'; + + $renderer = new $rendererClass(); + $renderer->children = $this->children; + $renderer->page = $this->page; + $renderer->linkedObjectIds = $this->linkedObjectIds; + $renderer->encodeHtml = $this->encodeHtml; + + return $renderer->render(); + } +} + +?>+ \ No newline at end of file diff --git a/modules/wikiparser/model/EmphaticElement.class.php b/modules/wikiparser/model/EmphaticElement.class.php @@ -0,0 +1,25 @@ +<?php + +namespace wikiparser\model; + +use wikiparser\model\AbstractElement; + +/** + * @author $Author$ + * @version $Revision$ + * @package openrat.text + */ +class EmphaticElement extends AbstractElement +{ + function render($type) + { + switch ($type) { + case 'html': + return '<p>' . $this->value . '</p>'; + default: + return $this->value; + } + } +} + +?>+ \ No newline at end of file diff --git a/modules/wikiparser/model/FootnoteElement.class.php b/modules/wikiparser/model/FootnoteElement.class.php @@ -0,0 +1,17 @@ +<?php + +namespace wikiparser\model; + +use wikiparser\model\AbstractElement; + +/** + * @author $Author$ + * @version $Revision$ + * @package openrat.text + */ +class FootnoteElement extends AbstractElement +{ + +} + +?>+ \ No newline at end of file diff --git a/modules/wikiparser/model/HeadlineElement.class.php b/modules/wikiparser/model/HeadlineElement.class.php @@ -0,0 +1,52 @@ +<?php + +namespace wikiparser\model; + +use wikiparser\model\AbstractElement; + +/** + * @author $Author$ + * @version $Revision$ + * @package openrat.text + */ +class HeadlineElement extends AbstractElement +{ + var $level = 1; + + + /** + * Konstruktor. + */ + function __construct($level = 1) + { + $this->level = $level; + } + + + function getText() + { + $name = ''; + foreach ($this->children as $child) { + if (strtolower(get_class($child)) == 'textelement') { + $name .= $child->text; + } + } + + return $name; + } + + + function getName() + { + $name = strtolower($this->getText()); + +// return urlencode( $name ); + $gueltig = 'abcdefghijklmnopqrstuvwxyz0123456789.-_'; + $tmp = strtr($name, $gueltig, str_repeat('#', strlen($gueltig))); + $name = str_replace('.', '', strtr($name, $tmp, str_repeat('.', strlen($tmp)))); + + return $name; + } +} + +?>+ \ No newline at end of file diff --git a/modules/wikiparser/model/ImageElement.class.php b/modules/wikiparser/model/ImageElement.class.php @@ -0,0 +1,16 @@ +<?php + +namespace wikiparser\model; +use wikiparser\model\LinkElement; + +/** + * @author $Author$ + * @version $Revision$ + * @package openrat.text + */ +class ImageElement extends LinkElement +{ + var $description; +} + +?>+ \ No newline at end of file diff --git a/modules/wikiparser/model/InsertedElement.class.php b/modules/wikiparser/model/InsertedElement.class.php @@ -0,0 +1,17 @@ +<?php + +namespace wikiparser\model; + +use wikiparser\model\AbstractElement; + +/** + * @author $Author$ + * @version $Revision$ + * @package openrat.text + */ +class InsertedElement extends AbstractElement +{ + +} + +?>+ \ No newline at end of file diff --git a/modules/wikiparser/model/LineBreakElement.class.php b/modules/wikiparser/model/LineBreakElement.class.php @@ -0,0 +1,17 @@ +<?php + +namespace wikiparser\model; + +use wikiparser\model\AbstractElement; + +/** + * @author $Author$ + * @version $Revision$ + * @package openrat.text + */ +class LineBreakElement extends AbstractElement +{ + +} + +?>+ \ No newline at end of file diff --git a/modules/wikiparser/model/LinkElement.class.php b/modules/wikiparser/model/LinkElement.class.php @@ -0,0 +1,149 @@ +<?php + +namespace wikiparser\model; + +use target; +use wikiparser\model\AbstractElement; + +/** + * Darstellung eines Verweises auf eine URL.<br> + * <br> + * Es wird nur das Verweisziel gespeichert.<br> + * Der verweisende Text wird nicht hier, sondern in einem der Unterelemente gespeichert. + * + * @author $Author$ + * @version $Revision$ + * @package openrat.text + */ +class LinkElement extends AbstractElement +{ + var $target; + var $mail; + var $protocol = ''; + var $objectId = 0; + var $user = ''; + var $password = ''; + var $host = ''; + var $port = ''; + var $query = ''; + var $fragment = ''; + var $path = ''; + + var $name; + + /** + * Setzt das Ziel des Links.<br> + * Als Parameter wird eine URL erwartet. + * + * @param target Verweisziel + */ + function setTarget($target) + { + $this->target = $target; + + $url = parse_url($target); + + $this->protocol = @$url['scheme']; + $this->user = @$url['user']; + $this->password = @$url['pass']; + $this->host = @$url['host']; + $this->port = @$url['port']; + $this->path = @$url['path']; + $this->query = @$url['query']; + $this->fragment = @$url['fragment']; + + if ($this->protocol == 'object') + $this->objectId = intval($url['host']); + + + if ($this->protocol == '') { + if (strpos($target, '@') !== false) { + $this->protocol = 'mailto'; + $this->path = $this->target; + } + + // "..."->"123" + if (intval($url['path']) > 0) { + $this->protocol = 'object'; + $this->objectId = intval($url['path']); + } + } + } + + + /** + * Ermittelt die URL des Links. + */ + function getUrl() + { + $url = ''; + + // Protokollangabe im Format <protokoll>:// + if ($this->protocol != '') { + $url .= $this->protocol . ':'; + + // Ausnahme: Das "mailto"-Protokoll darf keinen Doppelslash haben. + if ($this->protocol != 'mailto') + $url .= '//'; + } + + // Benutzer und Kennwort anh�ngen. + // Format: <benutzer>:<kennwort>@ + if ($this->user != '') { + $url .= $this->user; + if ($this->password != '') { + $url .= ':' . $this->password; + } + $url .= '@'; + } + + // Hostnamen anh�ngen. + $url .= $this->host; + + // Port anh�ngen + if ($this->port != '') + $url .= ':' . $this->port; + + // Den Pfad anh�ngen. + $url .= $this->url_encode($this->path); + + // Den Query-Teil mit einem "?" getrennt anh�ngen. + if ($this->query != '') + $url .= '?' . $this->url_encode($this->query); +// $url .= '?'.urlencode($this->query); + + // Fragment mit "#" getrennt anh�ngen. + if ($this->fragment != '') + $url .= '#' . $this->url_encode($this->fragment); + + return $url; + } + + + /** + * Hilfsfunktion f�r #url_encode(). + * Ein Ganzzahl-Wert wird in Hexadezimal umgewandelt. + */ + private function int2hex($intega) + { + $Ziffer = "0123456789ABCDEF"; + return @$Ziffer[($intega % 256) / 16] . $Ziffer[$intega % 16]; + } + + + /** + * Kodiert eine URL.<br> + * Alle Zeichen mit dem Ordinalwert >=129 werden kodiert. + */ + private function url_encode($text) + { + for ($i = 129; $i < 255; $i++) { + $in = chr($i); + $out = "%C3%" . $this->int2hex($i - 64); + $text = str_replace($in, $out, $text); + } + return $text; + } +} + +?>+ \ No newline at end of file diff --git a/modules/wikiparser/model/ListElement.class.php b/modules/wikiparser/model/ListElement.class.php @@ -0,0 +1,18 @@ +<?php + +namespace wikiparser\model; + +use wikiparser\model\AbstractElement; + +/** + * @author $Author$ + * @version $Revision$ + * @package openrat.text + */ +class ListElement extends AbstractElement +{ + + +} + +?>+ \ No newline at end of file diff --git a/modules/wikiparser/model/ListEntryElement.class.php b/modules/wikiparser/model/ListEntryElement.class.php @@ -0,0 +1,16 @@ +<?php + +namespace wikiparser\model; + +use wikiparser\model\AbstractElement; + +/** + * @author $Author$ + * @version $Revision$ + * @package openrat.text + */ +class ListEntryElement extends AbstractElement +{ +} + +?>+ \ No newline at end of file diff --git a/modules/wikiparser/model/MacroElement.class.php b/modules/wikiparser/model/MacroElement.class.php @@ -0,0 +1,21 @@ +<?php + +namespace wikiparser\model; + +use wikiparser\model\AbstractElement; + +/** + * Darstellung eines Makros. + * + * Ein Makro hat einen Namen sowie n Attribute. + * + * @author Jan Dankert + * @package openrat.text + */ +class MacroElement extends AbstractElement +{ + var $name; + var $attributes = array(); +} + +?>+ \ No newline at end of file diff --git a/modules/wikiparser/model/NumberedListElement.class.php b/modules/wikiparser/model/NumberedListElement.class.php @@ -0,0 +1,17 @@ +<?php + +namespace wikiparser\model; + +use wikiparser\model\AbstractElement; + +/** + * @author $Author$ + * @version $Revision$ + * @package openrat.text + */ +class NumberedListElement extends AbstractElement +{ + +} + +?>+ \ No newline at end of file diff --git a/modules/wikiparser/model/ParagraphElement.class.php b/modules/wikiparser/model/ParagraphElement.class.php @@ -0,0 +1,17 @@ +<?php + +namespace wikiparser\model; + +use wikiparser\model\AbstractElement; + +/** + * @author $Author$ + * @version $Revision$ + * @package openrat.text + */ +class ParagraphElement extends AbstractElement +{ + +} + +?>+ \ No newline at end of file diff --git a/modules/wikiparser/model/QuoteElement.class.php b/modules/wikiparser/model/QuoteElement.class.php @@ -0,0 +1,16 @@ +<?php + +namespace wikiparser\model; + +use wikiparser\model\AbstractElement; + +/** + * @author $Author$ + * @version $Revision$ + * @package openrat.text + */ +class QuoteElement extends AbstractElement +{ +} + +?>+ \ No newline at end of file diff --git a/modules/wikiparser/model/RawElement.class.php b/modules/wikiparser/model/RawElement.class.php @@ -0,0 +1,26 @@ +<?php + +namespace wikiparser\model; + +use wikiparser\model\AbstractElement; + +/** + * @author $Author$ + * @version $Revision$ + * @package openrat.text + */ +class RawElement extends AbstractElement +{ + var $src = ''; + + /** + * RawElement constructor. + * @param string $t + */ + function __construct($t = '') + { + $this->src = $t; + } +} + +?>+ \ No newline at end of file diff --git a/modules/wikiparser/model/RemovedElement.class.php b/modules/wikiparser/model/RemovedElement.class.php @@ -0,0 +1,17 @@ +<?php + +namespace wikiparser\model; + +use wikiparser\model\AbstractElement; + +/** + * @author $Author$ + * @version $Revision$ + * @package openrat.text + */ +class RemovedElement extends AbstractElement +{ + +} + +?>+ \ No newline at end of file diff --git a/modules/wikiparser/model/SpeechElement.class.php b/modules/wikiparser/model/SpeechElement.class.php @@ -0,0 +1,17 @@ +<?php + +namespace wikiparser\model; + +use wikiparser\model\AbstractElement; + +/** + * @author $Author$ + * @version $Revision$ + * @package openrat.text + */ +class SpeechElement extends AbstractElement +{ + +} + +?>+ \ No newline at end of file diff --git a/modules/wikiparser/model/StrongElement.class.php b/modules/wikiparser/model/StrongElement.class.php @@ -0,0 +1,29 @@ +<?php + +namespace wikiparser\model; + +use wikiparser\model\AbstractElement; + +/** + * @author $Author$ + * @version $Revision$ + * @package openrat.text + */ +class StrongElement extends AbstractElement +{ + function render($type) + { + switch ($type) { + case 'html': + return '<p>' . $this->value . '</p>'; + default: + return $this->value; + } + } + + + var $markup = array('beginswith' => '*', + 'endswith' => '*'); +} + +?>+ \ No newline at end of file diff --git a/modules/wikiparser/model/TableCellElement.class.php b/modules/wikiparser/model/TableCellElement.class.php @@ -0,0 +1,19 @@ +<?php + +namespace wikiparser\model; + +use wikiparser\model\AbstractElement; + +/** + * @author $Author$ + * @version $Revision$ + * @package openrat.text + */ +class TableCellElement extends AbstractElement +{ + var $rowSpan = 1; + var $colSpan = 1; + var $isHeading = false; +} + +?>+ \ No newline at end of file diff --git a/modules/wikiparser/model/TableElement.class.php b/modules/wikiparser/model/TableElement.class.php @@ -0,0 +1,25 @@ +<?php + +namespace wikiparser\model; + +use wikiparser\model\AbstractElement; + +/** + * @author $Author$ + * @version $Revision$ + * @package openrat.text + */ +class TableElement extends AbstractElement +{ + function render($type) + { + switch ($type) { + case 'html': + return '<p>' . $this->value . '</p>'; + default: + return $this->value; + } + } +} + +?>+ \ No newline at end of file diff --git a/modules/wikiparser/model/TableLineElement.class.php b/modules/wikiparser/model/TableLineElement.class.php @@ -0,0 +1,17 @@ +<?php + +namespace wikiparser\model; + +use wikiparser\model\AbstractElement; + +/** + * @author $Author$ + * @version $Revision$ + * @package openrat.text + */ +class TableLineElement extends AbstractElement +{ + +} + +?>+ \ No newline at end of file diff --git a/modules/wikiparser/model/TableOfContentElement.class.php b/modules/wikiparser/model/TableOfContentElement.class.php @@ -0,0 +1,17 @@ +<?php + +namespace wikiparser\model; + +use wikiparser\model\AbstractElement; + +/** + * @author $Author$ + * @version $Revision$ + * @package openrat.text + */ +class TableOfContentElement extends AbstractElement +{ + +} + +?>+ \ No newline at end of file diff --git a/modules/wikiparser/model/TeletypeElement.class.php b/modules/wikiparser/model/TeletypeElement.class.php @@ -0,0 +1,17 @@ +<?php + +namespace wikiparser\model; + +use wikiparser\model\AbstractElement; + +/** + * @author $Author$ + * @version $Revision$ + * @package openrat.text + */ +class TeletypeElement extends AbstractElement +{ + +} + +?>+ \ No newline at end of file diff --git a/modules/wikiparser/model/TextElement.class.php b/modules/wikiparser/model/TextElement.class.php @@ -0,0 +1,60 @@ +<?php + +namespace wikiparser\model; + +use wikiparser\model\AbstractElement; + +/** + * @author $Author$ + * @version $Revision$ + * @package openrat.text + */ +class TextElement extends AbstractElement +{ + var $text = ''; + + function __construct($t = '') + { + $this->text = $t; + + $this->parseStyleClass(); + $this->parseTitleText(); + } + + + function parseStyleClass() + { + $char1 = substr($this->text, 0, 1); + if ($char1 == "(") { + $pos2 = strpos($this->text, ")", 2); + if ($pos2 !== false) { + $this->style = substr($this->text, 1, $pos2 - 1); + $this->text = substr($this->text, $pos2 + 1); + + // Wenn kein Doppelpunkt in den Styleangaben vorkommt, dann + // handelt es sich um einen Klassennamen. + if (strpos($this->style, ':') === false) { + $this->class = $this->style; + $this->style = ''; + } + } + } + } + + + function parseTitleText() + { + $char1 = substr($this->text, 0, 1); + if ($char1 == "'") { + $pos2 = strpos($this->text, "'", 2); + if ($pos2 !== false) { + $this->title = substr($this->text, 1, $pos2 - 1); + $this->text = substr($this->text, $pos2 + 1); + } + } + } + + +} + +?>+ \ No newline at end of file diff --git a/modules/wikiparser/parser/WikiParser.class.php b/modules/wikiparser/parser/WikiParser.class.php @@ -1,11 +1,37 @@ <?php +namespace wikiparser\parser; +use wikiparser\model\CodeElement; +use wikiparser\model\DefinitionItemElement; +use wikiparser\model\DefinitionListElement; +use Ein; +use wikiparser\model\HeadlineElement; +use wikiparser\model\ImageElement; +use Line; +use wikiparser\model\LineBreakElement; +use wikiparser\model\LinkElement; +use Liste; +use wikiparser\model\ListElement; +use wikiparser\model\ListEntryElement; +use LogicException; +use wikiparser\model\MacroElement; +use wikiparser\model\NumberedListElement; +use wikiparser\model\ParagraphElement; +use wikiparser\model\QuoteElement; +use Session; +use wikiparser\model\TableCellElement; +use wikiparser\model\TableElement; +use wikiparser\model\TableLineElement; +use wikiparser\model\TableOfContentElement; +use wikiparser\model\TextElement; +use zeilen; + /** * Dokument-Objekt.<br> * Diese Objekt verk�rpert das Root-Objekt in einem DOM-Baum.<br> * <br> * Dieses Objekt kann Text parsen und seine Unterobjekte selbst erzeugen.<br> - * + * * @author Jan Dankert, $Author$ * @version $Revision$ * @package openrat.text @@ -13,72 +39,67 @@ class WikiParser { var $linkedObjectIds = array(); - + /** * Ein Text wird geparst.<br> * <br> * Zerlegt den Text zeilenweise und erzeugt die Unterobjekte.<br> - * + * * @param Ein- oder mehrzeiliger roher Text */ - function parse( $text ) + function parse($text) { // set_time_limit(1); $zeilen = array(); - $nr = 0; - - foreach( $text as $t ) - { + $nr = 0; + + foreach ($text as $t) { // $t = $this->fixLinks( $t ); // Verweise vervollstaendigen. - $zeilen[++$nr] = new Line( rtrim($t) ); + $zeilen[++$nr] = new Line(rtrim($t)); } // $zeilen enth�lt eine Liste von Zeilenobjekten. // Der Index ist die Zeilennr. und beginnt bei 1. // Html::debug($zeilen,"Zeilen"); - - return $this->parseMultiLineText( $zeilen ); - } + return $this->parseMultiLineText($zeilen); + } /** * Erzeugt aus einer Liste von Zeilenobjekten ein DOM in Form eines Objektbaumes. - * + * * @param zeilen Liste von Zeilenobjekten. Array beginnt bei 1. * @return Liste von Textobjekten */ - function parseMultiLineText( $zeilen ) + function parseMultiLineText($zeilen) { global $conf; - - $children = array(); // Initiales Anlegen der Unterobjektliste. - $anzahlZeilen = count( $zeilen ); // Anzahl Zeilen - + + $children = array(); // Initiales Anlegen der Unterobjektliste. + $anzahlZeilen = count($zeilen); // Anzahl Zeilen + // Erzwingt am Anfang und Ende eine leere Zeile, damit // n�chste und vorige Zeile in der folgenden Schleife immer gef�llt ist. - $zeilen[0] = new Line(''); - $zeilen[$anzahlZeilen+1] = new Line(''); - - for ( $zeileNr=1; $zeileNr<=$anzahlZeilen; $zeileNr++ ) - { + $zeilen[0] = new Line(''); + $zeilen[$anzahlZeilen + 1] = new Line(''); - $letzteZeile = $zeilen[$zeileNr-1]; - $dieseZeile = $zeilen[$zeileNr ]; - $naechsteZeile = $zeilen[$zeileNr+1]; + for ($zeileNr = 1; $zeileNr <= $anzahlZeilen; $zeileNr++) { + + $letzteZeile = $zeilen[$zeileNr - 1]; + $dieseZeile = $zeilen[$zeileNr]; + $naechsteZeile = $zeilen[$zeileNr + 1]; // Html::debug($dieseZeile,"Zeile"); - + // Leerzeilen ignorieren - if ( $dieseZeile->isEmpty ) - { + if ($dieseZeile->isEmpty) { continue; } - + // Inhaltsverzeichnis // Text nicht parsen - if ( $dieseZeile->isTableOfContent ) - { + if ($dieseZeile->isTableOfContent) { $children[] = new TableOfContentElement(); continue; } @@ -86,19 +107,17 @@ class WikiParser // Parser deaktiviert f�r diese Zeile // Text nicht parsen - if ( $dieseZeile->isUnparsed ) - { - $children[] = new TextElement( $dieseZeile->value ); + if ($dieseZeile->isUnparsed) { + $children[] = new TextElement($dieseZeile->value); continue; } // Ueberschriften Teil 1 // Markierung in der Folgezeile mit "...", "---" oder "===" - if ( $naechsteZeile->isHeadlineUnderline ) - { + if ($naechsteZeile->isHeadlineUnderline) { $headline = new HeadlineElement($naechsteZeile->level); - $headline->children = $this->parseSimple( $dieseZeile->value); + $headline->children = $this->parseSimple($dieseZeile->value); $children[] = $headline; $zeileNr++; continue; // Naechste Zeile @@ -107,106 +126,93 @@ class WikiParser // Ueberschriften Teil 2 // Markierung mit "+++..." am Zeilenbeginn. - if ( $dieseZeile->isHeadline ) - { + if ($dieseZeile->isHeadline) { $headline = new HeadlineElement($dieseZeile->level); - $headline->children = $this->parseSimple( $dieseZeile->value); + $headline->children = $this->parseSimple($dieseZeile->value); $children[] = $headline; continue; // Naechste Zeile } - + // Zitate Teil 1 // Zitat ist in separater Zeile angek�ndigt - if ( $dieseZeile->isQuote ) - { - $bisZeileNr = $zeileNr+1; - do - { + if ($dieseZeile->isQuote) { + $bisZeileNr = $zeileNr + 1; + do { $bisZeileNr++; - } - while( !$zeilen[$bisZeileNr]->isQuote && $bisZeileNr<=$anzahlZeilen ); - + } while (!$zeilen[$bisZeileNr]->isQuote && $bisZeileNr <= $anzahlZeilen); + $quote = new QuoteElement(); $zeilenAuszug = array(); - $nr=0; - for( $zn=$zeileNr+1;$zn<$bisZeileNr;$zn++) - { + $nr = 0; + for ($zn = $zeileNr + 1; $zn < $bisZeileNr; $zn++) { $zeilenAuszug[++$nr] = $zeilen[$zn]; } $quote->children = $this->parseMultiLineText($zeilenAuszug); - $zeileNr = $bisZeileNr+1; + $zeileNr = $bisZeileNr + 1; $children[] = $quote; continue; } - - + // Zitate Teil 2 // Markierung am Zeilenanfang - if ( $dieseZeile->isQuotePraefix ) - { + if ($dieseZeile->isQuotePraefix) { $bisZeileNr = $zeileNr; - while( $bisZeileNr<=$anzahlZeilen && $zeilen[$bisZeileNr]->isQuotePraefix ) + while ($bisZeileNr <= $anzahlZeilen && $zeilen[$bisZeileNr]->isQuotePraefix) $bisZeileNr++; $bisZeileNr--; // Html::debug($bisZeileNr,"Bis-Zeile-Nr."); $quote = new QuoteElement(); - - $zeilenAuszug = $this->getListenAuszug( $zeilen,$zeileNr,$bisZeileNr); + + $zeilenAuszug = $this->getListenAuszug($zeilen, $zeileNr, $bisZeileNr); // Html::debug($zeilenAuszug,"Auszug"); $quote->children = $this->parseMultiLineText($zeilenAuszug); $zeileNr = $bisZeileNr; $children[] = $quote; continue; } - - + // Definitionsliste // Markierung am Zeilenanfang - if ( $dieseZeile->isDefinition ) - { + if ($dieseZeile->isDefinition) { $bisZeileNr = $zeileNr; - while( $bisZeileNr<=$anzahlZeilen && $zeilen[$bisZeileNr]->isDefinition ) + while ($bisZeileNr <= $anzahlZeilen && $zeilen[$bisZeileNr]->isDefinition) $bisZeileNr++; $bisZeileNr--; $defList = new DefinitionListElement(); - - $zeilenAuszug = $this->getListenAuszug( $zeilen,$zeileNr,$bisZeileNr); + + $zeilenAuszug = $this->getListenAuszug($zeilen, $zeileNr, $bisZeileNr); // Html::debug($zeilenAuszug,"Auszug"); - foreach( $zeilenAuszug as $zeile ) - { + foreach ($zeilenAuszug as $zeile) { $sep = $conf['editor']['text-markup']['definition-sep']; list($defKey, $defValue) = explode($sep, $zeile->value); - + $defEntry = new DefinitionItemElement(); - $defEntry->key = $defKey; - $defEntry->children = $this->parseSimple($defValue); + $defEntry->key = $defKey; + $defEntry->children = $this->parseSimple($defValue); $defList->children[] = $defEntry; } $zeileNr = $bisZeileNr; $children[] = $defList; continue; } - - + // Code - if ( $dieseZeile->isCode) - { - $bisZeileNr = $zeileNr+1; - while( $bisZeileNr<$anzahlZeilen && !$zeilen[$bisZeileNr]->isCode ) + if ($dieseZeile->isCode) { + $bisZeileNr = $zeileNr + 1; + while ($bisZeileNr < $anzahlZeilen && !$zeilen[$bisZeileNr]->isCode) $bisZeileNr++; - + $code = new CodeElement(); $code->language = trim($dieseZeile->value); - - for( $zn=$zeileNr+1;$zn<$bisZeileNr;$zn++) - { - $code->children[] = new TextElement( $zeilen[$zn]->source ); - - if ( $zn < $bisZeileNr-1 ) + + for ($zn = $zeileNr + 1; $zn < $bisZeileNr; $zn++) { + $code->children[] = new TextElement($zeilen[$zn]->source); + + if ($zn < $bisZeileNr - 1) $code->children[] = new LineBreakElement(); } $zeileNr = $bisZeileNr; @@ -216,64 +222,57 @@ class WikiParser // Tabellen - if ( $dieseZeile->isTable ) - { + if ($dieseZeile->isTable) { $bisZeileNr = $zeileNr; - while( $bisZeileNr<=$anzahlZeilen && $zeilen[$bisZeileNr]->isTable ) + while ($bisZeileNr <= $anzahlZeilen && $zeilen[$bisZeileNr]->isTable) $bisZeileNr++; - + $tabelle = new TableElement(); $zeilenAuszug = array(); - for( $zn=$zeileNr;$zn<=$bisZeileNr;$zn++) - { - $zeilenAuszug[$zn-$zeileNr+1] = $zeilen[$zn]; + for ($zn = $zeileNr; $zn <= $bisZeileNr; $zn++) { + $zeilenAuszug[$zn - $zeileNr + 1] = $zeilen[$zn]; } $tabelle->children = $this->parseTable($zeilenAuszug); $children[] = $tabelle; - $zeileNr = $bisZeileNr+1; + $zeileNr = $bisZeileNr + 1; continue; } // Listen - if ( $dieseZeile->isList || $dieseZeile->isNumberedList ) - { - + if ($dieseZeile->isList || $dieseZeile->isNumberedList) { + $bisZeileNr = $zeileNr; - while( $bisZeileNr<=$anzahlZeilen && - ($zeilen[$bisZeileNr]->isList || $zeilen[$bisZeileNr]->isNumberedList) ) + while ($bisZeileNr <= $anzahlZeilen && + ($zeilen[$bisZeileNr]->isList || $zeilen[$bisZeileNr]->isNumberedList)) $bisZeileNr++; $bisZeileNr--; - if ( $dieseZeile->isList ) + if ($dieseZeile->isList) $liste = new ListElement(); else $liste = new NumberedListElement(); - + $zeilenAuszug = array(); - $nr=0; + $nr = 0; - for( $zn=$zeileNr;$zn<=$bisZeileNr;$zn++) - { + for ($zn = $zeileNr; $zn <= $bisZeileNr; $zn++) { $zeilenAuszug[++$nr] = $zeilen[$zn]; } - $liste->children = $this->parseList($zeilenAuszug,1); + $liste->children = $this->parseList($zeilenAuszug, 1); $children[] = $liste; $zeileNr = $bisZeileNr; continue; } - - if ( $dieseZeile->isNormal ) - { + if ($dieseZeile->isNormal) { // Html::debug($dieseZeile,"normale Zeile"); // Textabsaetze $bisZeileNr = $zeileNr; - while( $bisZeileNr <= $anzahlZeilen && - $zeilen[$bisZeileNr ]->isNormal ) - { + while ($bisZeileNr <= $anzahlZeilen && + $zeilen[$bisZeileNr]->isNormal) { $bisZeileNr++; } $bisZeileNr--; @@ -281,98 +280,90 @@ class WikiParser // Html::debug($bisZeileNr,"bisZeile-P"); $para = new ParagraphElement(); - for( $zn=$zeileNr;$zn<=$bisZeileNr;$zn++) - { - if ( !$zeilen[$zn]->isNormal ) + for ($zn = $zeileNr; $zn <= $bisZeileNr; $zn++) { + if (!$zeilen[$zn]->isNormal) continue; - - if ( $zeilen[$zn]->isUnparsed ) - $para->children[] = new TextElement( $zeilen[$zn]->source ); - - foreach( $this->parseSimple($zeilen[$zn]->value) as $e ) + + if ($zeilen[$zn]->isUnparsed) + $para->children[] = new TextElement($zeilen[$zn]->source); + + foreach ($this->parseSimple($zeilen[$zn]->value) as $e) $para->children[] = $e; - - if ( $zn < $bisZeileNr ) + + if ($zn < $bisZeileNr) $para->children[] = new LineBreakElement(); } - + $zeileNr = $bisZeileNr; $children[] = $para; - + continue; } - - throw new LogicException( 'unknown line: '.$dieseZeile ); + + throw new LogicException('unknown line: ' . $dieseZeile); } - + return $children; } - - function getListenAuszug( $liste, $von, $bis ) + function getListenAuszug($liste, $von, $bis) { $auszug = array(); - $idx = 0; - - for( $j=$von;$j<=$bis;$j++) - { + $idx = 0; + + for ($j = $von; $j <= $bis; $j++) { $auszug[++$idx] = new Line($liste[$j]->value); } - + return $auszug; } - - + + /** - * Parsen einer mehrzeiligen Liste + * Parsen einer mehrzeiligen Liste */ - function parseList( $zeilen,$tiefe ) + function parseList($zeilen, $tiefe) { $children = array(); - $anzahlZeilen = count( $zeilen ); - $entry = null; - for ( $zeileNr=1; $zeileNr<=$anzahlZeilen; $zeileNr++ ) - { + $anzahlZeilen = count($zeilen); + $entry = null; + for ($zeileNr = 1; $zeileNr <= $anzahlZeilen; $zeileNr++) { $dieseZeile = $zeilen[$zeileNr]; // Listen - if ( $dieseZeile->indent <= $tiefe ) - { - if ( $zeileNr > 1 ) + if ($dieseZeile->indent <= $tiefe) { + if ($zeileNr > 1) $children[] = $entry; - + $entry = new ListEntryElement(); - $entry->children = $this->parseSimple( $dieseZeile->value ); - } - else - { + $entry->children = $this->parseSimple($dieseZeile->value); + } else { // Weitere Schachtelung der Liste - if ( $dieseZeile->isList ) + if ($dieseZeile->isList) $liste = new ListElement(); else - $liste = new NumberedListElement(); + $liste = new NumberedListElement(); $bisZeileNr = $zeileNr; - while( $bisZeileNr<=$anzahlZeilen && $zeilen[$bisZeileNr]->indent != $tiefe ) + while ($bisZeileNr <= $anzahlZeilen && $zeilen[$bisZeileNr]->indent != $tiefe) $bisZeileNr++; $bisZeileNr--; - + // echo "von $zeileNr bis $bisZeileNr (insges. $anzahlZeilen)"; $zeilenAuszug = array(); - $nr=0; - for( $zn=$zeileNr;$zn<=$bisZeileNr;$zn++) - { + $nr = 0; + for ($zn = $zeileNr; $zn <= $bisZeileNr; $zn++) { $zeilenAuszug[++$nr] = $zeilen[$zn]; } - $liste->children = $this->parseList($zeilenAuszug,$tiefe+1); + $liste->children = $this->parseList($zeilenAuszug, $tiefe + 1); $entry->children[] = $liste; $zeileNr = $bisZeileNr; } } $children[] = $entry; - + return $children; } @@ -380,111 +371,105 @@ class WikiParser /** * Parsen einer Tabelle. */ - function parseTable( $zeilen ) + function parseTable($zeilen) { $children = array(); - $anzahlZeilen = count( $zeilen ); - for ( $zeileNr=1; $zeileNr<=$anzahlZeilen; $zeileNr++ ) - { - $dieseZeile = $zeilen[$zeileNr]; + $anzahlZeilen = count($zeilen); + for ($zeileNr = 1; $zeileNr <= $anzahlZeilen; $zeileNr++) { + $dieseZeile = $zeilen[$zeileNr]; $zeile = new TableLineElement(); - + // Listen - $zellen = explode('|',$dieseZeile->source); + $zellen = explode('|', $dieseZeile->source); $colSpan = 1; - - foreach( $zellen as $zellenInhalt ) - { - if ( $zellenInhalt=='') - { + + foreach ($zellen as $zellenInhalt) { + if ($zellenInhalt == '') { $colSpan++; continue; } - + $zelle = new TableCellElement(); $zelle->colSpan = $colSpan; $colSpan = 1; - - if ( substr($zellenInhalt,0,1) == '!' ) - { + + if (substr($zellenInhalt, 0, 1) == '!') { $zelle->isHeading = true; - $zellenInhalt = substr($zellenInhalt,1); + $zellenInhalt = substr($zellenInhalt, 1); } - - $zelle->children = $this->parseSimple( $zellenInhalt); - + + $zelle->children = $this->parseSimple($zellenInhalt); + $zeile->children[] = $zelle; } - + $children[] = $zeile; } - + return $children; } - - function parseLinks( $text ) + function parseLinks($text) { $conf = Session::getConfig(); - $text_markup = $conf['editor']['text-markup']; + $text_markup = $conf['editor']['text-markup']; - $posM = strpos($text,'"'.$text_markup['linkto'].'"'); + $posM = strpos($text, '"' . $text_markup['linkto'] . '"'); - if ( $posM === false ) + if ($posM === false) return false; - $posL = strpos(substr($text,0,$posM-1),'"'); + $posL = strpos(substr($text, 0, $posM - 1), '"'); - if ( $posL === false ) + if ($posL === false) return false; - $posR = strpos($text,'"',$posM+4); + $posR = strpos($text, '"', $posM + 4); - if ( $posR === false ) + if ($posR === false) return false; - $parts = array(); - $parts[] = substr($text,0 ,$posL ); // Anfang - $parts[] = substr($text,$posL+1,$posM-$posL-1); // Linktext - $parts[] = substr($text,$posM+4,$posR-$posM-4); // Verweisziel - $parts[] = substr($text,$posR+1 ); // Rest + $parts = array(); + $parts[] = substr($text, 0, $posL); // Anfang + $parts[] = substr($text, $posL + 1, $posM - $posL - 1); // Linktext + $parts[] = substr($text, $posM + 4, $posR - $posM - 4); // Verweisziel + $parts[] = substr($text, $posR + 1); // Rest return $parts; } - - + + /** * Erzeugt ein Bildobjekt */ - function parseImages( $text ) + function parseImages($text) { - $posM = strpos($text,'image:'); + $posM = strpos($text, 'image:'); - if ( $posM === false ) + if ($posM === false) return false; - $posL = strpos(substr($text,0,$posM-1),'"'); + $posL = strpos(substr($text, 0, $posM - 1), '"'); - if ( $posL === false ) + if ($posL === false) return false; - $posR = strpos($text,'"',$posM+4); + $posR = strpos($text, '"', $posM + 4); - if ( $posR === false ) + if ($posR === false) return false; - $parts = array(); - $parts[] = substr($text,0 ,$posL ); // Anfang - $parts[] = substr($text,$posL+1,$posM-$posL-1); // Linktext - $parts[] = substr($text,$posM+4,$posR-$posM-4); // Verweisziel - $parts[] = substr($text,$posR+1 ); // Rest - + $parts = array(); + $parts[] = substr($text, 0, $posL); // Anfang + $parts[] = substr($text, $posL + 1, $posM - $posL - 1); // Linktext + $parts[] = substr($text, $posM + 4, $posR - $posM - 4); // Verweisziel + $parts[] = substr($text, $posR + 1); // Rest + return $parts; } - - + /** * Zerlegt einen einfachen Text in ein Array. @@ -494,48 +479,46 @@ class WikiParser * @param String $sepRechts Rechte Begrenzung * @return Array */ - function parseSimpleParts( $text,$sepLinks,$sepRechts ) + function parseSimpleParts($text, $sepLinks, $sepRechts) { - $posL = strpos($text,$sepLinks); + $posL = strpos($text, $sepLinks); - if ( $posL === false ) + if ($posL === false) return false; - $posR = strpos($text,$sepRechts,$posL+strlen($sepLinks)); + $posR = strpos($text, $sepRechts, $posL + strlen($sepLinks)); - if ( $posR === false ) + if ($posR === false) return false; - $parts = array(); - $parts[] = substr($text,0 ,$posL ); - $parts[] = substr($text,$posL+strlen($sepLinks),$posR-$posL-strlen($sepLinks)); - $parts[] = substr($text,$posR+strlen($sepRechts) ); + $parts = array(); + $parts[] = substr($text, 0, $posL); + $parts[] = substr($text, $posL + strlen($sepLinks), $posR - $posL - strlen($sepLinks)); + $parts[] = substr($text, $posR + strlen($sepRechts)); return $parts; } - - - + + /** - * + * */ - function parseEscapes( $text ) + function parseEscapes($text) { - $posL = strpos($text,'\\'); + $posL = strpos($text, '\\'); - if ( $posL === false ) + if ($posL === false) return false; - $parts = array(); - $parts[] = substr($text,0 ,$posL ); - $parts[] = substr($text,$posL+1,1 ); - $parts[] = substr($text,$posL+2 ); + $parts = array(); + $parts[] = substr($text, 0, $posL); + $parts[] = substr($text, $posL + 1, 1); + $parts[] = substr($text, $posL + 2); return $parts; } - - - + + /** * Parst einen einzeiligen Text und erzeugt daraus Elemente. * @@ -545,32 +528,30 @@ class WikiParser * @param String $className Klassenname des Elementes, welches es zu erzeugen gilt. * @return Array */ - function parseSimpleElement( $text,$sepL,$sepR,$className ) + function parseSimpleElement($text, $sepL, $sepR, $className) { - $erg = $this->parseSimpleParts( $text,$sepL,$sepR ); - if ( is_array($erg) ) - { - $idx = -1; + $erg = $this->parseSimpleParts($text, $sepL, $sepR); + if (is_array($erg)) { + $idx = -1; $elements = array(); - + $davor = $this->parseSimple($erg[++$idx]); - foreach( $davor as $davorEl ) + foreach ($davor as $davorEl) $elements[] = $davorEl; $newEl = new $className(); - $newEl->children = $this->parseSimple($erg[++$idx]); + $newEl->children = $this->parseSimple($erg[++$idx]); $elements[] = $newEl; $danach = $this->parseSimple($erg[++$idx]); - foreach( $danach as $danachEl ) + foreach ($danach as $danachEl) $elements[] = $danachEl; return $elements; } - + return false; } - - + /** * Korrigiert kurze Links. @@ -578,179 +559,173 @@ class WikiParser * @param String $text * @return String */ - function fixLinks( $text ) + function fixLinks($text) { // Text->... umsetzen nach "Text"->... (Anfuehrungszeichen ergaenzen) - $text = preg_replace( '/([A-Za-z0-9._-]+)\-\>/','"\\1"->',$text ); - + $text = preg_replace('/([A-Za-z0-9._-]+)\-\>/', '"\\1"->', $text); + // ...->Link umsetzen nach ...->"Link" (Anfuehrungszeichen ergaenzen) - $text = preg_replace( '/\->([A-Za-z0-9\.\:\_\/\,\?\=\&-]+)/','->"\\1"',$text ); + $text = preg_replace('/\->([A-Za-z0-9\.\:\_\/\,\?\=\&-]+)/', '->"\\1"', $text); // alleinstehende externe Links // Funktioniert nicht richtig, erstmal deaktiviert. // $text = ereg_replace( '((https?|ftps?|news|gopher):\/\/([A-Za-z0-9._\/\,-]+))([^"])','"\\1"->"\\1"\\2',$text ); // alleinstehende E-Mail Adressen - $text = preg_replace( '/([A-Za-z0-9._-]+@[A-Za-z0-9\.\_\-]+)([^A-Za-z0-9\.\_\-\"])/','"\\1"->"mailto:\\1"\\2',$text ); + $text = preg_replace('/([A-Za-z0-9._-]+@[A-Za-z0-9\.\_\-]+)([^A-Za-z0-9\.\_\-\"])/', '"\\1"->"mailto:\\1"\\2', $text); // Bilder - $text = preg_replace( '/ima?ge?:\/?\/?([A-Za-z0-9\.\:\_\/\,\?\=\&-]+)/','{\\1}',$text ); - + $text = preg_replace('/ima?ge?:\/?\/?([A-Za-z0-9\.\:\_\/\,\?\=\&-]+)/', '{\\1}', $text); + return $text; } - - - + + /** * Diese Methode parst einen einfachen, einzeiligen Text und zerlegt diesen in seine Bestandteile. - * + * * @param String $text * @return Array - */ - function parseSimple( $text ) + */ + function parseSimple($text) { $conf = Session::getConfig(); $text_markup = $conf['editor']['text-markup']; - + $text = $this->fixLinks($text); $elements = array(); - - if ( trim($text) == '' ) + + if (trim($text) == '') return $elements; - $erg = $this->parseLinks( $text ); - if ( is_array($erg) ) - { - $idx = -1; - + $erg = $this->parseLinks($text); + if (is_array($erg)) { + $idx = -1; + $davor = $this->parseSimple($erg[++$idx]); - foreach( $davor as $davorEl ) + foreach ($davor as $davorEl) $elements[] = $davorEl; $link = new LinkElement(); - $link->children = $this->parseSimple($erg[++$idx]); - $link->setTarget( $erg[++$idx] ); - - if ( $link->objectId != 0 ) + $link->children = $this->parseSimple($erg[++$idx]); + $link->setTarget($erg[++$idx]); + + if ($link->objectId != 0) $this->linkedObjectIds[] = $link->objectId; $elements[] = $link; $danach = $this->parseSimple($erg[++$idx]); - foreach( $danach as $danachEl ) + foreach ($danach as $danachEl) $elements[] = $danachEl; return $elements; } - $erg = $this->parseSimpleParts( $text,$text_markup['image-begin'],$text_markup['image-end'] ); - if ( is_array($erg) ) - { - $idx = -1; - + $erg = $this->parseSimpleParts($text, $text_markup['image-begin'], $text_markup['image-end']); + if (is_array($erg)) { + $idx = -1; + $davor = $this->parseSimple($erg[++$idx]); - foreach( $davor as $davorEl ) + foreach ($davor as $davorEl) $elements[] = $davorEl; $image = new ImageElement(); $t = new TextElement($erg[++$idx]); - $image->setTarget( intval($t->text) ); + $image->setTarget(intval($t->text)); $t->text = ''; $image->children[] = $t; - - if ( $image->objectId != 0 ) + + if ($image->objectId != 0) $this->linkedObjectIds[] = $image->objectId; $elements[] = $image; $danach = $this->parseSimple($erg[++$idx]); - foreach( $danach as $danachEl ) + foreach ($danach as $danachEl) $elements[] = $danachEl; return $elements; } - $erg = $this->parseSimpleParts( $text,$text_markup['macro-begin'],$text_markup['macro-end'] ); - if ( is_array($erg) ) - { - $idx = -1; - + $erg = $this->parseSimpleParts($text, $text_markup['macro-begin'], $text_markup['macro-end']); + if (is_array($erg)) { + $idx = -1; + $davor = $this->parseSimple($erg[++$idx]); - foreach( $davor as $davorEl ) + foreach ($davor as $davorEl) $elements[] = $davorEl; $macro = new MacroElement(); - $inh = explode(' ',$erg[++$idx]); + $inh = explode(' ', $erg[++$idx]); $macro->name = $inh[0]; unset($inh[0]); - foreach( $inh as $attr ) - { - if ( empty($attr)) continue; - - list($attr_name,$attr_val) = explode($text_markup['macro-attribute-value-seperator'],$attr); - $attr_val = trim($attr_val,$text_markup['macro-attribute-quote']); + foreach ($inh as $attr) { + if (empty($attr)) continue; + + list($attr_name, $attr_val) = explode($text_markup['macro-attribute-value-seperator'], $attr); + $attr_val = trim($attr_val, $text_markup['macro-attribute-quote']); $macro->attributes[$attr_name] = $attr_val; } - + $elements[] = $macro; $danach = $this->parseSimple($erg[++$idx]); - foreach( $danach as $danachEl ) + foreach ($danach as $danachEl) $elements[] = $danachEl; return $elements; } - - - $erg = $this->parseEscapes( $text ); - if ( is_array($erg) ) - { - $idx = -1; - + + + $erg = $this->parseEscapes($text); + if (is_array($erg)) { + $idx = -1; + $davor = $this->parseSimple($erg[++$idx]); - foreach( $davor as $davorEl ) + foreach ($davor as $davorEl) $elements[] = $davorEl; $t = new TextElement($erg[++$idx]); $elements[] = $t; $danach = $this->parseSimple($erg[++$idx]); - foreach( $danach as $danachEl ) + foreach ($danach as $danachEl) $elements[] = $danachEl; return $elements; } - $erg = $this->parseSimpleElement( $text,$text_markup['footnote-begin'],$text_markup['footnote-end'],'FootnoteElement' ); - if ( is_array($erg) ) + $erg = $this->parseSimpleElement($text, $text_markup['footnote-begin'], $text_markup['footnote-end'], 'FootnoteElement'); + if (is_array($erg)) return $erg; - $erg = $this->parseSimpleElement( $text,$text_markup['strong-begin'],$text_markup['strong-end'],'StrongElement' ); - if ( is_array($erg) ) + $erg = $this->parseSimpleElement($text, $text_markup['strong-begin'], $text_markup['strong-end'], 'StrongElement'); + if (is_array($erg)) return $erg; - $erg = $this->parseSimpleElement( $text,$text_markup['emphatic-begin'],$text_markup['emphatic-end'],'EmphaticElement' ); - if ( is_array($erg) ) + $erg = $this->parseSimpleElement($text, $text_markup['emphatic-begin'], $text_markup['emphatic-end'], 'EmphaticElement'); + if (is_array($erg)) return $erg; - $erg = $this->parseSimpleElement( $text,$text_markup['code-begin'],$text_markup['code-end'],'TeletypeElement' ); - if ( is_array($erg) ) + $erg = $this->parseSimpleElement($text, $text_markup['code-begin'], $text_markup['code-end'], 'TeletypeElement'); + if (is_array($erg)) return $erg; - $erg = $this->parseSimpleElement( $text,$text_markup['insert-begin'],$text_markup['insert-end'],'InsertedElement' ); - if ( is_array($erg) ) + $erg = $this->parseSimpleElement($text, $text_markup['insert-begin'], $text_markup['insert-end'], 'InsertedElement'); + if (is_array($erg)) return $erg; - $erg = $this->parseSimpleElement( $text,$text_markup['remove-begin'],$text_markup['remove-end'],'RemovedElement' ); - if ( is_array($erg) ) + $erg = $this->parseSimpleElement($text, $text_markup['remove-begin'], $text_markup['remove-end'], 'RemovedElement'); + if (is_array($erg)) return $erg; - $erg = $this->parseSimpleElement( $text,$text_markup['speech-begin'],$text_markup['speech-end'],'SpeechElement' ); - if ( is_array($erg) ) + $erg = $this->parseSimpleElement($text, $text_markup['speech-begin'], $text_markup['speech-end'], 'SpeechElement'); + if (is_array($erg)) return $erg; $t = new TextElement($text); $elements[] = $t; - + return $elements; } } diff --git a/modules/wikiparser/renderer/DocBookRenderer.class.php b/modules/wikiparser/renderer/DocBookRenderer.class.php @@ -1,13 +1,17 @@ <?php +namespace wikiparser\renderer; +use wikiparser\model\LinkElement; +use Text; + /** * Renderer fuer das DOCBOOK-Format. - * + * * Das Docbook-Format ist von der OASIS spezifiert und ermoeglicht die * strukturierte Darstellung von Text-Dokumenten. - * + * * Dieses Klasse erzeugt aus dem internen DOM-Baum ein DocBook-XML-Dokument. - * + * * @author Jan Dankert, $Author$ * @version $Revision$ * @package openrat.text @@ -15,8 +19,8 @@ class DocBookRenderer { var $linkedObjectIds = array(); - var $encodeHtml = false; - + var $encodeHtml = false; + /** * Rendert ein Dokument-Element. @@ -24,22 +28,21 @@ class DocBookRenderer * @param Object $child Element * @return String */ - function renderElement( $child ) + function renderElement($child) { global $conf; - + $attr = array(); - $val = ''; + $val = ''; $praefix = ''; - $suffix = ''; - $empty = false; + $suffix = ''; + $empty = false; - switch( strtolower(get_class($child)) ) - { + switch (strtolower(get_class($child))) { case 'macroelement': $tag = ''; break; - + case 'tableofcontentelement': $tag = 'toc'; break; @@ -47,15 +50,15 @@ class DocBookRenderer case 'rawelement': $tag = ''; $val = $child->src; - + break; case 'textelement': $tag = 'para'; $val = $child->text; - $val = Text::encodeHtml( $val ); - $val = Text::replaceHtmlChars( $val ); + $val = Text::encodeHtml($val); + $val = Text::replaceHtmlChars($val); break; case 'footnoteelement': @@ -63,7 +66,7 @@ class DocBookRenderer break; case 'codeelement': - + $tag = 'emphasis'; $attr['role'] = 'code'; break; @@ -82,8 +85,8 @@ class DocBookRenderer break; case 'linebreakelement': - $tag = ''; - $val = "\n"; + $tag = ''; + $val = "\n"; break; case 'linkelement': @@ -92,7 +95,7 @@ class DocBookRenderer break; case 'imageelement': - $empty = true; + $empty = true; $tag = 'graphic'; $attr['fileref'] = $child->getUrl(); break; @@ -119,11 +122,11 @@ class DocBookRenderer case 'headlineelement': $tag = 'chapter'; // $child->level ? - + $l = new LinkElement(); $l->name = $child->getName(); $child->children[] = $l; - + break; case 'tableelement': @@ -139,13 +142,10 @@ class DocBookRenderer break; case 'definitionitemelement': - if ( !empty($child->key) ) - { + if (!empty($child->key)) { $tag = 'listitem'; $val = $child->key; - } - else - { + } else { $tag = 'term'; } break; @@ -158,38 +158,36 @@ class DocBookRenderer case 'listelement': $tag = 'itemizedlist'; break; - + case 'teletypeelement': $tag = 'emphasis'; $attr['role'] = 'code'; break; - + case 'numberedlistelement': $tag = 'orderedlist'; break; - + case 'listentryelement': $tag = 'listitem'; break; default: - + $tag = 'unknown-element'; $attr['class'] = strtolower(get_class($child)); break; - } + } $val .= $praefix; - foreach( $child->children as $c ) - { - $val .= $this->renderElement( $c ); + foreach ($child->children as $c) { + $val .= $this->renderElement($c); } $val .= $suffix; - return $this->renderXmlElement($tag,$val,$empty,$attr); - - } + return $this->renderXmlElement($tag, $val, $empty, $attr); + } /** @@ -201,30 +199,27 @@ class DocBookRenderer * @param Array $attr Attribute als Array<String,String> * @return String */ - function renderXmlElement( $tag,$value,$empty,$attr=array() ) + function renderXmlElement($tag, $value, $empty, $attr = array()) { global $conf; - if ( $tag == '' ) + if ($tag == '') return $value; - - $val = '<'.$tag; - foreach( $attr as $attrName=>$attrInhalt ) - { - $val .= ' '.$attrName.'="'.$attrInhalt.'"'; + + $val = '<' . $tag; + foreach ($attr as $attrName => $attrInhalt) { + $val .= ' ' . $attrName . '="' . $attrInhalt . '"'; } - - if ( $value == '' && $empty ) - { + + if ($value == '' && $empty) { $val .= ' />'; return $val; } - - $val .= '>'.$value.'</'.$tag.'>'; + + $val .= '>' . $value . '</' . $tag . '>'; return $val; } - - + /** * Rendering des Dokumentes.<br> * @@ -235,9 +230,9 @@ class DocBookRenderer $this->renderedText = ''; $this->renderedText .= '<?xml version="1.0" encoding="UTF-8" ?>'; $this->renderedText .= '<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN" "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">'; - - foreach( $this->children as $child ) - $this->renderedText .= $this->renderElement( $child ); + + foreach ($this->children as $child) + $this->renderedText .= $this->renderElement($child); return $this->renderedText; } diff --git a/modules/wikiparser/renderer/HtmlDomRenderer.class.php b/modules/wikiparser/renderer/HtmlDomRenderer.class.php @@ -1,11 +1,19 @@ <?php +namespace wikiparser\renderer; +use wikiparser\model\DefinitionItemElement; +use DefinitionListEntryElement; +use DefinitionListItemElement; +use File; +use wikiparser\model\LinkElement; +use wikiparser\model\TextElement; + /** * Dokument-Objekt.<br> * Diese Objekt verk�rpert das Root-Objekt in einem DOM-Baum.<br> * <br> * Dieses Objekt kann Text parsen und seine Unterobjekte selbst erzeugen.<br> - * + * * @author Jan Dankert, $Author$ * @version $Revision$ * @package openrat.text @@ -13,274 +21,258 @@ class HtmlDomRenderer { var $linkedObjectIds = array(); - + /** * Fu�noten. * * @var Array */ - var $footnotes = array(); + var $footnotes = array(); var $encodeHtml = false; - - var $path = array(); - - var $domId = ''; - - + + var $path = array(); + + var $domId = ''; + + /** * Rendert ein Dokument-Element. * * @param Object $child Element * @return String */ - function renderElement( $child ) + function renderElement($child) { global $conf; - + $this->path[] = $child; - - $val = ''; + + $val = ''; // $val = '<br/>'; // foreach( $this->path as $p ) // $val .= '&nbsp;&nbsp;&nbsp;&nbsp;'; // $val .= '<a href="#'.$this->getPathAsString().'">_</a>'; - - $attr = array(); - $praefix = ''; - $suffix = ''; - $empty = false; - - if ( count($child->children) > 0 ) - { - $subChild1 = $child->children[0]; - - if ( !empty($subChild1->class) ) - $attr['class'] = $subChild1->class; - - if ( !empty($subChild1->style) ) - $attr['style'] = $subChild1->style; - - if ( !empty($subChild1->title) ) - $attr['title'] = $subChild1->title; + + $attr = array(); + $praefix = ''; + $suffix = ''; + $empty = false; + + if (count($child->children) > 0) { + $subChild1 = $child->children[0]; + + if (!empty($subChild1->class)) + $attr['class'] = $subChild1->class; + + if (!empty($subChild1->style)) + $attr['style'] = $subChild1->style; + + if (!empty($subChild1->title)) + $attr['title'] = $subChild1->title; + } + + $praefix .= lang('TEXT_MARKUP_' . strtoupper(substr(get_class($child), 0, -7))); + + switch (strtolower(get_class($child))) { + case 'rawelement': + $tag = ''; + $val = $child->src; + + break; + + case 'textelement': + $tag = 'text'; + + $val .= $child->text; + + break; + + + case 'linkelement': + + $tag = 'a'; + if (!empty($child->name)) + $attr['name'] = $child->name; + else + $attr['href'] = htmlspecialchars($child->getUrl()); + + if (Object::available($child->objectId)) { + $file = new File($child->objectId); + $file->load(); + $attr['title'] = $file->description; + unset($file); + } + + break; + + case 'imageelement': + $empty = true; + $attr['alt'] = ''; + + if (!Object::available($child->objectId)) { + $tag = ''; + } elseif (empty($attr['title'])) { + $tag = 'img'; + $attr['src'] = $child->getUrl(); + $attr['border'] = '0'; + + // Breite/H�he des Bildes bestimmen. + $image = new File($child->objectId); + + $image->load(); + $attr['alt'] = $image->name; + $attr['title'] = $image->description; + + $image->getImageSize(); + $attr['width'] = $image->width; + $attr['height'] = $image->height; + unset($image); + } else { + $tag = 'dl'; + + if (empty($attr['class'])) + $attr['class'] = "image"; + + $child->children = array(); + $dt = new DefinitionListItemElement(); + $dt->children[] = new TextElement('(image)'); + $dt->children[] = $child; + $child->children[] = $dt; + + $dd = new DefinitionListEntryElement(); + $dd->children[] = new TextElement('(image)'); + $dd->children[] = new TextElement($attr['title']); + $child->children[] = $dd; } + $suffix = '<img src="./themes/default/images/editor/image.png">'; + break; + + case 'strongelement': + $tag = 'strong'; + break; + + case 'macroelement': + $tag = 'macro'; + $val = ucfirst($child->name); + break; + - $praefix .= lang('TEXT_MARKUP_'.strtoupper(substr(get_class($child),0,-7))); - - switch( strtolower(get_class($child)) ) - { - case 'rawelement': - $tag = ''; - $val = $child->src; - - break; - - case 'textelement': - $tag = 'text'; - - $val .= $child->text; - - break; - - - case 'linkelement': - - $tag = 'a'; - if ( !empty($child->name) ) - $attr['name'] = $child->name; - else - $attr['href'] = htmlspecialchars($child->getUrl()); - - if ( Object::available( $child->objectId ) ) - { - $file = new File( $child->objectId ); - $file->load(); - $attr['title'] = $file->description; - unset( $file ); - } - - break; - - case 'imageelement': - $empty = true; - $attr['alt'] = ''; - - if ( ! Object::available( $child->objectId ) ) - { - $tag = ''; - } - elseif ( empty($attr['title']) ) - { - $tag = 'img'; - $attr['src'] = $child->getUrl(); - $attr['border'] = '0'; - - // Breite/H�he des Bildes bestimmen. - $image = new File( $child->objectId ); - - $image->load(); - $attr['alt' ] = $image->name; - $attr['title' ] = $image->description; - - $image->getImageSize(); - $attr['width' ] = $image->width; - $attr['height'] = $image->height; - unset($image); - } - else - { - $tag = 'dl'; - - if ( empty($attr['class']) ) - $attr['class'] = "image"; - - $child->children = array(); - $dt = new DefinitionListItemElement(); - $dt->children[] = new TextElement('(image)'); - $dt->children[] = $child; - $child->children[] = $dt; - - $dd = new DefinitionListEntryElement(); - $dd->children[] = new TextElement('(image)'); - $dd->children[] = new TextElement($attr['title']); - $child->children[] = $dd; - } - $suffix = '<img src="./themes/default/images/editor/image.png">'; - break; - - case 'strongelement': - $tag = 'strong'; - break; - - case 'macroelement': - $tag = 'macro'; - $val = ucfirst($child->name); - break; - - - case 'emphaticelement': - $tag = 'em'; - break; - - case 'insertedelement': - $tag = 'ins'; - break; - - case 'removedelement': - $tag = 'del'; - break; - - case 'headlineelement': - $tag = 'h'.$child->level; - - $l = new LinkElement(); - $l->name = $child->getName(); - $child->children[] = $l; - - break; - - case 'tableelement': - $tag = 'table'; - break; - - case 'tablelineelement': - $tag = 'tr'; - break; - - case 'definitionlistelement': - $items = $child->children; - $newChildren = array(); - foreach( $items as $item ) - { - $def = new DefinitionItemElement(); - $def->key = $item->key; - $item->key = ''; - $newChildren[] = $def; - $newChildren[] = $item; - } + case 'emphaticelement': + $tag = 'em'; + break; + + case 'insertedelement': + $tag = 'ins'; + break; + + case 'removedelement': + $tag = 'del'; + break; + + case 'headlineelement': + $tag = 'h' . $child->level; + + $l = new LinkElement(); + $l->name = $child->getName(); + $child->children[] = $l; + + break; + + case 'tableelement': + $tag = 'table'; + break; + + case 'tablelineelement': + $tag = 'tr'; + break; + + case 'definitionlistelement': + $items = $child->children; + $newChildren = array(); + foreach ($items as $item) { + $def = new DefinitionItemElement(); + $def->key = $item->key; + $item->key = ''; + $newChildren[] = $def; + $newChildren[] = $item; + } // Html::debug($newChildren,'Children-neu'); - $child->children = $newChildren; - $tag = 'dl'; - break; - - case 'definitionitemelement': - if ( !empty($child->key) ) - { - $tag = 'dt'; - $val = $child->key; - } - else - { - $tag = 'dd'; - } - break; - - case 'tablecellelement': - if ( $child->isHeading ) - $tag = 'th'; else $tag = 'td'; - - if ( $child->rowSpan > 1 ) - $attr['rowspan'] = $child->rowSpan; - if ( $child->colSpan > 1 ) - $attr['colspan'] = $child->colSpan; - break; - - case 'listelement': - $tag = 'ul'; - break; - - case 'teletypeelement': - $tag = 'code'; - break; - - case 'numberedlistelement': - $tag = 'ol'; - break; - - case 'listentryelement': - $tag = 'li'; - break; - - default: - - } - - $val = $this->renderValue($val); - $val = '<div class="entry">'.$praefix.$val.$suffix.'</div>'; - - if ( count($child->children)>0 ) - { - $val .= '<ul class="tree">'; - foreach( $child->children as $c ) - { - $val .= $this->renderElement( $c ); - } - $val .= '</ul>'; + $child->children = $newChildren; + $tag = 'dl'; + break; + + case 'definitionitemelement': + if (!empty($child->key)) { + $tag = 'dt'; + $val = $child->key; + } else { + $tag = 'dd'; } + break; + + case 'tablecellelement': + if ($child->isHeading) + $tag = 'th'; else $tag = 'td'; + + if ($child->rowSpan > 1) + $attr['rowspan'] = $child->rowSpan; + if ($child->colSpan > 1) + $attr['colspan'] = $child->colSpan; + break; + + case 'listelement': + $tag = 'ul'; + break; + + case 'teletypeelement': + $tag = 'code'; + break; + + case 'numberedlistelement': + $tag = 'ol'; + break; + + case 'listentryelement': + $tag = 'li'; + break; + + default: + + } + + $val = $this->renderValue($val); + $val = '<div class="entry">' . $praefix . $val . $suffix . '</div>'; + + if (count($child->children) > 0) { + $val .= '<ul class="tree">'; + foreach ($child->children as $c) { + $val .= $this->renderElement($c); + } + $val .= '</ul>'; + } // echo "text:$val"; - unset( $this->path[ count($this->path)-1 ] ); - return '<li><div class="tree" />'.$val.'</li>'; + unset($this->path[count($this->path) - 1]); + return '<li><div class="tree" />' . $val . '</li>'; } - /** * Rendert einen Inhalt. * * @param String $value Inhalt * @return String */ - function renderValue( $value ) + function renderValue($value) { - $val = '&nbsp;<em>'.$value.'</em>'; + $val = '&nbsp;<em>' . $value . '</em>'; return $val; } - - + /** * Rendering des Dokumentes.<br> * @@ -289,34 +281,33 @@ class HtmlDomRenderer function render() { $this->renderedText = ''; - $this->footnotes = array(); + $this->footnotes = array(); $this->renderedText = '<ul class="tree">'; - - foreach( $this->children as $child ) - $this->renderedText .= ''.$this->renderElement( $child ).''; - //$this->renderedText .= '<li><div class="tree" /><div class="entry" /><ul class="tree">'.$this->renderElement( $child ).'</ul></li>'; - - foreach( $this->footnotes as $child ) - $this->renderedText .= '<li><div class="tree" /><div class="entry" /><ul class="tree">'.$this->renderElement( $child ).'</ul></li>'; + + foreach ($this->children as $child) + $this->renderedText .= '' . $this->renderElement($child) . ''; + //$this->renderedText .= '<li><div class="tree" /><div class="entry" /><ul class="tree">'.$this->renderElement( $child ).'</ul></li>'; + + foreach ($this->footnotes as $child) + $this->renderedText .= '<li><div class="tree" /><div class="entry" /><ul class="tree">' . $this->renderElement($child) . '</ul></li>'; $this->renderedText .= '</ul>'; - + return $this->renderedText; } - - + + /** * */ function getPathAsString() { $path = array(); - foreach( $this->path as $p ) - { - $path[] = strtolower( substr(get_class($p),0,-7) ); + foreach ($this->path as $p) { + $path[] = strtolower(substr(get_class($p), 0, -7)); } - - return implode('_',$path); + + return implode('_', $path); } } diff --git a/modules/wikiparser/renderer/HtmlRenderer.class.php b/modules/wikiparser/renderer/HtmlRenderer.class.php @@ -1,15 +1,28 @@ <?php +namespace wikiparser\renderer; + use cms\model\File; use cms\model\Image; use cms\model\BaseObject; +use wikiparser\model\DefinitionItemElement; +use DefinitionListEntryElement; +use DefinitionListItemElement; +use Exception; +use Geshi; +use wikiparser\model\LineBreakElement; +use wikiparser\model\LinkElement; +use MacroRunner; +use wikiparser\model\RawElement; +use Text; +use wikiparser\model\TextElement; /** * Dokument-Objekt.<br> * Diese Objekt verk�rpert das Root-Objekt in einem DOM-Baum.<br> * <br> * Dieses Objekt kann Text parsen und seine Unterobjekte selbst erzeugen.<br> - * + * * @author Jan Dankert, $Author$ * @version $Revision$ * @package openrat.text @@ -18,397 +31,376 @@ class HtmlRenderer { public $linkedObjectIds = array(); public $encodeHtml = false; - + /** * Fu�noten. * * @var array */ - public $footnotes = array(); + public $footnotes = array(); - /** - * @var string - */ - public $renderedText; + /** + * @var string + */ + public $renderedText; - /** - * @var \cms\model\Page - */ - public $page; + /** + * @var \cms\model\Page + */ + public $page; - /** - * @var array - */ - public $children; + /** + * @var array + */ + public $children; - /** + /** * Rendert ein Dokument-Element. * * @param BaseObject $child Element * @return String */ - function renderElement( $child ) + function renderElement($child) { global $conf; - - $attr = array(); - $val = ''; - $praefix = ''; - $suffix = ''; - $empty = false; - - if ( count($child->children) > 0 ) - { - $subChild1 = $child->children[0]; - - if ( !empty($subChild1->class) ) - $attr['class'] = $subChild1->class; - - if ( !empty($subChild1->style) ) - $attr['style'] = $subChild1->style; - - if ( !empty($subChild1->title) ) - $attr['title'] = $subChild1->title; - } - - switch( strtolower(get_class($child)) ) - { - case 'tableofcontentelement': - $tag = 'p'; - foreach( $this->children as $h) - { - if ( strtolower(get_class($h))=='headlineelement' ) - { - $child->children[] = new RawElement(str_repeat('&nbsp;&nbsp;',$h->level)); - $t = new TextElement( $h->getText() ); - $l = new LinkElement(); - $l->fragment=$h->getName(); - $l->children[] = $t; - $child->children[] = $l; - $child->children[] = new LineBreakElement(); - } - } - break; - - case 'rawelement': - $tag = ''; - $val = $child->src; - - break; - - case 'textelement': - $tag = ''; -// $tag = 'span'; - - $val = $child->text; - if ( $this->encodeHtml ) - $val = Text::encodeHtml( $val ); - $val = Text::replaceHtmlChars( $val ); - break; - - case 'footnoteelement': - $tag = 'a'; - $attr['href'] = '#footnote'; - - $title = ''; - foreach( $child->children as $c ) - $title .= $this->renderElement($c); - $attr['title'] = strip_tags($title); - - $nr = 1; - foreach( $this->footnotes as $fn ) - if ( strtolower(get_class($fn))=='linebreakelement') - $nr++; - - $val = $nr; - if ( @$conf['editor']['footnote']['bracket']) - $val = '('.$nr.')'; - if ( @$conf['editor']['footnote']['sup']) - $val = '<sup><small>'.$nr.'</small></sup>'; - - - if ( $nr == 1 ) - { - $this->footnotes[] = new RawElement('&mdash;'); - $le = new LinkElement(); - $le->name = "footnote"; - $this->footnotes[] = $le; - $this->footnotes[] = new RawElement('&mdash;'); - } - $this->footnotes[] = new LineBreakElement(); - $this->footnotes[] = new RawElement($val); - $this->footnotes[] = new RawElement(' '); - foreach( $child->children as $c ) - $this->footnotes[] = $c; - - $child->children = array(); - break; - - case 'codeelement': - - if ( empty($child->language) ) - // Wenn keine Sprache verf�gbar, dann ein einfaches PRE-Element erzeugen. - $tag = 'pre'; - else - { - // Wenn Sprache verf�gbar, dann den GESHI-Parser bem�hen. - $tag = ''; - $source = ''; - foreach( $child->children as $c ) - if ( strtolower(get_class($c)) == 'textelement') - $source .= $c->text."\n"; - $child->children = array(); - require_once( __DIR__.'/../../../geshi/geshi.php'); - $geshi = new Geshi($source,$child->language); - $val = $geshi->parse_code(); - } - break; - - case 'quoteelement': - $tag = 'blockquote'; - break; + $attr = array(); + $val = ''; + $praefix = ''; + $suffix = ''; + $empty = false; + if (count($child->children) > 0) { + $subChild1 = $child->children[0]; - case 'paragraphelement': - $tag = 'p'; - break; + if (!empty($subChild1->class)) + $attr['class'] = $subChild1->class; - case 'speechelement': - if ( isset($conf['editor']['html']['tag_speech']) ) - $tag = $conf['editor']['html']['tag_speech']; - else - $tag = 'cite'; - - // Danke an: http://www.apostroph.de/tueddelchen.php - //TODO: Abh�ngigkeit von Spracheinstellung implementieren. - $language = 'de'; - switch( $language ) - { - case 'de': // deutsche Notation - $praefix = '&bdquo;'; - $suffix = '&ldquo;'; - break; - case 'fr': - $praefix = '&laquo;'; - $suffix = '&raquo;'; - break; - default: // englische Notation - $praefix = '&ldquo;'; - $suffix = '&rdquo;'; - } - - if ( $conf['editor']['html']['override_speech'] ) - { - $praefix = $conf['editor']['html']['override_speech_open' ]; - $suffix = $conf['editor']['html']['override_speech_close']; - } - break; + if (!empty($subChild1->style)) + $attr['style'] = $subChild1->style; - case 'macroelement': - - $tag = ''; - - $className = ucfirst($child->name); + if (!empty($subChild1->title)) + $attr['title'] = $subChild1->title; + } - $runner = new MacroRunner(); - try { + switch (strtolower(get_class($child))) { + case 'tableofcontentelement': + $tag = 'p'; + foreach ($this->children as $h) { + if (strtolower(get_class($h)) == 'headlineelement') { + $child->children[] = new RawElement(str_repeat('&nbsp;&nbsp;', $h->level)); + $t = new TextElement($h->getText()); + $l = new LinkElement(); + $l->fragment = $h->getName(); + $l->children[] = $t; + $child->children[] = $l; + $child->children[] = new LineBreakElement(); + } + } + break; - $val .= $runner->executeMacro($className,$child->attributes,$this->page); - } - catch( Exception $e ) { - if ( config('editor','macro','show_errors') ) - $tag = 'tt'; - $attr['style'] = 'color:red'; - $val .= 'Macro warning: '.$e->getMessage(); - } + case 'rawelement': + $tag = ''; + $val = $child->src; - break; - - case 'linebreakelement': - $tag = 'br'; - $empty = true; - break; + break; - case 'linkelement': - $tag = 'a'; - if ( !empty($child->name) ) - $attr['name'] = $child->name; - else - $attr['href'] = htmlspecialchars($child->getUrl()); - - if ( BaseObject::available( $child->objectId ) ) - { - $file = new File( $child->objectId ); - $file->load(); - $attr['title'] = $file->description; - unset( $file ); - } - break; + case 'textelement': + $tag = ''; +// $tag = 'span'; - case 'imageelement': - $empty = true; - $attr['alt'] = ''; - - if ( ! BaseObject::available( $child->objectId ) ) - { - $tag = ''; - } - elseif ( empty($attr['title']) ) - { - $tag = 'img'; - $attr['src'] = $child->getUrl(); - $attr['border'] = '0'; - - // Breite/H�he des Bildes bestimmen. - $image = new Image( $child->objectId ); - - $image->load(); - $attr['alt' ] = $image->name; - $attr['title' ] = $image->description; - - $image->getImageSize(); - $attr['width' ] = $image->width; - $attr['height'] = $image->height; - unset($image); - } - else - { - $tag = 'dl'; - - if ( empty($attr['class']) ) - $attr['class'] = "image"; - - $child->children = array(); - $dt = new DefinitionListItemElement(); - $dt->children[] = new TextElement('(image)'); - $dt->children[] = $child; - $child->children[] = $dt; - - $dd = new DefinitionListEntryElement(); - $dd->children[] = new TextElement('(image)'); - $dd->children[] = new TextElement($attr['title']); - $child->children[] = $dd; - } + $val = $child->text; + if ($this->encodeHtml) + $val = Text::encodeHtml($val); + $val = Text::replaceHtmlChars($val); + break; + + case 'footnoteelement': + $tag = 'a'; + $attr['href'] = '#footnote'; + + $title = ''; + foreach ($child->children as $c) + $title .= $this->renderElement($c); + $attr['title'] = strip_tags($title); + + $nr = 1; + foreach ($this->footnotes as $fn) + if (strtolower(get_class($fn)) == 'linebreakelement') + $nr++; + + $val = $nr; + if (@$conf['editor']['footnote']['bracket']) + $val = '(' . $nr . ')'; + if (@$conf['editor']['footnote']['sup']) + $val = '<sup><small>' . $nr . '</small></sup>'; + + + if ($nr == 1) { + $this->footnotes[] = new RawElement('&mdash;'); + $le = new LinkElement(); + $le->name = "footnote"; + $this->footnotes[] = $le; + $this->footnotes[] = new RawElement('&mdash;'); + } + $this->footnotes[] = new LineBreakElement(); + $this->footnotes[] = new RawElement($val); + $this->footnotes[] = new RawElement(' '); + foreach ($child->children as $c) + $this->footnotes[] = $c; + + $child->children = array(); + + break; + + case 'codeelement': + + if (empty($child->language)) + // Wenn keine Sprache verf�gbar, dann ein einfaches PRE-Element erzeugen. + $tag = 'pre'; + else { + // Wenn Sprache verf�gbar, dann den GESHI-Parser bem�hen. + $tag = ''; + $source = ''; + foreach ($child->children as $c) + if (strtolower(get_class($c)) == 'textelement') + $source .= $c->text . "\n"; + $child->children = array(); + require_once(__DIR__ . '/../../../geshi/geshi.php'); + $geshi = new Geshi($source, $child->language); + $val = $geshi->parse_code(); + } + break; + + case 'quoteelement': + $tag = 'blockquote'; + break; + + + case 'paragraphelement': + $tag = 'p'; + break; + + case 'speechelement': + if (isset($conf['editor']['html']['tag_speech'])) + $tag = $conf['editor']['html']['tag_speech']; + else + $tag = 'cite'; + + // Danke an: http://www.apostroph.de/tueddelchen.php + //TODO: Abh�ngigkeit von Spracheinstellung implementieren. + $language = 'de'; + switch ($language) { + case 'de': // deutsche Notation + $praefix = '&bdquo;'; + $suffix = '&ldquo;'; break; - - case 'strongelement': - if ( isset($conf['editor']['html']['tag_strong']) ) - $tag = $conf['editor']['html']['tag_strong']; - else - $tag = 'strong'; + case 'fr': + $praefix = '&laquo;'; + $suffix = '&raquo;'; break; + default: // englische Notation + $praefix = '&ldquo;'; + $suffix = '&rdquo;'; + } - case 'emphaticelement': - if ( isset($conf['editor']['html']['tag_emphatic']) ) - $tag = $conf['editor']['html']['tag_emphatic']; - else - $tag = 'em'; - break; + if ($conf['editor']['html']['override_speech']) { + $praefix = $conf['editor']['html']['override_speech_open']; + $suffix = $conf['editor']['html']['override_speech_close']; + } + break; - case 'insertedelement': - $tag = 'ins'; - break; + case 'macroelement': - case 'removedelement': - $tag = 'del'; - break; + $tag = ''; - case 'headlineelement': - $tag = 'h'.$child->level; - - $l = new LinkElement(); - $l->name = $child->getName(); - $child->children[] = $l; - - break; + $className = ucfirst($child->name); - case 'tableelement': - $tag = 'table'; - break; + $runner = new MacroRunner(); + try { - case 'tablelineelement': - $tag = 'tr'; - break; + $val .= $runner->executeMacro($className, $child->attributes, $this->page); + } catch (Exception $e) { + if (config('editor', 'macro', 'show_errors')) + $tag = 'tt'; + $attr['style'] = 'color:red'; + $val .= 'Macro warning: ' . $e->getMessage(); + } - case 'definitionlistelement': - $items = $child->children; - $newChildren = array(); - foreach( $items as $item ) - { - $def = new DefinitionItemElement(); - $def->key = $item->key; - $item->key = ''; - $newChildren[] = $def; - $newChildren[] = $item; - } + break; + + case 'linebreakelement': + $tag = 'br'; + $empty = true; + break; + + case 'linkelement': + $tag = 'a'; + if (!empty($child->name)) + $attr['name'] = $child->name; + else + $attr['href'] = htmlspecialchars($child->getUrl()); + + if (BaseObject::available($child->objectId)) { + $file = new File($child->objectId); + $file->load(); + $attr['title'] = $file->description; + unset($file); + } + break; + + case 'imageelement': + $empty = true; + $attr['alt'] = ''; + + if (!BaseObject::available($child->objectId)) { + $tag = ''; + } elseif (empty($attr['title'])) { + $tag = 'img'; + $attr['src'] = $child->getUrl(); + $attr['border'] = '0'; + + // Breite/H�he des Bildes bestimmen. + $image = new Image($child->objectId); + + $image->load(); + $attr['alt'] = $image->name; + $attr['title'] = $image->description; + + $image->getImageSize(); + $attr['width'] = $image->width; + $attr['height'] = $image->height; + unset($image); + } else { + $tag = 'dl'; + + if (empty($attr['class'])) + $attr['class'] = "image"; + + $child->children = array(); + $dt = new DefinitionListItemElement(); + $dt->children[] = new TextElement('(image)'); + $dt->children[] = $child; + $child->children[] = $dt; + + $dd = new DefinitionListEntryElement(); + $dd->children[] = new TextElement('(image)'); + $dd->children[] = new TextElement($attr['title']); + $child->children[] = $dd; + } + break; + + case 'strongelement': + if (isset($conf['editor']['html']['tag_strong'])) + $tag = $conf['editor']['html']['tag_strong']; + else + $tag = 'strong'; + break; + + case 'emphaticelement': + if (isset($conf['editor']['html']['tag_emphatic'])) + $tag = $conf['editor']['html']['tag_emphatic']; + else + $tag = 'em'; + break; + + case 'insertedelement': + $tag = 'ins'; + break; + + case 'removedelement': + $tag = 'del'; + break; + + case 'headlineelement': + $tag = 'h' . $child->level; + + $l = new LinkElement(); + $l->name = $child->getName(); + $child->children[] = $l; + + break; + + case 'tableelement': + $tag = 'table'; + break; + + case 'tablelineelement': + $tag = 'tr'; + break; + + case 'definitionlistelement': + $items = $child->children; + $newChildren = array(); + foreach ($items as $item) { + $def = new DefinitionItemElement(); + $def->key = $item->key; + $item->key = ''; + $newChildren[] = $def; + $newChildren[] = $item; + } // Html::debug($newChildren,'Children-neu'); - $child->children = $newChildren; - $tag = 'dl'; - break; - - case 'definitionitemelement': - if ( !empty($child->key) ) - { - $tag = 'dt'; - $val = $child->key; - } - else - { - $tag = 'dd'; - } - break; - - case 'tablecellelement': - if ( $child->isHeading ) - $tag = 'th'; else $tag = 'td'; - - if ( $child->rowSpan > 1 ) - $attr['rowspan'] = $child->rowSpan; - if ( $child->colSpan > 1 ) - $attr['colspan'] = $child->colSpan; - break; - - case 'listelement': - $tag = 'ul'; - break; - - case 'teletypeelement': - if ( isset($conf['editor']['html']['tag_teletype']) ) - $tag = $conf['editor']['html']['tag_teletype']; - else - $tag = 'code'; - break; - - case 'numberedlistelement': - $tag = 'ol'; - break; - - case 'listentryelement': - $tag = 'li'; - break; + $child->children = $newChildren; + $tag = 'dl'; + break; + + case 'definitionitemelement': + if (!empty($child->key)) { + $tag = 'dt'; + $val = $child->key; + } else { + $tag = 'dd'; + } + break; + + case 'tablecellelement': + if ($child->isHeading) + $tag = 'th'; else $tag = 'td'; + + if ($child->rowSpan > 1) + $attr['rowspan'] = $child->rowSpan; + if ($child->colSpan > 1) + $attr['colspan'] = $child->colSpan; + break; + + case 'listelement': + $tag = 'ul'; + break; + + case 'teletypeelement': + if (isset($conf['editor']['html']['tag_teletype'])) + $tag = $conf['editor']['html']['tag_teletype']; + else + $tag = 'code'; + break; + + case 'numberedlistelement': + $tag = 'ol'; + break; + + case 'listentryelement': + $tag = 'li'; + break; + + default: + + $tag = 'unknown-element'; + $attr['class'] = strtolower(get_class($child)); + break; + } - default: - - $tag = 'unknown-element'; - $attr['class'] = strtolower(get_class($child)); - break; - } + $val .= $praefix; + foreach ($child->children as $c) { + $val .= $this->renderElement($c); + } - $val .= $praefix; - foreach( $child->children as $c ) - { - $val .= $this->renderElement( $c ); - } + $val .= $suffix; + return $this->renderHtmlElement($tag, $val, $empty, $attr); - $val .= $suffix; - return $this->renderHtmlElement($tag,$val,$empty,$attr); - } - /** * Erzeugt ein HTML-Element. * @@ -418,42 +410,36 @@ class HtmlRenderer * @param array $attr Attribute als Array<String,String> * @return String */ - function renderHtmlElement( $tag,$value,$empty,$attr=array() ) + function renderHtmlElement($tag, $value, $empty, $attr = array()) { global $conf; - if ( $tag == '' ) + if ($tag == '') return $value; - - $val = '<'.$tag; - foreach( $attr as $attrName=>$attrInhalt ) - { - $val .= ' '.$attrName.'="'.$attrInhalt.'"'; + + $val = '<' . $tag; + foreach ($attr as $attrName => $attrInhalt) { + $val .= ' ' . $attrName . '="' . $attrInhalt . '"'; } - - if ( $value == '' && $empty ) - { + + if ($value == '' && $empty) { // Inhalt ist leer, also Kurzform verwenden. // Die Kurzform ist abh�ngig vom Rendermode. // SGML=<tag> // XML=<tag /> - if ( $conf['editor']['html']['rendermode'] == 'xml' ) - { + if ($conf['editor']['html']['rendermode'] == 'xml') { $val .= ' />'; return $val; - } - else - { + } else { $val .= '>'; return $val; - } + } } - - $val .= '>'.$value.'</'.$tag.'>'; + + $val .= '>' . $value . '</' . $tag . '>'; return $val; } - - + /** * Rendering des Dokumentes.<br> * @@ -462,14 +448,14 @@ class HtmlRenderer function render() { $this->renderedText = ''; - $this->footnotes = array(); - - foreach( $this->children as $child ) - $this->renderedText .= $this->renderElement( $child ); - - foreach( $this->footnotes as $child ) - $this->renderedText .= $this->renderElement( $child ); - + $this->footnotes = array(); + + foreach ($this->children as $child) + $this->renderedText .= $this->renderElement($child); + + foreach ($this->footnotes as $child) + $this->renderedText .= $this->renderElement($child); + return $this->renderedText; } } diff --git a/modules/wikiparser/renderer/LatexRenderer.class.php b/modules/wikiparser/renderer/LatexRenderer.class.php @@ -1,10 +1,13 @@ <?php +namespace wikiparser\renderer; +use Text; + /** * Renderer fuer das LaTex-Format. * * Diese Klasse erzeugt aus dem internen DOM-Baum ein LaTex-Dokument. - * + * * @author Jan Dankert, $Author$ * @version $Revision$ * @package openrat.text @@ -12,46 +15,45 @@ class LatexRenderer { var $linkedObjectIds = array(); - + /** * Rendert ein Dokument-Element. * * @param Object $child Element * @return String */ - function renderElement( $child ) + function renderElement($child) { global $conf; - - $val = ''; - $before = ''; - $after = ''; - switch( strtolower(get_class($child)) ) - { + $val = ''; + $before = ''; + $after = ''; + + switch (strtolower(get_class($child))) { case 'tableofcontentelement': - $before = '\tableofcontents'."\n"; + $before = '\tableofcontents' . "\n"; break; case 'rawelement': $tag = ''; $val = $child->src; - + break; case 'textelement': $val = $child->text; //$val = Text::encodeHtml( $val ); - $val = Text::replaceHtmlChars( $val ); + $val = Text::replaceHtmlChars($val); break; case 'footnoteelement': $before = '\footnote{'; - $after = '}'; + $after = '}'; break; case 'codeelement': - + break; case 'quoteelement': @@ -59,11 +61,11 @@ class LatexRenderer case 'paragraphelement': - $before = "\n"; + $before = "\n"; break; case 'speechelement': - + break; case 'linebreakelement': @@ -79,28 +81,27 @@ class LatexRenderer case 'strongelement': $before = '\textbf{'; - $after = '}'; + $after = '}'; break; case 'emphaticelement': $before = '\textit{'; - $after = '}'; + $after = '}'; break; case 'insertedelement': $before = ''; - $after = ''; + $after = ''; break; case 'removedelement': $before = ''; - $after = ''; + $after = ''; break; case 'headlineelement': - - switch( $child->level ) - { + + switch ($child->level) { case 1: $before = '\section'; break; @@ -113,17 +114,17 @@ class LatexRenderer break; } $before .= '{'; - $after = '}'; + $after = '}'; break; case 'tableelement': - $before = '\begin{tabular}'."\n"; - $after = '\end{tabular}'."\n"; + $before = '\begin{tabular}' . "\n"; + $after = '\end{tabular}' . "\n"; break; case 'tablelineelement': $before = ''; - $after = '\\'; + $after = '\\'; break; case 'definitionlistelement': @@ -137,39 +138,38 @@ class LatexRenderer case 'tablecellelement': $before = ''; - $after = ' & '; + $after = ' & '; break; case 'listelement': - $before = '\begin{itemize}'."\n"; - $after = '\end{itemize}'."\n"; + $before = '\begin{itemize}' . "\n"; + $after = '\end{itemize}' . "\n"; break; - + case 'teletypeelement': $before = '\texttt{'; - $after = '}'; + $after = '}'; break; - + case 'numberedlistelement': - $before = '\begin{itemize}'."\n"; - $after = '\end{itemize}'."\n"; + $before = '\begin{itemize}' . "\n"; + $after = '\end{itemize}' . "\n"; break; - + case 'listentryelement': $before = '\item '; break; default: - + $tag = 'unknown-element'; $attr['class'] = strtolower(get_class($child)); break; - } + } $val .= $before; - foreach( $child->children as $c ) - { - $val .= $this->renderElement( $c ); + foreach ($child->children as $c) { + $val .= $this->renderElement($c); } $val .= $after; @@ -177,7 +177,6 @@ class LatexRenderer } - /** * Rendering des Dokumentes.<br> * @@ -186,14 +185,14 @@ class LatexRenderer function render() { $this->renderedText = ''; - $this->renderedText .= '\documentclass{article}'."\n"; - $this->renderedText .= '\begin{document}'."\n"; + $this->renderedText .= '\documentclass{article}' . "\n"; + $this->renderedText .= '\begin{document}' . "\n"; + + foreach ($this->children as $child) + $this->renderedText .= $this->renderElement($child); - foreach( $this->children as $child ) - $this->renderedText .= $this->renderElement( $child ); + $this->renderedText .= '\end{document}' . "\n"; - $this->renderedText .= '\end{document}'."\n"; - return $this->renderedText; } } diff --git a/modules/wikiparser/renderer/Pdf.class.php b/modules/wikiparser/renderer/Pdf.class.php @@ -1,35 +0,0 @@ -<?php - -/* - * - */ -class Pdf extends FPDF -{ - /* - * Ueberschreibt die FPDF-Methode, damit im Fehlerfall kein die() aufgerufen wird. - */ - function Error( $errorText ) - { - Logger::warn('PDF-Error:'.$errorText); - } - - /* - * Ueberschreibt die FPDF-Methode, damit im Fehlerfall kein die() aufgerufen wird. - */ - function Image( $file,$x=null,$y=null,$a=0,$b=0,$type='',$link='' ) - { - switch( $type ) - { - case 'png': - case 'jpeg': - case 'jpg': - parent::Image($file,$x,$y,$a,$b,$type,$link); - break; - default: - Logger::warn( 'Imagetype '.$type.' not available in PDF renderer'); - - } - } -} - -?> diff --git a/modules/wikiparser/renderer/PdfRenderer.class.php b/modules/wikiparser/renderer/PdfRenderer.class.php @@ -5,33 +5,36 @@ * Diese Objekt verkoerpert das Root-Objekt in einem DOM-Baum.<br> * <br> * Dieses Objekt kann Text parsen und seine Unterobjekte selbst erzeugen.<br> - * + * * @author Jan Dankert, $Author$ * @version $Revision$ * @package openrat.text */ +namespace wikiparser\renderer; + use cms\model\BaseObject; use cms\model\File; use cms\model\Image; +use Pdf; -require( __DIR__.'/fpdf.php'); -require(__DIR__.'/Pdf.class.php'); +require(__DIR__ . '/fpdf/fpdf.php'); +require(__DIR__ . '/fpdf/Pdf.class.php'); class PdfRenderer { var $linkedObjectIds = array(); - + /** * * @var array */ - var $footnotes = array(); - + var $footnotes = array(); + var $pdf; - + var $url; - + /** * Rendert ein Dokument-Element. @@ -39,155 +42,152 @@ class PdfRenderer * @param Object $child Element * @return String */ - function renderElement( $child ) + function renderElement($child) { global $conf; - - switch( strtolower(get_class($child)) ) - { - case 'tableofcontentelement': - break; - - case 'rawelement': - $this->pdf->Write(5,$child->src); - - break; - - case 'textelement': - - $this->pdf->Write(5,$child->text,$this->url); - $this->url = ''; - break; - - case 'footnoteelement': - break; - - case 'macroelement': - break; - - case 'codeelement': - $this->pdf->ln(10); - $this->pdf->SetFont('Courier','',12); - break; - - case 'quoteelement': - $this->pdf->SetFont('Arial','I',12); - break; - - - case 'paragraphelement': - $this->pdf->ln(10); - break; - - case 'speechelement': - $this->pdf->SetFont('Arial','I',12); - break; - - case 'linebreakelement': - $this->pdf->ln(5); - break; - - case 'linkelement': - $this->url = $child->getUrl(); - $this->pdf->SetTextColor(0, 0, 255); // Blau. - break; - - case 'imageelement': - if ( BaseObject::available( $child->objectId ) ) - { - $this->pdf->ln(5); - // Breite/oe�he des Bildes bestimmen. - $image = new Image( $child->objectId ); - - $image->load(); - $image->write(); - $image->getImageSize(); - // $image->width; - // $image->height; - - $this->pdf->Image($image->getCache()->getFilename(),$this->pdf->GetX(),$this->pdf->GetY(),0,0,$image->extension()); - $this->pdf->ln($image->height/2.5); - $this->pdf->ln(5); - - unset($image); - } - break; - - case 'strongelement': - $this->pdf->SetFont('Arial','B',12); - - break; - - case 'emphaticelement': - $this->pdf->SetFont('Arial','I',12); - break; - - case 'insertedelement': - $this->pdf->SetTextColor(0,255,0); - break; - - case 'removedelement': - $this->pdf->SetTextColor(255,0,0); - break; - - case 'headlineelement': - $this->pdf->ln(20-(2*$child->level)); - $this->pdf->SetFontSize(20-(2*$child->level)); - - break; - - case 'tableelement': - $this->pdf->ln(20); - break; - - case 'tablelineelement': - $this->pdf->ln(20); - break; - - case 'definitionlistelement': - //$this->pdf->ln(10); - break; - - case 'definitionitemelement': - $this->pdf->ln(10); - if ( !empty($child->key) ) - { - $this->pdf->SetFont('','U'); - $this->pdf->Write(5,$child->key); - $this->pdf->SetFont('',''); } - $this->pdf->Write(5,': '); - - case 'tablecellelement': - break; - - case 'teletypeelement': - $this->pdf->SetFont('Courier','',12); - break; - - case 'listelement': - $this->pdf->ln(5); - break; - - case 'numberedlistelement': - $this->pdf->ln(5); - break; - - case 'listentryelement': - $this->pdf->ln(5); - $this->pdf->Write(5,'- '); - break; - - default: - break; - } - - foreach( $child->children as $c ) - { - $this->renderElement( $c ); + + switch (strtolower(get_class($child))) { + case 'tableofcontentelement': + break; + + case 'rawelement': + $this->pdf->Write(5, $child->src); + + break; + + case 'textelement': + + $this->pdf->Write(5, $child->text, $this->url); + $this->url = ''; + break; + + case 'footnoteelement': + break; + + case 'macroelement': + break; + + case 'codeelement': + $this->pdf->ln(10); + $this->pdf->SetFont('Courier', '', 12); + break; + + case 'quoteelement': + $this->pdf->SetFont('Arial', 'I', 12); + break; + + + case 'paragraphelement': + $this->pdf->ln(10); + break; + + case 'speechelement': + $this->pdf->SetFont('Arial', 'I', 12); + break; + + case 'linebreakelement': + $this->pdf->ln(5); + break; + + case 'linkelement': + $this->url = $child->getUrl(); + $this->pdf->SetTextColor(0, 0, 255); // Blau. + break; + + case 'imageelement': + if (BaseObject::available($child->objectId)) { + $this->pdf->ln(5); + // Breite/oe�he des Bildes bestimmen. + $image = new Image($child->objectId); + + $image->load(); + $image->write(); + $image->getImageSize(); + // $image->width; + // $image->height; + + $this->pdf->Image($image->getCache()->getFilename(), $this->pdf->GetX(), $this->pdf->GetY(), 0, 0, $image->extension()); + $this->pdf->ln($image->height / 2.5); + $this->pdf->ln(5); + + unset($image); } - - $this->pdf->SetFont('Arial','',12); - $this->pdf->SetTextColor(0,0,0); + break; + + case 'strongelement': + $this->pdf->SetFont('Arial', 'B', 12); + + break; + + case 'emphaticelement': + $this->pdf->SetFont('Arial', 'I', 12); + break; + + case 'insertedelement': + $this->pdf->SetTextColor(0, 255, 0); + break; + + case 'removedelement': + $this->pdf->SetTextColor(255, 0, 0); + break; + + case 'headlineelement': + $this->pdf->ln(20 - (2 * $child->level)); + $this->pdf->SetFontSize(20 - (2 * $child->level)); + + break; + + case 'tableelement': + $this->pdf->ln(20); + break; + + case 'tablelineelement': + $this->pdf->ln(20); + break; + + case 'definitionlistelement': + //$this->pdf->ln(10); + break; + + case 'definitionitemelement': + $this->pdf->ln(10); + if (!empty($child->key)) { + $this->pdf->SetFont('', 'U'); + $this->pdf->Write(5, $child->key); + $this->pdf->SetFont('', ''); + } + $this->pdf->Write(5, ': '); + + case 'tablecellelement': + break; + + case 'teletypeelement': + $this->pdf->SetFont('Courier', '', 12); + break; + + case 'listelement': + $this->pdf->ln(5); + break; + + case 'numberedlistelement': + $this->pdf->ln(5); + break; + + case 'listentryelement': + $this->pdf->ln(5); + $this->pdf->Write(5, '- '); + break; + + default: + break; + } + + foreach ($child->children as $c) { + $this->renderElement($c); + } + + $this->pdf->SetFont('Arial', '', 12); + $this->pdf->SetTextColor(0, 0, 0); } @@ -201,17 +201,17 @@ class PdfRenderer $this->pdf = new Pdf(); $this->pdf->AddPage(); $this->pdf->SetCreator(OR_TITLE); - $this->pdf->SetFont('Arial','',12); - + $this->pdf->SetFont('Arial', '', 12); + #$this->footnotes = array(); - - foreach( $this->children as $child ) - $this->renderElement( $child ); - + + foreach ($this->children as $child) + $this->renderElement($child); + #foreach( $this->footnotes as $child ) # $this->renderElement( $child ); - return $this->pdf->Output('','S'); + return $this->pdf->Output('', 'S'); } } diff --git a/modules/wikiparser/renderer/TextRenderer.class.php b/modules/wikiparser/renderer/TextRenderer.class.php @@ -1,11 +1,15 @@ <?php +namespace wikiparser\renderer; +use wikiparser\model\LineBreakElement; +use wikiparser\model\RawElement; + /** * Dokument-Objekt.<br> - * Diese Objekt verkrpert das Root-Objekt in einem DOM-Baum.<br> + * Diese Objekt verk�rpert das Root-Objekt in einem DOM-Baum.<br> * <br> * Dieses Objekt kann Text parsen und seine Unterobjekte selbst erzeugen.<br> - * + * * @author Jan Dankert, $Author$ * @version $Revision$ * @package openrat.text @@ -13,104 +17,100 @@ class TextRenderer { var $linkedObjectIds = array(); - + /** - * Funoten. + * Fu�noten. * * @var Array */ - var $footnotes = array(); + var $footnotes = array(); + - /** * Rendert ein Dokument-Element. * * @param Object $child Element * @return String */ - function renderElement( $child ) + function renderElement($child) { global $conf; - - $className = strtolower(get_class($child)); - $val = ''; + $className = strtolower(get_class($child)); + $val = ''; + + $length = @$conf['editor']['text']['linelength']; + if (intval($length) == 0) + $length = 70; + + switch ($className) { + case 'footnoteelement': + + $nr = 1; + foreach ($this->footnotes as $fn) + if (strtolower(get_class($fn)) == 'linebreakelement') + $nr++; + + $val = $nr; + if (@$conf['editor']['footnote']['bracket']) + $val = '(' . $nr . ')'; + + if ($nr == 1) { + $this->footnotes[] = new RawElement("\n\n---\n"); + } + $this->footnotes[] = new LineBreakElement(); + $this->footnotes[] = new RawElement($val); + $this->footnotes[] = new RawElement(' '); + foreach ($child->children as $c) + $this->footnotes[] = $c; + + $child->children = array(); + + break; + + case 'headlineelement': + $val = "\n" . wordwrap($child->text, $length); + $val .= str_repeat('-', min($length, strlen($val))); + break; + + case 'paragraphelement': + $val = "\n\n"; + break; + + case 'strongelement': + + foreach ($child->children as $c) + $val .= $this->renderElement($c); + $val = strtoupper($val); + + $child->children = array(); + + break; + + case 'textelement': $length = @$conf['editor']['text']['linelength']; - if ( intval($length) == 0 ) + if (intval($length) == 0) $length = 70; + $val .= wordwrap($child->text, $length); + break; - switch( $className ) - { - case 'footnoteelement': - - $nr = 1; - foreach( $this->footnotes as $fn ) - if ( strtolower(get_class($fn))=='linebreakelement') - $nr++; - - $val = $nr; - if ( @$conf['editor']['footnote']['bracket']) - $val = '('.$nr.')'; - - if ( $nr == 1 ) - { - $this->footnotes[] = new RawElement("\n\n---\n"); - } - $this->footnotes[] = new LineBreakElement(); - $this->footnotes[] = new RawElement($val); - $this->footnotes[] = new RawElement(' '); - foreach( $child->children as $c ) - $this->footnotes[] = $c; - - $child->children = array(); - - break; - - case 'headlineelement': - $val = "\n".wordwrap($child->text,$length); - $val .= str_repeat('-',min($length,strlen($val))); - break; - - case 'paragraphelement': - $val = "\n\n"; - break; - - case 'strongelement': - - foreach( $child->children as $c ) - $val .= $this->renderElement($c); - $val = strtoupper($val); - - $child->children = array(); - - break; - - case 'textelement': - $length = @$conf['editor']['text']['linelength']; - if ( intval($length) == 0 ) - $length = 70; - $val .= wordwrap($child->text,$length); - break; - - case 'linebreakelement': - $val .= "\n"; - break; - default: - } - - foreach( $child->children as $c ) - { - $val .= $this->renderElement( $c ); - } + case 'linebreakelement': + $val .= "\n"; + break; + default: + } + + foreach ($child->children as $c) { + $val .= $this->renderElement($c); + } + + return $val; - return $val; - // die( 'unknown document type: '.$this->type ); - + } - /** * Rendering des Dokumentes.<br> * @@ -119,14 +119,14 @@ class TextRenderer function render() { $this->renderedText = ''; - $this->footnotes = array(); - - foreach( $this->children as $child ) - $this->renderedText .= $this->renderElement( $child ); - - foreach( $this->footnotes as $child ) - $this->renderedText .= $this->renderElement( $child ); - + $this->footnotes = array(); + + foreach ($this->children as $child) + $this->renderedText .= $this->renderElement($child); + + foreach ($this->footnotes as $child) + $this->renderedText .= $this->renderElement($child); + return $this->renderedText; } } diff --git a/modules/wikiparser/renderer/XhtmlRenderer.class.php b/modules/wikiparser/renderer/XhtmlRenderer.class.php @@ -1,11 +1,24 @@ <?php +namespace wikiparser\renderer; +use wikiparser\model\DefinitionItemElement; +use DefinitionListEntryElement; +use DefinitionListItemElement; +use File; +use Geshi; +use wikiparser\model\LineBreakElement; +use wikiparser\model\LinkElement; +use Logger; +use wikiparser\model\RawElement; +use Text; +use wikiparser\model\TextElement; + /** * Dokument-Objekt.<br> * Diese Objekt verk�rpert das Root-Objekt in einem DOM-Baum.<br> * <br> * Dieses Objekt kann Text parsen und seine Unterobjekte selbst erzeugen.<br> - * + * * @author Jan Dankert, $Author$ * @version $Revision$ * @package openrat.text @@ -14,13 +27,13 @@ class XhtmlRenderer { var $linkedObjectIds = array(); var $encodeHtml = false; - + /** * Fu�noten. * * @var Array */ - var $footnotes = array(); + var $footnotes = array(); /** @@ -29,388 +42,358 @@ class XhtmlRenderer * @param Object $child Element * @return String */ - function renderElement( $child ) + function renderElement($child) { global $conf; - - $attr = array(); - $val = ''; - $praefix = ''; - $suffix = ''; - $empty = false; - - if ( count($child->children) > 0 ) - { - $subChild1 = $child->children[0]; - - if ( !empty($subChild1->class) ) - $attr['class'] = $subChild1->class; - - if ( !empty($subChild1->style) ) - $attr['style'] = $subChild1->style; - - if ( !empty($subChild1->title) ) - $attr['title'] = $subChild1->title; - } - - switch( strtolower(get_class($child)) ) - { - case 'tableofcontentelement': - $tag = 'p'; - foreach( $this->children as $h) - { - if ( strtolower(get_class($h))=='headlineelement' ) - { - $child->children[] = new RawElement(str_repeat('&nbsp;&nbsp;',$h->level)); - $t = new TextElement( $h->getText() ); - $l = new LinkElement(); - $l->fragment=$h->getName(); - $l->children[] = $t; - $child->children[] = $l; - $child->children[] = new LineBreakElement(); - } - } - break; - case 'rawelement': - $tag = ''; - $val = $child->src; - - break; + $attr = array(); + $val = ''; + $praefix = ''; + $suffix = ''; + $empty = false; - case 'textelement': - $tag = ''; -// $tag = 'span'; + if (count($child->children) > 0) { + $subChild1 = $child->children[0]; - $val = $child->text; - if ( $this->encodeHtml ) - $val = Text::encodeHtml( $val ); - $val = Text::replaceHtmlChars( $val ); - break; + if (!empty($subChild1->class)) + $attr['class'] = $subChild1->class; - case 'footnoteelement': - $tag = 'a'; - $attr['href'] = '#footnote'; - - $title = ''; - foreach( $child->children as $c ) - $title .= $this->renderElement($c); - $attr['title'] = strip_tags($title); - - $nr = 1; - foreach( $this->footnotes as $fn ) - if ( strtolower(get_class($fn))=='linebreakelement') - $nr++; - - $val = $nr; - if ( @$conf['editor']['footnote']['bracket']) - $val = '('.$nr.')'; - if ( @$conf['editor']['footnote']['sup']) - $val = '<sup><small>'.$nr.'</small></sup>'; - - - if ( $nr == 1 ) - { - $this->footnotes[] = new RawElement('&mdash;'); - $le = new LinkElement(); - $le->name = "footnote"; - $this->footnotes[] = $le; - $this->footnotes[] = new RawElement('&mdash;'); - } - $this->footnotes[] = new LineBreakElement(); - $this->footnotes[] = new RawElement($val); - $this->footnotes[] = new RawElement(' '); - foreach( $child->children as $c ) - $this->footnotes[] = $c; - - $child->children = array(); - - break; - - case 'codeelement': - - if ( empty($child->language) ) - // Wenn keine Sprache verf�gbar, dann ein einfaches PRE-Element erzeugen. - $tag = 'pre'; - else - { - // Wenn Sprache verf�gbar, dann den GESHI-Parser bem�hen. - $tag = ''; - $source = ''; - foreach( $child->children as $c ) - if ( strtolower(get_class($c)) == 'textelement') - $source .= $c->text."\n"; - $child->children = array(); - require_once('./geshi/geshi.php'); - $geshi = new Geshi($source,$child->language); - $val = $geshi->parse_code(); - } - break; - - case 'quoteelement': - $tag = 'blockquote'; - break; + if (!empty($subChild1->style)) + $attr['style'] = $subChild1->style; + if (!empty($subChild1->title)) + $attr['title'] = $subChild1->title; + } - case 'paragraphelement': - $tag = 'p'; - break; + switch (strtolower(get_class($child))) { + case 'tableofcontentelement': + $tag = 'p'; + foreach ($this->children as $h) { + if (strtolower(get_class($h)) == 'headlineelement') { + $child->children[] = new RawElement(str_repeat('&nbsp;&nbsp;', $h->level)); + $t = new TextElement($h->getText()); + $l = new LinkElement(); + $l->fragment = $h->getName(); + $l->children[] = $t; + $child->children[] = $l; + $child->children[] = new LineBreakElement(); + } + } + break; - case 'speechelement': - $tag = 'cite'; - - // Danke an: http://www.apostroph.de/tueddelchen.php - //TODO: Abh�ngigkeit von Spracheinstellung implementieren. - $language = 'de'; - switch( $language ) - { - case 'de': // deutsche Notation - $praefix = '&bdquo;'; - $suffix = '&ldquo;'; - break; - case 'fr': - $praefix = '&laquo;'; - $suffix = '&raquo;'; - break; - default: // englische Notation - $praefix = '&ldquo;'; - $suffix = '&rdquo;'; - } - - if ( $conf['editor']['html']['override_speech'] ) - { - $praefix = $conf['editor']['html']['override_speech_open' ]; - $suffix = $conf['editor']['html']['override_speech_close']; - } - break; + case 'rawelement': + $tag = ''; + $val = $child->src; - case 'linebreakelement': - $tag = 'br'; - $empty = true; - break; + break; - case 'linkelement': - $tag = 'a'; - if ( !empty($child->name) ) - $attr['name'] = $child->name; - else - $attr['href'] = htmlspecialchars($child->getUrl()); - - if ( Object::available( $child->objectId ) ) - { - $file = new File( $child->objectId ); - $file->load(); - $attr['title'] = $file->description; - unset( $file ); - } - break; + case 'textelement': + $tag = ''; +// $tag = 'span'; - case 'imageelement': - $empty = true; - $attr['alt'] = ''; - - if ( ! Object::available( $child->objectId ) ) - { - $tag = ''; - } - elseif ( empty($attr['title']) ) - { - $tag = 'img'; - $attr['src'] = $child->getUrl(); - $attr['border'] = '0'; - - // Breite/H�he des Bildes bestimmen. - $image = new File( $child->objectId ); - - $image->load(); - $attr['alt' ] = $image->name; - $attr['title' ] = $image->description; - - $image->getImageSize(); - $attr['width' ] = $image->width; - $attr['height'] = $image->height; - unset($image); - } - else - { - $tag = 'dl'; - - if ( empty($attr['class']) ) - $attr['class'] = "image"; - - $child->children = array(); - $dt = new DefinitionListItemElement(); - $dt->children[] = new TextElement('(image)'); - $dt->children[] = $child; - $child->children[] = $dt; - - $dd = new DefinitionListEntryElement(); - $dd->children[] = new TextElement('(image)'); - $dd->children[] = new TextElement($attr['title']); - $child->children[] = $dd; - } - break; + $val = $child->text; + if ($this->encodeHtml) + $val = Text::encodeHtml($val); + $val = Text::replaceHtmlChars($val); + break; + + case 'footnoteelement': + $tag = 'a'; + $attr['href'] = '#footnote'; + + $title = ''; + foreach ($child->children as $c) + $title .= $this->renderElement($c); + $attr['title'] = strip_tags($title); + + $nr = 1; + foreach ($this->footnotes as $fn) + if (strtolower(get_class($fn)) == 'linebreakelement') + $nr++; + + $val = $nr; + if (@$conf['editor']['footnote']['bracket']) + $val = '(' . $nr . ')'; + if (@$conf['editor']['footnote']['sup']) + $val = '<sup><small>' . $nr . '</small></sup>'; + + + if ($nr == 1) { + $this->footnotes[] = new RawElement('&mdash;'); + $le = new LinkElement(); + $le->name = "footnote"; + $this->footnotes[] = $le; + $this->footnotes[] = new RawElement('&mdash;'); + } + $this->footnotes[] = new LineBreakElement(); + $this->footnotes[] = new RawElement($val); + $this->footnotes[] = new RawElement(' '); + foreach ($child->children as $c) + $this->footnotes[] = $c; + + $child->children = array(); + + break; + + case 'codeelement': + + if (empty($child->language)) + // Wenn keine Sprache verf�gbar, dann ein einfaches PRE-Element erzeugen. + $tag = 'pre'; + else { + // Wenn Sprache verf�gbar, dann den GESHI-Parser bem�hen. + $tag = ''; + $source = ''; + foreach ($child->children as $c) + if (strtolower(get_class($c)) == 'textelement') + $source .= $c->text . "\n"; + $child->children = array(); + require_once('./geshi/geshi.php'); + $geshi = new Geshi($source, $child->language); + $val = $geshi->parse_code(); + } + break; - case 'strongelement': - $tag = 'strong'; - break; + case 'quoteelement': + $tag = 'blockquote'; + break; - case 'emphaticelement': - $tag = 'em'; - break; - case 'insertedelement': - $tag = 'ins'; - break; + case 'paragraphelement': + $tag = 'p'; + break; - case 'removedelement': - $tag = 'del'; - break; + case 'speechelement': + $tag = 'cite'; - case 'headlineelement': - $tag = 'h'.$child->level; - - $l = new LinkElement(); - $l->name = $child->getName(); - $child->children[] = $l; - + // Danke an: http://www.apostroph.de/tueddelchen.php + //TODO: Abh�ngigkeit von Spracheinstellung implementieren. + $language = 'de'; + switch ($language) { + case 'de': // deutsche Notation + $praefix = '&bdquo;'; + $suffix = '&ldquo;'; break; - - case 'tableelement': - $tag = 'table'; - break; - - case 'tablelineelement': - $tag = 'tr'; + case 'fr': + $praefix = '&laquo;'; + $suffix = '&raquo;'; break; + default: // englische Notation + $praefix = '&ldquo;'; + $suffix = '&rdquo;'; + } - case 'definitionlistelement': - $items = $child->children; - $newChildren = array(); - foreach( $items as $item ) - { - $def = new DefinitionItemElement(); - $def->key = $item->key; - $item->key = ''; - $newChildren[] = $def; - $newChildren[] = $item; - } + if ($conf['editor']['html']['override_speech']) { + $praefix = $conf['editor']['html']['override_speech_open']; + $suffix = $conf['editor']['html']['override_speech_close']; + } + break; + + case 'linebreakelement': + $tag = 'br'; + $empty = true; + break; + + case 'linkelement': + $tag = 'a'; + if (!empty($child->name)) + $attr['name'] = $child->name; + else + $attr['href'] = htmlspecialchars($child->getUrl()); + + if (Object::available($child->objectId)) { + $file = new File($child->objectId); + $file->load(); + $attr['title'] = $file->description; + unset($file); + } + break; + + case 'imageelement': + $empty = true; + $attr['alt'] = ''; + + if (!Object::available($child->objectId)) { + $tag = ''; + } elseif (empty($attr['title'])) { + $tag = 'img'; + $attr['src'] = $child->getUrl(); + $attr['border'] = '0'; + + // Breite/H�he des Bildes bestimmen. + $image = new File($child->objectId); + + $image->load(); + $attr['alt'] = $image->name; + $attr['title'] = $image->description; + + $image->getImageSize(); + $attr['width'] = $image->width; + $attr['height'] = $image->height; + unset($image); + } else { + $tag = 'dl'; + + if (empty($attr['class'])) + $attr['class'] = "image"; + + $child->children = array(); + $dt = new DefinitionListItemElement(); + $dt->children[] = new TextElement('(image)'); + $dt->children[] = $child; + $child->children[] = $dt; + + $dd = new DefinitionListEntryElement(); + $dd->children[] = new TextElement('(image)'); + $dd->children[] = new TextElement($attr['title']); + $child->children[] = $dd; + } + break; + + case 'strongelement': + $tag = 'strong'; + break; + + case 'emphaticelement': + $tag = 'em'; + break; + + case 'insertedelement': + $tag = 'ins'; + break; + + case 'removedelement': + $tag = 'del'; + break; + + case 'headlineelement': + $tag = 'h' . $child->level; + + $l = new LinkElement(); + $l->name = $child->getName(); + $child->children[] = $l; + + break; + + case 'tableelement': + $tag = 'table'; + break; + + case 'tablelineelement': + $tag = 'tr'; + break; + + case 'definitionlistelement': + $items = $child->children; + $newChildren = array(); + foreach ($items as $item) { + $def = new DefinitionItemElement(); + $def->key = $item->key; + $item->key = ''; + $newChildren[] = $def; + $newChildren[] = $item; + } // Html::debug($newChildren,'Children-neu'); - $child->children = $newChildren; - $tag = 'dl'; - break; + $child->children = $newChildren; + $tag = 'dl'; + break; + + case 'definitionitemelement': + if (!empty($child->key)) { + $tag = 'dt'; + $val = $child->key; + } else { + $tag = 'dd'; + } + break; + + case 'tablecellelement': + if ($child->isHeading) + $tag = 'th'; else $tag = 'td'; + + if ($child->rowSpan > 1) + $attr['rowspan'] = $child->rowSpan; + if ($child->colSpan > 1) + $attr['colspan'] = $child->colSpan; + break; + + case 'listelement': + $tag = 'ul'; + break; + + case 'teletypeelement': + $tag = 'code'; + break; + + case 'numberedlistelement': + $tag = 'ol'; + break; + + case 'listentryelement': + $tag = 'li'; + break; + + case 'macroelement': + + $className = ucfirst($child->name); + $fileName = './dynamicClasses/' . $className . '.class.php'; + if (is_file($fileName)) { + // Fuer den Fall, dass eine Dynamic-Klasse mehrmals pro Vorlage auftritt + if (!class_exists($className)) + require($fileName); + + if (class_exists($className)) { + $dynEl = new $className; + $dynEl->page = &$this->page; + + if (method_exists($dynEl, 'execute')) { + $dynEl->objectid = $this->page->objectid; + $dynEl->page = &$this->page; + + foreach ($child->attributes as $param_name => $param_value) { + if (isset($dynEl->$param_name)) + $dynEl->$param_name = $param_value; + } - case 'definitionitemelement': - if ( !empty($child->key) ) - { - $tag = 'dt'; - $val = $child->key; + $dynEl->execute(); + $val = $dynEl->getOutput(); + } else { + Logger::warn('element:' . $this->element->name . ', ' . + 'class:' . $className . ', no method: execute()'); } - else - { - $tag = 'dd'; - } - break; + } else { + Logger::warn('element:' . $this->element->name . ', ' . + 'class not found:' . $className); + } + } else { + Logger::warn('element:' . $this->element->name . ', ' . + 'file not found:' . $fileName); + } - case 'tablecellelement': - if ( $child->isHeading ) - $tag = 'th'; else $tag = 'td'; - - if ( $child->rowSpan > 1 ) - $attr['rowspan'] = $child->rowSpan; - if ( $child->colSpan > 1 ) - $attr['colspan'] = $child->colSpan; - break; + // Wenn HTML-Ausgabe, dann Sonderzeichen in HTML �bersetzen + if ($this->page->mimeType() == 'text/html') + $inhalt = Text::encodeHtmlSpecialChars($inhalt); - case 'listelement': - $tag = 'ul'; - break; - - case 'teletypeelement': - $tag = 'code'; - break; - - case 'numberedlistelement': - $tag = 'ol'; - break; - - case 'listentryelement': - $tag = 'li'; - break; + break; - case 'macroelement': - - $className = ucfirst($child->name); - $fileName = './dynamicClasses/'.$className.'.class.php'; - if ( is_file( $fileName ) ) - { - // Fuer den Fall, dass eine Dynamic-Klasse mehrmals pro Vorlage auftritt - if ( !class_exists($className) ) - require( $fileName ); - - if ( class_exists($className) ) - { - $dynEl = new $className; - $dynEl->page = &$this->page; - - if ( method_exists( $dynEl,'execute' ) ) - { - $dynEl->objectid = $this->page->objectid; - $dynEl->page = &$this->page; - - foreach( $child->attributes as $param_name=>$param_value ) - { - if ( isset( $dynEl->$param_name ) ) - $dynEl->$param_name = $param_value; - } - - $dynEl->execute(); - $val = $dynEl->getOutput(); - } - else - { - Logger::warn('element:'.$this->element->name.', '. - 'class:'.$className.', no method: execute()'); - } - } - else - { - Logger::warn('element:'.$this->element->name.', '. - 'class not found:'.$className); - } - } - else - { - Logger::warn('element:'.$this->element->name.', '. - 'file not found:'.$fileName); - } - - // Wenn HTML-Ausgabe, dann Sonderzeichen in HTML �bersetzen - if ( $this->page->mimeType()=='text/html' ) - $inhalt = Text::encodeHtmlSpecialChars( $inhalt ); - - break; - - - default: - - $tag = 'unknown-element'; - $attr['class'] = strtolower(get_class($child)); - break; - } - $val .= $praefix; - foreach( $child->children as $c ) - { - $val .= $this->renderElement( $c ); - } + default: - $val .= $suffix; + $tag = 'unknown-element'; + $attr['class'] = strtolower(get_class($child)); + break; + } + + $val .= $praefix; + foreach ($child->children as $c) { + $val .= $this->renderElement($c); + } + + $val .= $suffix; // echo "text:$val"; - return $this->renderHtmlElement($tag,$val,$empty,$attr); - - } + return $this->renderHtmlElement($tag, $val, $empty, $attr); + } /** @@ -422,42 +405,36 @@ class XhtmlRenderer * @param Array $attr Attribute als Array<String,String> * @return String */ - function renderHtmlElement( $tag,$value,$empty,$attr=array() ) + function renderHtmlElement($tag, $value, $empty, $attr = array()) { global $conf; - if ( $tag == '' ) + if ($tag == '') return $value; - - $val = '<'.$tag; - foreach( $attr as $attrName=>$attrInhalt ) - { - $val .= ' '.$attrName.'="'.$attrInhalt.'"'; + + $val = '<' . $tag; + foreach ($attr as $attrName => $attrInhalt) { + $val .= ' ' . $attrName . '="' . $attrInhalt . '"'; } - - if ( $value == '' && $empty ) - { + + if ($value == '' && $empty) { // Inhalt ist leer, also Kurzform verwenden. // Die Kurzform ist abh�ngig vom Rendermode. // SGML=<tag> // XML=<tag /> - if ( $conf['editor']['html']['rendermode'] == 'xml' ) - { + if ($conf['editor']['html']['rendermode'] == 'xml') { $val .= ' />'; return $val; - } - else - { + } else { $val .= '>'; return $val; - } + } } - - $val .= '>'.$value.'</'.$tag.'>'; + + $val .= '>' . $value . '</' . $tag . '>'; return $val; } - - + /** * Rendering des Dokumentes.<br> * @@ -466,14 +443,14 @@ class XhtmlRenderer function render() { $this->renderedText = ''; - $this->footnotes = array(); - - foreach( $this->children as $child ) - $this->renderedText .= $this->renderElement( $child ); - - foreach( $this->footnotes as $child ) - $this->renderedText .= $this->renderElement( $child ); - + $this->footnotes = array(); + + foreach ($this->children as $child) + $this->renderedText .= $this->renderElement($child); + + foreach ($this->footnotes as $child) + $this->renderedText .= $this->renderElement($child); + return $this->renderedText; } } diff --git a/modules/wikiparser/renderer/fpdf.php b/modules/wikiparser/renderer/fpdf.php @@ -1,1726 +0,0 @@ -<?php -/******************************************************************************* - * FPDF * - * * - * Version: 1.6 * - * Date: 2008-08-03 * - * Author: Olivier PLATHEY * - *******************************************************************************/ - -define('FPDF_VERSION','1.6'); - -class FPDF -{ - var $page; //current page numberstrem - var $n; //current object number - var $offsets; //array of object offsets - var $buffer; //buffer holding in-memory PDF - var $pages; //array containing pages - var $state; //current document state - var $compress; //compression flag - var $k; //scale factor (number of points in user unit) - var $DefOrientation; //default orientation - var $CurOrientation; //current orientation - var $PageFormats; //available page formats - var $DefPageFormat; //default page format - var $CurPageFormat; //current page format - var $PageSizes; //array storing non-default page sizes - var $wPt,$hPt; //dimensions of current page in points - var $w,$h; //dimensions of current page in user unit - var $lMargin; //left margin - var $tMargin; //top margin - var $rMargin; //right margin - var $bMargin; //page break margin - var $cMargin; //cell margin - var $x,$y; //current position in user unit - var $lasth; //height of last printed cell - var $LineWidth; //line width in user unit - var $CoreFonts; //array of standard font names - var $fonts; //array of used fonts - var $FontFiles; //array of font files - var $diffs; //array of encoding differences - var $FontFamily; //current font family - var $FontStyle; //current font style - var $underline; //underlining flag - var $CurrentFont; //current font info - var $FontSizePt; //current font size in points - var $FontSize; //current font size in user unit - var $DrawColor; //commands for drawing color - var $FillColor; //commands for filling color - var $TextColor; //commands for text color - var $ColorFlag; //indicates whether fill and text colors are different - var $ws; //word spacing - var $images; //array of used images - var $PageLinks; //array of links in pages - var $links; //array of internal links - var $AutoPageBreak; //automatic page breaking - var $PageBreakTrigger; //threshold used to trigger page breaks - var $InHeader; //flag set when processing header - var $InFooter; //flag set when processing footer - var $ZoomMode; //zoom display mode - var $LayoutMode; //layout display mode - var $title; //title - var $subject; //subject - var $author; //author - var $keywords; //keywords - var $creator; //creator - var $AliasNbPages; //alias for total number of pages - var $PDFVersion; //PDF version number - - /******************************************************************************* - * * - * Public methods * - * * - *******************************************************************************/ - function __construct($orientation='P', $unit='mm', $format='A4') - { - //Some checks - $this->_dochecks(); - //Initialization of properties - $this->page=0; - $this->n=2; - $this->buffer=''; - $this->pages=array(); - $this->PageSizes=array(); - $this->state=0; - $this->fonts=array(); - $this->FontFiles=array(); - $this->diffs=array(); - $this->images=array(); - $this->links=array(); - $this->InHeader=false; - $this->InFooter=false; - $this->lasth=0; - $this->FontFamily=''; - $this->FontStyle=''; - $this->FontSizePt=12; - $this->underline=false; - $this->DrawColor='0 G'; - $this->FillColor='0 g'; - $this->TextColor='0 g'; - $this->ColorFlag=false; - $this->ws=0; - //Standard fonts - $this->CoreFonts=array('courier'=>'Courier', 'courierB'=>'Courier-Bold', 'courierI'=>'Courier-Oblique', 'courierBI'=>'Courier-BoldOblique', - 'helvetica'=>'Helvetica', 'helveticaB'=>'Helvetica-Bold', 'helveticaI'=>'Helvetica-Oblique', 'helveticaBI'=>'Helvetica-BoldOblique', - 'times'=>'Times-Roman', 'timesB'=>'Times-Bold', 'timesI'=>'Times-Italic', 'timesBI'=>'Times-BoldItalic', - 'symbol'=>'Symbol', 'zapfdingbats'=>'ZapfDingbats'); - //Scale factor - if($unit=='pt') - $this->k=1; - elseif($unit=='mm') - $this->k=72/25.4; - elseif($unit=='cm') - $this->k=72/2.54; - elseif($unit=='in') - $this->k=72; - else - $this->Error('Incorrect unit: '.$unit); - //Page format - $this->PageFormats=array('a3'=>array(841.89,1190.55), 'a4'=>array(595.28,841.89), 'a5'=>array(420.94,595.28), - 'letter'=>array(612,792), 'legal'=>array(612,1008)); - if(is_string($format)) - $format=$this->_getpageformat($format); - $this->DefPageFormat=$format; - $this->CurPageFormat=$format; - //Page orientation - $orientation=strtolower($orientation); - if($orientation=='p' || $orientation=='portrait') - { - $this->DefOrientation='P'; - $this->w=$this->DefPageFormat[0]; - $this->h=$this->DefPageFormat[1]; - } - elseif($orientation=='l' || $orientation=='landscape') - { - $this->DefOrientation='L'; - $this->w=$this->DefPageFormat[1]; - $this->h=$this->DefPageFormat[0]; - } - else - $this->Error('Incorrect orientation: '.$orientation); - $this->CurOrientation=$this->DefOrientation; - $this->wPt=$this->w*$this->k; - $this->hPt=$this->h*$this->k; - //Page margins (1 cm) - $margin=28.35/$this->k; - $this->SetMargins($margin,$margin); - //Interior cell margin (1 mm) - $this->cMargin=$margin/10; - //Line width (0.2 mm) - $this->LineWidth=.567/$this->k; - //Automatic page break - $this->SetAutoPageBreak(true,2*$margin); - //Full width display mode - $this->SetDisplayMode('fullwidth'); - //Enable compression - $this->SetCompression(true); - //Set default PDF version number - $this->PDFVersion='1.3'; - } - - function SetMargins($left, $top, $right=null) - { - //Set left, top and right margins - $this->lMargin=$left; - $this->tMargin=$top; - if($right===null) - $right=$left; - $this->rMargin=$right; - } - - function SetLeftMargin($margin) - { - //Set left margin - $this->lMargin=$margin; - if($this->page>0 && $this->x<$margin) - $this->x=$margin; - } - - function SetTopMargin($margin) - { - //Set top margin - $this->tMargin=$margin; - } - - function SetRightMargin($margin) - { - //Set right margin - $this->rMargin=$margin; - } - - function SetAutoPageBreak($auto, $margin=0) - { - //Set auto page break mode and triggering margin - $this->AutoPageBreak=$auto; - $this->bMargin=$margin; - $this->PageBreakTrigger=$this->h-$margin; - } - - function SetDisplayMode($zoom, $layout='continuous') - { - //Set display mode in viewer - if($zoom=='fullpage' || $zoom=='fullwidth' || $zoom=='real' || $zoom=='default' || !is_string($zoom)) - $this->ZoomMode=$zoom; - else - $this->Error('Incorrect zoom display mode: '.$zoom); - if($layout=='single' || $layout=='continuous' || $layout=='two' || $layout=='default') - $this->LayoutMode=$layout; - else - $this->Error('Incorrect layout display mode: '.$layout); - } - - function SetCompression($compress) - { - //Set page compression - if(function_exists('gzcompress')) - $this->compress=$compress; - else - $this->compress=false; - } - - function SetTitle($title, $isUTF8=false) - { - //Title of document - if($isUTF8) - $title=$this->_UTF8toUTF16($title); - $this->title=$title; - } - - function SetSubject($subject, $isUTF8=false) - { - //Subject of document - if($isUTF8) - $subject=$this->_UTF8toUTF16($subject); - $this->subject=$subject; - } - - function SetAuthor($author, $isUTF8=false) - { - //Author of document - if($isUTF8) - $author=$this->_UTF8toUTF16($author); - $this->author=$author; - } - - function SetKeywords($keywords, $isUTF8=false) - { - //Keywords of document - if($isUTF8) - $keywords=$this->_UTF8toUTF16($keywords); - $this->keywords=$keywords; - } - - function SetCreator($creator, $isUTF8=false) - { - //Creator of document - if($isUTF8) - $creator=$this->_UTF8toUTF16($creator); - $this->creator=$creator; - } - - function AliasNbPages($alias='{nb}') - { - //Define an alias for total number of pages - $this->AliasNbPages=$alias; - } - - function Error($msg) - { - //Fatal error - die('<b>FPDF error:</b> '.$msg); - } - - function Open() - { - //Begin document - $this->state=1; - } - - function Close() - { - //Terminate document - if($this->state==3) - return; - if($this->page==0) - $this->AddPage(); - //Page footer - $this->InFooter=true; - $this->Footer(); - $this->InFooter=false; - //Close page - $this->_endpage(); - //Close document - $this->_enddoc(); - } - - function AddPage($orientation='', $format='') - { - //Start a new page - if($this->state==0) - $this->Open(); - $family=$this->FontFamily; - $style=$this->FontStyle.($this->underline ? 'U' : ''); - $size=$this->FontSizePt; - $lw=$this->LineWidth; - $dc=$this->DrawColor; - $fc=$this->FillColor; - $tc=$this->TextColor; - $cf=$this->ColorFlag; - if($this->page>0) - { - //Page footer - $this->InFooter=true; - $this->Footer(); - $this->InFooter=false; - //Close page - $this->_endpage(); - } - //Start new page - $this->_beginpage($orientation,$format); - //Set line cap style to square - $this->_out('2 J'); - //Set line width - $this->LineWidth=$lw; - $this->_out(sprintf('%.2F w',$lw*$this->k)); - //Set font - if($family) - $this->SetFont($family,$style,$size); - //Set colors - $this->DrawColor=$dc; - if($dc!='0 G') - $this->_out($dc); - $this->FillColor=$fc; - if($fc!='0 g') - $this->_out($fc); - $this->TextColor=$tc; - $this->ColorFlag=$cf; - //Page header - $this->InHeader=true; - $this->Header(); - $this->InHeader=false; - //Restore line width - if($this->LineWidth!=$lw) - { - $this->LineWidth=$lw; - $this->_out(sprintf('%.2F w',$lw*$this->k)); - } - //Restore font - if($family) - $this->SetFont($family,$style,$size); - //Restore colors - if($this->DrawColor!=$dc) - { - $this->DrawColor=$dc; - $this->_out($dc); - } - if($this->FillColor!=$fc) - { - $this->FillColor=$fc; - $this->_out($fc); - } - $this->TextColor=$tc; - $this->ColorFlag=$cf; - } - - function Header() - { - //To be implemented in your own inherited class - } - - function Footer() - { - //To be implemented in your own inherited class - } - - function PageNo() - { - //Get current page number - return $this->page; - } - - function SetDrawColor($r, $g=null, $b=null) - { - //Set color for all stroking operations - if(($r==0 && $g==0 && $b==0) || $g===null) - $this->DrawColor=sprintf('%.3F G',$r/255); - else - $this->DrawColor=sprintf('%.3F %.3F %.3F RG',$r/255,$g/255,$b/255); - if($this->page>0) - $this->_out($this->DrawColor); - } - - function SetFillColor($r, $g=null, $b=null) - { - //Set color for all filling operations - if(($r==0 && $g==0 && $b==0) || $g===null) - $this->FillColor=sprintf('%.3F g',$r/255); - else - $this->FillColor=sprintf('%.3F %.3F %.3F rg',$r/255,$g/255,$b/255); - $this->ColorFlag=($this->FillColor!=$this->TextColor); - if($this->page>0) - $this->_out($this->FillColor); - } - - function SetTextColor($r, $g=null, $b=null) - { - //Set color for text - if(($r==0 && $g==0 && $b==0) || $g===null) - $this->TextColor=sprintf('%.3F g',$r/255); - else - $this->TextColor=sprintf('%.3F %.3F %.3F rg',$r/255,$g/255,$b/255); - $this->ColorFlag=($this->FillColor!=$this->TextColor); - } - - function GetStringWidth($s) - { - //Get width of a string in the current font - $s=(string)$s; - $cw=&$this->CurrentFont['cw']; - $w=0; - $l=strlen($s); - for($i=0;$i<$l;$i++) - $w+=$cw[$s[$i]]; - return $w*$this->FontSize/1000; - } - - function SetLineWidth($width) - { - //Set line width - $this->LineWidth=$width; - if($this->page>0) - $this->_out(sprintf('%.2F w',$width*$this->k)); - } - - function Line($x1, $y1, $x2, $y2) - { - //Draw a line - $this->_out(sprintf('%.2F %.2F m %.2F %.2F l S',$x1*$this->k,($this->h-$y1)*$this->k,$x2*$this->k,($this->h-$y2)*$this->k)); - } - - function Rect($x, $y, $w, $h, $style='') - { - //Draw a rectangle - if($style=='F') - $op='f'; - elseif($style=='FD' || $style=='DF') - $op='B'; - else - $op='S'; - $this->_out(sprintf('%.2F %.2F %.2F %.2F re %s',$x*$this->k,($this->h-$y)*$this->k,$w*$this->k,-$h*$this->k,$op)); - } - - function AddFont($family, $style='', $file='') - { - //Add a TrueType or Type1 font - $family=strtolower($family); - if($file=='') - $file=str_replace(' ','',$family).strtolower($style).'.php'; - if($family=='arial') - $family='helvetica'; - $style=strtoupper($style); - if($style=='IB') - $style='BI'; - $fontkey=$family.$style; - if(isset($this->fonts[$fontkey])) - return; - include($this->_getfontpath().$file); - if(!isset($name)) - $this->Error('Could not include font definition file'); - $i=count($this->fonts)+1; - $this->fonts[$fontkey]=array('i'=>$i, 'type'=>$type, 'name'=>$name, 'desc'=>$desc, 'up'=>$up, 'ut'=>$ut, 'cw'=>$cw, 'enc'=>$enc, 'file'=>$file); - if($diff) - { - //Search existing encodings - $d=0; - $nb=count($this->diffs); - for($i=1;$i<=$nb;$i++) - { - if($this->diffs[$i]==$diff) - { - $d=$i; - break; - } - } - if($d==0) - { - $d=$nb+1; - $this->diffs[$d]=$diff; - } - $this->fonts[$fontkey]['diff']=$d; - } - if($file) - { - if($type=='TrueType') - $this->FontFiles[$file]=array('length1'=>$originalsize); - else - $this->FontFiles[$file]=array('length1'=>$size1, 'length2'=>$size2); - } - } - - function SetFont($family, $style='', $size=0) - { - //Select a font; size given in points - global $fpdf_charwidths; - - $family=strtolower($family); - if($family=='') - $family=$this->FontFamily; - if($family=='arial') - $family='helvetica'; - elseif($family=='symbol' || $family=='zapfdingbats') - $style=''; - $style=strtoupper($style); - if(strpos($style,'U')!==false) - { - $this->underline=true; - $style=str_replace('U','',$style); - } - else - $this->underline=false; - if($style=='IB') - $style='BI'; - if($size==0) - $size=$this->FontSizePt; - //Test if font is already selected - if($this->FontFamily==$family && $this->FontStyle==$style && $this->FontSizePt==$size) - return; - //Test if used for the first time - $fontkey=$family.$style; - if(!isset($this->fonts[$fontkey])) - { - //Check if one of the standard fonts - if(isset($this->CoreFonts[$fontkey])) - { - if(!isset($fpdf_charwidths[$fontkey])) - { - //Load metric file - $file=$family; - if($family=='times' || $family=='helvetica') - $file.=strtolower($style); - include($this->_getfontpath().$file.'.php'); - if(!isset($fpdf_charwidths[$fontkey])) - $this->Error('Could not include font metric file'); - } - $i=count($this->fonts)+1; - $name=$this->CoreFonts[$fontkey]; - $cw=$fpdf_charwidths[$fontkey]; - $this->fonts[$fontkey]=array('i'=>$i, 'type'=>'core', 'name'=>$name, 'up'=>-100, 'ut'=>50, 'cw'=>$cw); - } - else - $this->Error('Undefined font: '.$family.' '.$style); - } - //Select it - $this->FontFamily=$family; - $this->FontStyle=$style; - $this->FontSizePt=$size; - $this->FontSize=$size/$this->k; - $this->CurrentFont=&$this->fonts[$fontkey]; - if($this->page>0) - $this->_out(sprintf('BT /F%d %.2F Tf ET',$this->CurrentFont['i'],$this->FontSizePt)); - } - - function SetFontSize($size) - { - //Set font size in points - if($this->FontSizePt==$size) - return; - $this->FontSizePt=$size; - $this->FontSize=$size/$this->k; - if($this->page>0) - $this->_out(sprintf('BT /F%d %.2F Tf ET',$this->CurrentFont['i'],$this->FontSizePt)); - } - - function AddLink() - { - //Create a new internal link - $n=count($this->links)+1; - $this->links[$n]=array(0, 0); - return $n; - } - - function SetLink($link, $y=0, $page=-1) - { - //Set destination of internal link - if($y==-1) - $y=$this->y; - if($page==-1) - $page=$this->page; - $this->links[$link]=array($page, $y); - } - - function Link($x, $y, $w, $h, $link) - { - //Put a link on the page - $this->PageLinks[$this->page][]=array($x*$this->k, $this->hPt-$y*$this->k, $w*$this->k, $h*$this->k, $link); - } - - function Text($x, $y, $txt) - { - //Output a string - $s=sprintf('BT %.2F %.2F Td (%s) Tj ET',$x*$this->k,($this->h-$y)*$this->k,$this->_escape($txt)); - if($this->underline && $txt!='') - $s.=' '.$this->_dounderline($x,$y,$txt); - if($this->ColorFlag) - $s='q '.$this->TextColor.' '.$s.' Q'; - $this->_out($s); - } - - function AcceptPageBreak() - { - //Accept automatic page break or not - return $this->AutoPageBreak; - } - - function Cell($w, $h=0, $txt='', $border=0, $ln=0, $align='', $fill=false, $link='') - { - //Output a cell - $k=$this->k; - if($this->y+$h>$this->PageBreakTrigger && !$this->InHeader && !$this->InFooter && $this->AcceptPageBreak()) - { - //Automatic page break - $x=$this->x; - $ws=$this->ws; - if($ws>0) - { - $this->ws=0; - $this->_out('0 Tw'); - } - $this->AddPage($this->CurOrientation,$this->CurPageFormat); - $this->x=$x; - if($ws>0) - { - $this->ws=$ws; - $this->_out(sprintf('%.3F Tw',$ws*$k)); - } - } - if($w==0) - $w=$this->w-$this->rMargin-$this->x; - $s=''; - if($fill || $border==1) - { - if($fill) - $op=($border==1) ? 'B' : 'f'; - else - $op='S'; - $s=sprintf('%.2F %.2F %.2F %.2F re %s ',$this->x*$k,($this->h-$this->y)*$k,$w*$k,-$h*$k,$op); - } - if(is_string($border)) - { - $x=$this->x; - $y=$this->y; - if(strpos($border,'L')!==false) - $s.=sprintf('%.2F %.2F m %.2F %.2F l S ',$x*$k,($this->h-$y)*$k,$x*$k,($this->h-($y+$h))*$k); - if(strpos($border,'T')!==false) - $s.=sprintf('%.2F %.2F m %.2F %.2F l S ',$x*$k,($this->h-$y)*$k,($x+$w)*$k,($this->h-$y)*$k); - if(strpos($border,'R')!==false) - $s.=sprintf('%.2F %.2F m %.2F %.2F l S ',($x+$w)*$k,($this->h-$y)*$k,($x+$w)*$k,($this->h-($y+$h))*$k); - if(strpos($border,'B')!==false) - $s.=sprintf('%.2F %.2F m %.2F %.2F l S ',$x*$k,($this->h-($y+$h))*$k,($x+$w)*$k,($this->h-($y+$h))*$k); - } - if($txt!=='') - { - if($align=='R') - $dx=$w-$this->cMargin-$this->GetStringWidth($txt); - elseif($align=='C') - $dx=($w-$this->GetStringWidth($txt))/2; - else - $dx=$this->cMargin; - if($this->ColorFlag) - $s.='q '.$this->TextColor.' '; - $txt2=str_replace(')','\\)',str_replace('(','\\(',str_replace('\\','\\\\',$txt))); - $s.=sprintf('BT %.2F %.2F Td (%s) Tj ET',($this->x+$dx)*$k,($this->h-($this->y+.5*$h+.3*$this->FontSize))*$k,$txt2); - if($this->underline) - $s.=' '.$this->_dounderline($this->x+$dx,$this->y+.5*$h+.3*$this->FontSize,$txt); - if($this->ColorFlag) - $s.=' Q'; - if($link) - $this->Link($this->x+$dx,$this->y+.5*$h-.5*$this->FontSize,$this->GetStringWidth($txt),$this->FontSize,$link); - } - if($s) - $this->_out($s); - $this->lasth=$h; - if($ln>0) - { - //Go to next line - $this->y+=$h; - if($ln==1) - $this->x=$this->lMargin; - } - else - $this->x+=$w; - } - - function MultiCell($w, $h, $txt, $border=0, $align='J', $fill=false) - { - //Output text with automatic or explicit line breaks - $cw=&$this->CurrentFont['cw']; - if($w==0) - $w=$this->w-$this->rMargin-$this->x; - $wmax=($w-2*$this->cMargin)*1000/$this->FontSize; - $s=str_replace("\r",'',$txt); - $nb=strlen($s); - if($nb>0 && $s[$nb-1]=="\n") - $nb--; - $b=0; - if($border) - { - if($border==1) - { - $border='LTRB'; - $b='LRT'; - $b2='LR'; - } - else - { - $b2=''; - if(strpos($border,'L')!==false) - $b2.='L'; - if(strpos($border,'R')!==false) - $b2.='R'; - $b=(strpos($border,'T')!==false) ? $b2.'T' : $b2; - } - } - $sep=-1; - $i=0; - $j=0; - $l=0; - $ns=0; - $nl=1; - while($i<$nb) - { - //Get next character - $c=$s[$i]; - if($c=="\n") - { - //Explicit line break - if($this->ws>0) - { - $this->ws=0; - $this->_out('0 Tw'); - } - $this->Cell($w,$h,substr($s,$j,$i-$j),$b,2,$align,$fill); - $i++; - $sep=-1; - $j=$i; - $l=0; - $ns=0; - $nl++; - if($border && $nl==2) - $b=$b2; - continue; - } - if($c==' ') - { - $sep=$i; - $ls=$l; - $ns++; - } - $l+=$cw[$c]; - if($l>$wmax) - { - //Automatic line break - if($sep==-1) - { - if($i==$j) - $i++; - if($this->ws>0) - { - $this->ws=0; - $this->_out('0 Tw'); - } - $this->Cell($w,$h,substr($s,$j,$i-$j),$b,2,$align,$fill); - } - else - { - if($align=='J') - { - $this->ws=($ns>1) ? ($wmax-$ls)/1000*$this->FontSize/($ns-1) : 0; - $this->_out(sprintf('%.3F Tw',$this->ws*$this->k)); - } - $this->Cell($w,$h,substr($s,$j,$sep-$j),$b,2,$align,$fill); - $i=$sep+1; - } - $sep=-1; - $j=$i; - $l=0; - $ns=0; - $nl++; - if($border && $nl==2) - $b=$b2; - } - else - $i++; - } - //Last chunk - if($this->ws>0) - { - $this->ws=0; - $this->_out('0 Tw'); - } - if($border && strpos($border,'B')!==false) - $b.='B'; - $this->Cell($w,$h,substr($s,$j,$i-$j),$b,2,$align,$fill); - $this->x=$this->lMargin; - } - - function Write($h, $txt, $link='') - { - //Output text in flowing mode - $cw=&$this->CurrentFont['cw']; - $w=$this->w-$this->rMargin-$this->x; - $wmax=($w-2*$this->cMargin)*1000/$this->FontSize; - $s=str_replace("\r",'',$txt); - $nb=strlen($s); - $sep=-1; - $i=0; - $j=0; - $l=0; - $nl=1; - while($i<$nb) - { - //Get next character - $c=$s[$i]; - if($c=="\n") - { - //Explicit line break - $this->Cell($w,$h,substr($s,$j,$i-$j),0,2,'',0,$link); - $i++; - $sep=-1; - $j=$i; - $l=0; - if($nl==1) - { - $this->x=$this->lMargin; - $w=$this->w-$this->rMargin-$this->x; - $wmax=($w-2*$this->cMargin)*1000/$this->FontSize; - } - $nl++; - continue; - } - if($c==' ') - $sep=$i; - $l+=$cw[$c]; - if($l>$wmax) - { - //Automatic line break - if($sep==-1) - { - if($this->x>$this->lMargin) - { - //Move to next line - $this->x=$this->lMargin; - $this->y+=$h; - $w=$this->w-$this->rMargin-$this->x; - $wmax=($w-2*$this->cMargin)*1000/$this->FontSize; - $i++; - $nl++; - continue; - } - if($i==$j) - $i++; - $this->Cell($w,$h,substr($s,$j,$i-$j),0,2,'',0,$link); - } - else - { - $this->Cell($w,$h,substr($s,$j,$sep-$j),0,2,'',0,$link); - $i=$sep+1; - } - $sep=-1; - $j=$i; - $l=0; - if($nl==1) - { - $this->x=$this->lMargin; - $w=$this->w-$this->rMargin-$this->x; - $wmax=($w-2*$this->cMargin)*1000/$this->FontSize; - } - $nl++; - } - else - $i++; - } - //Last chunk - if($i!=$j) - $this->Cell($l/1000*$this->FontSize,$h,substr($s,$j),0,0,'',0,$link); - } - - function Ln($h=null) - { - //Line feed; default value is last cell height - $this->x=$this->lMargin; - if($h===null) - $this->y+=$this->lasth; - else - $this->y+=$h; - } - - function Image($file, $x=null, $y=null, $w=0, $h=0, $type='', $link='') - { - //Put an image on the page - if(!isset($this->images[$file])) - { - //First use of this image, get info - if($type=='') - { - $pos=strrpos($file,'.'); - if(!$pos) - $this->Error('Image file has no extension and no type was specified: '.$file); - $type=substr($file,$pos+1); - } - $type=strtolower($type); - if($type=='jpeg') - $type='jpg'; - $mtd='_parse'.$type; - if(!method_exists($this,$mtd)) - $this->Error('Unsupported image type: '.$type); - $info=$this->$mtd($file); - $info['i']=count($this->images)+1; - $this->images[$file]=$info; - } - else - $info=$this->images[$file]; - //Automatic width and height calculation if needed - if($w==0 && $h==0) - { - //Put image at 72 dpi - $w=$info['w']/$this->k; - $h=$info['h']/$this->k; - } - elseif($w==0) - $w=$h*$info['w']/$info['h']; - elseif($h==0) - $h=$w*$info['h']/$info['w']; - //Flowing mode - if($y===null) - { - if($this->y+$h>$this->PageBreakTrigger && !$this->InHeader && !$this->InFooter && $this->AcceptPageBreak()) - { - //Automatic page break - $x2=$this->x; - $this->AddPage($this->CurOrientation,$this->CurPageFormat); - $this->x=$x2; - } - $y=$this->y; - $this->y+=$h; - } - if($x===null) - $x=$this->x; - $this->_out(sprintf('q %.2F 0 0 %.2F %.2F %.2F cm /I%d Do Q',$w*$this->k,$h*$this->k,$x*$this->k,($this->h-($y+$h))*$this->k,$info['i'])); - if($link) - $this->Link($x,$y,$w,$h,$link); - } - - function GetX() - { - //Get x position - return $this->x; - } - - function SetX($x) - { - //Set x position - if($x>=0) - $this->x=$x; - else - $this->x=$this->w+$x; - } - - function GetY() - { - //Get y position - return $this->y; - } - - function SetY($y) - { - //Set y position and reset x - $this->x=$this->lMargin; - if($y>=0) - $this->y=$y; - else - $this->y=$this->h+$y; - } - - function SetXY($x, $y) - { - //Set x and y positions - $this->SetY($y); - $this->SetX($x); - } - - function Output($name='', $dest='') - { - //Output PDF to some destination - if($this->state<3) - $this->Close(); - $dest=strtoupper($dest); - if($dest=='') - { - if($name=='') - { - $name='doc.pdf'; - $dest='I'; - } - else - $dest='F'; - } - switch($dest) - { - case 'I': - //Send to standard output - if(ob_get_length()) - $this->Error('Some data has already been output, can\'t send PDF file'); - if(php_sapi_name()!='cli') - { - //We send to a browser - header('Content-Type: application/pdf'); - if(headers_sent()) - $this->Error('Some data has already been output, can\'t send PDF file'); - header('Content-Length: '.strlen($this->buffer)); - header('Content-Disposition: inline; filename="'.$name.'"'); - header('Cache-Control: private, max-age=0, must-revalidate'); - header('Pragma: public'); - ini_set('zlib.output_compression','0'); - } - echo $this->buffer; - break; - case 'D': - //Download file - if(ob_get_length()) - $this->Error('Some data has already been output, can\'t send PDF file'); - header('Content-Type: application/x-download'); - if(headers_sent()) - $this->Error('Some data has already been output, can\'t send PDF file'); - header('Content-Length: '.strlen($this->buffer)); - header('Content-Disposition: attachment; filename="'.$name.'"'); - header('Cache-Control: private, max-age=0, must-revalidate'); - header('Pragma: public'); - ini_set('zlib.output_compression','0'); - echo $this->buffer; - break; - case 'F': - //Save to local file - $f=fopen($name,'wb'); - if(!$f) - $this->Error('Unable to create output file: '.$name); - fwrite($f,$this->buffer,strlen($this->buffer)); - fclose($f); - break; - case 'S': - //Return as a string - return $this->buffer; - default: - $this->Error('Incorrect output destination: '.$dest); - } - return ''; - } - - /******************************************************************************* - * * - * Protected methods * - * * - *******************************************************************************/ - function _dochecks() - { - //Check availability of %F - if(sprintf('%.1F',1.0)!='1.0') - $this->Error('This version of PHP is not supported'); - //Check mbstring overloading - if(ini_get('mbstring.func_overload') & 2) - $this->Error('mbstring overloading must be disabled'); - //Disable runtime magic quotes - if(get_magic_quotes_runtime()) - @set_magic_quotes_runtime(0); - } - - function _getpageformat($format) - { - $format=strtolower($format); - if(!isset($this->PageFormats[$format])) - $this->Error('Unknown page format: '.$format); - $a=$this->PageFormats[$format]; - return array($a[0]/$this->k, $a[1]/$this->k); - } - - function _getfontpath() - { - if(!defined('FPDF_FONTPATH') && is_dir(dirname(__FILE__).'/font')) - define('FPDF_FONTPATH',dirname(__FILE__).'/font/'); - return defined('FPDF_FONTPATH') ? FPDF_FONTPATH : ''; - } - - function _beginpage($orientation, $format) - { - $this->page++; - $this->pages[$this->page]=''; - $this->state=2; - $this->x=$this->lMargin; - $this->y=$this->tMargin; - $this->FontFamily=''; - //Check page size - if($orientation=='') - $orientation=$this->DefOrientation; - else - $orientation=strtoupper($orientation[0]); - if($format=='') - $format=$this->DefPageFormat; - else - { - if(is_string($format)) - $format=$this->_getpageformat($format); - } - if($orientation!=$this->CurOrientation || $format[0]!=$this->CurPageFormat[0] || $format[1]!=$this->CurPageFormat[1]) - { - //New size - if($orientation=='P') - { - $this->w=$format[0]; - $this->h=$format[1]; - } - else - { - $this->w=$format[1]; - $this->h=$format[0]; - } - $this->wPt=$this->w*$this->k; - $this->hPt=$this->h*$this->k; - $this->PageBreakTrigger=$this->h-$this->bMargin; - $this->CurOrientation=$orientation; - $this->CurPageFormat=$format; - } - if($orientation!=$this->DefOrientation || $format[0]!=$this->DefPageFormat[0] || $format[1]!=$this->DefPageFormat[1]) - $this->PageSizes[$this->page]=array($this->wPt, $this->hPt); - } - - function _endpage() - { - $this->state=1; - } - - function _escape($s) - { - //Escape special characters in strings - $s=str_replace('\\','\\\\',$s); - $s=str_replace('(','\\(',$s); - $s=str_replace(')','\\)',$s); - $s=str_replace("\r",'\\r',$s); - return $s; - } - - function _textstring($s) - { - //Format a text string - return '('.$this->_escape($s).')'; - } - - function _UTF8toUTF16($s) - { - //Convert UTF-8 to UTF-16BE with BOM - $res="\xFE\xFF"; - $nb=strlen($s); - $i=0; - while($i<$nb) - { - $c1=ord($s[$i++]); - if($c1>=224) - { - //3-byte character - $c2=ord($s[$i++]); - $c3=ord($s[$i++]); - $res.=chr((($c1 & 0x0F)<<4) + (($c2 & 0x3C)>>2)); - $res.=chr((($c2 & 0x03)<<6) + ($c3 & 0x3F)); - } - elseif($c1>=192) - { - //2-byte character - $c2=ord($s[$i++]); - $res.=chr(($c1 & 0x1C)>>2); - $res.=chr((($c1 & 0x03)<<6) + ($c2 & 0x3F)); - } - else - { - //Single-byte character - $res.="\0".chr($c1); - } - } - return $res; - } - - function _dounderline($x, $y, $txt) - { - //Underline text - $up=$this->CurrentFont['up']; - $ut=$this->CurrentFont['ut']; - $w=$this->GetStringWidth($txt)+$this->ws*substr_count($txt,' '); - return sprintf('%.2F %.2F %.2F %.2F re f',$x*$this->k,($this->h-($y-$up/1000*$this->FontSize))*$this->k,$w*$this->k,-$ut/1000*$this->FontSizePt); - } - - function _parsejpg($file) - { - //Extract info from a JPEG file - $a=GetImageSize($file); - if(!$a) - $this->Error('Missing or incorrect image file: '.$file); - if($a[2]!=2) - $this->Error('Not a JPEG file: '.$file); - if(!isset($a['channels']) || $a['channels']==3) - $colspace='DeviceRGB'; - elseif($a['channels']==4) - $colspace='DeviceCMYK'; - else - $colspace='DeviceGray'; - $bpc=isset($a['bits']) ? $a['bits'] : 8; - //Read whole file - $f=fopen($file,'rb'); - $data=''; - while(!feof($f)) - $data.=fread($f,8192); - fclose($f); - return array('w'=>$a[0], 'h'=>$a[1], 'cs'=>$colspace, 'bpc'=>$bpc, 'f'=>'DCTDecode', 'data'=>$data); - } - - function _parsepng($file) - { - //Extract info from a PNG file - $f=fopen($file,'rb'); - if(!$f) - $this->Error('Can\'t open image file: '.$file); - //Check signature - if($this->_readstream($f,8)!=chr(137).'PNG'.chr(13).chr(10).chr(26).chr(10)) - $this->Error('Not a PNG file: '.$file); - //Read header chunk - $this->_readstream($f,4); - if($this->_readstream($f,4)!='IHDR') - $this->Error('Incorrect PNG file: '.$file); - $w=$this->_readint($f); - $h=$this->_readint($f); - $bpc=ord($this->_readstream($f,1)); - if($bpc>8) - $this->Error('16-bit depth not supported: '.$file); - $ct=ord($this->_readstream($f,1)); - if($ct==0) - $colspace='DeviceGray'; - elseif($ct==2) - $colspace='DeviceRGB'; - elseif($ct==3) - $colspace='Indexed'; - else - $this->Error('Alpha channel not supported: '.$file); - if(ord($this->_readstream($f,1))!=0) - $this->Error('Unknown compression method: '.$file); - if(ord($this->_readstream($f,1))!=0) - $this->Error('Unknown filter method: '.$file); - if(ord($this->_readstream($f,1))!=0) - $this->Error('Interlacing not supported: '.$file); - $this->_readstream($f,4); - $parms='/DecodeParms <</Predictor 15 /Colors '.($ct==2 ? 3 : 1).' /BitsPerComponent '.$bpc.' /Columns '.$w.'>>'; - //Scan chunks looking for palette, transparency and image data - $pal=''; - $trns=''; - $data=''; - do - { - $n=$this->_readint($f); - $type=$this->_readstream($f,4); - if($type=='PLTE') - { - //Read palette - $pal=$this->_readstream($f,$n); - $this->_readstream($f,4); - } - elseif($type=='tRNS') - { - //Read transparency info - $t=$this->_readstream($f,$n); - if($ct==0) - $trns=array(ord(substr($t,1,1))); - elseif($ct==2) - $trns=array(ord(substr($t,1,1)), ord(substr($t,3,1)), ord(substr($t,5,1))); - else - { - $pos=strpos($t,chr(0)); - if($pos!==false) - $trns=array($pos); - } - $this->_readstream($f,4); - } - elseif($type=='IDAT') - { - //Read image data block - $data.=$this->_readstream($f,$n); - $this->_readstream($f,4); - } - elseif($type=='IEND') - break; - else - $this->_readstream($f,$n+4); - } - while($n); - if($colspace=='Indexed' && empty($pal)) - $this->Error('Missing palette in '.$file); - fclose($f); - return array('w'=>$w, 'h'=>$h, 'cs'=>$colspace, 'bpc'=>$bpc, 'f'=>'FlateDecode', 'parms'=>$parms, 'pal'=>$pal, 'trns'=>$trns, 'data'=>$data); - } - - function _readstream($f, $n) - { - //Read n bytes from stream - $res=''; - while($n>0 && !feof($f)) - { - $s=fread($f,$n); - if($s===false) - $this->Error('Error while reading stream'); - $n-=strlen($s); - $res.=$s; - } - if($n>0) - $this->Error('Unexpected end of stream'); - return $res; - } - - function _readint($f) - { - //Read a 4-byte integer from stream - $a=unpack('Ni',$this->_readstream($f,4)); - return $a['i']; - } - - function _parsegif($file) - { - //Extract info from a GIF file (via PNG conversion) - if(!function_exists('imagepng')) - $this->Error('GD extension is required for GIF support'); - if(!function_exists('imagecreatefromgif')) - $this->Error('GD has no GIF read support'); - $im=imagecreatefromgif($file); - if(!$im) - $this->Error('Missing or incorrect image file: '.$file); - imageinterlace($im,0); - $tmp=tempnam('.','gif'); - if(!$tmp) - $this->Error('Unable to create a temporary file'); - if(!imagepng($im,$tmp)) - $this->Error('Error while saving to temporary file'); - imagedestroy($im); - $info=$this->_parsepng($tmp); - unlink($tmp); - return $info; - } - - function _newobj() - { - //Begin a new object - $this->n++; - $this->offsets[$this->n]=strlen($this->buffer); - $this->_out($this->n.' 0 obj'); - } - - function _putstream($s) - { - $this->_out('stream'); - $this->_out($s); - $this->_out('endstream'); - } - - function _out($s) - { - //Add a line to the document - if($this->state==2) - $this->pages[$this->page].=$s."\n"; - else - $this->buffer.=$s."\n"; - } - - function _putpages() - { - $nb=$this->page; - if(!empty($this->AliasNbPages)) - { - //Replace number of pages - for($n=1;$n<=$nb;$n++) - $this->pages[$n]=str_replace($this->AliasNbPages,$nb,$this->pages[$n]); - } - if($this->DefOrientation=='P') - { - $wPt=$this->DefPageFormat[0]*$this->k; - $hPt=$this->DefPageFormat[1]*$this->k; - } - else - { - $wPt=$this->DefPageFormat[1]*$this->k; - $hPt=$this->DefPageFormat[0]*$this->k; - } - $filter=($this->compress) ? '/Filter /FlateDecode ' : ''; - for($n=1;$n<=$nb;$n++) - { - //Page - $this->_newobj(); - $this->_out('<</Type /Page'); - $this->_out('/Parent 1 0 R'); - if(isset($this->PageSizes[$n])) - $this->_out(sprintf('/MediaBox [0 0 %.2F %.2F]',$this->PageSizes[$n][0],$this->PageSizes[$n][1])); - $this->_out('/Resources 2 0 R'); - if(isset($this->PageLinks[$n])) - { - //Links - $annots='/Annots ['; - foreach($this->PageLinks[$n] as $pl) - { - $rect=sprintf('%.2F %.2F %.2F %.2F',$pl[0],$pl[1],$pl[0]+$pl[2],$pl[1]-$pl[3]); - $annots.='<</Type /Annot /Subtype /Link /Rect ['.$rect.'] /Border [0 0 0] '; - if(is_string($pl[4])) - $annots.='/A <</S /URI /URI '.$this->_textstring($pl[4]).'>>>>'; - else - { - $l=$this->links[$pl[4]]; - $h=isset($this->PageSizes[$l[0]]) ? $this->PageSizes[$l[0]][1] : $hPt; - $annots.=sprintf('/Dest [%d 0 R /XYZ 0 %.2F null]>>',1+2*$l[0],$h-$l[1]*$this->k); - } - } - $this->_out($annots.']'); - } - $this->_out('/Contents '.($this->n+1).' 0 R>>'); - $this->_out('endobj'); - //Page content - $p=($this->compress) ? gzcompress($this->pages[$n]) : $this->pages[$n]; - $this->_newobj(); - $this->_out('<<'.$filter.'/Length '.strlen($p).'>>'); - $this->_putstream($p); - $this->_out('endobj'); - } - //Pages root - $this->offsets[1]=strlen($this->buffer); - $this->_out('1 0 obj'); - $this->_out('<</Type /Pages'); - $kids='/Kids ['; - for($i=0;$i<$nb;$i++) - $kids.=(3+2*$i).' 0 R '; - $this->_out($kids.']'); - $this->_out('/Count '.$nb); - $this->_out(sprintf('/MediaBox [0 0 %.2F %.2F]',$wPt,$hPt)); - $this->_out('>>'); - $this->_out('endobj'); - } - - function _putfonts() - { - $nf=$this->n; - foreach($this->diffs as $diff) - { - //Encodings - $this->_newobj(); - $this->_out('<</Type /Encoding /BaseEncoding /WinAnsiEncoding /Differences ['.$diff.']>>'); - $this->_out('endobj'); - } - foreach($this->FontFiles as $file=>$info) - { - //Font file embedding - $this->_newobj(); - $this->FontFiles[$file]['n']=$this->n; - $font=''; - $f=fopen($this->_getfontpath().$file,'rb',1); - if(!$f) - $this->Error('Font file not found'); - while(!feof($f)) - $font.=fread($f,8192); - fclose($f); - $compressed=(substr($file,-2)=='.z'); - if(!$compressed && isset($info['length2'])) - { - $header=(ord($font[0])==128); - if($header) - { - //Strip first binary header - $font=substr($font,6); - } - if($header && ord($font[$info['length1']])==128) - { - //Strip second binary header - $font=substr($font,0,$info['length1']).substr($font,$info['length1']+6); - } - } - $this->_out('<</Length '.strlen($font)); - if($compressed) - $this->_out('/Filter /FlateDecode'); - $this->_out('/Length1 '.$info['length1']); - if(isset($info['length2'])) - $this->_out('/Length2 '.$info['length2'].' /Length3 0'); - $this->_out('>>'); - $this->_putstream($font); - $this->_out('endobj'); - } - foreach($this->fonts as $k=>$font) - { - //Font objects - $this->fonts[$k]['n']=$this->n+1; - $type=$font['type']; - $name=$font['name']; - if($type=='core') - { - //Standard font - $this->_newobj(); - $this->_out('<</Type /Font'); - $this->_out('/BaseFont /'.$name); - $this->_out('/Subtype /Type1'); - if($name!='Symbol' && $name!='ZapfDingbats') - $this->_out('/Encoding /WinAnsiEncoding'); - $this->_out('>>'); - $this->_out('endobj'); - } - elseif($type=='Type1' || $type=='TrueType') - { - //Additional Type1 or TrueType font - $this->_newobj(); - $this->_out('<</Type /Font'); - $this->_out('/BaseFont /'.$name); - $this->_out('/Subtype /'.$type); - $this->_out('/FirstChar 32 /LastChar 255'); - $this->_out('/Widths '.($this->n+1).' 0 R'); - $this->_out('/FontDescriptor '.($this->n+2).' 0 R'); - if($font['enc']) - { - if(isset($font['diff'])) - $this->_out('/Encoding '.($nf+$font['diff']).' 0 R'); - else - $this->_out('/Encoding /WinAnsiEncoding'); - } - $this->_out('>>'); - $this->_out('endobj'); - //Widths - $this->_newobj(); - $cw=&$font['cw']; - $s='['; - for($i=32;$i<=255;$i++) - $s.=$cw[chr($i)].' '; - $this->_out($s.']'); - $this->_out('endobj'); - //Descriptor - $this->_newobj(); - $s='<</Type /FontDescriptor /FontName /'.$name; - foreach($font['desc'] as $k=>$v) - $s.=' /'.$k.' '.$v; - $file=$font['file']; - if($file) - $s.=' /FontFile'.($type=='Type1' ? '' : '2').' '.$this->FontFiles[$file]['n'].' 0 R'; - $this->_out($s.'>>'); - $this->_out('endobj'); - } - else - { - //Allow for additional types - $mtd='_put'.strtolower($type); - if(!method_exists($this,$mtd)) - $this->Error('Unsupported font type: '.$type); - $this->$mtd($font); - } - } - } - - function _putimages() - { - $filter=($this->compress) ? '/Filter /FlateDecode ' : ''; - reset($this->images); - //while(list($file,$info)=each($this->images)) - foreach( $this->images as $file => $info ) - { - $this->_newobj(); - $this->images[$file]['n']=$this->n; - $this->_out('<</Type /XObject'); - $this->_out('/Subtype /Image'); - $this->_out('/Width '.$info['w']); - $this->_out('/Height '.$info['h']); - if($info['cs']=='Indexed') - $this->_out('/ColorSpace [/Indexed /DeviceRGB '.(strlen($info['pal'])/3-1).' '.($this->n+1).' 0 R]'); - else - { - $this->_out('/ColorSpace /'.$info['cs']); - if($info['cs']=='DeviceCMYK') - $this->_out('/Decode [1 0 1 0 1 0 1 0]'); - } - $this->_out('/BitsPerComponent '.$info['bpc']); - if(isset($info['f'])) - $this->_out('/Filter /'.$info['f']); - if(isset($info['parms'])) - $this->_out($info['parms']); - if(isset($info['trns']) && is_array($info['trns'])) - { - $trns=''; - for($i=0;$i<count($info['trns']);$i++) - $trns.=$info['trns'][$i].' '.$info['trns'][$i].' '; - $this->_out('/Mask ['.$trns.']'); - } - $this->_out('/Length '.strlen($info['data']).'>>'); - $this->_putstream($info['data']); - unset($this->images[$file]['data']); - $this->_out('endobj'); - //Palette - if($info['cs']=='Indexed') - { - $this->_newobj(); - $pal=($this->compress) ? gzcompress($info['pal']) : $info['pal']; - $this->_out('<<'.$filter.'/Length '.strlen($pal).'>>'); - $this->_putstream($pal); - $this->_out('endobj'); - } - } - } - - function _putxobjectdict() - { - foreach($this->images as $image) - $this->_out('/I'.$image['i'].' '.$image['n'].' 0 R'); - } - - function _putresourcedict() - { - $this->_out('/ProcSet [/PDF /Text /ImageB /ImageC /ImageI]'); - $this->_out('/Font <<'); - foreach($this->fonts as $font) - $this->_out('/F'.$font['i'].' '.$font['n'].' 0 R'); - $this->_out('>>'); - $this->_out('/XObject <<'); - $this->_putxobjectdict(); - $this->_out('>>'); - } - - function _putresources() - { - $this->_putfonts(); - $this->_putimages(); - //Resource dictionary - $this->offsets[2]=strlen($this->buffer); - $this->_out('2 0 obj'); - $this->_out('<<'); - $this->_putresourcedict(); - $this->_out('>>'); - $this->_out('endobj'); - } - - function _putinfo() - { - $this->_out('/Producer '.$this->_textstring('FPDF '.FPDF_VERSION)); - if(!empty($this->title)) - $this->_out('/Title '.$this->_textstring($this->title)); - if(!empty($this->subject)) - $this->_out('/Subject '.$this->_textstring($this->subject)); - if(!empty($this->author)) - $this->_out('/Author '.$this->_textstring($this->author)); - if(!empty($this->keywords)) - $this->_out('/Keywords '.$this->_textstring($this->keywords)); - if(!empty($this->creator)) - $this->_out('/Creator '.$this->_textstring($this->creator)); - $this->_out('/CreationDate '.$this->_textstring('D:'.@date('YmdHis'))); - } - - function _putcatalog() - { - $this->_out('/Type /Catalog'); - $this->_out('/Pages 1 0 R'); - if($this->ZoomMode=='fullpage') - $this->_out('/OpenAction [3 0 R /Fit]'); - elseif($this->ZoomMode=='fullwidth') - $this->_out('/OpenAction [3 0 R /FitH null]'); - elseif($this->ZoomMode=='real') - $this->_out('/OpenAction [3 0 R /XYZ null null 1]'); - elseif(!is_string($this->ZoomMode)) - $this->_out('/OpenAction [3 0 R /XYZ null null '.($this->ZoomMode/100).']'); - if($this->LayoutMode=='single') - $this->_out('/PageLayout /SinglePage'); - elseif($this->LayoutMode=='continuous') - $this->_out('/PageLayout /OneColumn'); - elseif($this->LayoutMode=='two') - $this->_out('/PageLayout /TwoColumnLeft'); - } - - function _putheader() - { - $this->_out('%PDF-'.$this->PDFVersion); - } - - function _puttrailer() - { - $this->_out('/Size '.($this->n+1)); - $this->_out('/Root '.$this->n.' 0 R'); - $this->_out('/Info '.($this->n-1).' 0 R'); - } - - function _enddoc() - { - $this->_putheader(); - $this->_putpages(); - $this->_putresources(); - //Info - $this->_newobj(); - $this->_out('<<'); - $this->_putinfo(); - $this->_out('>>'); - $this->_out('endobj'); - //Catalog - $this->_newobj(); - $this->_out('<<'); - $this->_putcatalog(); - $this->_out('>>'); - $this->_out('endobj'); - //Cross-ref - $o=strlen($this->buffer); - $this->_out('xref'); - $this->_out('0 '.($this->n+1)); - $this->_out('0000000000 65535 f '); - for($i=1;$i<=$this->n;$i++) - $this->_out(sprintf('%010d 00000 n ',$this->offsets[$i])); - //Trailer - $this->_out('trailer'); - $this->_out('<<'); - $this->_puttrailer(); - $this->_out('>>'); - $this->_out('startxref'); - $this->_out($o); - $this->_out('%%EOF'); - $this->state=3; - } - //End of class -} - -?> diff --git a/modules/wikiparser/renderer/fpdf/Pdf.class.php b/modules/wikiparser/renderer/fpdf/Pdf.class.php @@ -0,0 +1,35 @@ +<?php + +/* + * + */ +class Pdf extends FPDF +{ + /* + * Ueberschreibt die FPDF-Methode, damit im Fehlerfall kein die() aufgerufen wird. + */ + function Error( $errorText ) + { + Logger::warn('PDF-Error:'.$errorText); + } + + /* + * Ueberschreibt die FPDF-Methode, damit im Fehlerfall kein die() aufgerufen wird. + */ + function Image( $file,$x=null,$y=null,$a=0,$b=0,$type='',$link='' ) + { + switch( $type ) + { + case 'png': + case 'jpeg': + case 'jpg': + parent::Image($file,$x,$y,$a,$b,$type,$link); + break; + default: + Logger::warn( 'Imagetype '.$type.' not available in PDF renderer'); + + } + } +} + +?> diff --git a/modules/wikiparser/renderer/fpdf/fpdf.php b/modules/wikiparser/renderer/fpdf/fpdf.php @@ -0,0 +1,1726 @@ +<?php +/******************************************************************************* + * FPDF * + * * + * Version: 1.6 * + * Date: 2008-08-03 * + * Author: Olivier PLATHEY * + *******************************************************************************/ + +define('FPDF_VERSION','1.6'); + +class FPDF +{ + var $page; //current page numberstrem + var $n; //current object number + var $offsets; //array of object offsets + var $buffer; //buffer holding in-memory PDF + var $pages; //array containing pages + var $state; //current document state + var $compress; //compression flag + var $k; //scale factor (number of points in user unit) + var $DefOrientation; //default orientation + var $CurOrientation; //current orientation + var $PageFormats; //available page formats + var $DefPageFormat; //default page format + var $CurPageFormat; //current page format + var $PageSizes; //array storing non-default page sizes + var $wPt,$hPt; //dimensions of current page in points + var $w,$h; //dimensions of current page in user unit + var $lMargin; //left margin + var $tMargin; //top margin + var $rMargin; //right margin + var $bMargin; //page break margin + var $cMargin; //cell margin + var $x,$y; //current position in user unit + var $lasth; //height of last printed cell + var $LineWidth; //line width in user unit + var $CoreFonts; //array of standard font names + var $fonts; //array of used fonts + var $FontFiles; //array of font files + var $diffs; //array of encoding differences + var $FontFamily; //current font family + var $FontStyle; //current font style + var $underline; //underlining flag + var $CurrentFont; //current font info + var $FontSizePt; //current font size in points + var $FontSize; //current font size in user unit + var $DrawColor; //commands for drawing color + var $FillColor; //commands for filling color + var $TextColor; //commands for text color + var $ColorFlag; //indicates whether fill and text colors are different + var $ws; //word spacing + var $images; //array of used images + var $PageLinks; //array of links in pages + var $links; //array of internal links + var $AutoPageBreak; //automatic page breaking + var $PageBreakTrigger; //threshold used to trigger page breaks + var $InHeader; //flag set when processing header + var $InFooter; //flag set when processing footer + var $ZoomMode; //zoom display mode + var $LayoutMode; //layout display mode + var $title; //title + var $subject; //subject + var $author; //author + var $keywords; //keywords + var $creator; //creator + var $AliasNbPages; //alias for total number of pages + var $PDFVersion; //PDF version number + + /******************************************************************************* + * * + * Public methods * + * * + *******************************************************************************/ + function __construct($orientation='P', $unit='mm', $format='A4') + { + //Some checks + $this->_dochecks(); + //Initialization of properties + $this->page=0; + $this->n=2; + $this->buffer=''; + $this->pages=array(); + $this->PageSizes=array(); + $this->state=0; + $this->fonts=array(); + $this->FontFiles=array(); + $this->diffs=array(); + $this->images=array(); + $this->links=array(); + $this->InHeader=false; + $this->InFooter=false; + $this->lasth=0; + $this->FontFamily=''; + $this->FontStyle=''; + $this->FontSizePt=12; + $this->underline=false; + $this->DrawColor='0 G'; + $this->FillColor='0 g'; + $this->TextColor='0 g'; + $this->ColorFlag=false; + $this->ws=0; + //Standard fonts + $this->CoreFonts=array('courier'=>'Courier', 'courierB'=>'Courier-Bold', 'courierI'=>'Courier-Oblique', 'courierBI'=>'Courier-BoldOblique', + 'helvetica'=>'Helvetica', 'helveticaB'=>'Helvetica-Bold', 'helveticaI'=>'Helvetica-Oblique', 'helveticaBI'=>'Helvetica-BoldOblique', + 'times'=>'Times-Roman', 'timesB'=>'Times-Bold', 'timesI'=>'Times-Italic', 'timesBI'=>'Times-BoldItalic', + 'symbol'=>'Symbol', 'zapfdingbats'=>'ZapfDingbats'); + //Scale factor + if($unit=='pt') + $this->k=1; + elseif($unit=='mm') + $this->k=72/25.4; + elseif($unit=='cm') + $this->k=72/2.54; + elseif($unit=='in') + $this->k=72; + else + $this->Error('Incorrect unit: '.$unit); + //Page format + $this->PageFormats=array('a3'=>array(841.89,1190.55), 'a4'=>array(595.28,841.89), 'a5'=>array(420.94,595.28), + 'letter'=>array(612,792), 'legal'=>array(612,1008)); + if(is_string($format)) + $format=$this->_getpageformat($format); + $this->DefPageFormat=$format; + $this->CurPageFormat=$format; + //Page orientation + $orientation=strtolower($orientation); + if($orientation=='p' || $orientation=='portrait') + { + $this->DefOrientation='P'; + $this->w=$this->DefPageFormat[0]; + $this->h=$this->DefPageFormat[1]; + } + elseif($orientation=='l' || $orientation=='landscape') + { + $this->DefOrientation='L'; + $this->w=$this->DefPageFormat[1]; + $this->h=$this->DefPageFormat[0]; + } + else + $this->Error('Incorrect orientation: '.$orientation); + $this->CurOrientation=$this->DefOrientation; + $this->wPt=$this->w*$this->k; + $this->hPt=$this->h*$this->k; + //Page margins (1 cm) + $margin=28.35/$this->k; + $this->SetMargins($margin,$margin); + //Interior cell margin (1 mm) + $this->cMargin=$margin/10; + //Line width (0.2 mm) + $this->LineWidth=.567/$this->k; + //Automatic page break + $this->SetAutoPageBreak(true,2*$margin); + //Full width display mode + $this->SetDisplayMode('fullwidth'); + //Enable compression + $this->SetCompression(true); + //Set default PDF version number + $this->PDFVersion='1.3'; + } + + function SetMargins($left, $top, $right=null) + { + //Set left, top and right margins + $this->lMargin=$left; + $this->tMargin=$top; + if($right===null) + $right=$left; + $this->rMargin=$right; + } + + function SetLeftMargin($margin) + { + //Set left margin + $this->lMargin=$margin; + if($this->page>0 && $this->x<$margin) + $this->x=$margin; + } + + function SetTopMargin($margin) + { + //Set top margin + $this->tMargin=$margin; + } + + function SetRightMargin($margin) + { + //Set right margin + $this->rMargin=$margin; + } + + function SetAutoPageBreak($auto, $margin=0) + { + //Set auto page break mode and triggering margin + $this->AutoPageBreak=$auto; + $this->bMargin=$margin; + $this->PageBreakTrigger=$this->h-$margin; + } + + function SetDisplayMode($zoom, $layout='continuous') + { + //Set display mode in viewer + if($zoom=='fullpage' || $zoom=='fullwidth' || $zoom=='real' || $zoom=='default' || !is_string($zoom)) + $this->ZoomMode=$zoom; + else + $this->Error('Incorrect zoom display mode: '.$zoom); + if($layout=='single' || $layout=='continuous' || $layout=='two' || $layout=='default') + $this->LayoutMode=$layout; + else + $this->Error('Incorrect layout display mode: '.$layout); + } + + function SetCompression($compress) + { + //Set page compression + if(function_exists('gzcompress')) + $this->compress=$compress; + else + $this->compress=false; + } + + function SetTitle($title, $isUTF8=false) + { + //Title of document + if($isUTF8) + $title=$this->_UTF8toUTF16($title); + $this->title=$title; + } + + function SetSubject($subject, $isUTF8=false) + { + //Subject of document + if($isUTF8) + $subject=$this->_UTF8toUTF16($subject); + $this->subject=$subject; + } + + function SetAuthor($author, $isUTF8=false) + { + //Author of document + if($isUTF8) + $author=$this->_UTF8toUTF16($author); + $this->author=$author; + } + + function SetKeywords($keywords, $isUTF8=false) + { + //Keywords of document + if($isUTF8) + $keywords=$this->_UTF8toUTF16($keywords); + $this->keywords=$keywords; + } + + function SetCreator($creator, $isUTF8=false) + { + //Creator of document + if($isUTF8) + $creator=$this->_UTF8toUTF16($creator); + $this->creator=$creator; + } + + function AliasNbPages($alias='{nb}') + { + //Define an alias for total number of pages + $this->AliasNbPages=$alias; + } + + function Error($msg) + { + //Fatal error + die('<b>FPDF error:</b> '.$msg); + } + + function Open() + { + //Begin document + $this->state=1; + } + + function Close() + { + //Terminate document + if($this->state==3) + return; + if($this->page==0) + $this->AddPage(); + //Page footer + $this->InFooter=true; + $this->Footer(); + $this->InFooter=false; + //Close page + $this->_endpage(); + //Close document + $this->_enddoc(); + } + + function AddPage($orientation='', $format='') + { + //Start a new page + if($this->state==0) + $this->Open(); + $family=$this->FontFamily; + $style=$this->FontStyle.($this->underline ? 'U' : ''); + $size=$this->FontSizePt; + $lw=$this->LineWidth; + $dc=$this->DrawColor; + $fc=$this->FillColor; + $tc=$this->TextColor; + $cf=$this->ColorFlag; + if($this->page>0) + { + //Page footer + $this->InFooter=true; + $this->Footer(); + $this->InFooter=false; + //Close page + $this->_endpage(); + } + //Start new page + $this->_beginpage($orientation,$format); + //Set line cap style to square + $this->_out('2 J'); + //Set line width + $this->LineWidth=$lw; + $this->_out(sprintf('%.2F w',$lw*$this->k)); + //Set font + if($family) + $this->SetFont($family,$style,$size); + //Set colors + $this->DrawColor=$dc; + if($dc!='0 G') + $this->_out($dc); + $this->FillColor=$fc; + if($fc!='0 g') + $this->_out($fc); + $this->TextColor=$tc; + $this->ColorFlag=$cf; + //Page header + $this->InHeader=true; + $this->Header(); + $this->InHeader=false; + //Restore line width + if($this->LineWidth!=$lw) + { + $this->LineWidth=$lw; + $this->_out(sprintf('%.2F w',$lw*$this->k)); + } + //Restore font + if($family) + $this->SetFont($family,$style,$size); + //Restore colors + if($this->DrawColor!=$dc) + { + $this->DrawColor=$dc; + $this->_out($dc); + } + if($this->FillColor!=$fc) + { + $this->FillColor=$fc; + $this->_out($fc); + } + $this->TextColor=$tc; + $this->ColorFlag=$cf; + } + + function Header() + { + //To be implemented in your own inherited class + } + + function Footer() + { + //To be implemented in your own inherited class + } + + function PageNo() + { + //Get current page number + return $this->page; + } + + function SetDrawColor($r, $g=null, $b=null) + { + //Set color for all stroking operations + if(($r==0 && $g==0 && $b==0) || $g===null) + $this->DrawColor=sprintf('%.3F G',$r/255); + else + $this->DrawColor=sprintf('%.3F %.3F %.3F RG',$r/255,$g/255,$b/255); + if($this->page>0) + $this->_out($this->DrawColor); + } + + function SetFillColor($r, $g=null, $b=null) + { + //Set color for all filling operations + if(($r==0 && $g==0 && $b==0) || $g===null) + $this->FillColor=sprintf('%.3F g',$r/255); + else + $this->FillColor=sprintf('%.3F %.3F %.3F rg',$r/255,$g/255,$b/255); + $this->ColorFlag=($this->FillColor!=$this->TextColor); + if($this->page>0) + $this->_out($this->FillColor); + } + + function SetTextColor($r, $g=null, $b=null) + { + //Set color for text + if(($r==0 && $g==0 && $b==0) || $g===null) + $this->TextColor=sprintf('%.3F g',$r/255); + else + $this->TextColor=sprintf('%.3F %.3F %.3F rg',$r/255,$g/255,$b/255); + $this->ColorFlag=($this->FillColor!=$this->TextColor); + } + + function GetStringWidth($s) + { + //Get width of a string in the current font + $s=(string)$s; + $cw=&$this->CurrentFont['cw']; + $w=0; + $l=strlen($s); + for($i=0;$i<$l;$i++) + $w+=$cw[$s[$i]]; + return $w*$this->FontSize/1000; + } + + function SetLineWidth($width) + { + //Set line width + $this->LineWidth=$width; + if($this->page>0) + $this->_out(sprintf('%.2F w',$width*$this->k)); + } + + function Line($x1, $y1, $x2, $y2) + { + //Draw a line + $this->_out(sprintf('%.2F %.2F m %.2F %.2F l S',$x1*$this->k,($this->h-$y1)*$this->k,$x2*$this->k,($this->h-$y2)*$this->k)); + } + + function Rect($x, $y, $w, $h, $style='') + { + //Draw a rectangle + if($style=='F') + $op='f'; + elseif($style=='FD' || $style=='DF') + $op='B'; + else + $op='S'; + $this->_out(sprintf('%.2F %.2F %.2F %.2F re %s',$x*$this->k,($this->h-$y)*$this->k,$w*$this->k,-$h*$this->k,$op)); + } + + function AddFont($family, $style='', $file='') + { + //Add a TrueType or Type1 font + $family=strtolower($family); + if($file=='') + $file=str_replace(' ','',$family).strtolower($style).'.php'; + if($family=='arial') + $family='helvetica'; + $style=strtoupper($style); + if($style=='IB') + $style='BI'; + $fontkey=$family.$style; + if(isset($this->fonts[$fontkey])) + return; + include($this->_getfontpath().$file); + if(!isset($name)) + $this->Error('Could not include font definition file'); + $i=count($this->fonts)+1; + $this->fonts[$fontkey]=array('i'=>$i, 'type'=>$type, 'name'=>$name, 'desc'=>$desc, 'up'=>$up, 'ut'=>$ut, 'cw'=>$cw, 'enc'=>$enc, 'file'=>$file); + if($diff) + { + //Search existing encodings + $d=0; + $nb=count($this->diffs); + for($i=1;$i<=$nb;$i++) + { + if($this->diffs[$i]==$diff) + { + $d=$i; + break; + } + } + if($d==0) + { + $d=$nb+1; + $this->diffs[$d]=$diff; + } + $this->fonts[$fontkey]['diff']=$d; + } + if($file) + { + if($type=='TrueType') + $this->FontFiles[$file]=array('length1'=>$originalsize); + else + $this->FontFiles[$file]=array('length1'=>$size1, 'length2'=>$size2); + } + } + + function SetFont($family, $style='', $size=0) + { + //Select a font; size given in points + global $fpdf_charwidths; + + $family=strtolower($family); + if($family=='') + $family=$this->FontFamily; + if($family=='arial') + $family='helvetica'; + elseif($family=='symbol' || $family=='zapfdingbats') + $style=''; + $style=strtoupper($style); + if(strpos($style,'U')!==false) + { + $this->underline=true; + $style=str_replace('U','',$style); + } + else + $this->underline=false; + if($style=='IB') + $style='BI'; + if($size==0) + $size=$this->FontSizePt; + //Test if font is already selected + if($this->FontFamily==$family && $this->FontStyle==$style && $this->FontSizePt==$size) + return; + //Test if used for the first time + $fontkey=$family.$style; + if(!isset($this->fonts[$fontkey])) + { + //Check if one of the standard fonts + if(isset($this->CoreFonts[$fontkey])) + { + if(!isset($fpdf_charwidths[$fontkey])) + { + //Load metric file + $file=$family; + if($family=='times' || $family=='helvetica') + $file.=strtolower($style); + include($this->_getfontpath().$file.'.php'); + if(!isset($fpdf_charwidths[$fontkey])) + $this->Error('Could not include font metric file'); + } + $i=count($this->fonts)+1; + $name=$this->CoreFonts[$fontkey]; + $cw=$fpdf_charwidths[$fontkey]; + $this->fonts[$fontkey]=array('i'=>$i, 'type'=>'core', 'name'=>$name, 'up'=>-100, 'ut'=>50, 'cw'=>$cw); + } + else + $this->Error('Undefined font: '.$family.' '.$style); + } + //Select it + $this->FontFamily=$family; + $this->FontStyle=$style; + $this->FontSizePt=$size; + $this->FontSize=$size/$this->k; + $this->CurrentFont=&$this->fonts[$fontkey]; + if($this->page>0) + $this->_out(sprintf('BT /F%d %.2F Tf ET',$this->CurrentFont['i'],$this->FontSizePt)); + } + + function SetFontSize($size) + { + //Set font size in points + if($this->FontSizePt==$size) + return; + $this->FontSizePt=$size; + $this->FontSize=$size/$this->k; + if($this->page>0) + $this->_out(sprintf('BT /F%d %.2F Tf ET',$this->CurrentFont['i'],$this->FontSizePt)); + } + + function AddLink() + { + //Create a new internal link + $n=count($this->links)+1; + $this->links[$n]=array(0, 0); + return $n; + } + + function SetLink($link, $y=0, $page=-1) + { + //Set destination of internal link + if($y==-1) + $y=$this->y; + if($page==-1) + $page=$this->page; + $this->links[$link]=array($page, $y); + } + + function Link($x, $y, $w, $h, $link) + { + //Put a link on the page + $this->PageLinks[$this->page][]=array($x*$this->k, $this->hPt-$y*$this->k, $w*$this->k, $h*$this->k, $link); + } + + function Text($x, $y, $txt) + { + //Output a string + $s=sprintf('BT %.2F %.2F Td (%s) Tj ET',$x*$this->k,($this->h-$y)*$this->k,$this->_escape($txt)); + if($this->underline && $txt!='') + $s.=' '.$this->_dounderline($x,$y,$txt); + if($this->ColorFlag) + $s='q '.$this->TextColor.' '.$s.' Q'; + $this->_out($s); + } + + function AcceptPageBreak() + { + //Accept automatic page break or not + return $this->AutoPageBreak; + } + + function Cell($w, $h=0, $txt='', $border=0, $ln=0, $align='', $fill=false, $link='') + { + //Output a cell + $k=$this->k; + if($this->y+$h>$this->PageBreakTrigger && !$this->InHeader && !$this->InFooter && $this->AcceptPageBreak()) + { + //Automatic page break + $x=$this->x; + $ws=$this->ws; + if($ws>0) + { + $this->ws=0; + $this->_out('0 Tw'); + } + $this->AddPage($this->CurOrientation,$this->CurPageFormat); + $this->x=$x; + if($ws>0) + { + $this->ws=$ws; + $this->_out(sprintf('%.3F Tw',$ws*$k)); + } + } + if($w==0) + $w=$this->w-$this->rMargin-$this->x; + $s=''; + if($fill || $border==1) + { + if($fill) + $op=($border==1) ? 'B' : 'f'; + else + $op='S'; + $s=sprintf('%.2F %.2F %.2F %.2F re %s ',$this->x*$k,($this->h-$this->y)*$k,$w*$k,-$h*$k,$op); + } + if(is_string($border)) + { + $x=$this->x; + $y=$this->y; + if(strpos($border,'L')!==false) + $s.=sprintf('%.2F %.2F m %.2F %.2F l S ',$x*$k,($this->h-$y)*$k,$x*$k,($this->h-($y+$h))*$k); + if(strpos($border,'T')!==false) + $s.=sprintf('%.2F %.2F m %.2F %.2F l S ',$x*$k,($this->h-$y)*$k,($x+$w)*$k,($this->h-$y)*$k); + if(strpos($border,'R')!==false) + $s.=sprintf('%.2F %.2F m %.2F %.2F l S ',($x+$w)*$k,($this->h-$y)*$k,($x+$w)*$k,($this->h-($y+$h))*$k); + if(strpos($border,'B')!==false) + $s.=sprintf('%.2F %.2F m %.2F %.2F l S ',$x*$k,($this->h-($y+$h))*$k,($x+$w)*$k,($this->h-($y+$h))*$k); + } + if($txt!=='') + { + if($align=='R') + $dx=$w-$this->cMargin-$this->GetStringWidth($txt); + elseif($align=='C') + $dx=($w-$this->GetStringWidth($txt))/2; + else + $dx=$this->cMargin; + if($this->ColorFlag) + $s.='q '.$this->TextColor.' '; + $txt2=str_replace(')','\\)',str_replace('(','\\(',str_replace('\\','\\\\',$txt))); + $s.=sprintf('BT %.2F %.2F Td (%s) Tj ET',($this->x+$dx)*$k,($this->h-($this->y+.5*$h+.3*$this->FontSize))*$k,$txt2); + if($this->underline) + $s.=' '.$this->_dounderline($this->x+$dx,$this->y+.5*$h+.3*$this->FontSize,$txt); + if($this->ColorFlag) + $s.=' Q'; + if($link) + $this->Link($this->x+$dx,$this->y+.5*$h-.5*$this->FontSize,$this->GetStringWidth($txt),$this->FontSize,$link); + } + if($s) + $this->_out($s); + $this->lasth=$h; + if($ln>0) + { + //Go to next line + $this->y+=$h; + if($ln==1) + $this->x=$this->lMargin; + } + else + $this->x+=$w; + } + + function MultiCell($w, $h, $txt, $border=0, $align='J', $fill=false) + { + //Output text with automatic or explicit line breaks + $cw=&$this->CurrentFont['cw']; + if($w==0) + $w=$this->w-$this->rMargin-$this->x; + $wmax=($w-2*$this->cMargin)*1000/$this->FontSize; + $s=str_replace("\r",'',$txt); + $nb=strlen($s); + if($nb>0 && $s[$nb-1]=="\n") + $nb--; + $b=0; + if($border) + { + if($border==1) + { + $border='LTRB'; + $b='LRT'; + $b2='LR'; + } + else + { + $b2=''; + if(strpos($border,'L')!==false) + $b2.='L'; + if(strpos($border,'R')!==false) + $b2.='R'; + $b=(strpos($border,'T')!==false) ? $b2.'T' : $b2; + } + } + $sep=-1; + $i=0; + $j=0; + $l=0; + $ns=0; + $nl=1; + while($i<$nb) + { + //Get next character + $c=$s[$i]; + if($c=="\n") + { + //Explicit line break + if($this->ws>0) + { + $this->ws=0; + $this->_out('0 Tw'); + } + $this->Cell($w,$h,substr($s,$j,$i-$j),$b,2,$align,$fill); + $i++; + $sep=-1; + $j=$i; + $l=0; + $ns=0; + $nl++; + if($border && $nl==2) + $b=$b2; + continue; + } + if($c==' ') + { + $sep=$i; + $ls=$l; + $ns++; + } + $l+=$cw[$c]; + if($l>$wmax) + { + //Automatic line break + if($sep==-1) + { + if($i==$j) + $i++; + if($this->ws>0) + { + $this->ws=0; + $this->_out('0 Tw'); + } + $this->Cell($w,$h,substr($s,$j,$i-$j),$b,2,$align,$fill); + } + else + { + if($align=='J') + { + $this->ws=($ns>1) ? ($wmax-$ls)/1000*$this->FontSize/($ns-1) : 0; + $this->_out(sprintf('%.3F Tw',$this->ws*$this->k)); + } + $this->Cell($w,$h,substr($s,$j,$sep-$j),$b,2,$align,$fill); + $i=$sep+1; + } + $sep=-1; + $j=$i; + $l=0; + $ns=0; + $nl++; + if($border && $nl==2) + $b=$b2; + } + else + $i++; + } + //Last chunk + if($this->ws>0) + { + $this->ws=0; + $this->_out('0 Tw'); + } + if($border && strpos($border,'B')!==false) + $b.='B'; + $this->Cell($w,$h,substr($s,$j,$i-$j),$b,2,$align,$fill); + $this->x=$this->lMargin; + } + + function Write($h, $txt, $link='') + { + //Output text in flowing mode + $cw=&$this->CurrentFont['cw']; + $w=$this->w-$this->rMargin-$this->x; + $wmax=($w-2*$this->cMargin)*1000/$this->FontSize; + $s=str_replace("\r",'',$txt); + $nb=strlen($s); + $sep=-1; + $i=0; + $j=0; + $l=0; + $nl=1; + while($i<$nb) + { + //Get next character + $c=$s[$i]; + if($c=="\n") + { + //Explicit line break + $this->Cell($w,$h,substr($s,$j,$i-$j),0,2,'',0,$link); + $i++; + $sep=-1; + $j=$i; + $l=0; + if($nl==1) + { + $this->x=$this->lMargin; + $w=$this->w-$this->rMargin-$this->x; + $wmax=($w-2*$this->cMargin)*1000/$this->FontSize; + } + $nl++; + continue; + } + if($c==' ') + $sep=$i; + $l+=$cw[$c]; + if($l>$wmax) + { + //Automatic line break + if($sep==-1) + { + if($this->x>$this->lMargin) + { + //Move to next line + $this->x=$this->lMargin; + $this->y+=$h; + $w=$this->w-$this->rMargin-$this->x; + $wmax=($w-2*$this->cMargin)*1000/$this->FontSize; + $i++; + $nl++; + continue; + } + if($i==$j) + $i++; + $this->Cell($w,$h,substr($s,$j,$i-$j),0,2,'',0,$link); + } + else + { + $this->Cell($w,$h,substr($s,$j,$sep-$j),0,2,'',0,$link); + $i=$sep+1; + } + $sep=-1; + $j=$i; + $l=0; + if($nl==1) + { + $this->x=$this->lMargin; + $w=$this->w-$this->rMargin-$this->x; + $wmax=($w-2*$this->cMargin)*1000/$this->FontSize; + } + $nl++; + } + else + $i++; + } + //Last chunk + if($i!=$j) + $this->Cell($l/1000*$this->FontSize,$h,substr($s,$j),0,0,'',0,$link); + } + + function Ln($h=null) + { + //Line feed; default value is last cell height + $this->x=$this->lMargin; + if($h===null) + $this->y+=$this->lasth; + else + $this->y+=$h; + } + + function Image($file, $x=null, $y=null, $w=0, $h=0, $type='', $link='') + { + //Put an image on the page + if(!isset($this->images[$file])) + { + //First use of this image, get info + if($type=='') + { + $pos=strrpos($file,'.'); + if(!$pos) + $this->Error('Image file has no extension and no type was specified: '.$file); + $type=substr($file,$pos+1); + } + $type=strtolower($type); + if($type=='jpeg') + $type='jpg'; + $mtd='_parse'.$type; + if(!method_exists($this,$mtd)) + $this->Error('Unsupported image type: '.$type); + $info=$this->$mtd($file); + $info['i']=count($this->images)+1; + $this->images[$file]=$info; + } + else + $info=$this->images[$file]; + //Automatic width and height calculation if needed + if($w==0 && $h==0) + { + //Put image at 72 dpi + $w=$info['w']/$this->k; + $h=$info['h']/$this->k; + } + elseif($w==0) + $w=$h*$info['w']/$info['h']; + elseif($h==0) + $h=$w*$info['h']/$info['w']; + //Flowing mode + if($y===null) + { + if($this->y+$h>$this->PageBreakTrigger && !$this->InHeader && !$this->InFooter && $this->AcceptPageBreak()) + { + //Automatic page break + $x2=$this->x; + $this->AddPage($this->CurOrientation,$this->CurPageFormat); + $this->x=$x2; + } + $y=$this->y; + $this->y+=$h; + } + if($x===null) + $x=$this->x; + $this->_out(sprintf('q %.2F 0 0 %.2F %.2F %.2F cm /I%d Do Q',$w*$this->k,$h*$this->k,$x*$this->k,($this->h-($y+$h))*$this->k,$info['i'])); + if($link) + $this->Link($x,$y,$w,$h,$link); + } + + function GetX() + { + //Get x position + return $this->x; + } + + function SetX($x) + { + //Set x position + if($x>=0) + $this->x=$x; + else + $this->x=$this->w+$x; + } + + function GetY() + { + //Get y position + return $this->y; + } + + function SetY($y) + { + //Set y position and reset x + $this->x=$this->lMargin; + if($y>=0) + $this->y=$y; + else + $this->y=$this->h+$y; + } + + function SetXY($x, $y) + { + //Set x and y positions + $this->SetY($y); + $this->SetX($x); + } + + function Output($name='', $dest='') + { + //Output PDF to some destination + if($this->state<3) + $this->Close(); + $dest=strtoupper($dest); + if($dest=='') + { + if($name=='') + { + $name='doc.pdf'; + $dest='I'; + } + else + $dest='F'; + } + switch($dest) + { + case 'I': + //Send to standard output + if(ob_get_length()) + $this->Error('Some data has already been output, can\'t send PDF file'); + if(php_sapi_name()!='cli') + { + //We send to a browser + header('Content-Type: application/pdf'); + if(headers_sent()) + $this->Error('Some data has already been output, can\'t send PDF file'); + header('Content-Length: '.strlen($this->buffer)); + header('Content-Disposition: inline; filename="'.$name.'"'); + header('Cache-Control: private, max-age=0, must-revalidate'); + header('Pragma: public'); + ini_set('zlib.output_compression','0'); + } + echo $this->buffer; + break; + case 'D': + //Download file + if(ob_get_length()) + $this->Error('Some data has already been output, can\'t send PDF file'); + header('Content-Type: application/x-download'); + if(headers_sent()) + $this->Error('Some data has already been output, can\'t send PDF file'); + header('Content-Length: '.strlen($this->buffer)); + header('Content-Disposition: attachment; filename="'.$name.'"'); + header('Cache-Control: private, max-age=0, must-revalidate'); + header('Pragma: public'); + ini_set('zlib.output_compression','0'); + echo $this->buffer; + break; + case 'F': + //Save to local file + $f=fopen($name,'wb'); + if(!$f) + $this->Error('Unable to create output file: '.$name); + fwrite($f,$this->buffer,strlen($this->buffer)); + fclose($f); + break; + case 'S': + //Return as a string + return $this->buffer; + default: + $this->Error('Incorrect output destination: '.$dest); + } + return ''; + } + + /******************************************************************************* + * * + * Protected methods * + * * + *******************************************************************************/ + function _dochecks() + { + //Check availability of %F + if(sprintf('%.1F',1.0)!='1.0') + $this->Error('This version of PHP is not supported'); + //Check mbstring overloading + if(ini_get('mbstring.func_overload') & 2) + $this->Error('mbstring overloading must be disabled'); + //Disable runtime magic quotes + if(get_magic_quotes_runtime()) + @set_magic_quotes_runtime(0); + } + + function _getpageformat($format) + { + $format=strtolower($format); + if(!isset($this->PageFormats[$format])) + $this->Error('Unknown page format: '.$format); + $a=$this->PageFormats[$format]; + return array($a[0]/$this->k, $a[1]/$this->k); + } + + function _getfontpath() + { + if(!defined('FPDF_FONTPATH') && is_dir(dirname(__FILE__).'/font')) + define('FPDF_FONTPATH',dirname(__FILE__).'/font/'); + return defined('FPDF_FONTPATH') ? FPDF_FONTPATH : ''; + } + + function _beginpage($orientation, $format) + { + $this->page++; + $this->pages[$this->page]=''; + $this->state=2; + $this->x=$this->lMargin; + $this->y=$this->tMargin; + $this->FontFamily=''; + //Check page size + if($orientation=='') + $orientation=$this->DefOrientation; + else + $orientation=strtoupper($orientation[0]); + if($format=='') + $format=$this->DefPageFormat; + else + { + if(is_string($format)) + $format=$this->_getpageformat($format); + } + if($orientation!=$this->CurOrientation || $format[0]!=$this->CurPageFormat[0] || $format[1]!=$this->CurPageFormat[1]) + { + //New size + if($orientation=='P') + { + $this->w=$format[0]; + $this->h=$format[1]; + } + else + { + $this->w=$format[1]; + $this->h=$format[0]; + } + $this->wPt=$this->w*$this->k; + $this->hPt=$this->h*$this->k; + $this->PageBreakTrigger=$this->h-$this->bMargin; + $this->CurOrientation=$orientation; + $this->CurPageFormat=$format; + } + if($orientation!=$this->DefOrientation || $format[0]!=$this->DefPageFormat[0] || $format[1]!=$this->DefPageFormat[1]) + $this->PageSizes[$this->page]=array($this->wPt, $this->hPt); + } + + function _endpage() + { + $this->state=1; + } + + function _escape($s) + { + //Escape special characters in strings + $s=str_replace('\\','\\\\',$s); + $s=str_replace('(','\\(',$s); + $s=str_replace(')','\\)',$s); + $s=str_replace("\r",'\\r',$s); + return $s; + } + + function _textstring($s) + { + //Format a text string + return '('.$this->_escape($s).')'; + } + + function _UTF8toUTF16($s) + { + //Convert UTF-8 to UTF-16BE with BOM + $res="\xFE\xFF"; + $nb=strlen($s); + $i=0; + while($i<$nb) + { + $c1=ord($s[$i++]); + if($c1>=224) + { + //3-byte character + $c2=ord($s[$i++]); + $c3=ord($s[$i++]); + $res.=chr((($c1 & 0x0F)<<4) + (($c2 & 0x3C)>>2)); + $res.=chr((($c2 & 0x03)<<6) + ($c3 & 0x3F)); + } + elseif($c1>=192) + { + //2-byte character + $c2=ord($s[$i++]); + $res.=chr(($c1 & 0x1C)>>2); + $res.=chr((($c1 & 0x03)<<6) + ($c2 & 0x3F)); + } + else + { + //Single-byte character + $res.="\0".chr($c1); + } + } + return $res; + } + + function _dounderline($x, $y, $txt) + { + //Underline text + $up=$this->CurrentFont['up']; + $ut=$this->CurrentFont['ut']; + $w=$this->GetStringWidth($txt)+$this->ws*substr_count($txt,' '); + return sprintf('%.2F %.2F %.2F %.2F re f',$x*$this->k,($this->h-($y-$up/1000*$this->FontSize))*$this->k,$w*$this->k,-$ut/1000*$this->FontSizePt); + } + + function _parsejpg($file) + { + //Extract info from a JPEG file + $a=GetImageSize($file); + if(!$a) + $this->Error('Missing or incorrect image file: '.$file); + if($a[2]!=2) + $this->Error('Not a JPEG file: '.$file); + if(!isset($a['channels']) || $a['channels']==3) + $colspace='DeviceRGB'; + elseif($a['channels']==4) + $colspace='DeviceCMYK'; + else + $colspace='DeviceGray'; + $bpc=isset($a['bits']) ? $a['bits'] : 8; + //Read whole file + $f=fopen($file,'rb'); + $data=''; + while(!feof($f)) + $data.=fread($f,8192); + fclose($f); + return array('w'=>$a[0], 'h'=>$a[1], 'cs'=>$colspace, 'bpc'=>$bpc, 'f'=>'DCTDecode', 'data'=>$data); + } + + function _parsepng($file) + { + //Extract info from a PNG file + $f=fopen($file,'rb'); + if(!$f) + $this->Error('Can\'t open image file: '.$file); + //Check signature + if($this->_readstream($f,8)!=chr(137).'PNG'.chr(13).chr(10).chr(26).chr(10)) + $this->Error('Not a PNG file: '.$file); + //Read header chunk + $this->_readstream($f,4); + if($this->_readstream($f,4)!='IHDR') + $this->Error('Incorrect PNG file: '.$file); + $w=$this->_readint($f); + $h=$this->_readint($f); + $bpc=ord($this->_readstream($f,1)); + if($bpc>8) + $this->Error('16-bit depth not supported: '.$file); + $ct=ord($this->_readstream($f,1)); + if($ct==0) + $colspace='DeviceGray'; + elseif($ct==2) + $colspace='DeviceRGB'; + elseif($ct==3) + $colspace='Indexed'; + else + $this->Error('Alpha channel not supported: '.$file); + if(ord($this->_readstream($f,1))!=0) + $this->Error('Unknown compression method: '.$file); + if(ord($this->_readstream($f,1))!=0) + $this->Error('Unknown filter method: '.$file); + if(ord($this->_readstream($f,1))!=0) + $this->Error('Interlacing not supported: '.$file); + $this->_readstream($f,4); + $parms='/DecodeParms <</Predictor 15 /Colors '.($ct==2 ? 3 : 1).' /BitsPerComponent '.$bpc.' /Columns '.$w.'>>'; + //Scan chunks looking for palette, transparency and image data + $pal=''; + $trns=''; + $data=''; + do + { + $n=$this->_readint($f); + $type=$this->_readstream($f,4); + if($type=='PLTE') + { + //Read palette + $pal=$this->_readstream($f,$n); + $this->_readstream($f,4); + } + elseif($type=='tRNS') + { + //Read transparency info + $t=$this->_readstream($f,$n); + if($ct==0) + $trns=array(ord(substr($t,1,1))); + elseif($ct==2) + $trns=array(ord(substr($t,1,1)), ord(substr($t,3,1)), ord(substr($t,5,1))); + else + { + $pos=strpos($t,chr(0)); + if($pos!==false) + $trns=array($pos); + } + $this->_readstream($f,4); + } + elseif($type=='IDAT') + { + //Read image data block + $data.=$this->_readstream($f,$n); + $this->_readstream($f,4); + } + elseif($type=='IEND') + break; + else + $this->_readstream($f,$n+4); + } + while($n); + if($colspace=='Indexed' && empty($pal)) + $this->Error('Missing palette in '.$file); + fclose($f); + return array('w'=>$w, 'h'=>$h, 'cs'=>$colspace, 'bpc'=>$bpc, 'f'=>'FlateDecode', 'parms'=>$parms, 'pal'=>$pal, 'trns'=>$trns, 'data'=>$data); + } + + function _readstream($f, $n) + { + //Read n bytes from stream + $res=''; + while($n>0 && !feof($f)) + { + $s=fread($f,$n); + if($s===false) + $this->Error('Error while reading stream'); + $n-=strlen($s); + $res.=$s; + } + if($n>0) + $this->Error('Unexpected end of stream'); + return $res; + } + + function _readint($f) + { + //Read a 4-byte integer from stream + $a=unpack('Ni',$this->_readstream($f,4)); + return $a['i']; + } + + function _parsegif($file) + { + //Extract info from a GIF file (via PNG conversion) + if(!function_exists('imagepng')) + $this->Error('GD extension is required for GIF support'); + if(!function_exists('imagecreatefromgif')) + $this->Error('GD has no GIF read support'); + $im=imagecreatefromgif($file); + if(!$im) + $this->Error('Missing or incorrect image file: '.$file); + imageinterlace($im,0); + $tmp=tempnam('.','gif'); + if(!$tmp) + $this->Error('Unable to create a temporary file'); + if(!imagepng($im,$tmp)) + $this->Error('Error while saving to temporary file'); + imagedestroy($im); + $info=$this->_parsepng($tmp); + unlink($tmp); + return $info; + } + + function _newobj() + { + //Begin a new object + $this->n++; + $this->offsets[$this->n]=strlen($this->buffer); + $this->_out($this->n.' 0 obj'); + } + + function _putstream($s) + { + $this->_out('stream'); + $this->_out($s); + $this->_out('endstream'); + } + + function _out($s) + { + //Add a line to the document + if($this->state==2) + $this->pages[$this->page].=$s."\n"; + else + $this->buffer.=$s."\n"; + } + + function _putpages() + { + $nb=$this->page; + if(!empty($this->AliasNbPages)) + { + //Replace number of pages + for($n=1;$n<=$nb;$n++) + $this->pages[$n]=str_replace($this->AliasNbPages,$nb,$this->pages[$n]); + } + if($this->DefOrientation=='P') + { + $wPt=$this->DefPageFormat[0]*$this->k; + $hPt=$this->DefPageFormat[1]*$this->k; + } + else + { + $wPt=$this->DefPageFormat[1]*$this->k; + $hPt=$this->DefPageFormat[0]*$this->k; + } + $filter=($this->compress) ? '/Filter /FlateDecode ' : ''; + for($n=1;$n<=$nb;$n++) + { + //Page + $this->_newobj(); + $this->_out('<</Type /Page'); + $this->_out('/Parent 1 0 R'); + if(isset($this->PageSizes[$n])) + $this->_out(sprintf('/MediaBox [0 0 %.2F %.2F]',$this->PageSizes[$n][0],$this->PageSizes[$n][1])); + $this->_out('/Resources 2 0 R'); + if(isset($this->PageLinks[$n])) + { + //Links + $annots='/Annots ['; + foreach($this->PageLinks[$n] as $pl) + { + $rect=sprintf('%.2F %.2F %.2F %.2F',$pl[0],$pl[1],$pl[0]+$pl[2],$pl[1]-$pl[3]); + $annots.='<</Type /Annot /Subtype /Link /Rect ['.$rect.'] /Border [0 0 0] '; + if(is_string($pl[4])) + $annots.='/A <</S /URI /URI '.$this->_textstring($pl[4]).'>>>>'; + else + { + $l=$this->links[$pl[4]]; + $h=isset($this->PageSizes[$l[0]]) ? $this->PageSizes[$l[0]][1] : $hPt; + $annots.=sprintf('/Dest [%d 0 R /XYZ 0 %.2F null]>>',1+2*$l[0],$h-$l[1]*$this->k); + } + } + $this->_out($annots.']'); + } + $this->_out('/Contents '.($this->n+1).' 0 R>>'); + $this->_out('endobj'); + //Page content + $p=($this->compress) ? gzcompress($this->pages[$n]) : $this->pages[$n]; + $this->_newobj(); + $this->_out('<<'.$filter.'/Length '.strlen($p).'>>'); + $this->_putstream($p); + $this->_out('endobj'); + } + //Pages root + $this->offsets[1]=strlen($this->buffer); + $this->_out('1 0 obj'); + $this->_out('<</Type /Pages'); + $kids='/Kids ['; + for($i=0;$i<$nb;$i++) + $kids.=(3+2*$i).' 0 R '; + $this->_out($kids.']'); + $this->_out('/Count '.$nb); + $this->_out(sprintf('/MediaBox [0 0 %.2F %.2F]',$wPt,$hPt)); + $this->_out('>>'); + $this->_out('endobj'); + } + + function _putfonts() + { + $nf=$this->n; + foreach($this->diffs as $diff) + { + //Encodings + $this->_newobj(); + $this->_out('<</Type /Encoding /BaseEncoding /WinAnsiEncoding /Differences ['.$diff.']>>'); + $this->_out('endobj'); + } + foreach($this->FontFiles as $file=>$info) + { + //Font file embedding + $this->_newobj(); + $this->FontFiles[$file]['n']=$this->n; + $font=''; + $f=fopen($this->_getfontpath().$file,'rb',1); + if(!$f) + $this->Error('Font file not found'); + while(!feof($f)) + $font.=fread($f,8192); + fclose($f); + $compressed=(substr($file,-2)=='.z'); + if(!$compressed && isset($info['length2'])) + { + $header=(ord($font[0])==128); + if($header) + { + //Strip first binary header + $font=substr($font,6); + } + if($header && ord($font[$info['length1']])==128) + { + //Strip second binary header + $font=substr($font,0,$info['length1']).substr($font,$info['length1']+6); + } + } + $this->_out('<</Length '.strlen($font)); + if($compressed) + $this->_out('/Filter /FlateDecode'); + $this->_out('/Length1 '.$info['length1']); + if(isset($info['length2'])) + $this->_out('/Length2 '.$info['length2'].' /Length3 0'); + $this->_out('>>'); + $this->_putstream($font); + $this->_out('endobj'); + } + foreach($this->fonts as $k=>$font) + { + //Font objects + $this->fonts[$k]['n']=$this->n+1; + $type=$font['type']; + $name=$font['name']; + if($type=='core') + { + //Standard font + $this->_newobj(); + $this->_out('<</Type /Font'); + $this->_out('/BaseFont /'.$name); + $this->_out('/Subtype /Type1'); + if($name!='Symbol' && $name!='ZapfDingbats') + $this->_out('/Encoding /WinAnsiEncoding'); + $this->_out('>>'); + $this->_out('endobj'); + } + elseif($type=='Type1' || $type=='TrueType') + { + //Additional Type1 or TrueType font + $this->_newobj(); + $this->_out('<</Type /Font'); + $this->_out('/BaseFont /'.$name); + $this->_out('/Subtype /'.$type); + $this->_out('/FirstChar 32 /LastChar 255'); + $this->_out('/Widths '.($this->n+1).' 0 R'); + $this->_out('/FontDescriptor '.($this->n+2).' 0 R'); + if($font['enc']) + { + if(isset($font['diff'])) + $this->_out('/Encoding '.($nf+$font['diff']).' 0 R'); + else + $this->_out('/Encoding /WinAnsiEncoding'); + } + $this->_out('>>'); + $this->_out('endobj'); + //Widths + $this->_newobj(); + $cw=&$font['cw']; + $s='['; + for($i=32;$i<=255;$i++) + $s.=$cw[chr($i)].' '; + $this->_out($s.']'); + $this->_out('endobj'); + //Descriptor + $this->_newobj(); + $s='<</Type /FontDescriptor /FontName /'.$name; + foreach($font['desc'] as $k=>$v) + $s.=' /'.$k.' '.$v; + $file=$font['file']; + if($file) + $s.=' /FontFile'.($type=='Type1' ? '' : '2').' '.$this->FontFiles[$file]['n'].' 0 R'; + $this->_out($s.'>>'); + $this->_out('endobj'); + } + else + { + //Allow for additional types + $mtd='_put'.strtolower($type); + if(!method_exists($this,$mtd)) + $this->Error('Unsupported font type: '.$type); + $this->$mtd($font); + } + } + } + + function _putimages() + { + $filter=($this->compress) ? '/Filter /FlateDecode ' : ''; + reset($this->images); + //while(list($file,$info)=each($this->images)) + foreach( $this->images as $file => $info ) + { + $this->_newobj(); + $this->images[$file]['n']=$this->n; + $this->_out('<</Type /XObject'); + $this->_out('/Subtype /Image'); + $this->_out('/Width '.$info['w']); + $this->_out('/Height '.$info['h']); + if($info['cs']=='Indexed') + $this->_out('/ColorSpace [/Indexed /DeviceRGB '.(strlen($info['pal'])/3-1).' '.($this->n+1).' 0 R]'); + else + { + $this->_out('/ColorSpace /'.$info['cs']); + if($info['cs']=='DeviceCMYK') + $this->_out('/Decode [1 0 1 0 1 0 1 0]'); + } + $this->_out('/BitsPerComponent '.$info['bpc']); + if(isset($info['f'])) + $this->_out('/Filter /'.$info['f']); + if(isset($info['parms'])) + $this->_out($info['parms']); + if(isset($info['trns']) && is_array($info['trns'])) + { + $trns=''; + for($i=0;$i<count($info['trns']);$i++) + $trns.=$info['trns'][$i].' '.$info['trns'][$i].' '; + $this->_out('/Mask ['.$trns.']'); + } + $this->_out('/Length '.strlen($info['data']).'>>'); + $this->_putstream($info['data']); + unset($this->images[$file]['data']); + $this->_out('endobj'); + //Palette + if($info['cs']=='Indexed') + { + $this->_newobj(); + $pal=($this->compress) ? gzcompress($info['pal']) : $info['pal']; + $this->_out('<<'.$filter.'/Length '.strlen($pal).'>>'); + $this->_putstream($pal); + $this->_out('endobj'); + } + } + } + + function _putxobjectdict() + { + foreach($this->images as $image) + $this->_out('/I'.$image['i'].' '.$image['n'].' 0 R'); + } + + function _putresourcedict() + { + $this->_out('/ProcSet [/PDF /Text /ImageB /ImageC /ImageI]'); + $this->_out('/Font <<'); + foreach($this->fonts as $font) + $this->_out('/F'.$font['i'].' '.$font['n'].' 0 R'); + $this->_out('>>'); + $this->_out('/XObject <<'); + $this->_putxobjectdict(); + $this->_out('>>'); + } + + function _putresources() + { + $this->_putfonts(); + $this->_putimages(); + //Resource dictionary + $this->offsets[2]=strlen($this->buffer); + $this->_out('2 0 obj'); + $this->_out('<<'); + $this->_putresourcedict(); + $this->_out('>>'); + $this->_out('endobj'); + } + + function _putinfo() + { + $this->_out('/Producer '.$this->_textstring('FPDF '.FPDF_VERSION)); + if(!empty($this->title)) + $this->_out('/Title '.$this->_textstring($this->title)); + if(!empty($this->subject)) + $this->_out('/Subject '.$this->_textstring($this->subject)); + if(!empty($this->author)) + $this->_out('/Author '.$this->_textstring($this->author)); + if(!empty($this->keywords)) + $this->_out('/Keywords '.$this->_textstring($this->keywords)); + if(!empty($this->creator)) + $this->_out('/Creator '.$this->_textstring($this->creator)); + $this->_out('/CreationDate '.$this->_textstring('D:'.@date('YmdHis'))); + } + + function _putcatalog() + { + $this->_out('/Type /Catalog'); + $this->_out('/Pages 1 0 R'); + if($this->ZoomMode=='fullpage') + $this->_out('/OpenAction [3 0 R /Fit]'); + elseif($this->ZoomMode=='fullwidth') + $this->_out('/OpenAction [3 0 R /FitH null]'); + elseif($this->ZoomMode=='real') + $this->_out('/OpenAction [3 0 R /XYZ null null 1]'); + elseif(!is_string($this->ZoomMode)) + $this->_out('/OpenAction [3 0 R /XYZ null null '.($this->ZoomMode/100).']'); + if($this->LayoutMode=='single') + $this->_out('/PageLayout /SinglePage'); + elseif($this->LayoutMode=='continuous') + $this->_out('/PageLayout /OneColumn'); + elseif($this->LayoutMode=='two') + $this->_out('/PageLayout /TwoColumnLeft'); + } + + function _putheader() + { + $this->_out('%PDF-'.$this->PDFVersion); + } + + function _puttrailer() + { + $this->_out('/Size '.($this->n+1)); + $this->_out('/Root '.$this->n.' 0 R'); + $this->_out('/Info '.($this->n-1).' 0 R'); + } + + function _enddoc() + { + $this->_putheader(); + $this->_putpages(); + $this->_putresources(); + //Info + $this->_newobj(); + $this->_out('<<'); + $this->_putinfo(); + $this->_out('>>'); + $this->_out('endobj'); + //Catalog + $this->_newobj(); + $this->_out('<<'); + $this->_putcatalog(); + $this->_out('>>'); + $this->_out('endobj'); + //Cross-ref + $o=strlen($this->buffer); + $this->_out('xref'); + $this->_out('0 '.($this->n+1)); + $this->_out('0000000000 65535 f '); + for($i=1;$i<=$this->n;$i++) + $this->_out(sprintf('%010d 00000 n ',$this->offsets[$i])); + //Trailer + $this->_out('trailer'); + $this->_out('<<'); + $this->_puttrailer(); + $this->_out('>>'); + $this->_out('startxref'); + $this->_out($o); + $this->_out('%%EOF'); + $this->state=3; + } + //End of class +} + +?> diff --git a/modules/wikiparser/require.php b/modules/wikiparser/require.php @@ -1,43 +1,3 @@ <?php -// Die DOM-Klassen sind nur bei der Erzeugung von Seiten notwendig. -//if ( !empty($REQ[REQ_PARAM_ACTION]) && in_array($REQ[REQ_PARAM_ACTION],array('pageelement','page','folder')) ) -{ - require_once( __DIR__.'/'.'parser/WikiParser.class.php' ); - require_once( __DIR__.'/'.'renderer/HtmlRenderer.class.php' ); - require_once( __DIR__.'/'.'renderer/XhtmlRenderer.class.php' ); - require_once( __DIR__.'/'.'renderer/HtmlDomRenderer.class.php' ); - require_once( __DIR__.'/'.'renderer/PdfRenderer.class.php' ); - require_once( __DIR__.'/'.'renderer/TextRenderer.class.php' ); - require_once( __DIR__.'/'.'renderer/DocBookRenderer.class.php' ); - require_once( __DIR__.'/'.'renderer/LatexRenderer.class.php' ); - require_once( __DIR__.'/'.'AbstractElement.class.php' ); - require_once( __DIR__.'/'.'QuoteElement.class.php' ); - require_once( __DIR__.'/'.'CodeElement.class.php' ); - require_once( __DIR__.'/'.'DocumentElement.class.php' ); - require_once( __DIR__.'/'.'EmphaticElement.class.php' ); - require_once( __DIR__.'/'.'FootnoteElement.class.php' ); - require_once( __DIR__.'/'.'HeadlineElement.class.php' ); - require_once( __DIR__.'/'.'LineBreakElement.class.php' ); - require_once( __DIR__.'/'.'LinkElement.class.php' ); - require_once( __DIR__.'/'.'ImageElement.class.php' ); - require_once( __DIR__.'/'.'MacroElement.class.php' ); - require_once( __DIR__.'/'.'TeletypeElement.class.php' ); - require_once( __DIR__.'/'.'SpeechElement.class.php' ); - require_once( __DIR__.'/'.'ListElement.class.php' ); - require_once( __DIR__.'/'.'ListEntryElement.class.php' ); - require_once( __DIR__.'/'.'NumberedListElement.class.php' ); - require_once( __DIR__.'/'.'ParagraphElement.class.php' ); - require_once( __DIR__.'/'.'RawElement.class.php' ); - require_once( __DIR__.'/'.'StrongElement.class.php' ); - require_once( __DIR__.'/'.'TableElement.class.php' ); - require_once( __DIR__.'/'.'TableLineElement.class.php' ); - require_once( __DIR__.'/'.'TableCellElement.class.php' ); - require_once( __DIR__.'/'.'TableOfContentElement.class.php' ); - require_once( __DIR__.'/'.'TextElement.class.php' ); - require_once( __DIR__.'/'.'DefinitionListElement.class.php' ); - require_once( __DIR__.'/'.'DefinitionItemElement.class.php' ); - require_once( __DIR__.'/'.'InsertedElement.class.php' ); - require_once( __DIR__.'/'.'RemovedElement.class.php' ); -} -?>- \ No newline at end of file +// nothing to do. All classes are loaded by autoloading.+ \ No newline at end of file