intégrer Shaarli à Pluxml

Bonjour,

Je suis tombé sur http://links.yosko.net/ et j'aimerai bien trouvé une solution d'intégrer Shaarli à Pluxml comme c'est fait.
On peut naviguer facilement entre les liens et ça s'intègre au site.

Réponses

  • Je cherche aussi à faire la même chose et j'ai vu celui ci par contre http://links.hoa.ro/
  • effectivement. donc c'est bien possible de le faire.
  • une idée serait d'utiliser les exports.
  • PlakateckPlakateck Member
    juillet 2015 modifié
    Bonjour je ne comprend pas trop l'histoire de l'export :(

    Par contre j'ai vu que des thèmes prédéfini existait: https://github.com/shaarli/shaarli-themes

    Et qu'il fallait modifié le fichier inc/user.css dans le dossier Shaarli.
    Donc faudrait adapté ce fichier avec le thème par défaut du Shaarli.

    C'est là que viens l'histoire de l'export ?
  • il est possible d'exporter ses données au format html depuis tools > export.
  • PlakateckPlakateck Member
    juillet 2015 modifié
    Ah effectivement mais cela reviendrait à générer automatiquement un export pour le réintégré sur son site.

    Hum faudrait que je mette la main à la pâte pour savoir ce que l’on peut faire de beau.

    Le fichier généré n’est pas énorme c’est bon signe.
    Mais avoir un shaarli avec le même thème que le site serait effectivement assez compliqué.

    Sau si on intègre la page d’un shaarli avec théme pluxml dans une page de pluxml prévu pour.

    Hum je ne sais pas trop comment attaqué le truc : s

    http://links.hoa.ro/ a utilisé xml je pense vu qu'il est super familier avec d'après ses liens sur le shaarli.

    On peut leurs demandé aussi ;o
  • Bonjour, je poste mon grain de sel dans la conversation parce que j'ai envisagé un truc dans le genre, histoire d'englober plusieurs services au sein de l'environnement sécurisé de pluXML et n'avoir qu'un login/passe à fournir... (liens/snippets/fluxRSS/galerie etc)

    Plusieurs "solutions" en fonction de ce qu l'on attend:
    - un simple accès aux liens publics:
    * on crée une page statique ou un plugin qui se charge de lire le fichier de sauvegarde de shaarli et recrée la liste de liens
    * on utilise le fichier xml exporté par shaarli (pb: il faut exporter à la main ou automatiser la procédure, via une API de shaarli, pourquoi pas ?)
    * on crée une page statique avec une iframe ouvrant le shaarli et on adapte le css de shaarli en conséquence...

    - un accès admin au sein de pluxml: pas le choix...
    * soit on modifie shaarli pour l'intégrer à pluxml sous forme de plugin (adapter la procédure login/passe, les tests admin, les tokens etc)
    * soit, plus propre, on recrée un shaarli clone from scratch pour en faire un plugin: c'était la solution que j'envisageais... sans avoir le temps matériel de m'y mettre: avouez que ce serait un chouette projet ^^

    Bon... qui qui s'y colle ?! XD
  • mr-tocmr-toc Member
    juillet 2015 modifié
    je serai plutôt parti sur la première proposition: un simple accès aux liens publics.

    PluXml et Shaarli restent indépendant et pas besoin de modification du code. Du coté PluXml on ne fait que consulter, l'administration restant sur Shaarli.

    J'ai essayé de regarder mais je serai pas capable de refaire quelque chose de bien. Dans le fichier index.php on a la la fonction readdb donc on doit pouvoir adapter mais ça suppose qu'on a accès au lien privé même si on ne les acceptent pas.

    J'aurai une autre solution qui serait de sauvegarder un fichier "liens public" en plus du fichier datastore.php en se basant sur la méthode d'export Public.
    A la sauvegarde d'un nouvel article on enregistrerait datastore.php pour Shaarli et un fichier datastore_pluxml.xml qu'on peut exploité facilement (PluXml ou autre).

    Edit:
    bronco a écrit:
    Bon... qui qui s'y colle ?! XD
    Stéphane m'a l'air sur une bonne dynamique ;)
    Merci à lui pour la mise à jour de PluXml.
  • j'ai bricolé un petit truc pour convertir le bookmark (issu de l'export de Shaarli) avec du PHP.
    Je convertit le bookmark pour avoir un xml que l'on peut assez facilement utilisé après.

    J'arrive à récupérer le titre, URL, la date, les tags et le contenu. Maintenant, j'aimerais ne pas tout afficher d'un coup (si on a 2000 liens ça risque d'être pénible).
    Il faudrait pouvoir naviguer facilement, et du coup gérer un nombre de lien par page. Du coup la première page afficherait les 25 premiers liens mais comment je peux afficher des liens 26 à 50 ?
    Ensuite j'aimerai pouvoir naviguer par tags. Reste que je ne sais pas comment retrouver les liens comportant ce tag et comment les afficher ?
  • je-evrardje-evrard Member
    août 2015 modifié
    On avait eu une discussion la dessus : ici

    J'ai créé ce plugin : spxbookmarket

    Marchera en 5.4 dès que j'aurais mis a jour mes plugins.
  • Je vais tester de ce pas.
  • à partir de l'export de Shaarli, j'arrive à parcourir les différents liens.

    J'ai bien un pb pour le moment, j'arrive pas à afficher le 1er lien.
    [== PHP ==]
    <?php
    
    //*****************************************
    // Modifier le fichier d'export Shaarli
    //*****************************************
    
    // Emplacement des fichiers à modifier
    // emplacement du fichier d'entrée
    	$input = 'data/documents/009/bookmarks_public_20150801_194313.html';
    // emplacement du fichier d'entrée
    	$output = 'data/documents/009/bookmarks.html';
    
    // modification du fichier (remplacement de chaines de caractères)
    	$file = file_get_contents($input);
    	$file = str_replace('<!DOCTYPE NETSCAPE-Bookmark-file-1>',' ',$file);
    	$file = str_replace('<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=UTF-8">',"",$file);
    	$file = str_replace('<TITLE>Bookmarks</TITLE>',"",$file);
    	$file = str_replace('<H1>Bookmarks</H1><DT><A ',"<bookmarks><article><title><a ",$file);
    	$file = str_replace('<DT><A ',"</blockquote></article><article><title><a ",$file);
    	$file = str_replace('<DD>',"<blockquote>",$file);
    	$file = str_replace('<DT><A ',"<article><title><a ",$file);
    	$file = str_replace('</A>',"</a></title>",$file);
    	$file = $file."</blockquote></article></bookmarks>";
    
    // enregistrement du fichier 
    // file_put_contents($output,  $file);
    
    
    
    //*****************************************
    // Lire le fichier bookmarks.html
    //*****************************************
    
    $xml = file_get_contents($output);
    
    $startLink=isset($_GET['static9/test?start']) ? $_GET['static9/test?start'] : "0";
    $nbLinks="5";
    $endLink=$startLink+$nbLinks;
    
    // on parcours le fichier
    $xml = simplexml_load_string($xml); 
    $totalLinks=$xml->count();
    if ( $endLink > $totalLinks ) $endLink=$totalLinks;
    
    for($i = $startLink; $i <= $endLink; $i++)
    {
    $titre=$xml->article[$i]->title->a;
    $date=$xml->article[$i]->title->a[ADD_DATE];
    $url=$xml->article[$i]->title->a[HREF];
    //$private=$xml->article[$i]->title->a[PRIVATE];
    $tags=$xml->article[$i]->title->a[TAGS];
    $blockquote=nl2br($xml->article[$i]->blockquote);
    
    // on met le contenu dans une variable
     if (isset($titre)) {
    $html .= "<article><header><a id=\"$i\" href='$url'><h1>$titre</h1></a></header><section><span class=\"date\"><i class=\"fa fa-calendar\"></i>	<time datetime=\"$date\">$date</time></span><span class=\"tag\"><i class=\"fa fa-tags\"></i> $tags</span><p>$blockquote</p></section></article><hr />"; 
                            }
    }
    
    // on affiche les liens
    echo "<div class=\"feed\">".$html."</div>";
    ?>
    
    
    <!--  pagination  -->
    <p>
    <?php  $previous=( ($startLink-$nbLinks) >= 0) ? "<a href=\"?static9/test?start=".($startLink-$nbLinks)."\">Précédent </a> | " : "" ; echo $previous ?>
    <?php  $next=( ($endLink+nbLinks) < $totalLinks) ? "<a href=\"?static9/test?start=".($endLink)."\">Suivant </a>  " : "" ; echo $next ?>
    </p>
    

    je génère un fichier intermédiaire à chaque fois, c'est pas génial. Je devrais pouvoir limiter ça en utilisant la date de création.
    pour gérer la pagination, c'est plutôt artisanal.
    Reste une partie importante, gérer des filtres par tag.
  • j'ai repris une partie du code de Shaarli pour afficher les liens et gérer une pagination.
    Pour le moment, j'obtiens les liens à partir du fichier d'export Shaarli, il faut bien modifier l'URL dans le code.

    Je pense que je ne vais pas afficher les liens privés.

    L'idéal serait d'avoir une fonction de recherche par tags mais je pense que ça va être difficile pour moi et si quelqu'un veut aider.
    [== PHP ==]
    <?php 
    
    
    // nom du fichier a lire >> A MODIFIER
    $files="data/medias/bookmarks_shaarli.html";
    $data=file_get_contents($files);
    // echo $data; // affiche le contenu du fichier
    
    
    // Tells if a string start with a substring or not.
    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);
    }
    
    // Tells if a string ends with a substring or not.
    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);
    }
    
    
    
    $type='unknown';
    if (startsWith($data,'<!DOCTYPE NETSCAPE-Bookmark-file-1>'))  $type='netscape'; // Netscape bookmark file (aka Firefox).
    
    // Then import the bookmarks.
    if ($type=='netscape') // le format est OK et on peut importer
    {      //  echo "Le format est OK (type=netscape) et on peut importer.";
    
    $url="static4/shaarli-limitresult?page"; 
    $nb_elem_per_page =10;
    $page = isset($_GET[$url])?intval($_GET[$url]-1):0;
    $data =  (explode('<DT>',$data)) ;
    $number_of_pages = intval(count($data)/$nb_elem_per_page)+1;
    
    		// This format is supported by all browsers (except IE, of course), also delicious, diigo and others.
    		// foreach(explode('<DT>',$data) as $html) // explode is very fast
    
     foreach (array_slice ($data, $page*$nb_elem_per_page, $nb_elem_per_page) as $html)
    		{
    				// echo "$html  <hr />";
    				//       if (startswith($html,'<A '))  { echo "$html  <hr />"; }
    
    				$link = array('linkdate'=>'','title'=>'','url'=>'','description'=>'','tags'=>'','private'=>0);
    				$d = explode('<DD>',$html);
    				if (startswith($d[0],'<A '))
    						{
    									$link['description'] = (isset($d[1]) ? nl2br (html_entity_decode(trim($d[1]),ENT_QUOTES,'UTF-8')) : '');  // Get description (optional)
    									// echo "Description : ".$link['description']; // affiche la description de l'item
    
    									preg_match('!<A .*?>(.*?)</A>!i',$d[0],$matches); 
    
    									$link['title'] = (isset($matches[1]) ? trim($matches[1]) : '');  // Get title
    									// echo "Title : ".$link['title']." <hr />";  // affiche le titre de l'item
    								    $link['title'] = html_entity_decode($link['title'],ENT_QUOTES,'UTF-8');
    									// echo "<br><span style=\"color:brown\">Title : ".$link['title']." </span>";  // affiche le titre de l'item
    
    									preg_match_all('! ([A-Z_]+)=\"(.*?)"!i',$html,$matches,PREG_SET_ORDER);  // Get all other attributes
    									// echo "matches : "; var_dump ($matches) ; echo " <hr />";
    									
    									$raw_add_date=0;
    									
    									
    									foreach($matches as $m) 
    												{ 
    													$attr=$m[1]; $value=$m[2];
    													if ($attr=='HREF')  $link['url']=html_entity_decode($value,ENT_QUOTES,'UTF-8');
    													// echo 'url : '.$link['url'].'<hr />';
    
    													elseif ($attr=='TAGS')   $link['tags']=html_entity_decode(str_replace(',',' ',$value),ENT_QUOTES,'UTF-8');
    													//  echo "tags : ".$link['tags']." <hr />";
    													elseif ($attr=='PRIVATE')  $link['private']=($value=='0'?0:1);
    													//  echo "private : ".$link['private']." <hr />";
    													elseif ($attr=='ADD_DATE')         $raw_add_date=intval($value); $link['linkdate']=date('d/m/Y',$raw_add_date);
    													//  echo "linkdate : ".$link['linkdate']." <hr />";
    											
    												}
    
    											echo "<br><span style=\"color:brown\">Title : ".$link['title']." </span>";  // affiche le titre de l'item
    											echo "<br>Description : ".$link['description']; // affiche la description de l'item
    											echo "<br><span style=\"color:green\">url : ".$link['url']." </span>";
    											echo "<br><span style=\"color:red\">tags : ".$link['tags']." </span>";
    											echo "<br><span style=\"color:blue\">private : ".$link['private']." </span>";
    											echo "<br><span style=\"color:silver\">linkdate : ".$link['linkdate']." </span><hr />";
    
    
    
    					}	$i++;
    			}
    }
    
    else { echo " has an unknown file format. Nothing was imported."; }
    
    
    
    
    
    
    
    
    /****************
    Fontion de tri 
    ****************/
    if (isset($_GET['static4/shaarli-limitresult?searchtags'])) // Search by tag
    {echo "tags :".$_GET['static4/shaarli-limitresult?searchtags'] ;}
    
    ?>
    
    
    
    
    
    
    
    <ul id='paginator'>
    <?php
    for($i=1;$i<=$number_of_pages;$i++){ ?>
        <li><a href="index.php?<?php echo $url.'='.$i ; ?>"><?php echo $i ; ?></a></li>
    <?php } ?>
    </ul>
    
  • DrakyDraky Member
    Sous Wordpress, j'utilisais une autre méthode pour afficher mes liens Shaarli dans la sidebar.
    J'utilisais un widget (fourni par une extension ou de base, je ne sais plus) qui aafichait le contenu du flux RSS !
    Un Shaarli diffuse un flux RSS (ou Atom), par exemple : http://gilles.wittezaele.fr/liens/?do=rss
    Du coup, il "suffit" de récupérer à intervalle régulier (défini dans l'admin ?) genre toutes les x minutes/heures le XML du RSS et d'afficher ça proprement.
  • sauf que le RSS te fournit uniquement les derniers liens. Ici tu affiches tout et l'objectif est d'effectuer des recherches sur des tags ou des termes.
  • perso je vais intégrer la notion de tags dans mon plugin spxwbookmarket. J'ouvrirais un post sur le sujet.

    a+
  • DrakyDraky Member
    mr-toc a écrit:
    sauf que le RSS te fournit uniquement les derniers liens. Ici tu affiches tout et l'objectif est d'effectuer des recherches sur des tags ou des termes.

    Ok, je comprends.

    Mais bon, autant aller sur le Shaarli et faire la recherche dessus directement...
  • Draky a écrit:
    mr-toc a écrit:
    sauf que le RSS te fournit uniquement les derniers liens. Ici tu affiches tout et l'objectif est d'effectuer des recherches sur des tags ou des termes.

    Ok, je comprends.

    Mais bon, autant aller sur le Shaarli et faire la recherche dessus directement...
    sauf que tu passes sur une autre page, éventuellement un autre site, avec un interface qui n'a rien a voir.
    Ensuite, je ne vois pas l'intéret d'avoir accès au login etc.

    Il faut voir plus loin puisqu'il s'agit du format le plus utilisé pour enregistrer des favoris. Tu peux très bien exporter les favoris de ton navigateur ou d'un autre service et les insérer directement sur un site.
Connectez-vous ou Inscrivez-vous pour répondre.