ir a dada newsfeed! (inglés)

<?

//dada newsfeed: 2003 by eugenio tisselli

//este programa es el sistema de reglas que generan a dada newsfeed.
//es una colección de funciones y procedimientos que instruyen
//al ordenador para realizar la siguiente tarea:
//1. tomar un titular aleatorio de un servidor de noticias actuales
//2. tomar una imagen aleatoria de un banco de imágenes, basada en una palabra tomada aleatoriamente del titular
//3. combinar estos dos elementos en un "web-collage" y mostrarlos en una página
//4. si el usuario hace click en la imagen, un nuevo titular y su respectiva imagen son desplegados
//5. si el usuario hace click en el titular, se despliega una nueva imagen, y el titular se transforma,
//el ordenador intenta obtener un sinónimo para cada una de las palabras del titular.
//estos sinónimos se toman de un diccionario de sinónimos en internet. si no se encuentra
//un sinónimo, se preserva la palabra original.

//a veces dada newsfeed tarda demasiado, o se cansa...
//si esto sucede, no hay que preocuparse: solamente hay que
//hacer click en el botón "refrescar" del navegador...
//dada newsfeed no tiene nada que ver con rapidez o eficiencia,
//aunque en ocasiones lo intenta!

//a lo largo del código hay comentarios, de forma que incluso los
//no-programadores pueden echar un vistazo a lo que está
//ocurriendo. para ver el código en acción, hacer click en los
//enlaces titulados ir a dada newsfeed!

//escrito en php
//este código es libre para ser usado y modificado

//
//getSynonym: esta función recibe una palabra como parámetro (en inglés)
//y regresa un sinónimo proveniente del servidor
//thesaurus.reference.com
//si no se encuentra un sinónimo, se regresa una cadena vacía.
//

function getSynonym($word) {

$synonym = "";
$thesaurus="http://thesaurus.reference.com/search?q=$word"; //url del diccionario de sinónimos, intenta encontrar la palabra "$word"

$fd = fopen($thesaurus,"r"); //abrir la página de sinónimos
while(!feof($fd)) {

$pgdata .= fread($fd, 5000); //lee sinónimos
$start = strpos($pgdata, "<tr><td align=right valign=top><b>Synonyms:</b>&nbsp;&nbsp;</td><td>");
$end = strpos($pgdata, "<tr><td align=right valign=top><b>Concept:</b>&nbsp;&nbsp;</td>");
$size= $end-$start;

$synonym = strip_tags(substr($pgdata, $start, $size)); //obtener sinónimos para la palabra especificada
$synonym = ereg_replace ("Synonyms:", "", $synonym);

$words = explode(",",$synonym); //poner los sinónimos en una lista

if (sizeof($words)>0) {

$synonym = $words[rand(0,sizeof($words)-1)]; //obtener un elemento aleatorio de la lista

} else {

$synonym = ""; //no hay sinónimos, regresar una cadena vacía

}
if (strpos($synonym,"Antonyms:") > 0) {

$synonym = ""; //a veces se encuentra un antónimo...

}

}
return $synonym;

}

//
//NumGen: Esta función regresa un número aleatorio
//con un número de dígitos especificado por el parámetro 'length'
//

function NumGen($length){

for ($i = 1; $i <= $length; $i++) {

if ($i == 1)

$randnum = rand(0, 9);

else

$randnum .= rand(0, 9);

}

return $randnum;

}

//
//Multi_strpos: regresa un arreglo con todas las ocurrencias
//de un patrón dentro de una cadena de texto
//

function Multi_strpos($pattern, $sequence)
{
$n = -1;
while (ereg($pattern, $sequence)) {

$n++;
$fragment = split($pattern, $sequence);
$trimsize = (strlen($fragment[0]))+1; $sequence = "*".substr($sequence, $trimsize);
$position[$n] = (strlen($fragment[0]) + $position[($n-1)]);

}

return $position;

}

//
//getImageFromWord: Esta función regresa
//la URL de una imagen, obtenida gracias a el buscador de imágenes de google o altavista
//

