PROJET AUTOBLOG


Tontof

Site original : Tontof

⇐ retour index

Filtre calendrier ICS

jeudi 27 juin 2019 à 19:06
Quand l'administration utilise Google Calendar pour gérer les plannings avec un seul calendrier, ce n'est pas simple d'ajouter juste les événements qui nous intéressent.
On m'a demandé si c'était possible et après une rapide recherche, je n'ai rien trouvé qui permettait de faire ça : je n'ai pas réussi à utiliser https://icalfilter.com/

Je serai curieux de savoir si c'est possible de le faire avec un https://framagenda.org mais en utilisant un parseur et un formatteur PHP c'est plutôt simple.

Si ça peut être utile à d'autres.

Dans le fichier composer.json

{
"require": {
"johngrogg/ics-parser": "^2",
"jsvrcek/ics": "*@dev"
}
}


On installe tout ce qu'il faut avec
composer install


Dans un fichier index.php

<?php 
  
require_once 'vendor/autoload.php';
  use 
ICal\ICal;
  use 
Jsvrcek\ICS\Model\Calendar;
  use 
Jsvrcek\ICS\Model\CalendarEvent;
  use 
Jsvrcek\ICS\Model\Relationship\Attendee;
  use 
Jsvrcek\ICS\Model\Relationship\Organizer;
  
  use 
Jsvrcek\ICS\Utility\Formatter;
  use 
Jsvrcek\ICS\CalendarStream;
  use 
Jsvrcek\ICS\CalendarExport;

  try {
      
      
$ical = new ICal('https://raw.githubusercontent.com/u01jmg3/ics-parser/master/examples/ICal.ics', array(
         
'defaultSpan'                 => 2,     // Default value
         
'defaultTimeZone'             => 'UTC',
         
'defaultWeekStart'            => 'MO',  // Default value
         
'disableCharacterReplacement' => false// Default value
         
'filterDaysAfter'             => null,  // Default value
         
'filterDaysBefore'            => null,  // Default value
         
'replaceWindowsTimeZoneIds'   => false// Default value
         
'skipRecurrence'              => false// Default value
         
'useTimeZoneWithRRules'       => false// Default value
         
));
  } catch (\
Exception $e) {
      die(
$e);
  }
  
  
$forceTimeZone false;

  
$newCal = new Calendar();
  
$newCal->setProdId($ical->cal['VCALENDAR']['PRODID']);
  
$newCal->setVersion($ical->cal['VCALENDAR']['VERSION']);
  
$newCal->setName($ical->cal['VCALENDAR']['X-WR-CALNAME']);
  
$newCal->setCalendarScale($ical->cal['VCALENDAR']['CALSCALE']);
  
$newCal->setMethod($ical->cal['VCALENDAR']['METHOD']);
  
$newCal->setCustomHeaders(["X-WR-TIMEZONE" => $ical->cal['VCALENDAR']['X-WR-TIMEZONE']]);
  
  
$events $ical->events();
  foreach (
$events as $event) {
      
// add custom filter here
      
if (preg_match('/.*DST*/'$event->summary)) {
          
$newEvent = new CalendarEvent();
          
$newEvent->setStart(new DateTime($event->dtstart));
          
$newEvent->setEnd(new DateTime($event->dtend));
          
$newEvent->setSummary($event->summary);
          
$newEvent->setUid($event->uid);
          
$newEvent->setStatus($event->status);
          
$newCal->addEvent($newEvent);
      }
  }
  
  
$calendarExport = new CalendarExport(new CalendarStream, new Formatter());
  
$calendarExport->addCalendar($newCal);

  
header('Content-type: text/calendar; charset=utf-8');
  echo 
$calendarExport->getStream();
 
?>


Filtre calendrier ICS

jeudi 27 juin 2019 à 19:06
Quand l'administration utilise Google Calendar pour gérer les plannings avec un seul calendrier, ce n'est pas simple d'ajouter juste les événements qui nous intéressent.
On m'a demandé si c'était possible et après une rapide recherche, je n'ai rien trouvé qui permettait de faire ça : je n'ai pas réussi à utiliser https://icalfilter.com/

Je serai curieux de savoir si c'est possible de le faire avec un https://framagenda.org mais en utilisant un parseur et un formatteur PHP c'est plutôt simple.

Si ça peut être utile à d'autres.

Dans le fichier composer.json

{
"require": {
"johngrogg/ics-parser": "^2",
"jsvrcek/ics": "*@dev"
}
}


On installe tout ce qu'il faut avec
composer install


Dans un fichier index.php

<?php 
  
require_once 'vendor/autoload.php';
  use 
ICal\ICal;
  use 
