How to Add Slashdot Headlines to Your Web page

1. Copy and paste the code at the bottom of this page into Notepad. Save it as rss-get.php
2. Your Web page must end in .shtml , not .html
3. Add this code to your Web page to make the feed:

<table width="400" align="right" border=1><tr><td>
<b>
<!--#include virtual="rss-get.php" -->
</b>
</td></tr></table>




<!---

  =========================
  RSS_Get by Aaron Dunlap
  http://www.aarondunlap.com
  =========================
  aaron 'at' aarondunlap.com
  =========================
  Version 1.481 (05/04/05)

From http://scripts.ringsworld.com/web-fetching/rss-get/rss-get.php.html

-->
<?php

  #==========================
  # The following line declares how long to wait before reloading the RSS feed. 
  # Keep in mind,  many sites discourage people from pulling its feed more often than 30 minutes.
  # For example,  Slashdot.org may ban your server if it tries to load the rss feed too often.
  
  # You may change the below line.
  #==========================

  $minutes = 30; //How often to update the image. 0 indicates that image updates every time it is called (heavy strain on bandwidth & server)
 
  #==========================
  # The next line is what directory to dump the htm files generated by this script.
  # It should be relative to the location of this script,  and it *MUST* have a trailing slash if it's a seperate dir.
  # If you want the files to be dumped in the same dir as this script,  set it to ""

  # You may change the next line
  #==========================
  
  $filename = "rss/";
  
  #==========================
  # The next 4 lines are default settings for the script to use,  if they are not set prior to including this script
  # You may change the next 4 lines.
  #==========================

  $default_url = "http://rss.slashdot.org/Slashdot/slashdot/to"; //URL for the RSS/XML feed you're subscribing to.

