File modules/util/Transformer.class.php

Last commit: Sun Mar 14 01:33:16 2021 +0100	Jan Dankert	Fix: Transformer should not throw an exception if any linktarget could not be found. Fix: SearchIndex must use the correct pageContext.
1 <?php 2 3 namespace util; 4 5 use cms\model\BaseObject; 6 use cms\model\Page; 7 use cms\model\Url as MUrl; 8 use \util\exception\ObjectNotFoundException; 9 use wikiparser\model\DocumentElement; 10 use wikiparser\parser\WikiParser; 11 12 /** 13 * Transformieren eines Textes.<br> 14 * Ein Text wird geparst und neu gerendert. 15 * 16 * @author $Author$ 17 * @version $Revision$ 18 * @package openrat.services 19 */ 20 class Transformer 21 { 22 var $text = ''; 23 var $doc; 24 var $page; 25 var $element; 26 /** 27 * @var \cms\generator\PageContext 28 */ 29 public $pageContext; 30 31 function transform() 32 { 33 $this->parseDocument(); 34 $this->renderDocument(); 35 36 $this->text = $this->renderedText; 37 } 38 39 40 /** 41 * Parsen eines Textes.<br> 42 * Der Text muss in der Eigenschaft 'text' bereits zur Verf�gung stehen.<br> 43 * Der Text wird geparst und als DOM (Document object model) intern gespeichert. 44 */ 45 46 function parseDocument() 47 { 48 // Den Text zeilenweise aufteilen. 49 $zeilen = explode("\n", $this->text); 50 51 // Dokument erzeugen und den Text parsen. 52 $parser = new WikiParser(); 53 $this->doc = new DocumentElement(); 54 $this->doc->element = $this->element; 55 $this->doc->parse($zeilen); 56 $this->doc->page = $this->page; 57 $this->doc->pageContext = $this->pageContext; 58 } 59 60 61 /** 62 * Das interne Dokumente wird gerendet.<br> 63 * Die fertige Ausgabe steht anschliessend in der Eigenschaft "renderedText" zur Verf�gung. 64 */ 65 function renderDocument() 66 { 67 $this->doc->encodeHtml = !$this->element->html; 68 69 $text = $this->doc->render($this->page->mimeType()); 70 71 // Liste der verlinkten Objekt-Ids. 72 // Die Objekt-Ids werden absteigend sortiert, damit z.B. '33' vor '3' ersetzt wird. 73 $linkedObjectIds = $this->doc->linkedObjectIds; 74 rsort($linkedObjectIds, SORT_NUMERIC); 75 76 // Links object:nnn ersetzen 77 // 78 // Das Dokument-Objekt hat keine Information ueber die aktuelle Seite, 79 // daher werden die Links auf Objekte hier gesetzt. 80 foreach ($linkedObjectIds as $objectId) { 81 $linkFormat = $this->pageContext->getLinkScheme(); 82 $target = new BaseObject($objectId); 83 try { 84 $target->load(); 85 $sourcePage = new Page( $this->pageContext->sourceObjectId ); 86 $targetPath = $linkFormat->linkToObject( $sourcePage, $target ); 87 88 // Hack: Sonderzeichen muessen in URLs maskiert werden, aber nur bei URLs die aus Link-Objekten kommen, bei allem 89 // anderen (insbesondere Preview-Links zu andereen Seiten) darf die Umsetzung nicht erfolgen. 90 // Der Renderer kann dies nicht tun, denn der erzeugt nur "object://..."-URLs. 91 // Beispiel: "...?a=1&b=2" wird zu "...?a=1&amp;b=2" 92 if ($target->isUrl) { 93 $l = new MUrl($objectId); 94 $l->load(); 95 if ($this->page->mimeType() == 'text/html') 96 $targetPath = htmlspecialchars($targetPath); 97 } 98 } catch (ObjectNotFoundException $e) { 99 $targetPath = ''; 100 } 101 102 $text = str_replace('object:' . $objectId, $targetPath, $text); 103 $text = str_replace('object://' . $objectId, $targetPath, $text); 104 } 105 106 $this->renderedText = $text; 107 } 108 } 109
Download modules/util/Transformer.class.php
History Sun, 14 Mar 2021 01:33:16 +0100 Jan Dankert Fix: Transformer should not throw an exception if any linktarget could not be found. Fix: SearchIndex must use the correct pageContext. Sat, 27 Feb 2021 02:40:09 +0100 Jan Dankert Fix: Use the sourceObjectId from the pageContext for links. Sat, 27 Feb 2021 01:25:19 +0100 Jan Dankert Fix: Workaround for PHP 5.x, but i do not understand the reason. Tue, 29 Sep 2020 22:17:11 +0200 Jan Dankert Refactoring: Do not use global constants. Mon, 21 Sep 2020 22:48:59 +0200 Jan Dankert Complexe refactoring: Moving all generation logic from the model (Value,Page,File) to generators classes. Sat, 22 Feb 2020 23:58:02 +0100 Jan Dankert Refactoring: Namespacing for module 'util'. Tue, 22 May 2018 22:39:54 +0200 Jan Dankert Fix für PHP 7.2: 'Object' darf nun nicht mehr als Klassennamen verwendet werden. AUCH NICHT IN EINEM NAMESPACE! WTF, wozu habe ich das in einen verfickten Namespace gepackt? Wozu soll der sonst da sein??? Amateure. Daher nun notgedrungen unbenannt in 'BaseObject'. Fri, 9 Feb 2018 00:48:31 +0100 Jan Dankert Die LanguageId und ModelId an alle Actions durchreichen. Diese sollen nicht mehr aus der Sitzung geladen werden, da nun in unterschiedlichen Tabs auch Objekte mit unterschiedlichen Model/Languages angezeigt werden können. Sat, 16 Dec 2017 23:21:31 +0100 Jan Dankert Eigenes Modul für alle Util-Klassen.