18 agosto, 2009

URLPacks, grupos de páginas en el navegador

Tengo la mala costumbre de abrir más y más pestañas con páginas a las que quiero dedicar tiempo en algún momento y que se van acumulando hasta que se llena la barra de pestañas. Entre otros problemas, esta mañana me ha pasado que Google Chrome ha dado un error justo cuando intentaba restaurar todas las que tenía abiertas anteriormente y se ha cerrado. Al volverlo a abrir, ha aparecido una triste pestaña en blanco, algo que, por desgracia, ya me ha pasado anteriormente con Firefox. Aunque he conseguido restaurar las páginas abiertas gracias al historial, me he prometido que iba a resolver de una vez por todas el maldito problema de las pestañas y me he puesto manos a la obra.

La idea es tener una aplicación web muy ligera que acumule URLs relacionados con un tema y que se muestre como si fuese una barra de sub-pestañas. La aplicación está incluida en un único archivo PHP que realiza todas las funciones:

  • mostrar la página del grupo (get). Se muestra como una barra horizontal de enlaces que al ser pulsados cargan la página en la parte inferior, justo como si se tratase del mismo navegador. Además hay botones para limpiar la parte inferior, crear un marcador del grupo o agregar una nueva URL
  • crear un grupo nuevo (post)
  • agregar una nueva url a un grupo existente (put)
  • eliminar una URL del grupo (delete)
  • listar los grupos disponibles (list)
  • mostrar un favicon personalizado para un grupo mostrando las primeras 6 letras del título

Para almacenar la información sobre los grupos, he decidido usar un archivo ZIP de nombre "urlpacks.zip" alojado junto al archivo "urlpacks.php" que aparece a continuación. El ZIP contiene un archivo comprimido por cada grupo; el nombre coincide con el título del grupo; y el contenido son las URLs separadas por un salto de línea: Más sencillo imposible.

<?php
$id= $_GET['id'];
$action= $_GET['action'];
$url= $_GET['url'];

if($action=='') {
 if (!empty($url)) $action="post";
 else $action="list";
}

$zip = new ZipArchive();
if ($zip->open('urlpacks.zip')!==TRUE) {
    exit("cannot open urlpacks.zip\n");
}

switch ($action) {
case 'favicon':
 header('Content-type: image/png');
 $im= imagecreate(16,16);
 $color= imagecolorallocate($im, 255,255,255);
 $string= str_replace(' ','',$id);
 $font = imageloadfont('./terminal9.gdf');
 imagestring($im, $font, 1, -1, $string, imagecolorallocate($im, 0,0,0));
 imagestring($im, $font, 1, 6, substr($string,3), imagecolorallocate($im, 90,90,90));
 imagecolortransparent($im,$color);
 imagepng($im);
 imagedestroy($im);
 exit;
case 'put':
 $data= explode("\n", $zip->getFromName($id));
 array_push($data,$url);
 $zip->addFromString($id, implode("\n",$data));
 header("location:?action=get&id=".$id);
 exit;
case 'post':
 if (!$zip->getFromName($id)) $zip->addFromString($id, $url);
 header("location:?action=get&id=".$id);
 exit;
case 'delete':
 $data= explode("\n", $zip->getFromName($id));
 $key= array_search($url, $data);
 if ($key!==FALSE) array_splice($data,$key,1);
 $zip->addFromString($id, implode("\n",$data));
 header("location:?action=get&id=".$id);
 exit;
case 'list':
 echo "

index

    "; for ($i=0; $i<$zip->numFiles;$i++) { $item= $zip->statIndex($i); echo '
  • ',$item['name'],' ';
    $data= explode("\n", $zip->getFromName($item['name']));
    if (count($data)>0) {
    echo '
      '; foreach($data as $link) echo '
    1. ',$link,'
    2. '; echo '
    ';
    }
    echo '
  • '; } echo '
'; exit; default: } $zip->close(); $zip->open('urlpacks.zip'); $data= $zip->getFromName($id); $data= explode("\n", $data); if (!is_array($data)) $data= Array($zip->getFromName($id)); ?> <head> <title><?=$id?> :: URLPacks</title> <link rel="shortcut icon" href="urlpacks.php?action=favicon&id=<?=$id?>" type="image/png" /> </head> <body> <style> body { font: 9px verdana, arial, sans-serif; margin:0; background:url(/images/grid.gif); overflow:hidden !important; } .action{ text-decoration:none; color:red; font-size:15px; font-weight:bold; } li { padding:0 3px; white-space:nowrap !important; width:150px; overflow:hidden !important; border:1px outset gray; border-bottom-width:0; float:left; margin-right:2px; background:white; } li a { text-decoration:none; } li a:focus { background: yellow; } ul { top:25px; left:5px !important; position:absolute; padding-left:0 !important; } .icon { position:absolute; top:3px; width:22px; } .titulo { margin-left:90px; margin-top:-16px; font: bold 50px calibri, tahoma, verdana, arial, sans-serif ; letter-spacing:-1px; position:absolute; } iframe { border-top:1px solid black; background:white; } img { border:0; } </style> <a title="marcador para grupo <?=$id?>" href="/urlpacks.php?&id=<?=$id?>"><img src="http://www.iconfinder.net/data/icons/oxygen/22x22/actions/bookmark.png" class="icon" /></a> <a href="about:blank" target="page"><img src="http://www.sonicvisualiser.org/doc/reference/1.3/en/images/icons/erase.png" title="vaciar marco inferior" style="margin-left:24px;" class="icon" /></a> <a title="agrega nuevo enlace" class="action" href="#" onclick="if (newurl=prompt('URL','')) {location.href='?id=<?=$id?>&action=put&url='+newurl; }"><img src="http://academia.usbbog.edu.co/imagenes/add.png" style="margin-left:50px;" class="icon" /></a> <span class="titulo"><?=$id?></span> <ul><?php foreach($data as $link) { echo '
  • ',$link,'
  • '; } ?></ul> <iframe name="page" src="about:blank" style="width:100%;height:100%;margin-top:50px;" frameborder=0></iframe> </body> <?php $zip->close(); ?>

    Para crear un nuevo grupo a partir de la página actual, tengo un bookmarklet en el navegador con el siguiente código:

    javascript:id=prompt('nom',Math.random().toString().substr(2));location.href='http://servidor/urlpacks.php?id='+id+'&url='+location.href;

    En mi servidor de alojamiento funciona perfectamente y he reducido notablemente las pestañas abiertas. Espero que le sea útil a alguien más. Por cierto, he probado varias extensiones de Firefox para conseguir lo mismo, pero ahora mismo estoy usando Chrome y quería mantener yo la información de los grupos (fácilmente descargable mediante http://servidor/urlpacks.zip)

    Publicar un comentario en la entrada

    Últimos links en indiza.com