Jsvrcek\ICS\Model\Calendar;
  use 
Jsvrcek\ICS\Model\CalendarEvent;
  use 
Jsvrcek\ICS\Model\Relationship\Attendee;
  use 
Jsvrcek\ICS\Model\Relationship\Organizer;
  
  use 
Jsvrcek\ICS\Utility\Formatter;
  use 
Jsvrcek\ICS\CalendarStream;
  use 
Jsvrcek\ICS\CalendarExport;

  try {
      
      
$ical = new ICal('https://raw.githubusercontent.com/u01jmg3/ics-parser/master/examples/ICal.ics', array(
         
'defaultSpan'                 => 2,     // Default value
         
'defaultTimeZone'             => 'UTC',
         
'defaultWeekStart'            => 'MO',  // Default value
         
'disableCharacterReplacement' => false// Default value
         
'filterDaysAfter'             => null,  // Default value
         
'filterDaysBefore'            => null,  // Default value
         
'replaceWindowsTimeZoneIds'   => false// Default value
         
'skipRecurrence'              => false// Default value
         
'useTimeZoneWithRRules'       => false// Default value
         
));
  } catch (\
Exception $e) {
      die(
$e);
  }
  
  
$forceTimeZone false;

  
$newCal = new Calendar();
  
$newCal->setProdId($ical->cal['VCALENDAR']['PRODID']);
  
$newCal->setVersion($ical->cal['VCALENDAR']['VERSION']);
  
$newCal->setName($ical->cal['VCALENDAR']['X-WR-CALNAME']);
  
$newCal->setCalendarScale($ical->cal['VCALENDAR']['CALSCALE']);
  
$newCal->setMethod($ical->cal['VCALENDAR']['METHOD']);
  
$newCal->setCustomHeaders(["X-WR-TIMEZONE" => $ical->cal['VCALENDAR']['X-WR-TIMEZONE']]);
  
  
$events $ical->events();
  foreach (
$events as $event) {
      
// add custom filter here
      
if (preg_match('/.*DST*/'$event->summary)) {
          
$newEvent = new CalendarEvent();
          
$newEvent->setStart(new DateTime($event->dtstart));
          
$newEvent->setEnd(new DateTime($event->dtend));
          
$newEvent->setSummary($event->summary);
          
$newEvent->setUid($event->uid);
          
$newEvent->setStatus($event->status);
          
$newCal->addEvent($newEvent);
      }
  }
  
  
$calendarExport = new CalendarExport(new CalendarStream, new Formatter());
  
$calendarExport->addCalendar($newCal);

  
header('Content-type: text/calendar; charset=utf-8');
  echo 
$calendarExport->getStream();
 
?>


Filtre calendrier ICS

jeudi 27 juin 2019 à 19:06
Quand l'administration utilise Google Calendar pour gérer les plannings avec un seul calendrier, ce n'est pas simple d'ajouter juste les événements qui nous intéressent.
On m'a demandé si c'était possible et après une rapide recherche, je n'ai rien trouvé qui permettait de faire ça : je n'ai pas réussi à utiliser https://icalfilter.com/

Je serai curieux de savoir si c'est possible de le faire avec un https://framagenda.org mais en utilisant un parseur et un formatteur PHP c'est plutôt simple.

Si ça peut être utile à d'autres.

Dans le fichier composer.json

{
"require": {
"johngrogg/ics-parser": "^2",
"jsvrcek/ics": "*@dev"
}
}


On installe tout ce qu'il faut avec
composer install


Dans un fichier index.php

<?php 
  
require_once 'vendor/autoload.php';
  use 
ICal\ICal;
  use 
Jsvrcek\ICS\Model\Calendar;
  use 
Jsvrcek\ICS\Model\CalendarEvent;
  use 
Jsvrcek\ICS\Model\Relationship\Attendee;
  use 
Jsvrcek\ICS\Model\Relationship\Organizer;
  
  use 
Jsvrcek\ICS\Utility\Formatter;
  use 
Jsvrcek\ICS\CalendarStream;
  use 
Jsvrcek\ICS\CalendarExport;

  try {
      
      
$ical = new ICal('https://raw.githubusercontent.com/u01jmg3/ics-parser/master/examples/ICal.ics', array(
         
'defaultSpan'                 => 2,     // Default value
         
'defaultTimeZone'             => 'UTC',
         
'defaultWeekStart'            => 'MO',  // Default value
         
'disableCharacterReplacement' => false// Default value
         
'filterDaysAfter'             => null,  // Default value
         
'filterDaysBefore'            => null,  // Default value
         
'replaceWindowsTimeZoneIds'   => false// Default value
         
'skipRecurrence'              => false// Default value
         
'useTimeZoneWithRRules'       => false// Default value
         
));
  } catch (\
Exception $e) {
      die(
$e);
  }
  
  
