Greboca  

Suport technique et veille technologique

Aujourd’hui, les grandes entreprises et administrations publiques hésitent entre continuer à utiliser des logiciels propriétaires ou basculer vers les Logiciels Libres. Pourtant, la plupart des logiciels libres sont capables de bien traiter les données issues des logiciels propriétaire, et parfois avec une meilleur compatibilité.

C’est alors la barrière de la prise en main qui fait peur, et pourtant...

Les logiciels libres

L’aspect « Logiciel Libre » permet une évolution rapide et une plus grande participation des utilisateurs. Les aides et tutoriels foisonnent sur Internet ou sont directement inclus dans le logiciel lui-même.

Enfin, les concepteurs sont plus proches des utilisateurs, ce qui rend les logiciels libres plus agréable à utiliser et conviviaux.

Grâce à la disponibilité des logiciels libres, vous trouverez facilement des services de support techniques et la licence n’est plus un frein à l’utilisation de ces logiciels par votre personnel.

Notre support technique concerne essentiellement les logiciels libres, que ce soit sous forme de services ponctuels ou de tutoriels.

LinuxFr.org : les journaux  -  Import NetVibes dans Pétrolette

 -  Février 2021 - 

Sommaire

Devlog

Dans ce journal, nous verrons comment Pétrolette est maintenant capable d'importer le fichier OPML d'export de NetVibes.

Rappel

Pétrolette est une page d'accueil de lecture d'actualités, libre. Elle est immédiatement utilisable sans inscription avec la même URL dans le navigateur du bureau ou celui d'un appareil mobile.

Emacs / Pétrolette

OPML

La structure du fichier est un peu étrange :

  <?xml version="1.0" encoding="UTF-8"?>
  <opml version="1.0">
  <head>
  <title>UserName</title>
  <type>Private</type>
  <creationDate>2021-02-05 06:56:35</creationDate>
  </head>
  <body>
  <outline title="Tab1" cols="4" layout="4-0">
  <outline title="FeedTitle" xmlUrl="https://www.example.com/rss" htmlUrl="https://www.example.com/rss" type="rss" row="562.5" col="1"/>
  <outline title="FeedTitle" xmlUrl="https://www.example.com/rss" htmlUrl="https://www.example.com/rss" type="rss" row="1562.5" col="1"/>
  </outline>
  <outline title="Blogs" cols="4" layout="4-0">
  <outline title="FeedTitle" xmlUrl="https://www.example.com/rss" htmlUrl="https://www.example.com/rss" type="rss" row="500" col="1"/>
  <outline title="15ISSD" xmlUrl="https://www.example.com/rss" htmlUrl="https://www.example.com/rss" type="rss" row="5000" col="1"/>
  <outline title="FeedTitle" xmlUrl="https://www.example.com/rss" htmlUrl="https://www.example.com/rss" type="rss" row="7000" col="1"/>
  </outline>
  <outline title="Tab2" cols="3" layout="3-0">
   <outline title="FeedTitle" xmlUrl="https://www.example.com/rss" htmlUrl="https://www.example.com/rss" type="rss" row="125" col="1"/>
   <outline title="FeedTitle" xmlUrl="https://www.example.com/rss" htmlUrl="https://www.example.com/rss" type="rss" row="250" col="1"/>
  </outline>
 </body>
</opml>

Redondances

On peut se demander à quoi sert l'attribut "cols" de chaque tab, puisque les flux eux-mêmes ont un paramètre "col" pour indiquer où ils se trouvent dans le tab..?

Chez nous, c'est plus simple:

[
  {"name":"news",
   "columns": [
     [
       {"url":"https://www.sciencemag.org/rss/weekly_news_email.xml","type":"photo","limit": 1,"status":"off"},
       {"url":"http://rss.sciam.com/ScientificAmerican-Global","type":"mixed","limit": 6,"status":"on"}
     ],
     [
       {"url":"https://www.reddit.com/r/worldnews.rss","type":"mixed","limit": 6,"status":"off"},
       {"url":"https://www.npr.org/rss/rss.php?id=1001","type":"mixed","limit": 4,"status":"on"}
     ],
     [
       {"url":"http://explainxkcd.com/rss.xml","type":"photo","limit": 4,"status":"on"},
       {"url":"http://xkcd.com/rss.xml","type":"photo","limit": 2,"status":"on"}
     ],
     [
       {"url":"https://www.ignant.com/category/architecture/feed/","type":"photo","limit": 6,"status":"on"}
     ]
   ]
  },
  {"name":"tek",
   "columns": [
     [
       {"url":"http://feeds.bbci.co.uk/news/technology/rss.xml","type":"mixed","limit": 6,"status":"on"},
       {"url":"http://feeds.feedburner.com/hackaday/LgoM/","type":"mixed","limit": 8,"status":"on"},

       {"url":"https://hackernoon.com/feed","type":"mixed","limit": 8,"status":"off"}
     ],
     [
       {"url":"https://hacks.mozilla.org/feed/","type":"mixed","limit": 4,"status":"on"},
       {"url":"http://feeds.arstechnica.com/arstechnica/index","type":"mixed","limit": 6,"status":"on"}
     ]
   ]
  }
]

