openrat-cms

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

WikiParser.class.php (18509B)


      1 <?php
      2 
      3 namespace wikiparser\parser;
      4 use cms\base\Configuration;
      5 use wikiparser\model\CodeElement;
      6 use wikiparser\model\DefinitionItemElement;
      7 use wikiparser\model\DefinitionListElement;
      8 use Ein;
      9 use wikiparser\model\HeadlineElement;
     10 use wikiparser\model\ImageElement;
     11 use wikiparser\util\Line;
     12 use wikiparser\model\LineBreakElement;
     13 use wikiparser\model\LinkElement;
     14 use Liste;
     15 use wikiparser\model\ListElement;
     16 use wikiparser\model\ListEntryElement;
     17 use LogicException;
     18 use wikiparser\model\MacroElement;
     19 use wikiparser\model\NumberedListElement;
     20 use wikiparser\model\ParagraphElement;
     21 use wikiparser\model\QuoteElement;
     22 use util\Session;
     23 use wikiparser\model\TableCellElement;
     24 use wikiparser\model\TableElement;
     25 use wikiparser\model\TableLineElement;
     26 use wikiparser\model\TableOfContentElement;
     27 use wikiparser\model\TextElement;
     28 use zeilen;
     29 
     30 /**
     31  * Dokument-Objekt.<br>
     32  * Diese Objekt verk�rpert das Root-Objekt in einem DOM-Baum.<br>
     33  * <br>
     34  * Dieses Objekt kann Text parsen und seine Unterobjekte selbst erzeugen.<br>
     35  *
     36  * @author Jan Dankert, $Author$
     37  * @version $Revision$
     38  * @package openrat.text
     39  */
     40 class WikiParser
     41 {
     42 	var $linkedObjectIds = array();
     43 
     44 	/**
     45 	 * Ein Text wird geparst.<br>
     46 	 * <br>
     47 	 * Zerlegt den Text zeilenweise und erzeugt die Unterobjekte.<br>
     48 	 *
     49 	 * @param Ein- oder mehrzeiliger roher Text
     50 	 */
     51 	function parse($text)
     52 	{
     53 //		set_time_limit(1);
     54 		$zeilen = array();
     55 		$nr = 0;
     56 
     57 		foreach ($text as $t) {
     58 //			$t = $this->fixLinks( $t );  // Verweise vervollstaendigen.
     59 			$zeilen[++$nr] = new Line(rtrim($t));
     60 		}
     61 
     62 		// $zeilen enth�lt eine Liste von Zeilenobjekten.
     63 		// Der Index ist die Zeilennr. und beginnt bei 1.
     64 //		Html::debug($zeilen,"Zeilen");
     65 
     66 		return $this->parseMultiLineText($zeilen);
     67 	}
     68 
     69 
     70 	/**
     71 	 * Erzeugt aus einer Liste von Zeilenobjekten ein DOM in Form eines Objektbaumes.
     72 	 *
     73 	 * @param zeilen Liste von Zeilenobjekten. Array beginnt bei 1.
     74 	 * @return Liste von Textobjekten
     75 	 */
     76 	function parseMultiLineText($zeilen)
     77 	{
     78 		$children = array();           // Initiales Anlegen der Unterobjektliste.
     79 		$anzahlZeilen = count($zeilen);  // Anzahl Zeilen
     80 
     81 		// Erzwingt am Anfang und Ende eine leere Zeile, damit
     82 		// n�chste und vorige Zeile in der folgenden Schleife immer gef�llt ist.
     83 		$zeilen[0] = new Line('');
     84 		$zeilen[$anzahlZeilen + 1] = new Line('');
     85 
     86 		for ($zeileNr = 1; $zeileNr <= $anzahlZeilen; $zeileNr++) {
     87 
     88 			$letzteZeile = $zeilen[$zeileNr - 1];
     89 			$dieseZeile = $zeilen[$zeileNr];
     90 			$naechsteZeile = $zeilen[$zeileNr + 1];
     91 
     92 //			Html::debug($dieseZeile,"Zeile");
     93 
     94 			// Leerzeilen ignorieren
     95 			if ($dieseZeile->isEmpty) {
     96 				continue;
     97 			}
     98 
     99 			// Inhaltsverzeichnis
    100 			// Text nicht parsen
    101 			if ($dieseZeile->isTableOfContent) {
    102 				$children[] = new TableOfContentElement();
    103 				continue;
    104 			}
    105 
    106 
    107 			// Parser deaktiviert f�r diese Zeile
    108 			// Text nicht parsen
    109 			if ($dieseZeile->isUnparsed) {
    110 				$children[] = new TextElement($dieseZeile->value);
    111 				continue;
    112 			}
    113 
    114 
    115 			// Ueberschriften Teil 1
    116 			// Markierung in der Folgezeile mit "...", "---" oder "==="			
    117 			if ($naechsteZeile->isHeadlineUnderline) {
    118 				$headline = new HeadlineElement($naechsteZeile->level);
    119 				$headline->children = $this->parseSimple($dieseZeile->value);
    120 				$children[] = $headline;
    121 				$zeileNr++;
    122 				continue; // Naechste Zeile
    123 			}
    124 
    125 
    126 			// Ueberschriften Teil 2
    127 			// Markierung mit "+++..." am Zeilenbeginn.			
    128 			if ($dieseZeile->isHeadline) {
    129 				$headline = new HeadlineElement($dieseZeile->level);
    130 				$headline->children = $this->parseSimple($dieseZeile->value);
    131 				$children[] = $headline;
    132 				continue; // Naechste Zeile
    133 			}
    134 
    135 			// Zitate Teil 1
    136 			// Zitat ist in separater Zeile angek�ndigt			
    137 			if ($dieseZeile->isQuote) {
    138 				$bisZeileNr = $zeileNr + 1;
    139 				do {
    140 					$bisZeileNr++;
    141 				} while (!$zeilen[$bisZeileNr]->isQuote && $bisZeileNr <= $anzahlZeilen);
    142 
    143 				$quote = new QuoteElement();
    144 				$zeilenAuszug = array();
    145 				$nr = 0;
    146 				for ($zn = $zeileNr + 1; $zn < $bisZeileNr; $zn++) {
    147 					$zeilenAuszug[++$nr] = $zeilen[$zn];
    148 				}
    149 				$quote->children = $this->parseMultiLineText($zeilenAuszug);
    150 				$zeileNr = $bisZeileNr + 1;
    151 				$children[] = $quote;
    152 				continue;
    153 			}
    154 
    155 
    156 			// Zitate Teil 2
    157 			// Markierung am Zeilenanfang
    158 			if ($dieseZeile->isQuotePraefix) {
    159 				$bisZeileNr = $zeileNr;
    160 				while ($bisZeileNr <= $anzahlZeilen && $zeilen[$bisZeileNr]->isQuotePraefix)
    161 					$bisZeileNr++;
    162 				$bisZeileNr--;
    163 //				Html::debug($bisZeileNr,"Bis-Zeile-Nr.");
    164 				$quote = new QuoteElement();
    165 
    166 				$zeilenAuszug = $this->getListenAuszug($zeilen, $zeileNr, $bisZeileNr);
    167 //				Html::debug($zeilenAuszug,"Auszug");
    168 				$quote->children = $this->parseMultiLineText($zeilenAuszug);
    169 				$zeileNr = $bisZeileNr;
    170 				$children[] = $quote;
    171 				continue;
    172 			}
    173 
    174 
    175 			// Definitionsliste
    176 			// Markierung am Zeilenanfang
    177 			if ($dieseZeile->isDefinition) {
    178 				$bisZeileNr = $zeileNr;
    179 				while ($bisZeileNr <= $anzahlZeilen && $zeilen[$bisZeileNr]->isDefinition)
    180 					$bisZeileNr++;
    181 				$bisZeileNr--;
    182 
    183 				$defList = new DefinitionListElement();
    184 
    185 				$zeilenAuszug = $this->getListenAuszug($zeilen, $zeileNr, $bisZeileNr);
    186 //				Html::debug($zeilenAuszug,"Auszug");
    187 				foreach ($zeilenAuszug as $zeile) {
    188 					$sep = Configuration::subset(['editor','text-markup'])->get('definition-sep');
    189 					list($defKey, $defValue) = explode($sep, $zeile->value);
    190 
    191 					$defEntry = new DefinitionItemElement();
    192 					$defEntry->key = $defKey;
    193 					$defEntry->children = $this->parseSimple($defValue);
    194 					$defList->children[] = $defEntry;
    195 				}
    196 				$zeileNr = $bisZeileNr;
    197 				$children[] = $defList;
    198 				continue;
    199 			}
    200 
    201 
    202 			// Code
    203 			if ($dieseZeile->isCode) {
    204 				$bisZeileNr = $zeileNr + 1;
    205 				while ($bisZeileNr < $anzahlZeilen && !$zeilen[$bisZeileNr]->isCode)
    206 					$bisZeileNr++;
    207 
    208 				$code = new CodeElement();
    209 				$code->language = trim($dieseZeile->value);
    210 
    211 				for ($zn = $zeileNr + 1; $zn < $bisZeileNr; $zn++) {
    212 					$code->children[] = new TextElement($zeilen[$zn]->source);
    213 
    214 					if ($zn < $bisZeileNr - 1)
    215 						$code->children[] = new LineBreakElement();
    216 				}
    217 				$zeileNr = $bisZeileNr;
    218 				$children[] = $code;
    219 				continue;
    220 			}
    221 
    222 
    223 			// Tabellen
    224 			if ($dieseZeile->isTable) {
    225 				$bisZeileNr = $zeileNr;
    226 				while ($bisZeileNr <= $anzahlZeilen && $zeilen[$bisZeileNr]->isTable)
    227 					$bisZeileNr++;
    228 
    229 				$tabelle = new TableElement();
    230 				$zeilenAuszug = array();
    231 				for ($zn = $zeileNr; $zn <= $bisZeileNr; $zn++) {
    232 					$zeilenAuszug[$zn - $zeileNr + 1] = $zeilen[$zn];
    233 				}
    234 				$tabelle->children = $this->parseTable($zeilenAuszug);
    235 				$children[] = $tabelle;
    236 				$zeileNr = $bisZeileNr + 1;
    237 				continue;
    238 			}
    239 
    240 
    241 			// Listen
    242 			if ($dieseZeile->isList || $dieseZeile->isNumberedList) {
    243 
    244 				$bisZeileNr = $zeileNr;
    245 				while ($bisZeileNr <= $anzahlZeilen &&
    246 					($zeilen[$bisZeileNr]->isList || $zeilen[$bisZeileNr]->isNumberedList))
    247 					$bisZeileNr++;
    248 				$bisZeileNr--;
    249 
    250 				if ($dieseZeile->isList)
    251 					$liste = new ListElement();
    252 				else
    253 					$liste = new NumberedListElement();
    254 
    255 				$zeilenAuszug = array();
    256 				$nr = 0;
    257 
    258 				for ($zn = $zeileNr; $zn <= $bisZeileNr; $zn++) {
    259 					$zeilenAuszug[++$nr] = $zeilen[$zn];
    260 				}
    261 
    262 				$liste->children = $this->parseList($zeilenAuszug, 1);
    263 				$children[] = $liste;
    264 				$zeileNr = $bisZeileNr;
    265 				continue;
    266 			}
    267 
    268 
    269 			if ($dieseZeile->isNormal) {
    270 //				Html::debug($dieseZeile,"normale Zeile");
    271 				// Textabsaetze
    272 				$bisZeileNr = $zeileNr;
    273 				while ($bisZeileNr <= $anzahlZeilen &&
    274 					$zeilen[$bisZeileNr]->isNormal) {
    275 					$bisZeileNr++;
    276 				}
    277 				$bisZeileNr--;
    278 //				Html::debug($zeileNr,"Zeile");
    279 //				Html::debug($bisZeileNr,"bisZeile-P");
    280 
    281 				$para = new ParagraphElement();
    282 				for ($zn = $zeileNr; $zn <= $bisZeileNr; $zn++) {
    283 					if (!$zeilen[$zn]->isNormal)
    284 						continue;
    285 
    286 					if ($zeilen[$zn]->isUnparsed)
    287 						$para->children[] = new TextElement($zeilen[$zn]->source);
    288 
    289 					foreach ($this->parseSimple($zeilen[$zn]->value) as $e)
    290 						$para->children[] = $e;
    291 
    292 					if ($zn < $bisZeileNr)
    293 						$para->children[] = new LineBreakElement();
    294 				}
    295 
    296 				$zeileNr = $bisZeileNr;
    297 				$children[] = $para;
    298 
    299 				continue;
    300 			}
    301 
    302 			throw new LogicException('unknown line: ' . $dieseZeile);
    303 		}
    304 
    305 		return $children;
    306 	}
    307 
    308 
    309 	function getListenAuszug($liste, $von, $bis)
    310 	{
    311 		$auszug = array();
    312 		$idx = 0;
    313 
    314 		for ($j = $von; $j <= $bis; $j++) {
    315 			$auszug[++$idx] = new Line($liste[$j]->value);
    316 		}
    317 
    318 		return $auszug;
    319 	}
    320 
    321 
    322 	/**
    323 	 * Parsen einer mehrzeiligen Liste
    324 	 */
    325 	function parseList($zeilen, $tiefe)
    326 	{
    327 		$children = array();
    328 		$anzahlZeilen = count($zeilen);
    329 		$entry = null;
    330 		for ($zeileNr = 1; $zeileNr <= $anzahlZeilen; $zeileNr++) {
    331 			$dieseZeile = $zeilen[$zeileNr];
    332 
    333 			// Listen
    334 			if ($dieseZeile->indent <= $tiefe) {
    335 				if ($zeileNr > 1)
    336 					$children[] = $entry;
    337 
    338 				$entry = new ListEntryElement();
    339 				$entry->children = $this->parseSimple($dieseZeile->value);
    340 			} else {
    341 				// Weitere Schachtelung der Liste
    342 				if ($dieseZeile->isList)
    343 					$liste = new ListElement();
    344 				else
    345 					$liste = new NumberedListElement();
    346 
    347 				$bisZeileNr = $zeileNr;
    348 
    349 				while ($bisZeileNr <= $anzahlZeilen && $zeilen[$bisZeileNr]->indent != $tiefe)
    350 					$bisZeileNr++;
    351 				$bisZeileNr--;
    352 
    353 //				echo "von $zeileNr bis $bisZeileNr (insges. $anzahlZeilen)";
    354 				$zeilenAuszug = array();
    355 				$nr = 0;
    356 				for ($zn = $zeileNr; $zn <= $bisZeileNr; $zn++) {
    357 					$zeilenAuszug[++$nr] = $zeilen[$zn];
    358 				}
    359 				$liste->children = $this->parseList($zeilenAuszug, $tiefe + 1);
    360 				$entry->children[] = $liste;
    361 				$zeileNr = $bisZeileNr;
    362 			}
    363 		}
    364 		$children[] = $entry;
    365 
    366 		return $children;
    367 	}
    368 
    369 
    370 	/**
    371 	 * Parsen einer Tabelle.
    372 	 */
    373 	function parseTable($zeilen)
    374 	{
    375 		$children = array();
    376 		$anzahlZeilen = count($zeilen);
    377 		for ($zeileNr = 1; $zeileNr <= $anzahlZeilen; $zeileNr++) {
    378 			$dieseZeile = $zeilen[$zeileNr];
    379 
    380 			$zeile = new TableLineElement();
    381 
    382 			// Listen
    383 			$zellen = explode('|', $dieseZeile->source);
    384 			$colSpan = 1;
    385 
    386 			foreach ($zellen as $zellenInhalt) {
    387 				if ($zellenInhalt == '') {
    388 					$colSpan++;
    389 					continue;
    390 				}
    391 
    392 				$zelle = new TableCellElement();
    393 				$zelle->colSpan = $colSpan;
    394 				$colSpan = 1;
    395 
    396 				if (substr($zellenInhalt, 0, 1) == '!') {
    397 					$zelle->isHeading = true;
    398 					$zellenInhalt = substr($zellenInhalt, 1);
    399 				}
    400 
    401 				$zelle->children = $this->parseSimple($zellenInhalt);
    402 
    403 				$zeile->children[] = $zelle;
    404 			}
    405 
    406 			$children[] = $zeile;
    407 		}
    408 
    409 		return $children;
    410 	}
    411 
    412 
    413 	function parseLinks($text)
    414 	{
    415 		$text_markup = Configuration::subset(['editor','text-markup']);
    416 
    417 		$posM = strpos($text, '"' . $text_markup->get('linkto','->') . '"');
    418 
    419 		if ($posM === false)
    420 			return false;
    421 
    422 		$posL = strpos(substr($text, 0, $posM - 1), '"');
    423 
    424 		if ($posL === false)
    425 			return false;
    426 
    427 		$posR = strpos($text, '"', $posM + 4);
    428 
    429 		if ($posR === false)
    430 			return false;
    431 
    432 		$parts = array();
    433 		$parts[] = substr($text, 0, $posL);  // Anfang
    434 		$parts[] = substr($text, $posL + 1, $posM - $posL - 1);  // Linktext
    435 		$parts[] = substr($text, $posM + 4, $posR - $posM - 4);  // Verweisziel
    436 		$parts[] = substr($text, $posR + 1);  // Rest
    437 
    438 		return $parts;
    439 	}
    440 
    441 
    442 	/**
    443 	 * Erzeugt ein Bildobjekt
    444 	 */
    445 	function parseImages($text)
    446 	{
    447 		$posM = strpos($text, 'image:');
    448 
    449 		if ($posM === false)
    450 			return false;
    451 
    452 		$posL = strpos(substr($text, 0, $posM - 1), '"');
    453 
    454 		if ($posL === false)
    455 			return false;
    456 
    457 		$posR = strpos($text, '"', $posM + 4);
    458 
    459 		if ($posR === false)
    460 			return false;
    461 
    462 		$parts = array();
    463 		$parts[] = substr($text, 0, $posL);  // Anfang
    464 		$parts[] = substr($text, $posL + 1, $posM - $posL - 1);  // Linktext
    465 		$parts[] = substr($text, $posM + 4, $posR - $posM - 4);  // Verweisziel
    466 		$parts[] = substr($text, $posR + 1);  // Rest
    467 
    468 		return $parts;
    469 	}
    470 
    471 
    472 	/**
    473 	 * Zerlegt einen einfachen Text in ein Array.
    474 	 *
    475 	 * @param String $text Eingabe-Test
    476 	 * @param String $sepLinks Linke Begrenzung
    477 	 * @param String $sepRechts Rechte Begrenzung
    478 	 * @return Array
    479 	 */
    480 	function parseSimpleParts($text, $sepLinks, $sepRechts)
    481 	{
    482 		$posL = strpos($text, $sepLinks);
    483 
    484 		if ($posL === false)
    485 			return false;
    486 
    487 		$posR = strpos($text, $sepRechts, $posL + strlen($sepLinks));
    488 
    489 		if ($posR === false)
    490 			return false;
    491 
    492 		$parts = array();
    493 		$parts[] = substr($text, 0, $posL);
    494 		$parts[] = substr($text, $posL + strlen($sepLinks), $posR - $posL - strlen($sepLinks));
    495 		$parts[] = substr($text, $posR + strlen($sepRechts));
    496 
    497 		return $parts;
    498 	}
    499 
    500 
    501 	/**
    502 	 *
    503 	 */
    504 	function parseEscapes($text)
    505 	{
    506 		$posL = strpos($text, '\\');
    507 
    508 		if ($posL === false)
    509 			return false;
    510 
    511 		$parts = array();
    512 		$parts[] = substr($text, 0, $posL);
    513 		$parts[] = substr($text, $posL + 1, 1);
    514 		$parts[] = substr($text, $posL + 2);
    515 
    516 		return $parts;
    517 	}
    518 
    519 
    520 	/**
    521 	 * Parst einen einzeiligen Text und erzeugt daraus Elemente.
    522 	 *
    523 	 * @param String $text Zu parsender Text
    524 	 * @param String $sepL Linke Begrenzung des Elementes
    525 	 * @param String $sepR Rechte Begrenzung des Elementes
    526 	 * @param String $className Klassenname des Elementes, welches es zu erzeugen gilt.
    527 	 * @return Array
    528 	 */
    529 	function parseSimpleElement($text, $sepL, $sepR, $className)
    530 	{
    531 		$erg = $this->parseSimpleParts($text, $sepL, $sepR);
    532 		if (is_array($erg)) {
    533 			$idx = -1;
    534 			$elements = array();
    535 
    536 			$davor = $this->parseSimple($erg[++$idx]);
    537 			foreach ($davor as $davorEl)
    538 				$elements[] = $davorEl;
    539 
    540 			$className = 'wikiparser\model\\'.$className;
    541 			$newEl = new $className();
    542 			$newEl->children = $this->parseSimple($erg[++$idx]);
    543 			$elements[] = $newEl;
    544 
    545 			$danach = $this->parseSimple($erg[++$idx]);
    546 			foreach ($danach as $danachEl)
    547 				$elements[] = $danachEl;
    548 			return $elements;
    549 		}
    550 
    551 		return false;
    552 	}
    553 
    554 
    555 	/**
    556 	 * Korrigiert kurze Links.
    557 	 *
    558 	 * @param String $text
    559 	 * @return String
    560 	 */
    561 	function fixLinks($text)
    562 	{
    563 		// Text->... umsetzen nach "Text"->... (Anfuehrungszeichen ergaenzen)
    564 		$text = preg_replace('/([A-Za-z0-9._-]+)\-\>/', '"\\1"->', $text);
    565 
    566 		// ...->Link umsetzen nach ...->"Link" (Anfuehrungszeichen ergaenzen)
    567 		$text = preg_replace('/\->([A-Za-z0-9\.\:\_\/\,\?\=\&-]+)/', '->"\\1"', $text);
    568 
    569 		// alleinstehende externe Links
    570 		// Funktioniert nicht richtig, erstmal deaktiviert.
    571 //		$text = ereg_replace( '((https?|ftps?|news|gopher):\/\/([A-Za-z0-9._\/\,-]+))([^"])','"\\1"->"\\1"\\2',$text );
    572 
    573 		// alleinstehende E-Mail Adressen
    574 		$text = preg_replace('/([A-Za-z0-9._-]+@[A-Za-z0-9\.\_\-]+)([^A-Za-z0-9\.\_\-\"])/', '"\\1"->"mailto:\\1"\\2', $text);
    575 
    576 		// Bilder
    577 		$text = preg_replace('/ima?ge?:\/?\/?([A-Za-z0-9\.\:\_\/\,\?\=\&-]+)/', '{\\1}', $text);
    578 
    579 		return $text;
    580 	}
    581 
    582 
    583 	/**
    584 	 * Diese Methode parst einen einfachen, einzeiligen Text und zerlegt diesen in seine Bestandteile.
    585 	 *
    586 	 * @param String $text
    587 	 * @return Array
    588 	 */
    589 	function parseSimple($text)
    590 	{
    591 		$text_markup = Configuration::subset(['editor','text-markup']);
    592 
    593 		$text = $this->fixLinks($text);
    594 		$elements = array();
    595 
    596 		if (trim($text) == '')
    597 			return $elements;
    598 
    599 		$erg = $this->parseLinks($text);
    600 		if (is_array($erg)) {
    601 			$idx = -1;
    602 
    603 			$davor = $this->parseSimple($erg[++$idx]);
    604 			foreach ($davor as $davorEl)
    605 				$elements[] = $davorEl;
    606 
    607 			$link = new LinkElement();
    608 			$link->children = $this->parseSimple($erg[++$idx]);
    609 			$link->setTarget($erg[++$idx]);
    610 
    611 			if ($link->objectId != 0)
    612 				$this->linkedObjectIds[] = $link->objectId;
    613 			$elements[] = $link;
    614 
    615 			$danach = $this->parseSimple($erg[++$idx]);
    616 			foreach ($danach as $danachEl)
    617 				$elements[] = $danachEl;
    618 
    619 			return $elements;
    620 		}
    621 
    622 
    623 		$erg = $this->parseSimpleParts($text, $text_markup->get('image-begin'), $text_markup->get('image-end'));
    624 		if (is_array($erg)) {
    625 			$idx = -1;
    626 
    627 			$davor = $this->parseSimple($erg[++$idx]);
    628 			foreach ($davor as $davorEl)
    629 				$elements[] = $davorEl;
    630 
    631 			$image = new ImageElement();
    632 			$t = new TextElement($erg[++$idx]);
    633 			$image->setTarget(intval($t->text));
    634 			$t->text = '';
    635 			$image->children[] = $t;
    636 
    637 			if ($image->objectId != 0)
    638 				$this->linkedObjectIds[] = $image->objectId;
    639 			$elements[] = $image;
    640 
    641 			$danach = $this->parseSimple($erg[++$idx]);
    642 			foreach ($danach as $danachEl)
    643 				$elements[] = $danachEl;
    644 
    645 			return $elements;
    646 		}
    647 
    648 		$erg = $this->parseSimpleParts($text, $text_markup->get('macro-begin'), $text_markup->get('macro-end'));
    649 		if (is_array($erg)) {
    650 			$idx = -1;
    651 
    652 			$davor = $this->parseSimple($erg[++$idx]);
    653 			foreach ($davor as $davorEl)
    654 				$elements[] = $davorEl;
    655 
    656 			$macro = new MacroElement();
    657 			$inh = explode(' ', $erg[++$idx]);
    658 			$macro->name = $inh[0];
    659 			unset($inh[0]);
    660 			foreach ($inh as $attr) {
    661 				if (empty($attr)) continue;
    662 
    663 				list($attr_name, $attr_val) = explode($text_markup->get('macro-attribute-value-seperator'), $attr);
    664 				$attr_val = trim($attr_val, $text_markup->get('macro-attribute-quote'));
    665 				$macro->attributes[$attr_name] = $attr_val;
    666 			}
    667 
    668 			$elements[] = $macro;
    669 
    670 			$danach = $this->parseSimple($erg[++$idx]);
    671 			foreach ($danach as $danachEl)
    672 				$elements[] = $danachEl;
    673 
    674 			return $elements;
    675 		}
    676 
    677 
    678 		$erg = $this->parseEscapes($text);
    679 		if (is_array($erg)) {
    680 			$idx = -1;
    681 
    682 			$davor = $this->parseSimple($erg[++$idx]);
    683 			foreach ($davor as $davorEl)
    684 				$elements[] = $davorEl;
    685 
    686 			$t = new TextElement($erg[++$idx]);
    687 			$elements[] = $t;
    688 
    689 			$danach = $this->parseSimple($erg[++$idx]);
    690 			foreach ($danach as $danachEl)
    691 				$elements[] = $danachEl;
    692 
    693 			return $elements;
    694 		}
    695 
    696 		$erg = $this->parseSimpleElement($text, $text_markup->get('footnote-begin'), $text_markup->get('footnote-end'), 'FootnoteElement');
    697 		if (is_array($erg))
    698 			return $erg;
    699 
    700 		$erg = $this->parseSimpleElement($text, $text_markup->get('strong-begin'), $text_markup->get('strong-end'), 'StrongElement');
    701 		if (is_array($erg))
    702 			return $erg;
    703 
    704 		$erg = $this->parseSimpleElement($text, $text_markup->get('emphatic-begin'), $text_markup->get('emphatic-end'), 'EmphaticElement');
    705 		if (is_array($erg))
    706 			return $erg;
    707 
    708 		$erg = $this->parseSimpleElement($text, $text_markup->get('code-begin'), $text_markup->get('code-end'), 'TeletypeElement');
    709 		if (is_array($erg))
    710 			return $erg;
    711 
    712 		$erg = $this->parseSimpleElement($text, $text_markup->get('insert-begin'), $text_markup->get('insert-end'), 'InsertedElement');
    713 		if (is_array($erg))
    714 			return $erg;
    715 
    716 		$erg = $this->parseSimpleElement($text, $text_markup->get('remove-begin'), $text_markup->get('remove-end'), 'RemovedElement');
    717 		if (is_array($erg))
    718 			return $erg;
    719 
    720 		$erg = $this->parseSimpleElement($text, $text_markup->get('speech-begin'), $text_markup->get('speech-end'), 'SpeechElement');
    721 		if (is_array($erg))
    722 			return $erg;
    723 
    724 		$t = new TextElement($text);
    725 		$elements[] = $t;
    726 
    727 		return $elements;
    728 	}
    729 }
    730 
    731 ?>