commit 26da3aa3f7afa1572a06474946b916a6d67e1333
parent b432465f44f8aff28beb1e77c7f205d81e848ff3
Author: dankert <devnull@localhost>
Date: Sat, 9 Dec 2006 17:54:16 +0100
ein Definitionslisteneintrag wird nur noch durch die Klasse "DefinitionItemElement" dargestellt.
Diffstat:
3 files changed, 271 insertions(+), 72 deletions(-)
diff --git a/textClasses/DefinitionItemElement.class.php b/textClasses/DefinitionItemElement.class.php
@@ -0,0 +1,13 @@
+<?php
+
+/**
+ * @author $Author$
+ * @version $Revision$
+ * @package openrat.text
+ */
+class DefinitionItemElement extends AbstractElement
+{
+ var $key = '';
+}
+
+?>+
\ No newline at end of file
diff --git a/textClasses/DocumentElement.class.php b/textClasses/DocumentElement.class.php
@@ -25,18 +25,19 @@ class DocumentElement extends AbstractElement
*/
function parse( $text )
{
-
+// set_time_limit(1);
$zeilen = array();
$nr = 0;
foreach( $text as $t )
{
// $t = $this->fixLinks( $t ); // Verweise vervollstaendigen.
- $zeilen[++$nr] = new Line( $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");
$this->children = $this->parseMultiLineText( $zeilen );
}
@@ -51,6 +52,8 @@ class DocumentElement extends AbstractElement
*/
function parseMultiLineText( $zeilen )
{
+ global $conf;
+
$children = array(); // Initiales Anlegen der Unterobjektliste.
$anzahlZeilen = count( $zeilen ); // Anzahl Zeilen
@@ -61,9 +64,12 @@ class DocumentElement extends AbstractElement
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 )
@@ -71,7 +77,6 @@ class DocumentElement extends AbstractElement
continue;
}
-
// Inhaltsverzeichnis
// Text nicht parsen
if ( $dieseZeile->isTableOfContent )
@@ -113,7 +118,7 @@ class DocumentElement extends AbstractElement
}
// Zitate Teil 1
- // Markierung am Zeilenanfang
+ // Zitat ist in separater Zeile angekündigt
if ( $dieseZeile->isQuote )
{
$bisZeileNr = $zeileNr+1;
@@ -139,31 +144,58 @@ class DocumentElement extends AbstractElement
// Zitate Teil 2
- // Zitat ist in separater Zeile angekündigt
+ // Markierung am Zeilenanfang
if ( $dieseZeile->isQuotePraefix )
{
- $bisZeileNr = $zeileNr+1;
- do
- {
+ $bisZeileNr = $zeileNr;
+ while( $bisZeileNr<=$anzahlZeilen && $zeilen[$bisZeileNr]->isQuotePraefix )
$bisZeileNr++;
- }
- while( !$zeilen[$bisZeileNr]->isQuote && !$zeilen[$bisZeileNr]->isQuotePraefix && $bisZeileNr<=$anzahlZeilen );
-
+ $bisZeileNr--;
+// Html::debug($bisZeileNr,"Bis-Zeile-Nr.");
$quote = new QuoteElement();
- $zeilenAuszug = array();
- $nr=0;
- for( $zn=$zeileNr+1;$zn<$bisZeileNr;$zn++)
- {
- $zeilenAuszug[++$nr] = $zeilen[$zn];
- }
+
+ $zeilenAuszug = $this->getListenAuszug( $zeilen,$zeileNr,$bisZeileNr);
+// Html::debug($zeilenAuszug,"Auszug");
+// die();
$quote->children = $this->parseMultiLineText($zeilenAuszug);
- $zeileNr = $bisZeileNr+1;
+ $zeileNr = $bisZeileNr;
$children[] = $quote;
continue;
}
+ // Definitionsliste
+ // Markierung am Zeilenanfang
+ if ( $dieseZeile->isDefinition )
+ {
+ $bisZeileNr = $zeileNr;
+ while( $bisZeileNr<=$anzahlZeilen && $zeilen[$bisZeileNr]->isDefinition )
+ $bisZeileNr++;
+ $bisZeileNr--;
+
+ $defList = new DefinitionListElement();
+
+ $zeilenAuszug = $this->getListenAuszug( $zeilen,$zeileNr,$bisZeileNr);
+// Html::debug($zeilenAuszug,"Auszug");
+// die();
+ 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);
+ $defList->children[] = $defEntry;
+ }
+ $zeileNr = $bisZeileNr;
+ $children[] = $defList;
+ continue;
+ }
+
+
+
// Code
if ( $dieseZeile->isCode)
{
@@ -236,41 +268,45 @@ class DocumentElement extends AbstractElement
- // Textabsaetze
- $bisZeileNr = $zeileNr+1;
- while( $bisZeileNr < $anzahlZeilen &&
- !$zeilen[$bisZeileNr ]->isTable &&
- !$zeilen[$bisZeileNr ]->isCode &&
- !$zeilen[$bisZeileNr ]->isList &&
- !$zeilen[$bisZeileNr ]->isNumberedList &&
- !$zeilen[$bisZeileNr ]->isHeadline &&
- !$zeilen[$bisZeileNr+1]->isHeadlineUnderline &&
- !$zeilen[$bisZeileNr ]->isEmpty)
- {
- $bisZeileNr++;
- }
- $bisZeileNr--;
-
- $para = new ParagraphElement();
- for( $zn=$zeileNr;$zn<=$bisZeileNr;$zn++)
+ if ( $dieseZeile->isNormal )
{
- if ( $zeilen[$zn]->isEmpty )
- continue;
-
- if ( $zeilen[$zn]->isUnparsed )
- $para->children[] = new TextElement( $zeilen[$zn]->source );
+// Html::debug($dieseZeile,"normale Zeile");
+ // Textabsaetze
+ $bisZeileNr = $zeileNr;
+ while( $bisZeileNr <= $anzahlZeilen &&
+ $zeilen[$bisZeileNr ]->isNormal )
+ {
+ $bisZeileNr++;
+ }
+ $bisZeileNr--;
+// Html::debug($zeileNr,"Zeile");
+// Html::debug($bisZeileNr,"bisZeile-P");
+// die();
+
+ $para = new ParagraphElement();
+ 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 )
+ $para->children[] = $e;
- foreach( $this->parseSimple($zeilen[$zn]->value) as $e )
- $para->children[] = $e;
+ if ( $zn < $bisZeileNr )
+ $para->children[] = new LineBreakElement();
+ }
- if ( $zn < $bisZeileNr )
- $para->children[] = new LineBreakElement();
+ $zeileNr = $bisZeileNr;
+ $children[] = $para;
+
+ continue;
}
- $zeileNr = $bisZeileNr;
- $children[] = $para;
-
- continue;
+ Html::debug($dieseZeile,"Unbekannte Zeile");
+ die( 'unknown line: '.$dieseZeile );
}
return $children;
@@ -278,6 +314,20 @@ class DocumentElement extends AbstractElement
+ function getListenAuszug( $liste, $von, $bis )
+ {
+ $auszug = array();
+ $idx = 0;
+
+ for( $j=$von;$j<=$bis;$j++)
+ {
+ $auszug[++$idx] = new Line($liste[$j]->value);
+ }
+
+ return $auszug;
+ }
+
+
/**
* Parsen einer mehrzeiligen Liste
*/
@@ -442,7 +492,6 @@ class DocumentElement extends AbstractElement
function parseSimpleParts( $text,$sepLinks,$sepRechts )
{
-
$posL = strpos($text,$sepLinks);
if ( $posL === false )
@@ -463,6 +512,26 @@ class DocumentElement extends AbstractElement
+ /**
+ *
+ */
+ function parseEscapes( $text )
+ {
+ $posL = strpos($text,'\\');
+
+ if ( $posL === false )
+ return false;
+
+ $parts = array();
+ $parts[] = substr($text,0 ,$posL );
+ $parts[] = substr($text,$posL+1,1 );
+ $parts[] = substr($text,$posL+2 );
+
+ return $parts;
+ }
+
+
+
function parseSimpleElement( $text,$sepL,$sepR,$className )
{
@@ -513,7 +582,10 @@ class DocumentElement extends AbstractElement
}
-
+
+ /**
+ * Diese Methode parst einen einfachen, einzeiligen Text und zerlegt diesen in seine Bestandteile.
+ */
function parseSimple( $text )
{
$conf = Session::getConfig();
@@ -576,6 +648,24 @@ class DocumentElement extends AbstractElement
return $elements;
}
+ $erg = $this->parseEscapes( $text );
+ if ( is_array($erg) )
+ {
+ $idx = -1;
+
+ $davor = $this->parseSimple($erg[++$idx]);
+ foreach( $davor as $davorEl )
+ $elements[] = $davorEl;
+
+ $t = new TextElement($erg[++$idx]);
+ $elements[] = $t;
+
+ $danach = $this->parseSimple($erg[++$idx]);
+ foreach( $danach as $danachEl )
+ $elements[] = $danachEl;
+
+ return $elements;
+ }
$erg = $this->parseSimpleElement( $text,$text_markup['strong-begin'],$text_markup['strong-end'],'StrongElement' );
if ( is_array($erg) )
@@ -612,6 +702,8 @@ class DocumentElement extends AbstractElement
function renderElement( $child )
{
+ global $conf;
+
switch( $this->type )
{
case 'html':
@@ -620,6 +712,7 @@ class DocumentElement extends AbstractElement
$val = '';
$praefix = '';
$suffix = '';
+ $empty = false;
if ( count($child->children) > 0 )
{
@@ -637,10 +730,28 @@ class DocumentElement extends AbstractElement
switch( strtolower(get_class($child)) )
{
+ case 'tableofcontentelement':
+ $tag = 'p';
+ foreach( $this->children as $h)
+ {
+ if ( strtolower(get_class($h))=='headlineelement' )
+ {
+ $child->children[] = new TextElement(str_repeat(' ',$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 'textelement':
$tag = '';
// $tag = 'span';
- $val = $child->text;
+ $val = $this->replaceHtmlChars( $child->text );
+
break;
case 'codeelement':
@@ -656,26 +767,50 @@ class DocumentElement extends AbstractElement
$tag = 'p';
break;
- case 'paragraphelement':
- $tag = 'p';
- break;
-
case 'speechelement':
$tag = 'cite';
- $praefix = '„';
- $suffix = '“';
+
+ // Danke an: http://www.apostroph.de/tueddelchen.php
+ //TODO: Abhängigkeit von Spracheinstellung implementieren.
+ $language = 'de';
+ switch( $language )
+ {
+ case 'de': // deutsche Notation
+ $praefix = '„';
+ $suffix = '“';
+ break;
+ case 'fr':
+ $praefix = '«';
+ $suffix = '»';
+ break;
+ default: // englische Notation
+ $praefix = '“';
+ $suffix = '”';
+ }
+
+ 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';
+ $tag = 'br';
+ $empty = true;
break;
case 'linkelement':
$tag = 'a';
- $attr['href'] = htmlspecialchars($child->getUrl());
+ if ( !empty($child->name) )
+ $attr['name'] = $child->name;
+ else
+ $attr['href'] = htmlspecialchars($child->getUrl());
+
break;
case 'imageelement':
+ $empty = true;
$attr['alt'] = '';
if ( empty($attr['title']) )
@@ -722,6 +857,11 @@ class DocumentElement extends AbstractElement
case 'headlineelement':
$tag = 'h'.$child->level;
+
+ $l = new LinkElement();
+ $l->name = $child->getName();
+ $child->children[] = $l;
+
break;
case 'tableelement':
@@ -733,15 +873,31 @@ class DocumentElement extends AbstractElement
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 'definitionlistitemelement':
- $tag = 'dt';
- break;
-
- case 'definitionlistentryelement':
- $tag = 'dd';
+ case 'definitionitemelement':
+ if ( !empty($child->key) )
+ {
+ $tag = 'dt';
+ $val = $child->key;
+ }
+ else
+ {
+ $tag = 'dd';
+ }
break;
case 'tablecellelement':
@@ -785,7 +941,7 @@ class DocumentElement extends AbstractElement
$val .= $suffix;
// echo "text:$val";
- return $this->renderHtmlElement($tag,$val,$attr);
+ return $this->renderHtmlElement($tag,$val,$empty,$attr);
case 'text':
$className = strtolower(get_class($child));
@@ -808,6 +964,24 @@ class DocumentElement extends AbstractElement
}
+
+ /**
+ *
+ */
+ function replaceHtmlChars( $text )
+ {
+ global $conf;
+
+ foreach( explode(' ',$conf['editor']['html']['replace']) as $repl )
+ {
+ list( $ersetze, $mit ) = explode(':',$repl);
+ $text = str_replace($ersetze, $mit, $text);
+ }
+
+ return $text;
+ }
+
+
function render( $type='txt' )
{
@@ -834,8 +1008,9 @@ class DocumentElement extends AbstractElement
- function renderHtmlElement( $tag,$value,$attr=array() )
+ function renderHtmlElement( $tag,$value,$empty,$attr=array() )
{
+ global $conf;
if ( $tag == '' )
return $value;
@@ -845,11 +1020,22 @@ class DocumentElement extends AbstractElement
$val .= ' '.$attrName.'="'.$attrInhalt.'"';
}
- if ( $value == '' )
+ if ( $value == '' && $empty )
{
// Inhalt ist leer, also Kurzform verwenden.
- $val .= ' />';
- return $val;
+ // Die Kurzform ist abhängig vom Rendermode.
+ // SGML=<tag>
+ // XML=<tag />
+ if ( $conf['editor']['html']['rendermode'] == 'xml' )
+ {
+ $val .= ' />';
+ return $val;
+ }
+ else
+ {
+ $val .= '>';
+ return $val;
+ }
}
$val .= '>'.$value.'</'.$tag.'>';
diff --git a/textClasses/include.inc.php b/textClasses/include.inc.php
@@ -22,8 +22,7 @@ require_once( OR_TEXTCLASSES_DIR."TableCellElement.class.".PHP_EXT );
require_once( OR_TEXTCLASSES_DIR."TableOfContentElement.class.".PHP_EXT );
require_once( OR_TEXTCLASSES_DIR."TextElement.class.".PHP_EXT );
require_once( OR_TEXTCLASSES_DIR."DefinitionListElement.class.".PHP_EXT );
-require_once( OR_TEXTCLASSES_DIR."DefinitionListItemElement.class.".PHP_EXT );
-require_once( OR_TEXTCLASSES_DIR."DefinitionListEntryElement.class.".PHP_EXT );
+require_once( OR_TEXTCLASSES_DIR."DefinitionItemElement.class.".PHP_EXT );
require_once( OR_TEXTCLASSES_DIR."InsertedElement.class.".PHP_EXT );
require_once( OR_TEXTCLASSES_DIR."RemovedElement.class.".PHP_EXT );