XMLtoJSON

Apres avoir parsé le XML, on se retrouve avec ça:

[
  {
    "name": "Tab1",
    "cols": "2",
    "columns": [
      {
        "col": "1",
        "url": "http://example.com/rss"
      },
      {
        "col": "1",
        "url": "http://example.com/rss"
      },
      {
        "col": "2",
        "url": "http://example.com/rss"
      }
    ]
  },
  {
    "name": "Tab2",
    "cols": "3",
    "columns": [
      {
        "col": "1",
        "url": "http://example.com/rss"
      },
      {
        "col": "1",
        "url": "http://example.com/rss"
      },
      {
        "col": "3",
        "url": "http://example.com/rss"
      }
    ]
  }
]

Objets et tableaux

Il nous faut donc simplifier tout ça, mais on ne peut pas itérer sur les feeds, puisqu'il ne sont pas rangés dans un container "tab"…

    var xml2json = new PTL.util.XMLtoJSON(),
        objson = xml2json.fromStr(xml),
        dbparsed = JSON.stringify(objson),
        all = objson.opml.body.outline,
        allTabs = [];
    var totalNbOfFeed = 0;
    for (var nbOfTabs in all) {
      var tabs = all[nbOfTabs],
          feeds = tabs.outline;
      for (var key in tabs.outline[0]) {
        var tab = tabs[key],
            thisTab = {},
            thisTabFeeds = [],
            thisColFeeds = [];
        for (var nbOfFeeds in feeds) {
          var thisFeed = {};
          totalNbOfFeed++;
          thisFeed.status = "on";
          thisFeed.limit = 6;
          thisFeed.type = "mixed";
          thisFeed.url = feeds[nbOfFeeds]["@attributes"].xmlUrl;
          thisIndex = Number(feeds[nbOfFeeds]["@attributes"].col) - 1;
          if (!thisColFeeds[thisIndex]) thisColFeeds[thisIndex] = []; // C'est là que ça se passe
          thisColFeeds[thisIndex].push(thisFeed);
        }
        thisTabFeeds.push(thisColFeeds);
        thisTab.columns = thisColFeeds;
        thisTab.name = tab.title;
      }
      allTabs.push(thisTab);
    }
    PTL.util.console(PTL.tr('Found %1 groups containing %2 feeds', nbGroups, nbFeeds), 'success');

À la première occurrence du champ "col" on initialise un tableau qui va recevoir tous les flux (feeds) qui ont le même paramètre, qu'on met dans l'objet thisTab.columns, qu'on met dans le tableau allTabs.

On ajoute des valeurs par défaut à la volée: status (feed dé/plié), limit (le nombre d'articles), et type (texte, photo, mixed).

Donc au moment de l'import on teste

  • Si le fichier est du json valide ;
  • si ce fichier est un fichier prétrolette (on loope sur tous les tabs, qui doivent tous avoir un param. "columns") ;
  • Ou si au contraire, c'est du XML (xml.startsWith('<?xml version="1.0" encoding="UTF-8"?>'))
  • Sinon erreur

Notification discrète

Pour avertir l'utilisateur autrement qu'avec un méchant dialog, j'ai bricolé un petit systeme de notification non intrusive:

    $('#notify').fadeIn('fast', 'linear', function() {
      setTimeout(function() {
        $notify.fadeOut('slow');}, 5000);
    });

Navigation au clavier

Ah oui, j'oubliais ; Pétrolette est depuis le début navigable au clavier, mais il fallait mettre le focus sur un onglet, c'est maintenant le cas au démarrage:

$('#tabs').find('li[tabindex="0"]:first-child').focus();

RERO

Voilà :) Prochaine épisode : Le scrolling infini dans les flux.

Si vous voulez que Pétrolette importe un autre type de fichier de flux, merci de l'attacher à un ticket.

Commentaires : voir le flux Atom ouvrir dans le navigateur

par yPhil

LinuxFr.org : les journaux

LinuxFr.org : Journaux

La version 2.0 de WhosWho est sortie

 -  15 mai - 

Bonjour Nal,Je viens de publier la version 2.0 de WhosWho, mon logiciel pour faire des trombinoscopes, dont j'avais parlé il y a longtemps dans (...)


décrire une une image avec une iA locale

 -  8 mai - 

Aujourd'hui c'est fourien™, petit tuto sans prétention!Pour décrire des images en utilisant une iA localement j'utilise LLaVA qui fait partie de (...)


antistress adventure in Flatpak land

 -  30 avril - 

Hello nal, ça faisait un bail !Certain (il se reconnaîtra) m'a demandé de le tenir au courant lorsque j'aurai basculé sur un usage de Firefox (...)


Téléphone sous Linux ?

 -  25 avril - 

Aujourd'hui, avoir un téléphone avec un Android libéré, c'est possible, on pense en particulier à Murena.Avoir un téléphone sous GNU/Linux, c'est (...)


Quand votre voiture vous espionne… et vous le fait payer

 -  23 avril - 

Ceci se passe aux États-Unis, pour l’instant, aucune preuve qu’une telle fuite existe en Europe. Mais… si votre assurance augmente brutalement, (...)