openrat-cms

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

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&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