nIQnutn

Le numérique libre en contre-addiction

Afficher vos liens favoris sur votre site

Il existe de nombreux outils pour partager ses liens favoris. L'un des meilleurs reste certainement Shaarli, Qwant permet également de publier des Carnets publics et il en existe de nombreux autres.

Ces solutions sont toutes intéressantes mais aucune ne permet d'intégrer facilement ses favoris sur son site web. J'ai pourtant trouvé une solution efficace pour intégrer tous mes favoris sur le site.

Cette solution nécessite seulement l'utilisation de PHP et un fichier au format Netscape bookmark contenant les liens.

  • Avantage: format de fichier répandu.
  • Inconvénient: nécessite une mise à jour manuelle du fichier.

Pour commencer, il faut exporter les liens depuis Shaarli. Rien de plus facile, il suffit de se rendre sur l'URL http://shaarli.chezmoi.com/?do=export&what=public (pour l'export des liens publics uniquement).

Ce fichier est structuré comme ceci:


code
bookmarks_shaarli.txt
<!DOCTYPE NETSCAPE-Bookmark-file-1>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=UTF-8">
<TITLE>Bookmarks</TITLE>

<H1>Bookmarks</H1>

<DT><A HREF="http://urldulien1.org" ADD_DATE="1428331499" PRIVATE="0" TAGS="tag1,tag2,tag3">Lien 1</A>
<DD>Description du lien 1
<DT><A HREF="http://urldulien2.org" ADD_DATE="1428333578" PRIVATE="1" TAGS="tag2,tag4">Lien 2</A>
<DD>Description du lien 2

On retrouve toutes les informations: le titre du lien, son URL, sa description, sa date de création, les tags associés et l'attribut privé.

Il faut maintenant l'afficher sur une page. Le code est assez basique et grandement inspiré par celui de Shaarli.


code
bookmark.php
<?php

$file = "bookmarks_shaarli.txt" ; // A MODIFIER >> Emplacement du fichier
$urlBase= "/data/documents/0007/bookmark.php" ; // A MODIFIER >> URL de la page
$nb_elem_per_page = intval(5) ; // A MODIFIER >> Nb de liens à afficher


$url=preg_replace('/(^.*?)\?/', '', $urlBase."?page") ; //  Variable  de la page à récupérer
$urlGet=$urlBase."?page"; // URL pour la navigation
$data=file_get_contents($file); // Récupère le contenu du fichier
$dateFile= date("d/m/Y", filemtime($file)) ; // Date du fichier
$type='unknown'; // Type du fichier


// Fonction startsWith
function startsWith($haystack,$needle,$case=true)
{
    if($case){return (strcmp(substr($haystack, 0, strlen($needle)),$needle)===0);}
    return (strcasecmp(substr($haystack, 0, strlen($needle)),$needle)===0);
}

// Fonction endsWith
function endsWith($haystack,$needle,$case=true)
{
    if($case){return (strcmp(substr($haystack, strlen($haystack) - strlen($needle)),$needle)===0);}
    return (strcasecmp(substr($haystack, strlen($haystack) - strlen($needle)),$needle)===0);
}


if (startsWith($data,'<!DOCTYPE NETSCAPE-Bookmark-file-1>'))  $type='netscape'; // Vérification du type de fichier: Netscape bookmark

