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> </td><td>");
$end = strpos($pgdata, "<tr><td align=right valign=top><b>Concept:</b> </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 listaereg("<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(" ","",$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); ?>