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); $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); 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] = $this->MyConvertEncoding($this->rsscp, $this->cp, $out[1]); $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) { // Open and load RSS file $urlParts = parse_url($rss_url); $host = $urlParts['host']; $uri = $urlParts['path']; if (strcmp($urlParts['query'], '') != 0) { $uri .= '?'.$urlParts['query']; } if (strcmp($urlParts['fragment'], '') != 0) { $fragment = $urlParts['fragment']; $fragment = substr($fragment, 4, strlen($fragment) - 3); $uri = $uri.$fragment; } if ($f = fsockopen($host, 80, $errno, $errstr, $this->connection_time)) { $rss_content = ''; fputs($f, "GET $uri HTTP/1.0\r\nHost: $host\r\n\r\n"); while (!feof($f)) { $rss_content .= fgets($f, 512); } fclose($f); // Parse document encoding $result['encoding'] = $this->my_preg_match("'encoding=[\'\"](.*?)[\'\"]'si", $rss_content); // if document codepage is specified, use it if ($result['encoding'] != '') { $this->rsscp = $result['encoding']; } // This is used in my_preg_match() // otherwise use the default codepage else { $this->rsscp = $this->default_cp; } // This is used in my_preg_match() // 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 != '') $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 != '') $result['textinput_'.$textinputtag] = $temp; // Set only if not empty } } // 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 != '') $result['image_'.$imagetag] = $temp; // Set only if not empty } } // 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 != '') $result['items'][$i][$itemtag] = $temp; // Set only if not empty } // Strip HTML tags and other bullshit 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 bullshit 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 { return False; //die("Network error: $errstr ($errno)"); } } } ?> blog:ludens » news

everything in news

Feb08

coaster:2.0 - a creative design tool

~ studio:ludens @ 15:26 Europe/Amsterdam

coaster 2.0

a new sound in mass-customization

Mass-customization has giving you more control over the appearance of the products you buy. You can change the colors of your shoes (Puma) and turn a photo of your pet into everything from a mug to a teddybear (foto.com). We however missed the element of creativity in this process. Therefore, studio:ludens says “genere ludens!” (or “create through play!” for all us non-Romans).

a new design-tool for everyone

We hereby launch our very first online creative design tool: coaster:2.0. This tool gives you a major say in the design process of your own coasters. In a nutshell, this application offers you:

  • a fun and easy-to-use design interface
  • cool patterns in no-time
  • infinite design possibilities
  • an option to order your designs online (coming soon)

At the moment you can already design, log in and save designs you make. Very soon the order system will be up and running, allowing you to order your favorite design(s)!

coaster_screenshot

Click the screenshot to start designing or read on for some examples of what you can create with this tool.

Feb08

Preparations for Dutch Design Week

~ studio:ludens @ 15:24 Europe/Amsterdam

In two weeks, the Dutch Design Week (DDW) will be raging through Eindhoven. From October the 20th to the 28th Eindhoven will be all about design. With over a hundred events scattered around the city, it sure is going to be an event worth remembering.And of course, studio:ludens will be showing off some fresh new work. We are pushing ourselves to finish a number of first prototypes and two on-line design applications, where you can be te designer for once!

To lift up a tip of the veil: the theme of this year’s exhibition by studio:ludens will be light. We have been working on a number of indoor lighting objects that are quite out of the ordinary.