commit 86a679f2c8f7a6a73e103329a71c65b1c7ba69b1
parent 9d933b3c8d64655bf6f11eec50c4f582922109d9
Author: dankert <devnull@localhost>
Date: Sat, 30 May 2009 01:49:37 +0200
Makro-Element in Wiki-Text
Diffstat:
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' )