Chron.com Headlines/Links

The following are headlines from the major sections of the Houston Chronicle website, and links to columnist archives. The Chron.com news page only offers a partial collection of headlines from each section, but since the site provides free RSS feeds, it was easy enough to generate this sort of page, begging the question of why Chron.com hasn't listened to readers and done one themselves. It's also not clear why the Opinion page or the Nation and World news pages don't get an RSS feed.


HOUSTON AND TEXAS

createOption('Cachedir','Directory where to put the cached data (relative from MEDIADIR)','text','rsscache/'); $this->createOption('Titlediv','Classname for the titleDiv item-title','text','feedTitle'); $this->createOption('Linkdiv', 'Classname for the links when shown seperatly','text','feedLink'); $this->createOption('Descriptiondiv','Classname for the description in de feed','text','feedDesc'); $this->createOption('cacheTime','Time before cache gets refreshed','text','60'); $this->createOption('showLogoAndTitle','Should we include the sites meta data as logo and title?','yesno','yes'); $this->createOption('target','If filled with anyname all links will include target="anyname" (can be _blank)','text',''); $this->createOption('linktext','text visible for "read whole item" only for type 2 and 4 calls','text','[read on]'); $this->createOption('showFeedNotAvail','Should we give warning to a unavailbale feed?','yesno','yes'); } function doSkinVar($skintype, $newsfeedURL, $what = 1, $amount = 10) { global $manager, $blog, $CONF, $i; // go get the requested newsfeed. $feed = $this->readFeed($newsfeedURL); $titlediv = $this->getOption(Titlediv); $linkdiv = $this->getOption(Linkdiv); $descriptiondiv = $this->getOption(Descriptiondiv); $target = $this->getOption(target); $linktext = $this->getOption(linktext); if (!$feed) { if ($this->getOption('showFeedNotAvail') == 'yes') echo "

Feed temporarily unavailable
\n"; return; } // Now insert the newsfeed in your weblog // what. 1 Headlines only; headline = link // 2 Headlines + link apart // 3 Headlines, headline = link + description // 4 Headlines, link and description if ($this->getOption(showLogoAndTitle) == "yes") $i = 0; else { $i = 1; $amount = $amount+1; } foreach ( $feed as $feeditem ) { if ($i <= $amount) { $linkUrl = " "" ) { $linkUrl .= " target=\"".$target."\""; } $linkUrl .= ">" . stripslashes($feeditem[ "title" ]) .""; } if (($what % 2) == 0) { if ($target <> "" ) { $linkUrl .= " target=\"" . $target . "\""; } $linkUrl .= "\">" .$linktext.""; } // well we have the linkUrl at last ;-) all those options make it a mess !! if ($i == 0 && $feeditem[ "sitetitle"] <> "" ) { echo "
". stripslashes($feeditem[ "sitetitle" ]) ."
"; if ($feeditem[ "url" ] <> "") { echo "\""."; } } else if ($what == 1 || $what == 3) { echo "
" .$linkUrl."
\n"; } else { echo "
". $feeditem[ "title" ] ."
"; echo "
" . $linkUrl ."
\n"; } if ($what == 3 || $what == 4) { echo "
" . stripslashes($feeditem[ "description" ]) . "
\n"; } $i++; } } } function isCurrent($filename, $minutes) { return ceil((time() - filemtime($filename)) / 60) < $minutes; } function readFeed($feedURL) { // which URL to get global $manager, $blog, $saxparser, $CONF, $contents, $cache_age, $cache_time, $cache_path, $last_modified_time, $DIR_MEDIA; // get the cache path $cache_path = $this->getOption(Cachedir); $cache_time = $this->getOption(cacheTime); $feedURL_parts = parse_url($feedURL); $path = isset($feedURL_parts["path"]) ? $feedURL_parts["path"] : "/"; $filename = isset($feedURL_parts["host"]) ? $feedURL_parts["host"] : "feedfile"; $unique = isset($feedURL_parts["query"]) ? $feedURL_parts["query"] : ""; $filename = $filename . $path . $unique; $filename = str_replace("/","_",$filename); $filename = $DIR_MEDIA.$cache_path.$filename; $writedir = $DIR_MEDIA.$cache_path; $contents = ""; $data = ""; // create cache dir if non-excistent if (!@is_dir($writedir)){ if (!@mkdir($writedir, 0777)) return _ERROR_BADPERMISSIONS; } if (!file_exists($filename) || (file_exists($filename) && !$this->isCurrent($filename, $cache_time))) { $tag = ""; $isItem = false; $i = 0; unset($saxparser); $saxparser = xml_parser_create(); xml_parser_set_option($saxparser, XML_OPTION_CASE_FOLDING, false); xml_set_element_handler($saxparser, 'sax_start', 'sax_end'); xml_set_character_data_handler($saxparser, 'sax_data'); if (!function_exists('sax_start')) { function sax_start($parser, $name, $attribs) { global $tag, $isItem, $i, $isChannel; switch ($name){ case "channel": $i++; $isChannel = true; break; case "item": $i++; $isItem = true; break; case "image"; case "url"; case "docs"; case "language"; case "generator"; case "copyright"; case "title": case "link": case "pubDate"; case "description": case "author"; case "category": case "guid": if ($isItem || $isChannel) $tag = $name; break; default: $isItem = false; $isChannel = false; break; } } } if (!function_exists('sax_end')) { function sax_end($parser, $name) { } } if (!function_exists('sax_data')) { function sax_data($parser, $data) { global $tag, $isItem, $contents, $isChannel, $i; if ($data != "\n" && $isItem) { switch ($tag) { case "title"; case "link": case "description": (!isset($contents[$i-1][$tag]) || !strlen($contents[$i-1][$tag])) ? $contents[$i-1][$tag] = addslashes($data) : $contents[$i-1][$tag].= addslashes($data); break; } } else if ($data != "\n" && $isChannel) { switch ($tag) { case "title"; if ($tag == "title") {$tag = "sitetitle";} (!isset($contents[$i-1][$tag]) || !strlen($contents[$i-1][$tag])) ? $contents[$i-1][$tag] = addslashes($data) : $contents[$i-1][$tag] = addslashes($data); break; case "url": case "image": if ($tag == "title") {$tag = "sitetitle";} (!isset($contents[$i-1][$tag]) || !strlen($contents[$i-1][$tag])) ? $contents[$i-1][$tag] = addslashes($data) : $contents[$i-1][$tag] .= addslashes($data); break; } } } } $fp = fopen($feedURL, "r"); while ($data = fread($fp, 4096)) { $parsedOkay = xml_parse($saxparser, $data, feof($fp)); if (!$parsedOkay && xml_get_error_code($saxparser) != XML_ERROR_NONE) { die("XML Error in File: ".xml_error_string(xml_get_error_code($saxparser)). " at line ".xml_get_current_line_number($saxparser)); } } xml_parser_free($saxparser); fclose($fp); $cache = @fopen($filename, "w"); if ($cache) { fwrite($cache, serialize($contents)); fclose($cache); } $cache_age = 0; } else { $cache_age = ceil((time() - filemtime($filename)) / 60); $fp = @fopen($filename, "r"); if ($fp) { $data = fread($fp, filesize($filename)); } fclose($fp); $contents = unserialize($data); } return $contents; } } ?>