$forceTimeZone false;

  
$newCal = new Calendar();
  
$newCal->setProdId($ical->cal['VCALENDAR']['PRODID']);
  
$newCal->setVersion($ical->cal['VCALENDAR']['VERSION']);
  
$newCal->setName($ical->cal['VCALENDAR']['X-WR-CALNAME']);
  
$newCal->setCalendarScale($ical->cal['VCALENDAR']['CALSCALE']);
  
$newCal->setMethod($ical->cal['VCALENDAR']['METHOD']);
  
$newCal->setCustomHeaders(["X-WR-TIMEZONE" => $ical->cal['VCALENDAR']['X-WR-TIMEZONE']]);
  
  
$events $ical->events();
  foreach (
$events as $event) {
      
// add custom filter here
      
if (preg_match('/.*DST*/'$event->summary)) {
          
$newEvent = new CalendarEvent();
          
$newEvent->setStart(new DateTime($event->dtstart));
          
$newEvent->setEnd(new DateTime($event->dtend));
          
$newEvent->setSummary($event->summary);
          
$newEvent->setUid($event->uid);
          
$newEvent->setStatus($event->status);
          
$newCal->addEvent($newEvent);
      }
  }
  
  
$calendarExport = new CalendarExport(new CalendarStream, new Formatter());
  
$calendarExport->addCalendar($newCal);

  
header('Content-type: text/calendar; charset=utf-8');
  echo 
$calendarExport->getStream();
 
?>


KrISS tuto : html, css, php et maintenant javascript

jeudi 7 février 2019 à 19:02
Cela faisait plusieurs années que j'utilisais une présentation javascript d'une autre personne alors qu'il y avait des choses du style

<SCRIPT LANGUAGE="JavaScript">...</SCRIPT>

Autant vous dire que je n'étais pas à l'aise : l'utilisation des majuscules pour les balises et l'attribut language... ça pique un peu les yeux. J'avais apporté quelques modifications sur le fichier PDF avec Master PDF editor (qui depuis la version 5 n'est plus vraiment gratuit pour exporter ses modifications mais qui est heureusement toujours disponible en version 4.3.89). D'ailleurs si vous connaissez une alternative je suis preneur...

Heureusement maintenant c'est fini parce qu'après HTML/CSS et PHP j'ai enfin agrémenter KrISS tuto de JS !

Autant vous dire que je suis bien content et mon cours est maintenant complet, uniforme et interactif grâce aux différentes consoles que j'ai adaptées pour être utilisées directement dans le navigateur avec l'affichage du code HTML/CSS et son interprétation par le navigateur, l'affichage de la console JS et la sortie du code PHP. C'est vraiment agréable pour la présentation, tout se fait dans le navigateur !

En plus je peux générer le PDF de mon cours grâce à l'attribut print-pdf dans l'url. Par contre je ne sais pas exactement pourquoi mais quand je l'imprime avec Firefox, il me génère une page blanche entre chaque diapo et j'ai donc cherché à les supprimer en ligne de commande.

J'avais déjà eu le soucis, et j'avais utilisé pdftk pour résoudre ce problème

pdftk A=fichier.pdf cat Aodd output fichier_impair.pdf

Sauf que pdftk ne s'installe plus facilement avec apt à cause de certaines dépendances. A priori il existe une version java mais je n'avais pas envie d'ajouter une source tiers pour ça et j'ai donc cherché une alternative.

Première tentative avec psselect:

pdftops fichier.pdf; psselect -o fichier.ps > fichier_impair.ps; ps2pdf fichier_impair.ps

L'option -o pour odd (impair) et -e pour even (pair).
Taille du fichier d'origine 611k, taille du fichier final 6.6M !!!
À part le fait qu'au final j'ai bien le résultat attendu, ce n'est vraiment pas une bonne solution, les conversions pdf/ps/pdf sont super longues, la création d'un fichier PS inutile et la taille du finale du fichier x10 ce n'est pas possible...

Deuxième tentative avec qpdf:

qpdf --pages fichier.pdf 1,3,5,7,9 -- fichier.pdf fichier_impair.pdf

Sauf que mon nombre de pages ne s'arrêtent pas à 10 et je n'ai pas vu d'options dans le man pour gérer les pages paires/impaires.
J'ai donc cherché à récupérer le nombre de page de mon fichier PDF avec :

pdfinfo fichier.pdf | grep 'Pages:' | cut -d':' -f2

et avec l'utilisation de seq pour générer la liste des pages impaires

