File modules/wikiparser/parser/WikiParser.class.php

Last commit: Sun Nov 1 03:08:55 2020 +0100	Jan Dankert	Replaced the calls to "Configuration::rawConfig()" with the OO style calls; Cleanup LoginAction.
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 ?>
Download modules/wikiparser/parser/WikiParser.class.php
History Sun, 1 Nov 2020 03:08:55 +0100 Jan Dankert Replaced the calls to "Configuration::rawConfig()" with the OO style calls; Cleanup LoginAction. Sat, 26 Sep 2020 10:32:02 +0200 Jan Dankert Refactoring: No global $conf array any more. Sat, 22 Feb 2020 23:58:02 +0100 Jan Dankert Refactoring: Namespacing for module 'util'. Sat, 22 Feb 2020 22:55:37 +0100 Jan Dankert Fix: Using namespaces. Sat, 22 Feb 2020 22:45:05 +0100 Jan Dankert Refactoring: Enable Autoloading, Fix namespace structure. Wed, 12 Dec 2018 23:05:08 +0100 Jan Dankert die() grundsätzlich nicht verwenden, sondern stattdessen Exceptions werfen. Wed, 29 Aug 2018 01:33:22 +0200 Jan Dankert Aufgeräumt: Die RenderParams werden zu beginn erzeugt und werden in den Dispatcher und die Action reingereicht. Dadurch entfällt das Durchreichen von Action/Method. Sat, 16 Dec 2017 23:41:50 +0100 Jan Dankert Der Wikiparser als eigenes Modul (ehem. 'textclasses').