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). @] ***********************************************************/ // 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; } // For users prior to PHP 4.3.0 you may do this: function pmfeedunhtmlentities($string,$encoding) { global $Charset, $PmFeedXLateEncoding; // replace numeric entities $string = preg_replace('~&#x([0-9a-f]+);~ei', 'chr(hexdec("\\1"))', $string); $string = preg_replace('~&#([0-9]+);~e', 'chr(intval("\\1"))', $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 0.9.1 Simple yet powerfull PHP class to parse RSS files. by Vojtech Semecky, webmaster @ webdot . cz Latest version, features, manual and examples: http://lastrss.webdot.cz/ ---------------------------------------------------------------------- LICENSE This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License (GPL) as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. To read the license please visit http://www.gnu.org/copyleft/gpl.html ====================================================================== */ /** * lastRSS * Simple yet powerfull PHP class to parse RSS files. */ class lastRSS { // ------------------------------------------------------------------- // Public properties // ------------------------------------------------------------------- var $default_cp = 'ISO-8859-1'; var $CDATA = 'content'; var $cp = ''; var $items_limit = 0; var $stripHTML = False; var $date_format = ''; // ------------------------------------------------------------------- // Private variables // ------------------------------------------------------------------- var $channeltags = array ('title', 'link', 'description', 'language', 'copyright', 'managingEditor', 'webMaster', 'lastBuildDate', 'rating', 'docs'); var $itemtags = array('title', 'link', 'description', 'author', 'category', 'comments', 'enclosure', 'guid', 'pubDate', 'source'); var $imagetags = array('title', 'url', 'link', 'width', 'height'); var $textinputtags = array('title', 'description', 'name', 'link'); // ------------------------------------------------------------------- // Parse RSS file and returns associative array. // ------------------------------------------------------------------- function Get ($rss_url, $encoding) { global $PmFeedAltGet; // If CACHE ENABLED if ($this->cache_dir != '') { $cache_file = $this->cache_dir . '/rsscache_' . md5($rss_url); $timedif = @(time() - filemtime($cache_file)); if ($timedif < $this->cache_time) { // cached file is fresh enough, return cached array $result = unserialize(join('', file($cache_file))); // set 'cached' to 1 only if cached file is correct if ($result) $result['cached'] = 1; } else { // cached file is too old, create new $result = $this->Parse($rss_url,$encoding); $serialized = serialize($result); if ($f = @fopen($cache_file, 'w')) { fwrite ($f, $serialized, strlen($serialized)); fclose($f); } if ($result) $result['cached'] = 0; } } // If CACHE DISABLED >> load and parse the file directly else { $result = $this->Parse($rss_url,$encoding); if ($result) $result['cached'] = 0; } // return result return $result; } // ------------------------------------------------------------------- // Modification of preg_match(); return trimed field with index 1 // from 'classic' preg_match() array output // ------------------------------------------------------------------- function my_preg_match ($pattern, $subject) { // start regullar expression preg_match($pattern, $subject, $out); // if there is some result... process it and return it if(isset($out[1])) { // Process CDATA (if present) if ($this->CDATA == 'content') { // Get CDATA content (without CDATA tag) $out[1] = strtr($out[1], array(''', ']]>'=>'')); } elseif ($this->CDATA == 'strip') { // Strip CDATA $out[1] = strtr($out[1], array(''', ']]>'=>'')); } // If code page is set convert character encoding to required if ($this->cp != '') $out[1] = iconv($this->rsscp, $this->cp.'//TRANSLIT', $out[1]); // Return result return trim($out[1]); } else { // if there is NO result, return empty string return ''; } } // ------------------------------------------------------------------- // Replace HTML entities &something; by real characters // ------------------------------------------------------------------- function unhtmlentities ($string) { // Get HTML entities table $trans_tbl = get_html_translation_table (HTML_ENTITIES, ENT_QUOTES); // Flip keys<==>values $trans_tbl = array_flip ($trans_tbl); // Add support for ' entity (missing in HTML_ENTITIES) $trans_tbl += array(''' => "'"); // Replace entities by values return strtr ($string, $trans_tbl); } // ------------------------------------------------------------------- // Parse() is private method used by Get() to load and parse RSS file. // Don't use Parse() in your scripts - use Get($rss_file) instead. // ------------------------------------------------------------------- function Parse ($rss_url,$encoding) { global $PmFeedAltGet; // Open and load RSS file $rss_content = ''; if ($f = @fopen($rss_url, 'r')) { $rss_content = ''; while (!feof($f)) { $rss_content .= fgets($f, 4096); } fclose($f); } else { # Try alternative gets foreach ($PmFeedAltGet as $altgetfmt) { $altget=sprintf($altgetfmt, $rss_url); if ($f = popen("$altget", 'r')) { while (!feof($f)) { $rss_content .= fgets($f, 4096); } fclose($f); break; } } } if ($rss_content != '') { // Use $encoding if set if ($encoding != '') { $this->rsscp = $encoding; $result['encoding'] = $encoding; } else { // Parse document encoding $result['encoding'] = $this->my_preg_match("'encoding=[\'\"](.*?)[\'\"]'si", $rss_content); // if document codepage is specified, use it if ($result['encoding'] != '') { // This is used in my_preg_match() $this->rsscp = $result['encoding']; } else { // This is used in my_preg_match() // otherwise use the default codepage $this->rsscp = $this->default_cp; $result['encoding'] = $this->default_cp; } } // Parse CHANNEL info preg_match("'(.*?)'si", $rss_content, $out_channel); foreach($this->channeltags as $channeltag) { $temp = $this->my_preg_match("'<$channeltag.*?>(.*?)'si", $out_channel[1]); if ($temp != '') { // Set only if not empty $result[$channeltag] = $temp; // Set only if not empty } } // If date_format is specified and lastBuildDate is valid if ($this->date_format != '' && ($timestamp = strtotime($result['lastBuildDate'])) !==-1) { // convert lastBuildDate to specified date format $result['lastBuildDate'] = date($this->date_format, $timestamp); } // Parse TEXTINPUT info preg_match("']*[^/])>(.*?)'si", $rss_content, $out_textinfo); // This a little strange regexp means: // Look for tag with or without any attributes, // but skip truncated version (it's not beggining tag) if (isset($out_textinfo[2])) { foreach($this->textinputtags as $textinputtag) { $temp = $this->my_preg_match("'<$textinputtag.*?>(.*?)'si", $out_textinfo[2]); if ($temp != '') { // Set only if not empty $result['textinput_'.$textinputtag] = $temp; } } } // Parse IMAGE info preg_match("'(.*?)'si", $rss_content, $out_imageinfo); if (isset($out_imageinfo[1])) { foreach($this->imagetags as $imagetag) { $temp = $this->my_preg_match("'<$imagetag.*?>(.*?)'si", $out_imageinfo[1]); if ($temp != '') { // Set only if not empty $result['image_'.$imagetag] = $temp; } } } // Parse ITEMS preg_match_all("'(.*?)'si", $rss_content, $items); $rss_items = $items[2]; $i = 0; $result['items'] = array(); // create array even if there are no items foreach($rss_items as $rss_item) { // If number of items is lower then limit: Parse one item if ($i < $this->items_limit || $this->items_limit == 0) { foreach($this->itemtags as $itemtag) { $temp = $this->my_preg_match("'<$itemtag.*?>(.*?)'si", $rss_item); if ($temp != '') { // Set only if not empty $result['items'][$i][$itemtag] = $temp; // Set only if not empty } } // Strip HTML tags and other stuff from DESCRIPTION if ($this->stripHTML && $result['items'][$i]['description']) { $result['items'][$i]['description'] = strip_tags($this->unhtmlentities(strip_tags($result['items'][$i]['description']))); } // Strip HTML tags and other stuff from TITLE if ($this->stripHTML && $result['items'][$i]['title']) { $result['items'][$i]['title'] = strip_tags($this->unhtmlentities(strip_tags($result['items'][$i]['title']))); } // If date_format is specified and pubDate is valid if ($this->date_format != '' && ($timestamp = strtotime($result['items'][$i]['pubDate'])) !==-1) { // convert pubDate to specified date format $result['items'][$i]['pubDate'] = date($this->date_format, $timestamp); } // Item counter $i++; } } $result['items_count'] = $i; return $result; } else { // Error in opening return False return False; } } } /** * End lastRSS */ /* pmfeed */ Markup('pmfeed','directives',"/^\(:pmfeed[ ]*(.*?):\)\s*$/e", "pmfeed('$1')"); 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' ); $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"; // 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 == 'true') { $out.="[[$feed|(XML)]]"; } $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"; } if ($pmfeeddebug == 'true') { $debug_file = $PmFeedCacheDir . '/debug_'; if ($f = @fopen($debug_file, 'a+')) { fwrite ($f, $out); fclose($f); } } PRR(); return $out; }