// Si le fichier est au format Netscape bookmark, on parcourt le fichier
if ($type=='netscape') 
{ 

    $data =  (explode('<DT>',$data)) ; // Retourne un tableau avec pour chaque entrée les liens (Titre + Description + ...)  

    $page_nb = isset($_GET[$url])?intval($_GET[$url]):1;                // Numero de la page
    $number_of_pages = intval(count($data)/$nb_elem_per_page)+1;        // Nombre de pages total
    $page = isset($_GET[$url])?intval($_GET[$url]-1):0;                 

    //  Parcourt les liens depuis le XXX jusqu'au XXX 
    foreach (array_slice ($data, $page*$nb_elem_per_page, $nb_elem_per_page) as $html)
        {

                $link = array('linkdate'=>'','title'=>'','url'=>'','description'=>'','tags'=>'','private'=>0);
                $d = explode('<DD>',$html); // Retourne un tableau avec le lien (+ attibuts)   et  la description

                if (startswith($d[0],'<A '))
                        {
                                $link['description'] = (isset($d[1]) ? nl2br (html_entity_decode(trim($d[1]),ENT_QUOTES,'UTF-8')) : '');  // Récupère la description

                                preg_match('!<A .*?>(.*?)</A>!i',$d[0],$matches); 
                                $link['title'] = (isset($matches[1]) ? trim($matches[1]) : '');         
                                $link['title'] = html_entity_decode($link['title'],ENT_QUOTES,'UTF-8'); // Récupère le titre

                                $raw_add_date=0;

                                preg_match_all('! ([A-Z_]+)=\"(.*?)"!i',$html,$matches,PREG_SET_ORDER);                             
                                // Récupère les attributs et les valeurs contenu dans le lien
                                foreach($matches as $m) 
                                            { 
                                                $attr=$m[1]; $value=$m[2]; // attribut et valeur
                                                if ($attr=='HREF')          $link['url']=html_entity_decode($value,ENT_QUOTES,'UTF-8');                         // Récupère le lien
                                                elseif ($attr=='TAGS')      $link['tags']=html_entity_decode(str_replace(',',' ',$value),ENT_QUOTES,'UTF-8');   // Récupère les Tags
                                                elseif ($attr=='PRIVATE')   $link['private']=($value=='0'?0:1);                                                 // Récupère l'attibut Privé / Public 
                                                elseif ($attr=='ADD_DATE')  $raw_add_date=intval($value); $link['linkdate']=date("d/m/Y",$raw_add_date);        // Récupère   la date             
                                            }

                                // On affiche les liens     
                                if ($link['private'] == 0 )     { echo "<h2><a href=\"".$link['url']."\"  target=\"_blank\">".$link['title']."</a></h2><p>".$link['description']."</p><p>Tags: ".$link['tags']." <br /> Date: ".$link['linkdate']." </p><hr />" ; }
                                elseif ($link['private'] == 1 ) { echo "Lien privé <hr />"; }

                    }   
            }


echo "<p style=\"text-align:right ; font-size:0.9em; \">Mis à jour le: ". $dateFile."</p>"; // Affiche la date du fichier

// Pagination

}

// Message d'erreur si le format du fichier n'est pas Netscape bookmark
else { echo " File has an unknown file format. Nothing to read."; }

?>



On pourrait afficher tous les résultats d'un coup mais je préfère ajouter un menu de navigation. Pour ajouter ce menu, il suffit d'ajouter le code ci-dessous.


code
menu de navigation

// Pagination
echo "<div id=\"pagination\" style=\"text-align:center\">";
$previous=( $page_nb > 1) ? "<a href=\"".$urlGet."=".($page_nb-1)."\">Précédent</a> |   " : "" ; echo $previous;

for($i=1;$i<=$number_of_pages;$i++) { echo " <a href=\"". $urlGet ."=". $i ."\" >". $i ."</a> " ;  }

$next=( $page_nb != $number_of_pages ) ? " | <a href=\"".$urlGet."=".($page_nb+1)."\">Suivant</a>  " : "" ; echo $next; 
echo "</div>";

Voici le résultat sur la page des Liens en vrac et un autre page de test bookmark.php.

Je laisse encore un lien vers Shaarli pour ceux qui préfèrent son interface et bénéficier de ses différentes options, notamment la recherche et tri par tag.

Pour le moment, le code permet d'afficher les fichiers exporter depuis Shaarli et éventuellement les autres fichiers de type Netscape bookmark mais ne doivent pas intégrer d'autres balises ni de listes imbriqués.
J'essaierai de faire une mise à jour pour avoir un truc plus universel et plus complet. Cela offrira la possibilité d'utiliser l'export de ses favoris depuis Firefox.

Ressources

Écrire un commentaire