# For testing, use $default_url = "http://samsclass.info/to"; 

  $default_displayname = "Slashdot Headlines"; //Title to appear before headlines. Should be feed-specific
  $default_number = 25; //How many headlines to display. If you set it higher than the ammount of headlines,  it will stop there
  $default_target = "_self"; //Target for headline links. Options: "_self" and "_blank"

  #==========================
  # The next line is whether or not the script should auto-update. 
  # If enabled,  the script will check to see if a newer version of this script is available and will 
  # automatically download and install it. Your current version of the script will be backed up  in your $filename 
  # directory.

  # If you have manually edited this script,  you should disable this. Otherwise,  it is recomended that you enable it.
  # Also note,  your customized settings (default_url,  default_displayname,  filename,  etc) WILL be kept during
  # auto-updates. Alterations to the actual function code (beneath) would be overwritten in an update.

  # During updates,  your existing script is backed up into the $filename directory as "backup_[date]_(time).php"

  # You may change the next line
  #==========================
  
  $autoupdate = FALSE;
  
  #==========================
  # The settings below are for advanced headline truncation.
  
  # $default_trunc is how many characters to cut off at,  
  #                the default is FALSE,  which wont truncate
  #                at all. 
  
  #                You may use $trunc when calling this script
  #                to define the truncation for specific feeds
  
  # $default_delim is what character to cut off the headline at
  #                for example,  if your headlines contain useless
  #                data at the end,  like "(via Reuters)",  setting
  #                the delimiter to "(" will stop that from showing.
  
  #                You may use $delim when calling this script
  #                to define the truncation for specific feeds
  
  #===========================

  $default_trunc = FALSE;
  $default_delim = FALSE;

  #XXXXXXXXXXXXXXXXXXXXXXXXXX
  # Everything below is functional code.

  # You should not change it unless you know what you're doing,
  # and even if you do know what you're doing,  are you sure you're
  # awake enough to do it? Maybe take a nap,  rethink things,  try again.
  #XXXXXXXXXXXXXXXXXXXXXXXXXX

  $version = 1.481;

  //If these variables aren't declared already,  use defaults.
  if (!isset($url)) { $url = $default_url; }
  if (!isset($displayname)) { $displayname = $default_displayname; }
  if (!isset($number)) { $number = $default_number; }
  if (!isset($target)) { $target = $default_target; }
  if (!isset($trunc)) { $trunc = $default_trunc; }
  if (!isset($delim)) { $delim = $default_delim; }
  

  //In-URL definitions. Cannot be used for including,  but it works great for testing.
  if (isset($_GET['url'])) { $url = $_GET['url'];}
  if (isset($_GET['number'])) { $number = $_GET['number'];}
  if (isset($_GET['displayname'])) { $displayname = $_GET['displayname'];}
  if (isset($_GET['rssHeadline'])) { $rssHeadline = $_GET['rssHeadline'];}
  $basefile = $filename; 
  $versionfile = $filename."updatelog.htm"; //File for update attempt log
  $filename .= md5($url).".htm"; //Prepare filename for htm output


  #==========================
  # Script updating. Checks to see if an update attempt has been made in 24 hours,  then goes ahead.
  #==========================
  if (((is_file($versionfile)) && (((time()-filemtime($versionfile)) >= (24 * 60 * 60))) || (!is_file($versionfile))) && ($autoupdate == TRUE)) { 
    $out = ""; 
    
    //If updatelog.htm is too big,  clear it out.
    if (filesize($versionfile) > 102400)  { unlink($versionfile); $out .= "<i>[".date("m/d/y H:i:s")."]</i> <b>Cleared update log because it was too big (>100kB)</b><hr>"; }
    
    $fd = fopen ($versionfile ,  "a+");
    $out .= "<i>[".date("m/d/y H:i:s")."]</i> Attempting to acquire latest version number: ";
    fwrite ($fd ,  $out);
      require 'http://www.aarondunlap.com/code/rss_get_version.php';

    if ((isset($latestversion)) && (isset($versionURL))) { 
        $out = "<b>Acquired!</b><br>\n <i>[".date("m/d/y H:i:s")."]</i> Comparing version numbers: ";
        fwrite ($fd ,  $out);
        if ($version < $latestversion) {
            $out = "<b>Your version ($version) is out-of-date. Updating to version $latestversion.</b><br>\n <i>[".date("m/d/y H:i:s")."]</i> Loading updated script: ";
            fwrite ($fd ,  $out);    

            //Reads the new file from my server
            if (@$newversfile = fopen($versionURL, "r")) {

                while (!feof($newversfile)) {
                     $newvers .= fgets($newversfile);
                }

                //Transfers currently existing settings onto the update.
                $newvers = str_replace("http://www.aarondunlap.com/rss.php?mode=hl", $default_url, $newvers);
                $newvers = str_replace("|| aarondunlap.com ||", $default_displayname, $newvers);
                $newvers = str_replace('$default_number = 5;', '$default_number = '.$default_number.';', $newvers);
                $newvers = str_replace('$autoupdate = TRUE;', '$autoupdate = '.$autoupdate.';', $newvers);
                $newvers = str_replace('$filename = "rss/";', '$filename = "'.$basefile.'";', $newvers);
                $newvers = str_replace('$minutes = 30;', '$minutes = '.$minutes.';', $newvers);
                $newvers = str_replace('$default_target = "_self";', '$default_target = '.$default_target.';', $newvers);
            

                $out = "<b>Opened</b><br>\n <i>[".date("m/d/y H:i:s")."]</i> Checking write-access in directory: ";
                fwrite ($fd ,  $out);

                //Checks to make sure we can write in this directory
                if (is_writable(getcwd())) {
                    $out = "<b>Writable!</b><br>\n <i>[".date("m/d/y H:i:s")."]</i> Writing new version to temporary file: ";
                    fwrite ($fd ,  $out);

                    $outfile = fopen("rss_get_temp.txt", "w+");
                    fwrite($outfile,  $newvers);
                    fclose($outfile);
                    $out = "<b>Written.</b><br>\n<i>[".date("m/d/y H:i:s")."]</i> Backing up outdated file in $basefile directory:";
                    fwrite ($fd ,  $out);
                    

                    //Backs up the current script (this one) into the rss folder                     
                    if (!copy("rss_get.php", $basefile."backup_".date("m-d-y_(H.i)").".php")) {
                        $out = "<b>Failed.</b><hr>\n";
                        fwrite ($fd ,  $out);
                        fclose($fd);
                    } else {
                        $out = "<b>Moved.</b><br>\n<i>[".date("m/d/y H:i:s")."]</i> Replacing script with new version:";
                        fwrite ($fd ,  $out);

                        //Renames the temp file as this file,  effectively replacing it.
                        if (@!rename("rss_get_temp.txt", "rss_get.php")) {
  /*Dude,  look at these if blocks!*/            $out = "<b>Failed.</b><hr>\n";
                            fwrite ($fd ,  $out);
                            fclose($fd);
                        } else {
                            chmod("rss_get.php", 774);
                            $out = "<b>Replaced</b><br>\n<i>[".date("m/d/y H:i:s")."]</i><b> RSS_GET updating complete. </b>\n<br><i>[".date("m/d/y H:i:s")."]</i><b>Version note from author:</b>".$message."<hr>\n";
                            fwrite ($fd ,  $out);
                            fclose($fd);
                        } 
    
                    }
    
                } else {
                    $out = "<b>Not Writable.</b><hr>\n";
                    fwrite ($fd ,  $out);
                    fclose($fd);                
                }
                
            } else { 
                $out = "<b>Failed.</b><hr>\n";
                fwrite ($fd ,  $out);
                fclose($fd);
            }
        } else {
            $out = "<b>Your version is current</b><hr>\n";
            fwrite ($fd ,  $out);    
        }
        
    } else {     
        $out = "<b>Failed.</b><hr>\n";
        fwrite ($fd ,  $out);
        fclose($fd);
     }
 } // That's a lot of elses! Alright,  we're done with the update thing.
  



  #==========================
  # Check the modify time of the htm file for this feed,  and see if it's too new to reload the feed.
  # If the file is too new,  it loads the htm file. This stops the script from constantly pulling the feed.
  #==========================

  if (($minutes > 0) && (is_file($filename)) && (((time()-filemtime($filename)) < ($minutes * 60)))) { 
      include $filename;
    $time = floor((time()-filemtime($filename)) / 60); //See how many "minutes ago" the file was made.
    echo "<br><i><span class=\"updated\">Updated $time minutes ago.</span></i>"; //Include "minutes ago" after output.
       
  } elseif (@fopen($url, "r")) { //Makes sure the file can actually be accessed.

        #==========================
      # If we're down here,  it means that the feed needs to be reloaded.
      #==========================

      $rssHandle = fopen($url, "r") ; // Open the rss file for reading 

      while (!feof($rssHandle)) {
          $rssData .= fgets($rssHandle);
      }

      #==========================
      # Feed parsing
      #==========================
      $tag = "item ";
      $rssData =  preg_replace("/<" . $tag . "(.|\s)*?>/", "<item>", $rssData);
      $rssData = chop($rssData); // Strip any whitespace from the end of the string    

# ********* space removed in next line by sam, in the first string, it was originally "[\r, \n]"
      $rssData = ereg_replace("[\r,\n]",  "",  $rssData); //Clear line breaks

      $rssData = strstr($rssData, "<item>"); //Remove everything before <item>.

      #==========================
      # Strip specific tags and their content from the feed,  to lighten the strain on the processor.

      # Currently,  only the <description></description> tags are stripped,  we don't need them and sometimes
      # they are REALLY long,  getting rid of them now makes it easier to parse later.
      #==========================      
      $tags_and_content_to_strip = Array("description");

      foreach ($tags_and_content_to_strip as $tag) {
           $rssData = preg_replace("/<" . $tag . ">(.|\s)*?<\/" . $tag . ">/", "", $rssData);
      }

      $rssData = str_replace("<item>", "",  $rssData); //Remove <item> itself

      $rssData = urldecode($rssData); //Replace any silly %20-type characters with their readable replacement.
      $rssData = str_replace(strstr("</channel>", $rssData), "", $rssData);
      $rssArray = explode("</item>", $rssData); //Creates an Array from all the headlines
  
        $title = array();
      $link = array();

      #==========================
      # This loop creates an array for links and another for titles.
      #==========================  
      $x = 0;
      while($x < $number) {
          $link[$x] = strstr($rssArray[$x], "<link>"); //Remove everything before <link>
        $link[$x] = ereg_replace("<link>", "", $link[$x]); 
    
         $link[$x] = str_replace(strstr($link[$x], "</link>"), "", $link[$x]);
         $link[$x] = trim($link[$x]);

        $title[$x] = strstr($rssArray[$x], "<title>");
          $title[$x] = ereg_replace("<title>", "", $title[$x]); // Remove the leading <title> tags from the selected headline
          $title[$x] = str_replace(strstr($title[$x], "</title>"), "", $title[$x]); //  Remove </title> and anything after it

           $title[$x] = trim($title[$x]);
        
        if ($trunc != FALSE) { $title[$x] = str_replace(substr($title[$x], $trunc), "", $title[$x]); }
        if ($delim != FALSE) { $title[$x] = str_replace(strstr($title[$x], $delim), "", $title[$x]); }
        
            if ($title[$x] == "") { $number = $x; break; } //If there are no more headlines,  reset $number to the max.
        $x++;
      }

      #==========================
      # Writing the file
      #==========================
      $fp = fopen($filename,  "w+"); 
      $x=0;  
      fwrite($fp, "<b><span class=\"displayname\">$displayname</span></b> \n"); //Write the displayname to the file

      while ($x < $number) { //This loop writes each line individualy.

# ****** SAM CHANGED FORMATTING HERE
          fwrite($fp, "<br>\n<a class=\"headlinellink\" target=\"$target\" href=\"$link[$x]\">$title[$x]</a><br>");
        $x++;
      }
     fclose($fp);
     include $filename;
     echo "<br><i><span class=\"updated\">Live.</span></i>";

 } else { 
    #==========================
    # Error handling:
    # (rss url given is unreadable)
    #==========================
    echo "<b>Could not connect to $url. </b>"; 

}

?>

--Sam Bowne 3-22-09