preg_replace_callback. --XES-- -<20181201: replaced lastRSS 0.9.1 with 2.0.1 --chris-- ->Variables: [@ feed= URL to RSS feed file. Defaults to pmwiki.org's Site/AllRecentChanges. cache_time= Time to cache data... be nice to the providers. Defaults to 2000 seconds. Set to 0 to disable. encoding= Override the feed's encoding with this value. imagestyle= A wikistyle to apply to images (see showimages). itemspace= Defaults to 1, means 1 blank line after item. max_count= Number of items to read. Defaults to 0. newwin= Open links to items in a new window. Defaults to true. overrides= Set this to false to prevent URL line GET overrides to these parameters. showfeedxmllink= Defaults to false. Add link by the title to the original RSS feed file. showimages= Defaults to false. Attempt to show images in feed. showitems= Defaults to true. If false, don't show RSS items. showitemdescr= Defaults to true. If false, don't include the description along with the item. showpubdate= Defaults to false. Attempt to show publish date for item. showtables= Defaults to false. Attempt to show tables in feed. showtitle= Defaults to true. If false, don't show the feed title. title= Alternate title instead of using RSS title. unsafe= Defaults to false. If true, allows setting of title and feed from the URL line (_GET). @] ***********************************************************/ $RecipeInfo['PmFeed']['Version'] = '20170409'; // This function is useful if running with PmWikis default charset // of ISO-8859-1 and you don't have mb_convert_encoding or iconv // support. // // function pmfeedutf8htmlentityencode($s) { $t = array_flip(array( ' ' => "\xc2\xa0", '¡' => "\xc2\xa1", '¢' => "\xc2\xa2", '£' => "\xc2\xa3", '¤' => "\xc2\xa4", '¥' => "\xc2\xa5", '¦' => "\xc2\xa6", '§' => "\xc2\xa7", '¨' => "\xc2\xa8", '©' => "\xc2\xa9", 'ª' => "\xc2\xaa", '«' => "\xc2\xab", '¬' => "\xc2\xac", '­' => "\xc2\xad", '®' => "\xc2\xae", '¯' => "\xc2\xaf", '°' => "\xc2\xb0", '±' => "\xc2\xb1", '²' => "\xc2\xb2", '³' => "\xc2\xb3", '´' => "\xc2\xb4", 'µ' => "\xc2\xb5", '¶' => "\xc2\xb6", '·' => "\xc2\xb7", '¸' => "\xc2\xb8", '¹' => "\xc2\xb9", 'º' => "\xc2\xba", '»' => "\xc2\xbb", '¼' => "\xc2\xbc", '½' => "\xc2\xbd", '¾' => "\xc2\xbe", '¿' => "\xc2\xbf", 'À' => "\xc3\x80", 'Á' => "\xc3\x81", 'Â' => "\xc3\x82", 'Ã' => "\xc3\x83", 'Ä' => "\xc3\x84", 'Å' => "\xc3\x85", 'Æ' => "\xc3\x86", 'Ç' => "\xc3\x87", 'È' => "\xc3\x88", 'É' => "\xc3\x89", 'Ê' => "\xc3\x8a", 'Ë' => "\xc3\x8b", 'Ì' => "\xc3\x8c", 'Í' => "\xc3\x8d", 'Î' => "\xc3\x8e", 'Ï' => "\xc3\x8f", 'Ð' => "\xc3\x90", 'Ñ' => "\xc3\x91", 'Ò' => "\xc3\x92", 'Ó' => "\xc3\x93", 'Ô' => "\xc3\x94", 'Õ' => "\xc3\x95", 'Ö' => "\xc3\x96", '×' => "\xc3\x97", 'Ø' => "\xc3\x98", 'Ù' => "\xc3\x99", 'Ú' => "\xc3\x9a", 'Û' => "\xc3\x9b", 'Ü' => "\xc3\x9c", 'Ý' => "\xc3\x9d", 'Þ' => "\xc3\x9e", 'ß' => "\xc3\x9f", 'à' => "\xc3\xa0", 'á' => "\xc3\xa1", 'â' => "\xc3\xa2", 'ã' => "\xc3\xa3", 'ä' => "\xc3\xa4", 'å' => "\xc3\xa5", 'æ' => "\xc3\xa6", 'ç' => "\xc3\xa7", 'è' => "\xc3\xa8", 'é' => "\xc3\xa9", 'ê' => "\xc3\xaa", 'ë' => "\xc3\xab", 'ì' => "\xc3\xac", 'í' => "\xc3\xad", 'î' => "\xc3\xae", 'ï' => "\xc3\xaf", 'ð' => "\xc3\xb0", 'ñ' => "\xc3\xb1", 'ò' => "\xc3\xb2", 'ó' => "\xc3\xb3", 'ô' => "\xc3\xb4", 'õ' => "\xc3\xb5", 'ö' => "\xc3\xb6", '÷' => "\xc3\xb7", 'ø' => "\xc3\xb8", 'ù' => "\xc3\xb9", 'ú' => "\xc3\xba", 'û' => "\xc3\xbb", 'ü' => "\xc3\xbc", 'ý' => "\xc3\xbd", 'þ' => "\xc3\xbe", 'ÿ' => "\xc3\xbf", 'ƒ' => "\xc6\x92", 'Α' => "\xce\x91", 'Β' => "\xce\x92", 'Γ' => "\xce\x93", 'Δ' => "\xce\x94", 'Ε' => "\xce\x95", 'Ζ' => "\xce\x96", 'Η' => "\xce\x97", 'Θ' => "\xce\x98", 'Ι' => "\xce\x99", 'Κ' => "\xce\x9a", 'Λ' => "\xce\x9b", 'Μ' => "\xce\x9c", 'Ν' => "\xce\x9d", 'Ξ' => "\xce\x9e", 'Ο' => "\xce\x9f", 'Π' => "\xce\xa0", 'Ρ' => "\xce\xa1", 'Σ' => "\xce\xa3", 'Τ' => "\xce\xa4", 'Υ' => "\xce\xa5", 'Φ' => "\xce\xa6", 'Χ' => "\xce\xa7", 'Ψ' => "\xce\xa8", 'Ω' => "\xce\xa9", 'α' => "\xce\xb1", 'β' => "\xce\xb2", 'γ' => "\xce\xb3", 'δ' => "\xce\xb4", 'ε' => "\xce\xb5", 'ζ' => "\xce\xb6", 'η' => "\xce\xb7", 'θ' => "\xce\xb8", 'ι' => "\xce\xb9", 'κ' => "\xce\xba", 'λ' => "\xce\xbb", 'μ' => "\xce\xbc", 'ν' => "\xce\xbd", 'ξ' => "\xce\xbe", 'ο' => "\xce\xbf", 'π' => "\xcf\x80", 'ρ' => "\xcf\x81", 'ς' => "\xcf\x82", 'σ' => "\xcf\x83", 'τ' => "\xcf\x84", 'υ' => "\xcf\x85", 'φ' => "\xcf\x86", 'χ' => "\xcf\x87", 'ψ' => "\xcf\x88", 'ω' => "\xcf\x89", 'ϑ'=> "\xcf\x91", 'ϒ' => "\xcf\x92", 'ϖ' => "\xcf\x96", '•' => "\xe2\x80\xa2", '…' => "\xe2\x80\xa6", '′' => "\xe2\x80\xb2", '″' => "\xe2\x80\xb3", '‾' => "\xe2\x80\xbe", '⁄' => "\xe2\x81\x84", '℘' => "\xe2\x84\x98", 'ℑ' => "\xe2\x84\x91", 'ℜ' => "\xe2\x84\x9c", '™' => "\xe2\x84\xa2", 'ℵ' => "\xe2\x84\xb5", '←' => "\xe2\x86\x90", '↑' => "\xe2\x86\x91", '→' => "\xe2\x86\x92", '↓' => "\xe2\x86\x93", '↔' => "\xe2\x86\x94", '↵' => "\xe2\x86\xb5", '⇐' => "\xe2\x87\x90", '⇑' => "\xe2\x87\x91", '⇒' => "\xe2\x87\x92", '⇓' => "\xe2\x87\x93", '⇔' => "\xe2\x87\x94", '∀' => "\xe2\x88\x80", '∂' => "\xe2\x88\x82", '∃' => "\xe2\x88\x83", '∅' => "\xe2\x88\x85", '∇' => "\xe2\x88\x87", '∈' => "\xe2\x88\x88", '∉' => "\xe2\x88\x89", '∋' => "\xe2\x88\x8b", '∏' => "\xe2\x88\x8f", '∑' => "\xe2\x88\x91", '−' => "\xe2\x88\x92", '∗' => "\xe2\x88\x97", '√' => "\xe2\x88\x9a", '∝' => "\xe2\x88\x9d", '∞' => "\xe2\x88\x9e", '∠' => "\xe2\x88\xa0", '∧' => "\xe2\x88\xa7", '∨' => "\xe2\x88\xa8", '∩' => "\xe2\x88\xa9", '∪' => "\xe2\x88\xaa", '∫' => "\xe2\x88\xab", '∴' => "\xe2\x88\xb4", '∼' => "\xe2\x88\xbc", '≅' => "\xe2\x89\x85", '≈' => "\xe2\x89\x88", '≠' => "\xe2\x89\xa0", '≡' => "\xe2\x89\xa1", '≤' => "\xe2\x89\xa4", '≥' => "\xe2\x89\xa5", '⊂' => "\xe2\x8a\x82", '⊃' => "\xe2\x8a\x83", '⊄' => "\xe2\x8a\x84", '⊆' => "\xe2\x8a\x86", '⊇' => "\xe2\x8a\x87", '⊕' => "\xe2\x8a\x95", '⊗' => "\xe2\x8a\x97", '⊥' => "\xe2\x8a\xa5", '⋅' => "\xe2\x8b\x85", '⌈' => "\xe2\x8c\x88", '⌉' => "\xe2\x8c\x89", '⌊' => "\xe2\x8c\x8a", '⌋' => "\xe2\x8c\x8b", '⟨' => "\xe2\x8c\xa9", '⟩' => "\xe2\x8c\xaa", '◊' => "\xe2\x97\x8a", '♠' => "\xe2\x99\xa0", '♣' => "\xe2\x99\xa3", '♥' => "\xe2\x99\xa5", '♦' => "\xe2\x99\xa6", 'Œ' => "\xc5\x92", 'œ' => "\xc5\x93", 'Š' => "\xc5\xa0", 'š' => "\xc5\xa1", 'Ÿ' => "\xc5\xb8", 'ˆ' => "\xcb\x86", '˜' => "\xcb\x9c", ' ' => "\xe2\x80\x82", ' ' => "\xe2\x80\x83", ' ' => "\xe2\x80\x89", '‌' => "\xe2\x80\x8c", '‍' => "\xe2\x80\x8d", '‎' => "\xe2\x80\x8e", '‏' => "\xe2\x80\x8f", '–' => "\xe2\x80\x93", '—' => "\xe2\x80\x94", '‘' => "\xe2\x80\x98", '’' => "\xe2\x80\x99", '‚' => "\xe2\x80\x9a", '“' => "\xe2\x80\x9c", '”' => "\xe2\x80\x9d", '„' => "\xe2\x80\x9e", '†' => "\xe2\x80\xa0", '‡' => "\xe2\x80\xa1", '‰' => "\xe2\x80\xb0", '‹' => "\xe2\x80\xb9", '›' => "\xe2\x80\xba", '€' => "\xe2\x82\xac" )); preg_match_all('/[\xc2\xc3\xc5\xc6\xcb\xce\xcf][\x80-\xbf]|\xe2[\x80-\x99][\x82-\xac]/sx', $s, $m); foreach (array_unique($m[0]) as $c) { if (array_key_exists($c, $t)) { $s = str_replace($c, $t[$c], $s); } } return $s; } #XES - add function for callback xes_ to avoid namespace conflicts function xes_hexdec ($m) { return chr(hexdec($m[1])); } // For users prior to PHP 4.3.0 you may do this: function pmfeedunhtmlentities($string,$encoding) { global $Charset, $PmFeedXLateEncoding; // replace numeric entities #XES - attempt to fix #$string = preg_replace('~&#x([0-9a-f]+);~ei', 'chr(hexdec("\\1"))', $string); #$string = preg_replace('~&#([0-9]+);~e', 'chr(intval("\\1"))', $string); $string = preg_replace_callback('~&#x([0-9a-f]+);~i', 'xes_hexdec', $string); $string = preg_replace_callback('~&#([0-9]+);~', 'xes_hexdec', $string); switch ($PmFeedXLateEncoding) { case "mb_convert_endcoding": if (function_exists('mb_convert_encoding')) $string=mb_convert_encoding($string, $Charset, $encoding); else $PmFeedXLateEncoding = "auto"; break; case "iconv": if (function_exists('iconv')) $string=iconv($encoding, $Charset, $string); else $PmFeedXLateEncoding = "auto"; break; case "pmfeed": if (preg_match('/utf-8/i', $encoding)) $string = pmfeedutf8htmlentityencode($string); break; } if ($PmFeedXLateEncoding == "auto") { if (preg_match('/utf-8/i', $Charset)) { if (function_exists('mb_convert_encoding')) $string=mb_convert_encoding($string, $Charset, $encoding); else if (function_exists('iconv')) $string=iconv($encoding, $Charset, $string); else if (preg_match('/utf-8/i', $encoding)) $string = pmfeedutf8htmlentityencode($string); } else { if (preg_match('/utf-8/i', $encoding)) $string = pmfeedutf8htmlentityencode($string); } } // $string=iconv($encoding, $Charset, $string); //Alternative is mb_convert_encoding, parms reversed. //$string=mb_convert_encoding($string, $Charset, $encoding); // replace literal entities $trans_tbl = get_html_translation_table(HTML_ENTITIES); $trans_tbl = array_flip($trans_tbl); $string=strtr($string, $trans_tbl); return $string; } /** * LastRss * * This program is free software; you can redistribute it and/or modify * it under the terms of the New BSD License. * * @name LastRss * @version 2.0.1 * @link http://lastrss.oslab.net * @copyright Copyright (c) 2011 Vojtech Semecky * @license New BSD http://en.wikipedia.org/wiki/BSD_licenses * @author Vojtech Semecky * */ class LastRss { /** * cURL options * @var array */ private $curlOptions = array( CURLOPT_HEADER => false, CURLOPT_CONNECTTIMEOUT => 15, CURLOPT_TIMEOUT => 15, CURLOPT_FOLLOWLOCATION => true, CURLOPT_MAXREDIRS => 3, CURLOPT_RETURNTRANSFER => 1, CURLOPT_FAILONERROR => true, CURLOPT_ENCODING => 'gzip,deflate', ); /** * Error strings */ private static $parseError = 'Parse error: Invalid RSS/XML document (%s). Please check RSS by http://feedvalidator.org/.'; private static $downloadError = 'Download error: %s'; private static $fileOpenErorr = 'File error: Unable to open file %s'; /** * If true, HTML will be stripped from HTML is suspected tags * @var boolean */ private $stripHtml = true; /** * Array of tags where HTML is suspected */ private $htmlSuspected = array('title', 'description'); private $channelTags = array('title', 'link', 'description', 'lastBuildDate'); private $itemTags = array('title', 'link', 'description', 'pubDate', 'guid'); /** * Maximum number of items to be returned */ private $itemsLimit = 0; /** * @var string Date time format for date related RSS items */ private $dateFormat = null; /** * XML name spaces */ private static $xmlns = array( // @todo: asi se nikde nepouziva - smazat 'atom' => 'http://www.w3.org/2005/Atom', 'content' => 'http://purl.org/rss/1.0/modules/content/', 'wfw' => 'http://wellformedweb.org/CommentAPI/', 'dc' => 'http://purl.org/dc/elements/1.1/', 'sy' => 'http://purl.org/rss/1.0/modules/syndication/', 'slash' => 'http://purl.org/rss/1.0/modules/slash/', ); /** * XML name spaces used in used tags */ private $usedXmlns = array(); public $lastError = null; /** * Register all xml namespaces used in channel tags or item tags. */ private function registerNameSpaces(&$xpath) { foreach ($this->usedXmlns as $ns) { $xpath->registerNamespace($ns, ''); } } /** * Recalc array of all xml namespaces used in channel tags or item tags. */ private function calcNamespaces() { // Get all XML name spaces used in required tags $tags = implode(',', array_merge($this->channelTags, $this->itemTags)); preg_match_all("'([a-zA-Z0-9]+):'si", $tags, $namespaces); $this->usedXmlns = $namespaces[1]; } /** * Set required channel tags * @param array $tags (default is array('title', 'link', 'description') */ public function setChannelTags($tags) { $this->channelTags = $tags; $this->calcNamespaces(); return $this; } /** * Set required item tags * @param array $tags Default is array('title', 'link', 'description', 'pubDate', 'guid') */ public function setItemTags($tags) { $this->itemTags = $tags; $this->calcNamespaces(); return $this; } /** * Set date/time format for date related items (lastBuildDate, pubDate). * To disable date format conversion set date format to null (default value). * @param string $dateFormat Date/time format compatible with PHP function date(). */ public function setDateFormat($dateFormat) { $this->dateFormat = $dateFormat; return $this; } /** * Fotmat the input variable into $dateFormat * * If input value is not valid date, change input value to null. * If $dateFormat is specified, do nothing. * @param string $dateString */ private function formatDate(&$dateString) { if ($this->dateFormat) { $timeStamp = strtotime($dateString); $dateString = ($timeStamp) ? date($this->dateFormat, $timeStamp) : null; } } /** * Get URL content using CURL * @param $url String * @return String Returns XML string on success, FALSE on failure. */ private function loadUrl($url) // @todo: prejmenovat na downloadUrl() { if (!function_exists('curl_init')) { throw new Exception('CURL is not installed!'); } $ch = curl_init(); curl_setopt_array($ch, $this->curlOptions); curl_setopt($ch, CURLOPT_URL, $url); if (!($content = curl_exec($ch))) { $this->lastError = sprintf(self::$downloadError, curl_error($ch)); } curl_close($ch); return $content; } /** * Parse xmlData and return parsed result * */ private function parse(&$xmlData) { $result = array(); $doc = new DomDocument(); // Try to load XML or return parse error if (false == @$doc->loadXml($xmlData)) { // Try to fix XML by Tidy and try to load one more time $xmlData = tidy_repair_string($xmlData, array('output-xml' => true, 'input-xml' => true), 'utf8'); if (false == @$doc->loadXml($xmlData)) { $this->lastError = self::$parseError; return false; } } unset($xmlData); $xpath = new DOMXPath($doc); // Register xml name spaces $this->registerNamespaces($xpath); // Parse channel tags foreach($this->channelTags as &$tag) { $result[$tag] = $xpath->evaluate("string(channel/$tag)"); if ($tag == 'lastBuildDate') { $this->formatDate($result[$tag]); } } // Parse items // @todo: Zjistit, co bude rychlejsi //$items = $doc->getElementsByTagName('item'); $items = $xpath->evaluate('/rss/channel/item'); foreach($items as $item) { $tmpItem = array(); // Parse item tags foreach ($this->itemTags as &$tag) { switch ($tag) { case 'pubDate': $tmpItem[$tag] = $xpath->evaluate('string(pubDate)', $item); $this->formatDate($tmpItem[$tag]); break; case 'category': // Category is multivalue tag $tmpItem[$tag] = array(); foreach ($xpath->query('category', $item) as $node) { $tmpItem[$tag][] = trim($node->nodeValue); } break; case 'title': case 'description': $tmpItem[$tag] = $xpath->evaluate("string($tag)", $item); if ($this->stripHtml) { $tmpItem[$tag] = strip_tags($tmpItem[$tag]); $tmpItem[$tag] = html_entity_decode($tmpItem[$tag], ENT_QUOTES, 'UTF-8'); } $tmpItem[$tag] = trim($tmpItem[$tag]); break; default: $tmpItem[$tag] = trim($xpath->evaluate("string($tag)", $item)); break; } } $result['items'][] = $tmpItem; // If limit number of items is reached, stop processing remaining items if (count($result['items']) == $this->itemsLimit) { break; } } // Calc items count $result['itemsCount'] = isset($result['items']) ? count($result['items']) : 0; return $result; } /** * Fetch RSS/Atom feed from remote URL * @param string $url URL * @return array */ public function get($url) { $this->lastError = ''; // Get feed content $xmlData = $this->loadUrl($url); return $this->parse($xmlData); } /** * Fetch RSS/Atom feed from local file * @param string $filename Local file name * @return array */ public function getFile($filename) { $this->lastError = ''; $xmlData = file_get_contents($filename); return $this->parse($xmlData); } /** * Get last error message * @return string Error description */ public function getLastError() { return $this->lastError; } /** * @param int $limit Maximum number of items. Default is 0 which means "no limit". */ public function setItemsLimit($limit = 0) { $this->itemsLimit = (int) $limit; return $this; } } /** * End lastRSS */ /* pmfeed */ #XES - changed from Markup_e for compatibility Markup('pmfeed','directives','/\\(:pmfeed[ ]*(.*?):\\)\\s*$/', 'pmfeed'); #XES - changed to accept array of matches function pmfeed($opts) { global $ImgExtPattern, $FarmD, $pagename, $MaxIncludes, $HTMLHeaderFmt, $PmFeedCacheDir, $Charset, $PmFeedTitleMark, $PmFeedItemMark, $PmFeedDescrBold, $PmFeedDescrItalic, $PmFeedDescrUnderline, $PmFeedDescrSmall, $PmFeedDescrStrong, $PmFeedMarkupReplace, $PmFeedDescrHeader, $PmFeedImageStyle, $PmFeedImageStyleEnd, $PmFeedXLateEncoding, $PmFeedAltGet; //Force encoding/decoding conversion style SDV($PmFeedXLateEncoding, 'auto'); //Image styling SDV($PmFeedImageStyle, '%class=pmfeedimage%'); //Image style end string, normally %% SDV($PmFeedImageStyleEnd, '%%'); //Location of cache directory (must exist) SDV($PmFeedCacheDir, $FarmD.'/pub/cache'); //Initial PmWiki markup for feed title SDV($PmFeedTitleMark, '!!'); //Initial PmWiki markup for items SDV($PmFeedItemMark, '* %font-style=italic%'); //Convert bold tags SDV($PmFeedDescrBold, '\'\'\'$1\'\'\''); //Convert italic tags SDV($PmFeedDescrItalic, '\'\'$1\'\''); //Convert underline tags SDV($PmFeedDescrUnderline, '{+$1+}'); //Convert small tags SDV($PmFeedDescrSmall, '[-$1-]'); //Convert strong tags: text to '''''text''''' SDV($PmFeedDescrStrong, '\'\'\'\'\'$1\'\'\'\'\''); //Convert header tags:

text

to ''text'' SDV($PmFeedDescrHeader, '\'\'$1\'\''); //Attempt to escape markups special to PmWiki that might be found in description SDV($PmFeedMarkupReplace, '/([#*[\]])/'); //Alternative ways to get RSS feed in case direct open fails. SDVA($PmFeedAltGet, array( '/usr/bin/curl -k %s', '/usr/bin/wget -O - %s', '/usr/bin/lynx -source %s')); // Determine this Group // $group = FmtPageName('$Group',$pagename); $name = FmtPageName('$Name',$pagename); // Process markup arguments first // $defaults = array( 'feed'=>'http://www.pmwiki.org/wiki/Site/AllRecentChanges?action=rss', 'title'=>'', 'cache_time'=>2000, 'encoding'=>'', 'imagestyle'=>$PmFeedImageStyle, 'itemspace'=>1, 'max_count'=>0, 'showpubdate'=>'false', 'showencoding'=>'false', 'showimages'=>'false', 'showitems'=>'true', 'showitemdescr'=>'true', 'showtables'=>'false', 'showtitle'=>'true', 'showfeedxmllink'=>'false', 'newwin'=>'true', 'overrides'=>'true', 'unsafe'=>'false' ); #XES parse match array for found args $opts = $opts[1]; $args = array_merge($defaults, ParseArgs($opts)); $urladd=''; // Allows overrides=false in the :pmfeed: markup to disallow // settings on the URL line. // $overrides = $args['overrides']; if ($overrides == 'false') { $_GET = NULL; } $cache_time = isset($_GET['cache_time']) ? $_GET['cache_time'] : $args['cache_time']; if (isset($_GET['cache_time'])) $urladd.="&cache_time=".urlencode($_GET['cache_time']); $encoding = isset($_GET['encoding']) ? $_GET['encoding'] : $args['encoding']; if (isset($_GET['encoding'])) $urladd.="&encoding=".urlencode($_GET['encoding']); $imagestyle = isset($_GET['imagestyle']) ? $_GET['imagestyle'] : $args['imagestyle']; if (isset($_GET['imagestyle'])) $urladd.="&imagestyle=".urlencode($_GET['imagestyle']); $itemspace = isset($_GET['itemspace']) ? $_GET['itemspace'] : $args['itemspace']; if (isset($_GET['itemspace'])) $urladd.="&itemspace=".urlencode($_GET['itemspace']); $showpubdate= isset($_GET['showpubdate']) ? $_GET['showpubdate'] : $args['showpubdate']; if (isset($_GET['showpubdate'])) $urladd.="&showpubdate=".urlencode($_GET['showpubdate']); $showencoding= isset($_GET['showencoding']) ? $_GET['showencoding'] : $args['showencoding']; if (isset($_GET['showencoding'])) $urladd.="&showencoding=".urlencode($_GET['showencoding']); $showimages = isset($_GET['showimages']) ? $_GET['showimages'] : $args['showimages']; if (isset($_GET['showimages'])) $urladd.="&showimages=".urlencode($_GET['showimages']); $showtables= isset($_GET['showtables']) ? $_GET['showtables'] : $args['showtables']; if (isset($_GET['showtables'])) $urladd.="&showtables=".urlencode($_GET['showtables']); $showitemdescr = isset($_GET['showitemdescr']) ? $_GET['showitemdescr'] : $args['showitemdescr']; if (isset($_GET['showitemdescr'])) $urladd.="&showitemdescr=".urlencode($_GET['showitemdescr']); $showitems = isset($_GET['showitems']) ? $_GET['showitems'] : $args['showitems']; if (isset($_GET['showitems'])) $urladd.="&showitems=".urlencode($_GET['showitems']); $showtitle = isset($_GET['showtitle']) ? $_GET['showtitle'] : $args['showtitle']; if (isset($_GET['showtitle'])) $urladd.="&showtitle=".urlencode($_GET['showtitle']); $showfeedxmllink = isset($_GET['showfeedxmllink']) ? $_GET['showfeedxmllink'] : $args['showfeedxmllink']; if (isset($_GET['showfeedxmllink'])) $urladd.="&showfeedxmllink=".urlencode($_GET['showfeedxmllink']); $max_count = isset($_GET['max_count']) ? $_GET['max_count'] : $args['max_count']; if (isset($_GET['max_count'])) $urladd.="&max_count=".urlencode($_GET['max_count']); $newwin= isset($_GET['newwin']) ? $_GET['newwin'] : $args['newwin']; if (isset($_GET['newwin'])) $urladd.="&newwin=".urlencode($_GET['newwin']); // For unsafe (?) things // Enabling unsafe would allow you to create a totally user driven // feed. It's possible that some "nasty" markup could come in via // title if made user modifiable. $unsafe=$args['unsafe']; if ($unsafe == 'true') { $feed= isset($_GET['feed']) ? $_GET['feed'] : $args['feed']; if (isset($_GET['feed'])) $urladd.="&feed=".urlencode($_GET['feed']); $title= isset($_GET['title']) ? $_GET['title'] : $args['title']; if (isset($_GET['title'])) $urladd.="&title=".urlencode($_GET['title']); } else { $title=$args['title']; $feed=$args['feed']; } // Create lastRSS object $rss = new lastRSS; // $rss->stripHTML = True; // Set cache dir and cache time limit // (don't forget to chmod cache to allow writing) $rss->cache_dir = $PmFeedCacheDir; $rss->cache_time = $cache_time; if ($newwin == 'true') { $pmnewwin='newwin '; } else { $pmnewwin=''; } // Initialize output string $out="\n(:div9 class=\"pmfeed\":)\n"; // Try to load and parse RSS file $feed=str_replace('&', '&', $feed); if ($rs = $rss->Get($feed,$encoding)) { $encoding=$rs['encoding']; // Show title or clickable website rss title if not supplied if ($showtitle == 'true') { $rs[title]=preg_replace('/\n/','',strip_tags(pmfeedunhtmlentities($rs[title],$encoding))); if ($title != '') { $out.="\n$PmFeedTitleMark %".$pmnewwin."class=pmfeedtitle%[[$rs[link]|$title\"$rs[title]\"]]"; } else { $out.="\n$PmFeedTitleMark %".$pmnewwin."class=pmfeedtitle%[[$rs[link]|$rs[title]]]"; } } // Display a link to the original feed xml if ($showencoding == 'true') { $out.="[$encoding,CS:$Charset]"; } // Display a link to the original feed xml if ($showfeedxmllink != 'false') { if ($showfeedxmllink != 'true') { $xmltext=$showfeedxmllink; } else { $xmltext='(RSS)'; } $out.="[[$feed|$xmltext]]"; } $out.="\n"; // Show last published articles (title, link, description) if ($showitems == 'true') { $i=0; foreach($rs['items'] as $item) { if ($max_count && $i >= $max_count) { break; } $pmfeedtitle=preg_replace('/\n/','',strip_tags(pmfeedunhtmlentities($item['title'],$encoding))); $pmfeedlink=$item['link']; if ($pmfeedlink == '') { $pmfeeditem="$PmFeedItemMark %class=pmfeeditem%".$pmfeedtitle; } else { $pmfeeditem="$PmFeedItemMark %".$pmnewwin."class=pmfeeditem%[[$pmfeedlink|$pmfeedtitle]]"; } $out.="$pmfeeditem"; if ($showpubdate == 'true') { $out.="\\\\\n"; $out.="%class=pmfeedpubdate% ".$item['pubDate']."%%"; } if ($showitemdescr == 'true') { $out.="\\\\\n"; $d=$item['description']; $d=pmfeedunhtmlentities($d,$encoding); //Hack to hide PmWiki Markup, pound and asterisk //... sigh, there could be a ton of these. $d=preg_replace($PmFeedMarkupReplace, '[=$1=]', $d); // Eliminate returns $d=preg_replace('/\n\n*/', '', $d); // Eliminate leading spaces $d=preg_replace('/^\s\s*/m', '', $d); // Handle paragraphs $d=preg_replace('/\s*<\/{0,1}p>\s*/m', '\\\\\\'."\n".'\\\\'."\n", $d); // Handle breaks $d=preg_replace('/\s*<[bh]r\s*\/*>\s*/m', '\\\\\\'."\n".'\\\\'."\n", $d); if ($showimages == 'true') { // Attempt to convert free standing image URLs to have thumb $d=preg_replace('/([^["\'])(http:[^ ">]+'.$ImgExtPattern.')/is', '$1'.$imagestyle.'[[$2|$2]]'.$PmFeedImageStyleEnd, $d); } else { $d=preg_replace('/([^["\'])(http:[^ ">]+'.$ImgExtPattern.')/is', '$1%newwin%[[$2|IMG]]%%', $d); } if ($showimages == 'true') { // Attempt to convert to [[url|image]] $d=preg_replace('/]*?href=["\']([^"\']+)["\'][^>]*>\s*]*src=["\']([^"\']+'.$ImgExtPattern.')["\'][^>]*>\s*[^<]*<\/a>/is', $imagestyle.'[[$1|$2]]'.$PmFeedImageStyleEnd, $d); // $d=preg_replace('/]*>\s*]*>\s*[^<]*<\/a>/is', $imagestyle.'[[$1|$2]]'.$PmFeedImageStyleEnd, $d); } else { $d=preg_replace('/]*>\s*]*>\s*[^<]*<\/a>/is', '', $d); } // Attempt to convert name to [[url|name]] $d=preg_replace('/]*>([^<]+)<\/a>/is', '[[$1|$2]]', $d); if ($showimages == 'true') { // Attempt to convert ]*src="([^"]+'.$ImgExtPattern.')"[^>]*>/is', $imagestyle.'$1'.$PmFeedImageStyleEnd, $d); // $d=preg_replace('/]*>/is', $imagestyle.'$1'.$PmFeedImageStyleEnd, $d); } else { $d=preg_replace('/]*>/is', '', $d); } //Table handling if ($showtables == 'true') { $d=preg_replace('/]*\)>/', '(:table:)'."\n", $d); $d=preg_replace('/]*>/', "\n".'(:cell:)'."\n", $d); $d=preg_replace('/]*>/', "\n".'(:cell:)'."\n".'(:cellnr:)'."\n", $d); $d=preg_replace('/<\/table[^>]*>/', "\n".'(:tableend:)'."\n", $d); } //Convert bold tags $d=preg_replace('/(.*?)<\/b>/', $PmFeedDescrBold, $d); //Convert italics tags $d=preg_replace('/(.*?)<\/i>/', $PmFeedDescrItalic, $d); //Convert underline tags $d=preg_replace('/(.*?)<\/u>/', $PmFeedDescrUnderline, $d); //Convert small tags $d=preg_replace('/(.*?)<\/small>/', $PmFeedDescrSmall, $d); //Convert strong tags: text to '''''text''''' $d=preg_replace('/(.*?)<\/strong>/', $PmFeedDescrStrong, $d); //Convert header tags $d=preg_replace('/(.*?)<\/h\d>/', $PmFeedDescrHeader.'\\'."\n", $d); //Eliminate white space (lines) at head of item. $d=preg_replace('/^[\\\\\n][\\\\\n]*/','',$d); // Slaughter the rest of the html tags, prepend block $d="%block ".$pmnewwin."%".ltrim(strip_tags($d))." %%\n"; //Eliminate white space (lines) at end of item. $d=preg_replace('/[\\\\\n][\\\\\n]*%%$/','%%',$d); $d=preg_replace('/[\r]/',' ',$d); //Add an extra lines if desired to end of item. for ($is = 1; $is <= $itemspace; $is++) { $d.='\\\\'."\n\n"; } $out.=$d; } else { $out.="\n"; } $i++; } } } else { $out.="Error: It's not possible to reach RSS file $feed ...\n"; } $out.="(:div9end:)\n"; if ($pmfeeddebug == 'true') { $debug_file = $PmFeedCacheDir . '/debug_'; if ($f = @fopen($debug_file, 'a+')) { fwrite ($f, $out); fclose($f); } } PRR(); return $out; }