function getImageFromWord($word_image) {

$imageUrl = "";
$source="http://images.google.com/images?q=".$word_image;
$fd = fopen($source,"r"); //abrir el buscador de imágenes de google
while(!feof($fd)) {

$pgdata .= fread($fd, 5000); //leer resultados de google

}

$arr_image = Multi_strpos("\/images\?q\=tbn\:",$pgdata); //obtener las posiciones de los URLs de las imágenes
$start = $arr_image[rand(0,sizeof($arr_image))]; //obtener una sola de las imágenes
$end = strpos($pgdata, "&", $start);
$size = $end-$start;

if ($size > 0) {

$imageUrl = "<img src=\"http://images.google.com".urldecode(substr($pgdata,$start,$size)); //extraer el URL de la imagen
//si el archivo de imagen no es válido, obtener una imagen aleatoria del buscador de altavista

$image_info = @getimagesize("http://images.google.com".substr($pgdata,$start,$size));
$x_size=$image_info[0];
$y_size=$image_info[1];
$type=$image_info[2];
if ($x_size <= 0 || $y_size <= 0 || $type == 0) {

$imageUrl = "<img src=http://thm-br1r2.search.vip.scd.yahoo.com/image/21".NumGen(7)." height=345 width=345>";

} else {

$img_width = $x_size * 3;
$img_height = $y_size * 3;
$imageUrl .= "\" width=$img_width height=$img_height>";

}

}

return $imageUrl;

}

//
//aquí comienza todo:
//


//si no hay un titular actual, obtener uno
if (!isset($story)) {

$source = "Top stories"; //categoría de noticias de moreover.com
$urlfeed = "http://p.moreover.com/cgi-local/page?c=".rawurlencode($source)."&o=xml"; //obtener noticias de moreover.com

$xml = fopen($urlfeed,"r");

if(!$xml)die("Connect to newssource failed.");

$xmldata = fread($xml ,640000);
eregi("(<article id.*>.*</article>)", $xmldata ,$articlearray); //obtener todos los titulares
$articles = explode("<article", $articlearray[0]); //y ponerlos en una lista

ereg("<headline_text>(.*)</headline_text>",$articles[rand(1,sizeof($articles))], $headline); //obtener un titular aleatorio
$story = $headline[1];
$story = stripslashes($story); //quitar caracteres no deseados

}

//tenemos un titular, ahora queremos
//obtener sinónimos para cada palabra

$words = explode(" ",$story); //poner las palabras del titular en una lista

if (isset($repeat)) {

for ($i=0; $i<sizeof($words); $i++) { //repite esta operación para cada palabra

$words[$i] = stripslashes($words[$i]); //quitar caracteres no deseados

//la siguiente instrucción excluye las palabras con menos de 3 letras y
//algunas otras palabras específicas. esto se hace para mantener una estructura
//básica del titular, y no transformarlo demasiado. estas reglas pueden ser modificadas,
//e incluso se pueden introducir nuevas. las palabras excluidas son arbitrarias, simplemente
//voy añadiendo nuevas de tanto en tanto
//esto podría hacerse de forma mas elegante, utilizando una lista de "palabras excluidas",
//por ejemplo...

if ((strlen($words[$i]) > 2) && ($words[$i] != "for") && ($words[$i] != "the") && ($words[$i] != "and") && ($words[$i] != "but") && ($words[$i] != "from") && ($words[$i] != "with")) {

$synonym = trim(getSynonym($words[$i])); //si la palabra califica, obtener un sinónimo
if ($synonym != "") {

$words[$i] = eregi_replace("&nbsp;","",$synonym); //quitar espacios en blanco

}
//si no se encontró un sinónimo, se preserva la palabra original

}

}

}

$story = implode(" ",$words); //ahora, reconstruir el titular con todas las palabras
$story = ucfirst(strtolower($story)); //el primer caracter del titular es una letra mayúscula

//ahora, la imagen. tomar una imagen del buscador google, basada
//en una palabra tomada aleatoriamente del titular.
//en primer lugar, se toma la palabra aleatoria.
//para obtener imágenes mas interesantes, se prefieren las palabras largas
//NOTA: LAS IMAGENES PUEDEN TENER CONTENIDO EXPLICITO

$rand_word = "";
$counter = 0;
while ((strlen($rand_word) < 3) && ($counter < 10)) {

$rand_word = $words[rand(0,sizeof($words)-1)];
$counter++;

}

//intentar encontrar una imagen relacionada con la palabra elegida

$image = getImageFromWord($rand_word);

$link = "<a href=\"dadanewsfeed.php?story=".$story."&repeat=1\">";

//sigue código en html...

?>

<html>
<head>
<title>dadanewsfeed</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>

<body bgcolor="#000000" text="#FFFFFF" link="#FFFFFF" vlink="#FFFFFF" alink="#FFFFFF">
<div align="center">
<a href=dadanewsfeed.php><? echo $image; ?></a>
<p><font face="Courier New, Courier, mono" size="4"><? echo $link; echo $story; ?></a></font></p>
</div>
</body>
</html>

<? unset($story); ?>

ir a dada newsfeed!