PX : code

scriptingNews by Adam Trachtenberg
Download this code


<?php
/* 
txt2xml -- Adam Trachtenberg -- 1999 
This PHP script is the subject of a UserLand Discussion Group thread on using
scripts to create XMLizations of news channels. It reads a text file formatted
with double-carriage returns, possibly containing <a href>s and simple markup
(italic or bold text for example), and parses it to produce <scriptingNews> 2.0b1
formatted file.
*/

$inputfile 'http://nirvana.userland.com/misc/myUserLandDemo/inputFile.txt'//double-carriage-return formatted file
$outputfile ''//<scriptingNews> formatted file, we're just echoing the file for now, but you could write it out
$xml "";
$indent 0;

function 
add($line) {
    global 
$xml;
    global 
$indent;
    
    
$xml .= sprintf("%'\t".$indent.'s''')."$line\r\n";
}

function 
xml_header() {
    global 
$indent;

    
//these local variables determine the contents of the <header> portion of the file
    
$copyrightholder "UserLand Software, Inc.";
    
$scriptingNewsVersion "2.0b1";
    
$pubDate gmdate('D m M Y H:i:s').' GMT'//if you use a CMS, you'll want to get this from the database
    
if (!($modified filemtime($inputfile))) { $modified time(); }
    
$lastBuildDate gmdate('D m M Y H:i:s'$modified).' GMT'//ditto
    
$channelDescription "Just a demo of what a channel might look like when automatically generated by a script.";
    
$channelLink "http://my.channel.com/editorname/";
    
$channelTitle "Just a Demo Channel";
    
$imageLink channelLink//the image is allowed to point to something different
    
$imageTitle channelTitle//ditto
    
$imageUrl "http://my.channel.com/editorname/gifs/tinyChannelImage.gif";
    
$managingEditor "you@ynh.org";
    
$webmaster "webmaster@ynh.org";
    
$language "English";
    
$imageHeight 40;
    
$imageWidth 78;
    
$imageCaption imageTitle;
    
$skipHours = array("6""7""8""9""10""11"); //a list of 6 elements
    
$skipDays = array("Sunday"); //a list of 1 element


    
add ('<?xml version="1.0"?>');
    
add ("<scriptingNews>"); $indent++;
    
add ("<header>"); $indent++;
    
$copyright "Copyright 1999";
    
$year date('Y');
    if (
$year 1999) { $copyright .= "-$year"; }
    
add ("<copyright>$copyright $copyrightholder</copyright>");
    
add ("<scriptingNewsVersion>$scriptingNewsVersion</scriptingNewsVersion>");
    
add ("<pubDate>$pubDate</pubDate>");
    
add ("<lastBuildDate>$lastBuildDate</lastBuildDate>");
    
add ("<docs>http://www.scripting.com/frontier5/xml/scriptingNews.html</docs>");
    
add ("<channelDescription>$channelDescription</channelDescription>");
    
add ("<channelLink>$channelLink</channelLink>");
    
add ("<channelTitle>$channelTitle $scriptingNewsVersion</channelTitle>");
    
add ("<imageLink>$imageLink</imageLink>");
    
add ("<imageTitle>$imageTitle</imageTitle>");
    
add ("<imageUrl>$imageUrl</imageUrl>");
    
add ("<managingEditor>$managingEditor</managingEditor>");
    
add ("<webmaster>$webmaster</webmaster>");
    
add ("<language>$language</language>");
    
add ("<imageHeight>$imageHeight</imageHeight>");
    
add ("<imageWidth>$imageWidth</imageWidth>");
    
add ("<imageCaption>$imageCaption</imageCaption>");
    
add ("<skipHours>"); $indent++;
    while (list(
$key,$hour) = each($skipHours)) {
        
add ("<hour>$hour</hour>");
    }
    
add ("</skipHours>"); $indent--;
    
add ("<skipDays>"); $indent++;
    while (list(
$key,$day) = each($skipDays)) {
        
add ("<day>$day</day>");
    }
    
add ("</skipDays>"); $indent--;
    
add ("</header>"); $indent--;
}

function 
xml_footer() {
    global 
$indent;
    
    
add ("</scriptingNews>"); $indent--;
}

function 
get_links($line) {
    
$links = array();

    while (
eregi('(<A HREF="([^"]+)">([^<]+)</A>)'$line$matches)) {
            
$links[$matches[2]] = $matches[3];
            
$line str_replace($matches[1], $matches[3], $line);
    }
    return (
$links);
}

function 
txt2xml($line) { //s contains double-carriage-return formatted text
    
global $indent;

    
$links get_links(&$line);
    
add ("<item>"); $indent++;
    
add ("<text>".htmlentities($line)."</text>");
    while (list(
$url,$linetext) = each($links)) {
        
add ("<link>"); $indent++;
        
add ("<url>".htmlentities($url)."</url>");
        
add ("<linetext>".htmlentities($linetext)."</linetext>");
        
add ("</link>"); $indent--;
    }
    
add ("</item>"); $indent--;
}

xml_header();
$fp fopen($inputfile'r');
while (
$buffer fgets($fp4096)) {
    if (
$buffer trim($buffer)) { $xml .= txt2xml($buffer); }
}
fclose($fp);
xml_footer();

echo 
$xml;
?>

Comments or questions?
PX is running PHP 5.2.17
Thanks to Miranda Productions for hosting and bandwidth.
Use of any code from PX is at your own risk.