1<?php 2 3/** 4 * HTMLCreator is a FeedCreator that writes an HTML feed file to a specific 5 * location, overriding the createFeed method of the parent FeedCreator. 6 * The HTML produced can be included over http by scripting languages, or serve 7 * as the source for an IFrame. 8 * All output by this class is embedded in <div></div> tags to enable formatting 9 * using CSS. 10 * 11 * @author Pascal Van Hecke 12 * @since 1.7 13 */ 14class HTMLCreator extends FeedCreator 15{ 16 17 protected $contentType = "text/html"; 18 19 /** 20 * Contains HTML to be output at the start of the feed's html representation. 21 */ 22 public $header; 23 24 /** 25 * Contains HTML to be output at the end of the feed's html representation. 26 */ 27 public $footer; 28 29 /** 30 * Contains HTML to be output between entries. A separator is only used in 31 * case of multiple entries. 32 */ 33 public $separator; 34 35 /** 36 * Used to prefix the stylenames to make sure they are unique 37 * and do not clash with stylenames on the user's page. 38 */ 39 public $stylePrefix; 40 41 /** @var bool Determines whether the links open in a new window or not. */ 42 public $openInNewWindow = true; 43 44 /** @var string image alignments in output */ 45 public $imageAlign = "right"; 46 47 /** 48 * In case of very simple output you may want to get rid of the style tags, 49 * hence this variable. There's no equivalent on item level, but of course you can 50 * add strings to it while iterating over the items ($this->stylelessOutput .= ...) 51 * and when it is non-empty, ONLY the styleless output is printed, the rest is ignored 52 * in the function createFeed(). 53 */ 54 public $stylelessOutput = ""; 55 56 /** 57 * Writes the HTML. 58 * 59 * @inheritdoc 60 */ 61 public function createFeed() 62 { 63 // if there is styleless output, use the content of this variable and ignore the rest 64 if ($this->stylelessOutput != "") { 65 return $this->stylelessOutput; 66 } 67 68 //if no stylePrefix is set, generate it yourself depending on the script name 69 if ($this->stylePrefix == "") { 70 $this->stylePrefix = str_replace(".", "_", $this->_generateFilename())."_"; 71 } 72 73 //set an openInNewWindow_token_to be inserted or not 74 if ($this->openInNewWindow) { 75 $targetInsert = " class='target_blank'"; 76 } else { 77 $targetInsert = ''; 78 } 79 80 // use this array to put the lines in and implode later with "document.write" javascript 81 $feedArray = array(); 82 if ($this->image != null) { 83 $imageStr = "<a href='".$this->image->link."'".$targetInsert.">". 84 "<img src='".$this->image->url."' border='0' alt='". 85 FeedCreator::iTrunc(htmlspecialchars($this->image->title), 100). 86 "' align='".$this->imageAlign."' "; 87 if ($this->image->width) { 88 $imageStr .= " width='".$this->image->width."' "; 89 } 90 if ($this->image->height) { 91 $imageStr .= " height='".$this->image->height."' "; 92 } 93 $imageStr .= "/></a>"; 94 $feedArray[] = $imageStr; 95 } 96 97 if ($this->title) { 98 $feedArray[] = "<div class='".$this->stylePrefix."title'><a href='".$this->link."' ".$targetInsert." class='".$this->stylePrefix."title'>". 99 FeedCreator::iTrunc(htmlspecialchars($this->title), 100)."</a></div>"; 100 } 101 if ($this->getDescription()) { 102 $feedArray[] = "<div class='".$this->stylePrefix."description'>". 103 str_replace("]]>", "", str_replace("<![CDATA[", "", $this->getDescription())). 104 "</div>"; 105 } 106 107 if ($this->header) { 108 $feedArray[] = "<div class='".$this->stylePrefix."header'>".$this->header."</div>"; 109 } 110 111 for ($i = 0; $i < count($this->items); $i++) { 112 if ($this->separator and $i > 0) { 113 $feedArray[] = "<div class='".$this->stylePrefix."separator'>".$this->separator."</div>"; 114 } 115 116 if ($this->items[$i]->title) { 117 if ($this->items[$i]->link) { 118 $feedArray[] = 119 "<div class='".$this->stylePrefix."item_title'><a href='".$this->items[$i]->link."' class='".$this->stylePrefix. 120 "item_title'".$targetInsert.">".FeedCreator::iTrunc( 121 htmlspecialchars(strip_tags($this->items[$i]->title)), 122 100 123 ). 124 "</a></div>"; 125 } else { 126 $feedArray[] = 127 "<div class='".$this->stylePrefix."item_title'>". 128 FeedCreator::iTrunc(htmlspecialchars(strip_tags($this->items[$i]->title)), 100). 129 "</div>"; 130 } 131 } 132 if ($this->items[$i]->getDescription()) { 133 $feedArray[] = 134 "<div class='".$this->stylePrefix."item_description'>". 135 str_replace("]]>", "", str_replace("<![CDATA[", "", $this->items[$i]->getDescription())). 136 "</div>"; 137 } 138 } 139 if ($this->footer) { 140 $feedArray[] = "<div class='".$this->stylePrefix."footer'>".$this->footer."</div>"; 141 } 142 143 $feed = "".implode("\r\n", $feedArray); 144 145 return $feed; 146 } 147 148 /** 149 * Overrides parent to produce .html extensions 150 * 151 * @return string the feed cache filename 152 * @since 1.4 153 * @access private 154 */ 155 protected function _generateFilename() 156 { 157 $fileInfo = pathinfo($_SERVER["SCRIPT_NAME"]); 158 159 return substr($fileInfo["basename"], 0, -(strlen($fileInfo["extension"]) + 1)).".html"; 160 } 161} 162