:-y

De shaarli à KrISS link...

vendredi 30 novembre 2012 - 19:59

J'ai souvent rencontré ce problème quand j'enseignais Outils Logiciels à des premières années à l'université : comment expliquer à un public très hétérogène (maths, physique, chimie, info et parfois bio) que la ligne de commande est un puissant outil ? En attendant que je consacre un autre article à ce problème, voici un exemple concret :

Dans la lignée de KrISS blog et KrISS feed, je vous présente KrISS link : A simple and smart (or stupid) shaarli.

Pourquoi ne pas directement utiliser shaarli ?
À l'image de KrISS blog et KrISS feed, je voulais :
Pour l'utilisateur final :
- un fichier unique pour l'installation/mise à jour
- aucune dépendance (pas de jquery, pas de raintpl, idée discutable, mais pour le moment, je n'en vois pas la nécessité)
- pas d'image (juste un fichier :-) je regarderais plus tard pour faire comme avec kriss feed, des icônes css ou si besoin image codée avec base64)
- une séparation des tâches (à l'image du principe GNU, mais une compatibilité avec KrISS blog et KrISS feed pour ne pas avoir à retaper son mot de passe)
- un stockage sous forme de fichier
Pour le développeur :
- séparation dans différents fichiers pour la maintenance
- possibilité de tester directement (pas besoin de compiler en fichier unique pour les tests)
(En gros, comme KrISS feed et KrISS blog)

Pourquoi se baser sur shaarli ?
- je ne sais pas encore vraiment ce que je veux pour pouvoir partager avec un peu plus de "sémantique" (je ne me suis encore jamais vraiment servi de tags, je vais voir si ça me suffit)
- je n'ai pas beaucoup de temps en ce moment et pratiquement tous les critères cités étaient valables jusqu'à la version 31beta de shaarli
- shaarli est très pratique, concis et utilise le stockage dans un fichier

C'est parti ?!
Le but n'est pas d'apprendre à se servir de bash, mais de montrer que la ligne de commande permet de faciliter grandement des opérations qui, à la main, auraient pris pas mal de temps :-)
On commence par télécharger shaarli, on dézippe et à partir du dossier de shaarli_0.0.40beta :

On construit l'arborescence de KrISS link et on copie le fichier de style (vous pouvez aussi copier les images si vous voulez, mais elles ne sont pas indispensables) :
mkdir -p kriss_link/src/class/tpl
mkdir kriss_link/src/inc
cp inc/shaarli.css kriss_link/src/inc

On sépare à la main le fichier index.php en fonction des classes (doit pouvoir se faire en ligne de commande, mais cela m'aurait pris plus de temps de générer la commande que de le faire à la main). On obtient les fichiers linkdb.php, pageBuilder.php et pageCache.php que l'on place dans kriss_link/src/class. Le reste du fichier index.php devient kriss_link.php à placer dans kriss_link/src/

On utilise les templates php générés par raintpl (il faut d'abord accéder à chaque page de shaarli pour que ces templates soient générés). On commence par les renommer :
cd tmp; for file in *.php; do cp $file ../kriss_link/src/class/tpl/${file%.*.rtpl.php}.php; done;

(renomme par exemple install.9097c...d4686.rtpl.php en install.php)

On crée une nouvelle classe LinkPage.php qui nous permettra d'afficher les pages (pour remplacer raintpl) :
cd ../kriss_link/src/class;cat > LinkPage.php << EOF

On copie le bout de code suivant :

<?php 
class LinkPage
{
    public static 
$var = array();
    private static 
$_instance;

    
/**
     * initialize private instance of LinkPage class
     */
    
public static function init($var)
    {
        if (!isset(
self::$_instance)) {
            
self::$_instance = new LinkPage();
            
LinkPage::$var $var;
        }
    }
EOF
 ?>



On génère les fonctions utiles pour inclure chaque template php correspondant à une page :
cd tpl;(for file in *.php; do filename=$(echo "${file/.php/}"); echo " public static function ${filename//./}Tpl()";echo " {";echo " extract(LinkPage::\$var);";echo "?>";echo "<?php include(\"tpl/${file}\"); ?>"; echo "<?php"; echo " }";echo; done; echo "}";) >> ../LinkPage.php

Par exemple, pour le template install.php, la fonction générée est (sans le premier <?php qui n'est là que pour la coloration syntaxique) :

<?php 
 
public static function installTpl()
 {
 
extract(LinkPage::$var);
?>
<?php 
include("tpl/install.php"); ?>
<?php
 
}
 
?>


(les balises php ne sont pas indispensables autour du include, mais c'est plus simple pour le script generateIndex qui compile en fichier unique)

On supprime la dépendance avec raintpl et on sépare correctement les parties php des templates :
sed -i -e "s:<?php if(\!class_exists('raintpl')){exit;}?>::" *.php
sed -i -e "s:?><?php:?>\n<?php:g" *.php

On remplace les includes associés à raintpl :
sed -i -e 's!<?php $tpl = new RainTpl\(.*\)dirname("\([^"]*\)")\(.*\)?>!<?php LinkPage::\2Tpl(); ?>!g' *.php

On fixe les problèmes liés aux noms de fichiers qui ont plusieurs mots (page.header donne pageheader par exemple). Pour cela, on écrit une fonction qui génère des fonctions à exécuter :
(for file in *.*.php; do file=${file/.php/}; fileout=${file//.}; echo "sed -i -e 's|LinkPage::${file}|LinkPage::${fileout}|' *.php"; done) | bash

Ce qui exécute les fonctions générées suivantes :
sed -i -e 's|LinkPage::linklist.paging|LinkPage::linklistpaging|' *.php
sed -i -e 's|LinkPage::page.footer|LinkPage::pagefooter|' *.php
sed -i -e 's|LinkPage::page.header|LinkPage::pageheader|' *.php

On modifie à la main la classe PageBuilder pour ne plus utiliser raintpl mais LinkPage et voici en 15/20 minutes une bonne base fonctionnelle pour KrISS link :-)

C'est pas chouette la ligne de commande ?

- Pour le moment j'ai juste corrigé le bug sur les échappements de caractères dans les tags, supprimé les dépendances jquery (plus d'auto-complétion pour le moment) et modifié légèrement le style pour qu'il se rapproche de KrISS feed et KrISS blog et qu'il n'utilise plus d'images et des trucs à la con -webkit-, -moz-, -ms- et -o- !!!
- J'ai laissé la gestion de session comme shaarli, mais il faudrait que je l'adapte pour que ce soit compatible avec KrISS blog et KrISS feed. Mais cela demande un peu plus de boulot pour que cela ne soit pas trop gênant côté sécu (du coup c'est KrISS feed et KrISS blog qu'il faudra que je modifie en premier pour spécifier le path du cookie).
- J'ai aussi ajouté un paramètre GLOBAL pour laisser à l'utilisateur le choix de vérifier les mises à jour (j'ai mis à false par défaut parce que je n'ai pas encore modifié cette partie du code qui regarde les mises à jour pour shaarli)
- Et pour finir, quand on partage un lien en appuyant 's' dans KrISS feed (en mode show expanded) cela met automatiquement le via dans la description si le domaine entre link et guid est différent bien sûr :-). Cela marche avec tous les shaarlis (sauf celui de Sebsauvage :-) en attendant les nouvelles modifs) et les partages de blogotext de Timo !

Oui j'aime beaucoup les via/sources parce que sinon on se retrouve avec des choses de ce style :
http://nat.fam-martel.eu/2012/11/quels-sont-les-gros-cailloux-de-votre-vie/
via http://lehollandaisvolant.net/index.php?mode=links&id=20121127234658
qui au passage souligne que c'est une histoire connue, mais si on ne le sait pas on peut croire que Nathanaël Martel en est l'auteur... Pour quelqu'un qui se définit comme "défenseur de la culture du libre", je trouve ça limite... Je n'ai que copié la première phrase dans un moteur de recherche pas très libre mais j'ai trouvé cet article de 2004
http://open-time.net/post/2004/12/11/23-reflexion-a-propos-de-cailloux
avec une référence qui ne laisse aucune ambiguïté sur l'auteur...


Sinon je vous avoue que je ne pense pas avoir beaucoup de temps à consacrer au code de KrISS link surtout que j'attends avec impatience les modifications que Sebsauvage va apporter en fonction des commentaires sur Zérobin.

En attendant, j'ai placé sur github : KrISS link
Pour générer index.php, il suffit de "compiler" le fichier avec la commande à partir du dossier src :
bash generateIndex > ../index.php
(Merci Fred pour avoir transformé ma fonction perl en bash comme le reste du script... comment ça il reste du sed ? :-p)
Si vous voulez tester, vous pouvez copier index.php dans votre dossier shaarli, cela devrait fonctionner sans problème (renommer avant pour ne pas écraser l'index de shaarli).

Quant à moi, j'utiliserai KrISS link à cette adresse : http://tontof.net/link

Pour le moment, cela va surtout être un outil perso pour essayer de trier mes liens parce que je trouve que shaarli manque d'interaction pour être parfait. C'est très agréable de lire des commentaires dans les liens inutiles qui amènent souvent à découvrir de nouvelles choses bien sympathiques. Du coup, je pense que je vais continuer à poster des liens inutiles par paquet de 10 et quand j'aurai un peu plus organisé mes liens moins inutiles je pense que je posterai aussi des articles plus utiles de temps en temps :-)

Bon par contre je vais avoir du boulot pour mettre mes liens à jour... Actuellement, je garde tout dans un brouillon de mail et c'est un sacré bordel. Oui je sais j'aurais dû me mettre avant à shaarli, mais, c'est ça de procrastiner tout le temps... Heureusement, si je suis ma to-do list, ça devrait le faire...

Edit 01/12/12 : Améliorations proposées par July

Comments

1 - @ - July

Pour automatiser un peu plus :
* Pour le cat :
cat >monfichier <<EOF
Mon contenu
qui roxxe
EOF

* Pour les echo qui génèrent les commandes, pipe le résultat dans un shell ou utiliser eval

2 - @ - Tontof

@July : Merci beaucoup pour ces améliorations ! Voilà exactement pourquoi je trouve que le partage de liens avec shaarli manque d'interactions :-)
New comment







 __             ___      
/  \ \  /   /  |      /  
|  |  \/   /   |__   /_  
| \|  /\  /_|_ |    /  \ 
\__\ /  \   |  |___ \__/