Transformer.class.php (2992B)
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&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