SPORTS

createOption('Cachedir','Directory where to put the cached data (relative from MEDIADIR)','text','rsscache/'); $this->createOption('Titlediv','Classname for the titleDiv item-title','text','feedTitle'); $this->createOption('Linkdiv', 'Classname for the links when shown seperatly','text','feedLink'); $this->createOption('Descriptiondiv','Classname for the description in de feed','text','feedDesc'); $this->createOption('cacheTime','Time before cache gets refreshed','text','60'); $this->createOption('showLogoAndTitle','Should we include the sites meta data as logo and title?','yesno','yes'); $this->createOption('target','If filled with anyname all links will include target="anyname" (can be _blank)','text',''); $this->createOption('linktext','text visible for "read whole item" only for type 2 and 4 calls','text','[read on]'); $this->createOption('showFeedNotAvail','Should we give warning to a unavailbale feed?','yesno','yes'); } function doSkinVar($skintype, $newsfeedURL, $what = 1, $amount = 10) { global $manager, $blog, $CONF, $i; // go get the requested newsfeed. $feed = $this->readFeed($newsfeedURL); $titlediv = $this->getOption(Titlediv); $linkdiv = $this->getOption(Linkdiv); $descriptiondiv = $this->getOption(Descriptiondiv); $target = $this->getOption(target); $linktext = $this->getOption(linktext); if (!$feed) { if ($this->getOption('showFeedNotAvail') == 'yes') echo "

Feed temporarily unavailable
\n"; return; } // Now insert the newsfeed in your weblog // what. 1 Headlines only; headline = link // 2 Headlines + link apart // 3 Headlines, headline = link + description // 4 Headlines, link and description if ($this->getOption(showLogoAndTitle) == "yes") $i = 0; else { $i = 1; $amount = $amount+1; } foreach ( $feed as $feeditem ) { if ($i <= $amount) { $linkUrl = " "" ) { $linkUrl .= " target=\"".$target."\""; } $linkUrl .= ">" . stripslashes($feeditem[ "title" ]) .""; } if (($what % 2) == 0) { if ($target <> "" ) { $linkUrl .= " target=\"" . $target . "\""; } $linkUrl .= "\">" .$linktext.""; } // well we have the linkUrl at last ;-) all those options make it a mess !! if ($i == 0 && $feeditem[ "sitetitle"] <> "" ) { echo "
". stripslashes($feeditem[ "sitetitle" ]) ."
"; if ($feeditem[ "url" ] <> "") { echo "\""."; } } else if ($what == 1 || $what == 3) { echo "
" .$linkUrl."
\n"; } else { echo "
". $feeditem[ "title" ] ."
"; echo "
" . $linkUrl ."
\n"; } if ($what == 3 || $what == 4) { echo "
" . stripslashes($feeditem[ "description" ]) . "
\n"; } $i++; } } } function isCurrent($filename, $minutes) { return ceil((time() - filemtime($filename)) / 60) < $minutes; } function readFeed($feedURL) { // which URL to get global $manager, $blog, $saxparser, $CONF, $contents, $cache_age, $cache_time, $cache_path, $last_modified_time, $DIR_MEDIA; // get the cache path $cache_path = $this->getOption(Cachedir); $cache_time = $this->getOption(cacheTime); $feedURL_parts = parse_url($feedURL); $path = isset($feedURL_parts["path"]) ? $feedURL_parts["path"] : "/"; $filename = isset($feedURL_parts["host"]) ? $feedURL_parts["host"] : "feedfile"; $unique = isset($feedURL_parts["query"]) ? $feedURL_parts["query"] : ""; $filename = $filename . $path . $unique; $filename = str_replace("/","_",$filename); $filename = $DIR_MEDIA.$cache_path.$filename; $writedir = $DIR_MEDIA.$cache_path; $contents = ""; $data = ""; // create cache dir if non-excistent if (!@is_dir($writedir)){ if (!@mkdir($writedir, 0777)) return _ERROR_BADPERMISSIONS; } if (!file_exists($filename) || (file_exists($filename) && !$this->isCurrent($filename, $cache_time))) { $tag = ""; $isItem = false; $i = 0; unset($saxparser); $saxparser = xml_parser_create(); xml_parser_set_option($saxparser, XML_OPTION_CASE_FOLDING, false); xml_set_element_handler($saxparser, 'sax_start', 'sax_end'); xml_set_character_data_handler($saxparser, 'sax_data'); if (!function_exists('sax_start')) { function sax_start($parser, $name, $attribs) { global $tag, $isItem, $i, $isChannel; switch ($name){ case "channel": $i++; $isChannel = true; break; case "item": $i++; $isItem = true; break; case "image"; case "url"; case "docs"; case "language"; case "generator"; case "copyright"; case "title": case "link": case "pubDate"; case "description": case "author"; case "category": case "guid": if ($isItem || $isChannel) $tag = $name; break; default: $isItem = false; $isChannel = false; break; } } } if (!function_exists('sax_end')) { function sax_end($parser, $name) { } } if (!function_exists('sax_data')) { function sax_data($parser, $data) { global $tag, $isItem, $contents, $isChannel, $i; if ($data != "\n" && $isItem) { switch ($tag) { case "title"; case "link": case "description": (!isset($contents[$i-1][$tag]) || !strlen($contents[$i-1][$tag])) ? $contents[$i-1][$tag] = addslashes($data) : $contents[$i-1][$tag].= addslashes($data); break; } } else if ($data != "\n" && $isChannel) { switch ($tag) { case "title"; if ($tag == "title") {$tag = "sitetitle";} (!isset($contents[$i-1][$tag]) || !strlen($contents[$i-1][$tag])) ? $contents[$i-1][$tag] = addslashes($data) : $contents[$i-1][$tag] = addslashes($data); break; case "url": case "image": if ($tag == "title") {$tag = "sitetitle";} (!isset($contents[$i-1][$tag]) || !strlen($contents[$i-1][$tag])) ? $contents[$i-1][$tag] = addslashes($data) : $contents[$i-1][$tag] .= addslashes($data); break; } } } } $fp = fopen($feedURL, "r"); while ($data = fread($fp, 4096)) { $parsedOkay = xml_parse($saxparser, $data, feof($fp)); if (!$parsedOkay && xml_get_error_code($saxparser) != XML_ERROR_NONE) { die("XML Error in File: ".xml_error_string(xml_get_error_code($saxparser)). " at line ".xml_get_current_line_number($saxparser)); } } xml_parser_free($saxparser); fclose($fp); $cache = @fopen($filename, "w"); if ($cache) { fwrite($cache, serialize($contents)); fclose($cache); } $cache_age = 0; } else { $cache_age = ceil((time() - filemtime($filename)) / 60); $fp = @fopen($filename, "r"); if ($fp) { $data = fread($fp, filesize($filename)); } fclose($fp); $contents = unserialize($data); } return $contents; } } ?>