seq 1 2 $(pdfinfo fichier.pdf | grep 'Pages:' | cut -d':' -f2)

pour les pages paires il suffit de commencer seq à 2

seq 2 2 $(pdfinfo fichier.pdf | grep 'Pages:' | cut -d':' -f2)

Pour avoir toutes les pages sur une seule ligne, un petit xargs et un petit tr pour remplacer les espaces par des virgules, ce qui donne au final :

file="fichier.pdf"; qpdf --pages "$file" $(seq 1 2 $(pdfinfo "$file" | grep 'Pages:' | cut -d':' -f2) | xargs | tr " " ",") -- "$file" "${file/.pdf/_impair.pdf}"

Taille du fichier d'origine 611k, taille du fichier final 502k !!! Et c'est instantané !
Vive la ligne de commande

KrISS tuto : html, css, php et maintenant javascript

jeudi 7 février 2019 à 19:02
Cela faisait plusieurs années que j'utilisais une présentation javascript d'une autre personne alors qu'il y avait des choses du style

<SCRIPT LANGUAGE="JavaScript">...</SCRIPT>

Autant vous dire que je n'étais pas à l'aise : l'utilisation des majuscules pour les balises et l'attribut language... ça pique un peu les yeux. J'avais apporté quelques modifications sur le fichier PDF avec Master PDF editor (qui depuis la version 5 n'est plus vraiment gratuit pour exporter ses modifications mais qui est heureusement toujours disponible en version 4.3.89). D'ailleurs si vous connaissez une alternative je suis preneur...

Heureusement maintenant c'est fini parce qu'après HTML/CSS et PHP j'ai enfin agrémenter KrISS tuto de JS !

Autant vous dire que je suis bien content et mon cours est maintenant complet, uniforme et interactif grâce aux différentes consoles que j'ai adaptées pour être utilisées directement dans le navigateur avec l'affichage du code HTML/CSS et son interprétation par le navigateur, l'affichage de la console JS et la sortie du code PHP. C'est vraiment agréable pour la présentation, tout se fait dans le navigateur !

En plus je peux générer le PDF de mon cours grâce à l'attribut print-pdf dans l'url. Par contre je ne sais pas exactement pourquoi mais quand je l'imprime avec Firefox, il me génère une page blanche entre chaque diapo et j'ai donc cherché à les supprimer en ligne de commande.

J'avais déjà eu le soucis, et j'avais utilisé pdftk pour résoudre ce problème

pdftk A=fichier.pdf cat Aodd output fichier_impair.pdf

Sauf que pdftk ne s'installe plus facilement avec apt à cause de certaines dépendances. A priori il existe une version java mais je n'avais pas envie d'ajouter une source tiers pour ça et j'ai donc cherché une alternative.

Première tentative avec psselect:

pdftops fichier.pdf; psselect -o fichier.ps > fichier_impair.ps; ps2pdf fichier_impair.ps

L'option -o pour odd (impair) et -e pour even (pair).
Taille du fichier d'origine 611k, taille du fichier final 6.6M !!!
À part le fait qu'au final j'ai bien le résultat attendu, ce n'est vraiment pas une bonne solution, les conversions pdf/ps/pdf sont super longues, la création d'un fichier PS inutile et la taille du finale du fichier x10 ce n'est pas possible...

Deuxième tentative avec qpdf:

qpdf --pages fichier.pdf 1,3,5,7,9 -- fichier.pdf fichier_impair.pdf

Sauf que mon nombre de pages ne s'arrêtent pas à 10 et je n'ai pas vu d'options dans le man pour gérer les pages paires/impaires.
J'ai donc cherché à récupérer le nombre de page de mon fichier PDF avec :

pdfinfo fichier.pdf | grep 'Pages:' | cut -d':' -f2

et avec l'utilisation de seq pour générer la liste des pages impaires

seq 1 2 $(pdfinfo fichier.pdf | grep 'Pages:' | cut -d':' -f2)

pour les pages paires il suffit de commencer seq à 2

seq 2 2 $(pdfinfo fichier.pdf | grep 'Pages:' | cut -d':' -f2)

Pour avoir toutes les pages sur une seule ligne, un petit xargs et un petit tr pour remplacer les espaces par des virgules, ce qui donne au final :

file="fichier.pdf"; qpdf --pages "$file" $(seq 1 2 $(pdfinfo "$file" | grep 'Pages:' | cut -d':' -f2) | xargs | tr " " ",") -- "$file" "${file/.pdf/_impair.pdf}"

Taille du fichier d'origine 611k, taille du fichier final 502k !!! Et c'est instantané !
Vive la ligne de commande