openrat-cms

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs

commit 86a679f2c8f7a6a73e103329a71c65b1c7ba69b1
parent 9d933b3c8d64655bf6f11eec50c4f582922109d9
Author: dankert <devnull@localhost>
Date:   Sat, 30 May 2009 01:49:37 +0200

Makro-Element in Wiki-Text

Diffstat:
config/editor.ini.php | 6++++--
serviceClasses/Transformer.class.php | 7++++---
textClasses/DocumentElement.class.php | 2++
textClasses/include.inc.php | 1+
textClasses/parser/WikiParser.class.php | 41+++++++++++++++++++++++++++++++++++------
textClasses/renderer/DocBookRenderer.class.php | 3+++
textClasses/renderer/HtmlDomRenderer.class.php | 6++++++
textClasses/renderer/HtmlRenderer.class.php | 53+++++++++++++++++++++++++++++++++++++++++++++++++++++
textClasses/renderer/LatexRenderer.class.php | 3+++
textClasses/renderer/PdfRenderer.class.php | 5++++-
textClasses/renderer/XhtmlRenderer.class.php | 70++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--------
11 files changed, 177 insertions(+), 20 deletions(-)

diff --git a/config/editor.ini.php b/config/editor.ini.php @@ -78,8 +78,10 @@ quote-line-begin = ">" quote-line-end = ">" ; Makro -makro-begin = "$$" -makro-end = "$$" +macro-begin = "<<" +macro-end = ">>" +macro-attribute-quote = "'" +macro-attribute-value-seperator = "=" [html] diff --git a/serviceClasses/Transformer.class.php b/serviceClasses/Transformer.class.php @@ -27,7 +27,7 @@ class Transformer /** * Parsen eines Textes.<br> - * Der Text muss in der Eigenschaft 'text' bereits zur Verfügung stehen.<br> + * Der Text muss in der Eigenschaft 'text' bereits zur Verf�gung stehen.<br> * Der Text wird geparst und als DOM (Document object model) intern gespeichert. */ @@ -41,13 +41,14 @@ class Transformer $this->doc = new DocumentElement(); $this->doc->element = $this->element; $this->doc->parse( $zeilen ); + $this->doc->page = $this->page; } /** * Das interne Dokumente wird gerendet.<br> - * Die fertige Ausgabe steht anschliessend in der Eigenschaft "renderedText" zur Verfügung. + * Die fertige Ausgabe steht anschliessend in der Eigenschaft "renderedText" zur Verf�gung. */ function renderDocument() { @@ -62,7 +63,7 @@ class Transformer // Links object:nnn ersetzen // - // Das Dokument-Objekt hat keine Information über die aktuelle Seite, + // Das Dokument-Objekt hat keine Information �ber die aktuelle Seite, // daher werden die Links auf Objekte hier gesetzt. foreach( $linkedObjectIds as $objectId ) { diff --git a/textClasses/DocumentElement.class.php b/textClasses/DocumentElement.class.php @@ -13,6 +13,7 @@ class DocumentElement extends AbstractElement { var $linkedObjectIds = array(); + var $page; /** * Fu�noten. @@ -86,6 +87,7 @@ class DocumentElement extends AbstractElement $renderer = new $rendererClass(); $renderer->children = $this->children; + $renderer->page = $this->page; $renderer->linkedObjectIds = $this->linkedObjectIds; $renderer->encodeHtml = $this->encodeHtml; diff --git a/textClasses/include.inc.php b/textClasses/include.inc.php @@ -21,6 +21,7 @@ if ( !empty($REQ[REQ_PARAM_ACTION]) && in_array($REQ[REQ_PARAM_ACTION],array('pa require_once( OR_TEXTCLASSES_DIR."LineBreakElement.class.".PHP_EXT ); require_once( OR_TEXTCLASSES_DIR."LinkElement.class.".PHP_EXT ); require_once( OR_TEXTCLASSES_DIR."ImageElement.class.".PHP_EXT ); + require_once( OR_TEXTCLASSES_DIR."MacroElement.class.".PHP_EXT ); require_once( OR_TEXTCLASSES_DIR."TeletypeElement.class.".PHP_EXT ); require_once( OR_TEXTCLASSES_DIR."SpeechElement.class.".PHP_EXT ); require_once( OR_TEXTCLASSES_DIR."ListElement.class.".PHP_EXT ); diff --git a/textClasses/parser/WikiParser.class.php b/textClasses/parser/WikiParser.class.php @@ -2,7 +2,7 @@ /** * Dokument-Objekt.<br> - * Diese Objekt verkörpert 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> * @@ -33,7 +33,7 @@ class WikiParser $zeilen[++$nr] = new Line( rtrim($t) ); } - // $zeilen enthält eine Liste von Zeilenobjekten. + // $zeilen enth�lt eine Liste von Zeilenobjekten. // Der Index ist die Zeilennr. und beginnt bei 1. // Html::debug($zeilen,"Zeilen"); @@ -56,7 +56,7 @@ class WikiParser $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. + // n�chste und vorige Zeile in der folgenden Schleife immer gef�llt ist. $zeilen[0] = new Line(''); $zeilen[$anzahlZeilen+1] = new Line(''); @@ -84,7 +84,7 @@ class WikiParser } - // Parser deaktiviert für diese Zeile + // Parser deaktiviert f�r diese Zeile // Text nicht parsen if ( $dieseZeile->isUnparsed ) { @@ -116,7 +116,7 @@ class WikiParser } // Zitate Teil 1 - // Zitat ist in separater Zeile angekündigt + // Zitat ist in separater Zeile angek�ndigt if ( $dieseZeile->isQuote ) { $bisZeileNr = $zeileNr+1; @@ -673,6 +673,36 @@ class WikiParser return $elements; } + $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 ) + $elements[] = $davorEl; + + $macro = new MacroElement(); + $inh = explode(' ',$erg[++$idx]); + $macro->name = $inh[0]; + unset($inh[0]); + foreach( $inh as $attr ) + { + 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 ) + $elements[] = $danachEl; + + return $elements; + } + + $erg = $this->parseEscapes( $text ); if ( is_array($erg) ) { @@ -720,7 +750,6 @@ class WikiParser if ( is_array($erg) ) return $erg; - $t = new TextElement($text); $elements[] = $t; diff --git a/textClasses/renderer/DocBookRenderer.class.php b/textClasses/renderer/DocBookRenderer.class.php @@ -36,6 +36,9 @@ class DocBookRenderer switch( strtolower(get_class($child)) ) { + case 'macroelement': + break; + case 'tableofcontentelement': $tag = 'toc'; break; diff --git a/textClasses/renderer/HtmlDomRenderer.class.php b/textClasses/renderer/HtmlDomRenderer.class.php @@ -153,6 +153,12 @@ class HtmlDomRenderer $tag = 'strong'; break; + case 'macroelement': + $tag = 'macro'; + $val = ucfirst($child->name); + break; + + case 'emphaticelement': $tag = 'em'; break; diff --git a/textClasses/renderer/HtmlRenderer.class.php b/textClasses/renderer/HtmlRenderer.class.php @@ -187,6 +187,59 @@ class HtmlRenderer } 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; + case 'linebreakelement': $tag = 'br'; $empty = true; diff --git a/textClasses/renderer/LatexRenderer.class.php b/textClasses/renderer/LatexRenderer.class.php @@ -132,6 +132,9 @@ class LatexRenderer case 'definitionitemelement': break; + case 'macroelement': + break; + case 'tablecellelement': $before = ''; $after = ' & '; diff --git a/textClasses/renderer/PdfRenderer.class.php b/textClasses/renderer/PdfRenderer.class.php @@ -57,7 +57,10 @@ class PdfRenderer case 'footnoteelement': break; - + + case 'macroelement': + break; + case 'codeelement': $this->pdf->ln(10); $this->pdf->SetFont('Courier','',12); diff --git a/textClasses/renderer/XhtmlRenderer.class.php b/textClasses/renderer/XhtmlRenderer.class.php @@ -2,7 +2,7 @@ /** * Dokument-Objekt.<br> - * Diese Objekt verkörpert 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> * @@ -16,7 +16,7 @@ class XhtmlRenderer var $encodeHtml = false; /** - * Fußnoten. + * Fu�noten. * * @var Array */ @@ -130,11 +130,11 @@ class XhtmlRenderer case 'codeelement': if ( empty($child->language) ) - // Wenn keine Sprache verfügbar, dann ein einfaches PRE-Element erzeugen. + // Wenn keine Sprache verf�gbar, dann ein einfaches PRE-Element erzeugen. $tag = 'pre'; else { - // Wenn Sprache verfügbar, dann den GESHI-Parser bemühen. + // Wenn Sprache verf�gbar, dann den GESHI-Parser bem�hen. $tag = ''; $source = ''; foreach( $child->children as $c ) @@ -160,7 +160,7 @@ class XhtmlRenderer $tag = 'cite'; // Danke an: http://www.apostroph.de/tueddelchen.php - //TODO: Abhängigkeit von Spracheinstellung implementieren. + //TODO: Abh�ngigkeit von Spracheinstellung implementieren. $language = 'de'; switch( $language ) { @@ -219,7 +219,7 @@ class XhtmlRenderer $attr['src'] = $child->getUrl(); $attr['border'] = '0'; - // Breite/Höhe des Bildes bestimmen. + // Breite/H�he des Bildes bestimmen. $image = new File( $child->objectId ); $image->load(); @@ -338,6 +338,60 @@ class XhtmlRenderer $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; + } + + $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'; @@ -364,7 +418,7 @@ class XhtmlRenderer * * @param String $tag Name des Tags * @param String $value Inhalt - * @param boolean $empty abkürzen, wenn Inhalt leer ("<... />") + * @param boolean $empty abk�rzen, wenn Inhalt leer ("<... />") * @param Array $attr Attribute als Array<String,String> * @return String */ @@ -383,7 +437,7 @@ class XhtmlRenderer if ( $value == '' && $empty ) { // Inhalt ist leer, also Kurzform verwenden. - // Die Kurzform ist abhängig vom Rendermode. + // Die Kurzform ist abh�ngig vom Rendermode. // SGML=<tag> // XML=<tag /> if ( $conf['editor']['html']['rendermode'] == 'xml' )