BUSINESS

createOption('Cachedir','Directory where to put the cached data (relative from MEDIADIR)','text','rsscache/'); $this->createOption('Titlediv','Classname for the titleDiv item-title','text','feedTitle'); $this->createOption('Linkdiv', 'Classname for the links when shown seperatly','text','feedLink'); $this->createOption('Descriptiondiv','Classname for the description in de feed','text','feedDesc'); $this->createOption('cacheTime','Time before cache gets refreshed','text','60'); $this->createOption('showLogoAndTitle','Should we include the sites meta data as logo and title?','yesno','yes'); $this->createOption('target','If filled with anyname all links will include target="anyname" (can be _blank)','text',''); $this->createOption('linktext','text visible for "read whole item" only for type 2 and 4 calls','text','[read on]'); $this->createOption('showFeedNotAvail','Should we give warning to a unavailbale feed?','yesno','yes'); } function doSkinVar($skintype, $newsfeedURL, $what = 1, $amount = 10) { global $manager, $blog, $CONF, $i; // go get the requested newsfeed. $feed = $this->readFeed($newsfeedURL); $titlediv = $this->getOption(Titlediv); $linkdiv = $this->getOption(Linkdiv); $descriptiondiv = $this->getOption(Descriptiondiv); $target = $this->getOption(target); $linktext = $this->getOption(linktext); if (!$feed) { if ($this->getOption('showFeedNotAvail') == 'yes') echo "

Feed temporarily unavailable
\n"; return; } // Now insert the newsfeed in your weblog // what. 1 Headlines only; headline = link // 2 Headlines + link apart // 3 Headlines, headline = link + description // 4 Headlines, link and description if ($this->getOption(showLogoAndTitle) == "yes") $i = 0; else { $i = 1; $amount = $amount+1; } foreach ( $feed as $feeditem ) { if ($i <= $amount) { $linkUrl = " "" ) { $linkUrl .= " target=\"".$target."\""; } $linkUrl .= ">" . stripslashes($feeditem[ "title" ]) .""; } if (($what % 2) == 0) { if ($target <> "" ) { $linkUrl .= " target=\"" . $target . "\""; } $linkUrl .= "\">" .$linktext.""; } // well we have the linkUrl at last ;-) all those options make it a mess !! if ($i == 0 && $feeditem[ "sitetitle"] <> "" ) { echo "
". stripslashes($feeditem[ "sitetitle" ]) ."
"; if ($feeditem[ "url" ] <> "") { echo "\""."; } } else if ($what == 1 || $what == 3) { echo "
" .$linkUrl."
\n"; } else { echo "
". $feeditem[ "title" ] ."
"; echo "
" . $linkUrl ."
\n"; } if ($what == 3 || $what == 4) { echo "
" . stripslashes($feeditem[ "description" ]) . "
\n"; } $i++; } } } function isCurrent($filename, $minutes) { return ceil((time() - filemtime($filename)) / 60) < $minutes; } function readFeed($feedURL) { // which URL to get global $manager, $blog, $saxparser, $CONF, $contents, $cache_age, $cache_time, $cache_path, $last_modified_time, $DIR_MEDIA; // get the cache path $cache_path = $this->getOption(Cachedir); $cache_time = $this->getOption(cacheTime); $feedURL_parts = parse_url($feedURL); $path = isset($feedURL_parts["path"]) ? $feedURL_parts["path"] : "/"; $filename = isset($feedURL_parts["host"]) ? $feedURL_parts["host"] : "feedfile"; $unique = isset($feedURL_parts["query"]) ? $feedURL_parts["query"] : ""; $filename = $filename . $path . $unique; $filename = str_replace("/","_",$filename); $filename = $DIR_MEDIA.$cache_path.$filename; $writedir = $DIR_MEDIA.$cache_path; $contents = ""; $data = ""; // create cache dir if non-excistent if (!@is_dir($writedir)){ if (!@mkdir($writedir, 0777)) return _ERROR_BADPERMISSIONS; } if (!file_exists($filename) || (file_exists($filename) && !$this->isCurrent($filename, $cache_time))) { $tag = ""; $isItem = false; $i = 0; unset($saxparser); $saxparser = xml_parser_create(); xml_parser_set_option($saxparser, XML_OPTION_CASE_FOLDING, false); xml_set_element_handler($saxparser, 'sax_start', 'sax_end'); xml_set_character_data_handler($saxparser, 'sax_data'); if (!function_exists('sax_start')) { function sax_start($parser, $name, $attribs) { global $tag, $isItem, $i, $isChannel; switch ($name){ case "channel": $i++; $isChannel = true; break; case "item": $i++; $isItem = true; break; case "image"; case "url"; case "docs"; case "language"; case "generator"; case "copyright"; case "title": case "link": case "pubDate"; case "description": case "author"; case "category": case "guid": if ($isItem || $isChannel) $tag = $name; break; default: $isItem = false; $isChannel = false; break; } } } if (!function_exists('sax_end')) { function sax_end($parser, $name) { } } if (!function_exists('sax_data')) { function sax_data($parser, $data) { global $tag, $isItem, $contents, $isChannel, $i; if ($data != "\n" && $isItem) { switch ($tag) { case "title"; case "link": case "description": (!isset($contents[$i-1][$tag]) || !strlen($contents[$i-1][$tag])) ? $contents[$i-1][$tag] = addslashes($data) : $contents[$i-1][$tag].= addslashes($data); break; } } else if ($data != "\n" && $isChannel) { switch ($tag) { case "title"; if ($tag == "title") {$tag = "sitetitle";} (!isset($contents[$i-1][$tag]) || !strlen($contents[$i-1][$tag])) ? $contents[$i-1][$tag] = addslashes($data) : $contents[$i-1][$tag] = addslashes($data); break; case "url": case "image": if ($tag == "title") {$tag = "sitetitle";} (!isset($contents[$i-1][$tag]) || !strlen($contents[$i-1][$tag])) ? $contents[$i-1][$tag] = addslashes($data) : $contents[$i-1][$tag] .= addslashes($data); break; } } } } $fp = fopen($feedURL, "r"); while ($data = fread($fp, 4096)) { $parsedOkay = xml_parse($saxparser, $data, feof($fp)); if (!$parsedOkay && xml_get_error_code($saxparser) != XML_ERROR_NONE) { die("XML Error in File: ".xml_error_string(xml_get_error_code($saxparser)). " at line ".xml_get_current_line_number($saxparser)); } } xml_parser_free($saxparser); fclose($fp); $cache = @fopen($filename, "w"); if ($cache) { fwrite($cache, serialize($contents)); fclose($cache); } $cache_age = 0; } else { $cache_age = ceil((time() - filemtime($filename)) / 60); $fp = @fopen($filename, "r"); if ($fp) { $data = fread($fp, filesize($filename)); } fclose($fp); $contents = unserialize($data); } return $contents; } } ?>


SECTIONS WITHOUT RSS FEEDS

Corrections
National News
World News
Opinion
Life/Lifestyle & Features/ * /STAR/You Pick A Name!


CHRONICLE COLUMNISTS

METROPOLITAN
Rick Casey
Kristen Mack
Move It!

SPORTS
David Barron
Norman Chad
Richard Justice
John P. Lopez
John McClain

OUTDOORS
Joe Doggett
Doug Pike
Shannon Tompkins

FEATURES
Alison Cook
Leon Hale
Shelby Hodge
Ken Hoffman
Kathy Huber
Michael Lonsford
Joy Sewing

BUSINESS
Ronald Lipman
Nancy Sarnoff
L.M. Sixel
Loren Steffy

OPINION
Cragg Hines
Clay Robison

TECHNOLOGY
Jay Lee
Dwight Silverman

TRAVEL
Harry Shattuck