openrat-cms

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

commit 79607132b6c2782275669da25834cb02f665d520
parent a582f435e8b148e7536ddde78e8d20e8dda91a0b
Author: dankert <devnull@localhost>
Date:   Mon,  7 Nov 2005 23:37:21 +0100

*** empty log message ***

Diffstat:
serviceClasses/Transformer.class.php | 346++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++---
1 file changed, 333 insertions(+), 13 deletions(-)

diff --git a/serviceClasses/Transformer.class.php b/serviceClasses/Transformer.class.php @@ -16,10 +16,13 @@ class Transformer var $types = array('html','wml','text'); var $rules = array('strong','emphatic'); var $parsedText = array(); - var $renderedText = array(); + var $renderedText = ''; var $toc = array(); var $render = true; + var $doc; + var $parseRules = array( 'ListElement'=>array('char'=>'-'), + 'NumberedListElement' ); function anchorName( $text ) { @@ -53,15 +56,223 @@ class Transformer function transform() { - $this->parse(); - $this->render(); + $this->parseDocument(); + $this->renderDocument(); - $this->text = implode( "\n",$this->renderedText ); + $this->text = $this->renderedText; + +// echo "<h2>Rendered text:</h2><pre>".htmlentities($this->text)."</pre>"; + } + + + + function parseElement( $text,&$element ) + { + + } + + + + function parseMultiLine( $text ) + { + $elements = array(); + + foreach( $text as $zeile ) + { + if ( substr(ltrim($zeile),0,3)=='+++' ) + { + $headline = new HeadlineElement(1); + $headline->children = $this->parseSimple(substr(ltrim($zeile),3)); + $elements[] = $headline; + continue; + } + if ( substr(ltrim($zeile),0,2)=='++' ) + { + $headline = new HeadlineElement(2); + $headline->children = $this->parseSimple(substr(ltrim($zeile),2)); + $elements[] = $headline; + continue; + } + if ( substr(ltrim($zeile),0,1)=='+' ) + { + $headline = new HeadlineElement(3); + $headline->children = $this->parseSimple(substr(ltrim($zeile),1)); + $elements[] = $headline; + continue; + } + + $isList = false; + $isNumberedList = false; + $isCode = false; + $isTable = false; + $isQuote = false; + + if ( substr($zeile,0,1)=='-' ) + $isList = true; + elseif ( substr($zeile,0,1)=='#' ) + $isNumberedList = true; + elseif ( substr($zeile,0,1)=='>' ) + $isQuote = true; + elseif ( substr($zeile,0,1)=='|' ) + $isTable = true; + elseif ( substr($zeile,0,1)=='=' ) + $isCode = true; + + + $para = new ParagraphElement(); + $para->children = $this->parseSimple( $zeile ); + $elements[] = $para; + } + + return $elements; + } + + + + function parseSimple( $text ) + { +// echo "parseSimple($text)"; + $elements = array(); + + + // Fett + $teile = preg_split('/\*([^\*]+)\*/',$text,-1,PREG_SPLIT_DELIM_CAPTURE); +// echo "<pre>"; +// print_r($teile); +// echo "</pre>"; + if ( count($teile) > 1 ) + { + foreach( $teile as $nr=>$teil ) + { + if ( ($nr+1)%2 == 0 ) // Ungerade Indexe + { + $strong = new StrongElement(); + $strong->children = $this->parseSimple($teil); + $elements[] = $strong; + } + else + { + $t = new TextElement(); + $t->children = $this->parseSimple($teil); + $elements[] = $t; + } + } + return $elements; + } + + + + // Verknuepfungen +// $this->replaceRegexp( '\'\'([^\']+)\'\'-'.$pf.'\'\'([^\']+)\'\'', '{link:"\\2","\\1"}' ); + + // alleinstehende externe Links +// $this->replaceRegexp( '([^"])((https?|ftps?|news|gopher):\/\/([A-Za-z0-9._\/\,-]*))', '\\1{link:"\\2","\\4"}' ); +// $this->replaceRegexp( '^((https?|ftps?|news|gopher):\/\/([A-Za-z0-9._\/\,-]*))' , '{link:"\\1","\\3"}' ); + + $teile = preg_split('/\"([^\""]+)\"-\>\"([^\""]+)\"/',$text,-1,PREG_SPLIT_DELIM_CAPTURE); +// echo "<pre>"; +// print_r($teile); +// echo "</pre>"; + if ( count($teile) > 1 ) + { + foreach( $teile as $nr=>$teil ) + { + if ( ($nr+2)%3 == 0 ) // Ungerade Indexe + { + $link = new LinkElement(); + $link->target = $teile[$nr+1]; + $link->children = $this->parseSimple($teile[$nr]); + + $elements[] = $link; + } + elseif ( ($nr+1)%3 == 0 ) + { + } + else + { + $t = new TextElement(); + $t->children = $this->parseSimple($teil); + $elements[] = $t; + } + } + return $elements; + } + + + $t = new TextElement(); + $t->text = $text; + + return array( $t ); + + + //Text->... umsetzen nach "Text"->... (Anfuehrungszeichen ergaenzen) + $this->replaceRegexp( '([A-Za-z0-9._????????-]+)-'.$pf, '\'\'\\1\'\'-'.$pf ); + + // ...->Link umsetzen nach ...->"Link" (Anfuehrungszeichen ergaenzen) + $this->replaceRegexp( '-'.$pf.'([A-Za-z0-9.:_\/\,\?\=\&-]+)', '-'.$pf.'\'\'\\1\'\'' ); + + # Links ...->"nnn" ersetzen mit ...->"object:nnn" + $this->replaceRegexp( '-'.$pf.'\'\'([0-9]+)\'\'', '-'.$pf.'\'\'object\\1\'\'' ); + + $this->replaceRegexp( '-'.$pf.'\'\'([A-Za-z0-9._-]+@[A-Za-z0-9._-]+)\'\'', '-'.$pf.'\'\'mailto:\\1\'\'' ); + + # Links "mit->..." + $this->replaceRegexp( '\'\'([^\']+)\'\'-'.$pf.'\'\'([^\']+)\'\'', '{link:"\\2","\\1"}' ); + + // alleinstehende externe Links + $this->replaceRegexp( '([^"])((https?|ftps?|news|gopher):\/\/([A-Za-z0-9._\/\,-]*))', '\\1{link:"\\2","\\4"}' ); + $this->replaceRegexp( '^((https?|ftps?|news|gopher):\/\/([A-Za-z0-9._\/\,-]*))' , '{link:"\\1","\\3"}' ); + + # mailto:...-Links + $this->replaceRegexp( '([^[A-Za-z0-9._:-])([A-Za-z0-9._-]+@[A-Za-z0-9._-]+)', '\\1{link:"mailto:\\2","\\2"}' ); + $this->replaceRegexp( '^([A-Za-z0-9._-]+@[A-Za-z0-9._-]+)' , '{link:"mailto:\\1","\\1"}' ); + + // Einbinden von Bildern + $this->replaceRegexp( '(ima?ge?):\/?\/?(([0-9]+))(\{.*\})?', '{image:"object\\2"}' ); + $this->replaceRegexp( '\{([0-9]+),?\}' , '{image:"object\\1"}' ); + $this->replaceRegexp( '\{([0-9]+),([^\}]+)\}' , '{image:"object\\1","\\2"}' ); + + + $this->replaceRegexp( '\*([^\*]+[^\\])\*', '{strong-open}\\1{strong-close}' ); + $this->replaceRegexp( '_([^_]+[^\\])_' , '{emphatic-open}\\1{emphatic-close}' ); + +// $this->replaceRegexp( '_([^_]+[^\\])_' , '{emphatic-open}\\1{emphatic-close}' ); +// $this->replaceRegexp( '_([^_]+[^\\])_' , '{emphatic-open}\\1{emphatic-close}' ); + + // "Wortliche Rede" + if ( !$this->html ) + $this->replaceRegexp( '\'\'([^\']+[^\\])\'\'', '{speech-open}\\1{speech-close}' ); + + // =feste Breite= + $this->replaceRegexp( '=([^=]+[^\\])=', '{teletype-open}\\1{teletype-close}' ); + + $this->zeile = ereg_replace( '([^\\\\])\\\\','\\1', $this->zeile ); + + } + + + + function parseDocument() + { + $zeilen = explode("\n",$this->text); + $this->doc = new DocumentElement(); + $this->doc->parse($zeilen); + +// $this->doc->children = $this->parseMultiLine( $zeilen ); + +// echo "<h2>Dokument:</h2>"; +// echo "<pre>"; +// print_r($this->doc); +// echo "</pre>"; + + return; } - function parse() + + + function parseOld() { $tocid = 0; @@ -79,6 +290,7 @@ class Transformer // Links $pf = '>'; + // 2-zeilige Ueberschriften in 1-zeilige uebersetzen $this->text = preg_replace( '/([^\n]*)\r\n[\=]{3,}/','+ \\1',$this->text ); $this->text = preg_replace( '/([^\n]*)\r\n[\-]{3,}/','++ \\1',$this->text ); $this->text = preg_replace( '/([^\n]*)\r\n[\.]{3,}/','+++ \\1',$this->text ); @@ -156,7 +368,7 @@ class Transformer } - // ?berschriften + // Ueberschriften if ( preg_match('/^([+]{1,}) ?(.*)/',$this->zeile,$match) && !$nowiki && !$pre && !$quote ) { if ( $p ) @@ -171,7 +383,7 @@ class Transformer $this->zeile = '{heading:"'.$hlev.'","'.$this->anchorName($match[2]).'","'.$match[2].'"}'; } - // Bei pr?formatierem Text keine weiteren Formatierungen durchf?hren + // Bei praeformatierem Text keine weiteren Formatierungen durchfuehren if ( !$pre ) { // Tabellen @@ -214,7 +426,7 @@ class Transformer } } - // Aufz?hlungen + // Aufzaehlungen, Listen if ( preg_match('/^( *)([\*#-]) (.*)/',$this->zeile,$match) && !$nowiki ) { if ( $p ) @@ -256,9 +468,12 @@ class Transformer } else { + // Aufzaehlung/Liste ist vorbei. while( $level > 0 ) { - if ( $lis[$level]=='#') + $this->parsedText[] = '{entry-close}'; + + if ( $lis[$level]=='#' ) $this->parsedText[] = '{numbered-list-close}'; else $this->parsedText[] = '{list-close}'; @@ -267,7 +482,7 @@ class Transformer } } - // Abs?tze einrichten + // Absaetze einrichten if (!$pre && !$ol && !$ul && !$table && substr($this->zeile,0,1)!='{' ) { if ( $this->zeile != '' && $p ) @@ -354,9 +569,115 @@ class Transformer + function renderHtmlElement( $tag,$value,$attr=array() ) + { + if ( $tag == '' ) + return $value; + + $val = '<'.$tag; + foreach( $attr as $attrName=>$attrInhalt ) + { + $val .= ' '.$attrName.'="'.$attrInhalt.'"'; + } + + if ( $value == '' ) + { + // Inhalt ist leer, also Kurzform verwenden. + $val .= ' />'; + return $val; + } + + $val .= '>'.$value.'</'.$tag.'>'; + return $val; + } + - function render() + function renderElement( $child ) + { + //echo "renderElement(".get_class($child).")/".$this->type."<br/>"; + //echo "<pre>"; + //print_r($child); + //echo "</pre>"; + switch( $this->type ) + { + case 'html': + + $attr = array(); + $val = ''; + switch( strtolower(get_class($child)) ) + { + case 'textelement': + $tag = ''; + $val = $child->text; + break; + + case 'paragraphelement': + $tag = 'p'; + break; + + case 'linkelement': + $tag = 'a'; + $attr['href'] = $child->target; + break; + + case 'strongelement': + $tag = 'strong'; + break; + + case 'headlineelement': + $tag = 'h'.$child->level; + break; + + default: + + $tag = 'unknown-element'; + $attr['class'] = strtolower(get_class($child)); + break; + } + + foreach( $child->children as $c ) + { + $val .= $this->renderElement( $c ); + } +// echo "text:$val"; + return $this->renderHtmlElement($tag,$val,$attr); + + default: + } + + } + + function renderDocument() + { + if ( ! is_object($this->page->template) ) + $this->page->template = new Template( $this->page->templateid ); + + $this->page->template->load(); + $type = $this->page->template->extension; + +// print_r($this->page->template); + $text = $this->doc->render( $type ); + + // Links object:nnn ersetzen + foreach( $this->doc->linkedObjectIds as $objectId ) + { + $targetPath = $this->page->path_to_object( $objectId ); + $text = str_replace( 'object:' .$objectId, $targetPath, $text ); + $text = str_replace( 'object://'.$objectId, $targetPath, $text ); + } + + $this->renderedText = $text; + +// echo "Hier isses:".$this->renderedText; + +// foreach( $this->doc->children as $child ) +// $this->renderedText .= $this->renderElement( $child ); + } + + + + function renderOld() { foreach( $this->parsedText as $zeile ) { @@ -444,6 +765,7 @@ class Transformer break; case 'text': + default: $this->replaceRegexp( '\{image:([^}]+)\}' ,'' ); $this->replace( '{strong-open}' ,'' ); @@ -476,8 +798,6 @@ class Transformer $this->replace( '{line-break}' ,"\n" ); $this->replaceRegexp( '\{[^}]+)\}','' ); break; - - default: } // Links object:nnn ersetzen