Commit 9a01bc5b authored by Cerdic's avatar Cerdic

#BOUTON_TELECHARGER_OFFLINE et mecanismes de build des URLs d'un objet et des...

#BOUTON_TELECHARGER_OFFLINE et mecanismes de build des URLs d'un objet et des services en background
parent 74bc0ace
......@@ -100,6 +100,22 @@ function offline_url_404_offline() {
return $url_offline_404;
}
/**
* Nettoyer une liste d'URLs issue d'une liste texte
* @param string|array $urls
* @return array
*/
function offline_clean_urls_list($urls) {
if (is_string($urls)) {
$urls = explode("\n", $urls);
}
$urls = array_map('trim', $urls);
$urls = array_filter($urls);
$urls = array_unique($urls);
return $urls;
}
/**
* URLs a mettre en cache
* - soit liste des URLs configurées, par defaut
......@@ -112,9 +128,7 @@ function offline_urls_to_cache($build = false) {
$file_urls_load = _DIR_ETC . 'offline/'. "urls_to_cache.txt";
if ($build and file_exists($file_urls_load)) {
$urls = file_get_contents($file_urls_load);
$urls = explode("\n", $urls);
$urls = array_map('trim', $urls);
$urls = array_filter($urls);
$urls = offline_clean_urls_list($urls);
return $urls;
}
......@@ -133,9 +147,7 @@ function offline_urls_to_cache($build = false) {
);
if (isset($c['cacher_ressources'])) {
$u = explode("\n", $c['cacher_ressources']);
$u = array_map('trim', $u);
$u = array_filter($u);
$u = offline_clean_urls_list($c['cacher_ressources']);
$urls = array_merge($urls, $u);
}
......@@ -354,6 +366,20 @@ function offline_build_services($force_refresh=false, $time_out=null) {
return true;
}
/**
* Construire les services, en tache de fond
* @param bool $force_refresh
* @param int $iteration
*/
function offline_background_build_services($force_refresh=false, $iteration=1) {
$time_out = $_SERVER['REQUEST_TIME'] + 20;
if (!offline_build_services($force_refresh, $time_out)) {
// si pas fini il faut relancer
$iteration++;
job_queue_add('offline_background_build_services', "Build Services offline (iter $iteration)", array($force_refresh, $iteration), 'inc/offline', true, time(), -1);
}
}
/**
* Construire la liste des URLs a telecharger (y compris donc les ressources), pour rendre une liste de pages consultables hors ligne
......@@ -426,4 +452,103 @@ function offline_build_urls($file_urls_load_progress, $force_refresh=false, $tim
$urls = array_filter($urls);
$urls = array_unique($urls);
return $urls;
}
/**
* Nom du fichier qui contient la liste des URLs a telecharger pour un objet
* @param string $objet
* @param int $id_objet
* @return string
*/
function offline_filename_urls_to_load_objet($objet, $id_objet) {
$dir_config = sous_repertoire(_DIR_ETC, 'offline');
$dir_config = sous_repertoire($dir_config, 'objets');
$file_urls_load = $dir_config . "urls-{$objet}-{$id_objet}.txt";
return $file_urls_load;
}
/**
* Liste des URLs a telecharger pour permettre la consultation offline d'un objet
* @param string $objet
* @param int $id_objet
* @param bool $build
* lancer le build si il n'existe pas (true) ou pour mise a jour ('refresh')
* @return array|bool
*/
function offline_urls_to_load_objet($objet, $id_objet, $build = false) {
$file_urls_load = offline_filename_urls_to_load_objet($objet, $id_objet);
if (!file_exists($file_urls_load) or !$urls = file_get_contents($file_urls_load)) {
// Lancer un buil si besoin
if ($build) {
offline_start_build_urls_objet($objet, $id_objet, _VAR_MODE ? true : false);
}
return false;
}
if ($build === 'refresh') {
offline_start_build_urls_objet($objet, $id_objet, _VAR_MODE ? true : false);
}
$urls = offline_clean_urls_list($urls);
return $urls;
}
/**
* Construite la liste des URLs a telecharger pour un objet
* @param string $objet
* @param int $id_objet
* @param bool $force_refresh
* forcer ou non la mise a jour des pages avant de parser leur contenu
* @param null $time_out
* limite de temps (build incremental) ou non (buil en cli)
* @return array|bool|string
*/
function offline_build_urls_objet($objet, $id_objet, $force_refresh=false, $time_out=null) {
$file_urls_load = offline_filename_urls_to_load_objet($objet, $id_objet);
$file_urls_load_progress = $file_urls_load . '.tmp';
if (!file_exists($file_urls_load_progress)) {
$primary = id_table_objet($objet);
$urls = recuperer_fond('offline/urls-'.$objet, array($primary => $id_objet));
$urls = offline_clean_urls_list($urls);
$urls_to_load = array(
0 => $urls
);
ecrire_fichier($file_urls_load_progress, json_encode($urls_to_load));
}
if (!$urls_to_load = offline_build_urls($file_urls_load_progress, $force_refresh, $time_out)) {
// on a pas fini, on reviendra
return false;
}
@unlink($file_urls_load_progress);
$urls_to_load = implode("\n", $urls_to_load);
ecrire_fichier($file_urls_load, $urls_to_load);
return $urls_to_load;
}
/**
* Construire la liste d'URLs pour un objet, en tache de fond
* @param string $objet
* @param int $id_objet
* @param bool $force_refresh
* @param int $iteration
*/
function offline_background_build_urls_objet($objet, $id_objet, $force_refresh=false, $iteration=1) {
$time_out = $_SERVER['REQUEST_TIME'] + 20;
if (!offline_build_urls_objet($objet, $id_objet, $force_refresh, $time_out)) {
// si pas fini il faut relancer
$iteration++;
job_queue_add('offline_background_build_urls_objet', "Build URLs offline $objet-$id_objet (iter $iteration)", array($objet, $id_objet, $force_refresh, $iteration), 'inc/offline', true, time(), -1);
}
}
\ No newline at end of file
......@@ -13,6 +13,33 @@ if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
/**
* Construire les services, en tache de fond
* @param bool $force_refresh
* @param int $iteration
*/
function offline_start_build_services($force_refresh=false) {
job_queue_add('offline_background_build_services', "Build Services offline", array($force_refresh), 'inc/offline', true);
}
/**
* Lancer le build en tache de fond des URLs a telecharger pour un objet offline
* @param string $objet
* @param int $id_objet
* @param bool $force_refresh
*/
function offline_start_build_urls_objet($objet, $id_objet, $force_refresh=false) {
job_queue_add('offline_background_build_urls_objet', "Build URLs offline $objet-$id_objet", array($objet, $id_objet, $force_refresh), 'inc/offline', true);
}
/**
* Inserer des ressources supplémentaires dans le head d'une page existante
* (pour adapter la 404 de base en 404 offline)
* @param string $page_html
* @param string $insert
* @return mixed
*/
function offline_inserer_head($page_html, $insert) {
if ($p = stripos($page_html, '</head>')) {
......@@ -27,4 +54,65 @@ function offline_inserer_head($page_html, $insert) {
$page_html = substr_replace($page_html, $insert, $p, 0);
}
return $page_html;
}
/**
* #BOUTON_TELECHARGER_OFFLINE{rubrique,#ID_RUBRIQUE,'Télécharger cette documentation','Téléchargerment non disponible');
* @param $p
*/
function balise_BOUTON_TELECHARGER_OFFLINE_dist($p) {
$_objet = interprete_argument_balise(1, $p);
$_id_objet = interprete_argument_balise(2, $p);
$_label_active = "''";
$_label_unactive = "''";
if (($v = interprete_argument_balise(3, $p)) !== null) {
$_label_active = $v;
if (($v = interprete_argument_balise(4, $p)) !== null) {
$_label_unactive = $v;
}
}
$p->code = "offline_bouton_telecharger($_objet,$_id_objet,$_label_active,$_label_unactive)";
$p->interdire_scripts = false;
}
/**
* Filtre d'affichage utilise par #BOUTON_TELECHARGER_OFFLINE
* @param string $objet
* @param int $id_objet
* @param string $label_active
* @param string $label_unactive
* @return string
*/
function offline_bouton_telecharger($objet, $id_objet, $label_active='', $label_unactive='') {
// est-ce qu'on a bien un fond disponible pour lister les pages a telecharger ?
if (!trouver_fond('offline/urls-'.$objet)) {
return '';
}
include_spip('inc/offline');
// 3 status possibles :
// unactive : le telechargement n'est pas disponible pour cet objet (ou pour le moment car pas de build des urls dispo)
// activable : tout est OK cote serveur, le JS devra verifier cote client
// active : le bouton est actif et permet le telechargement
$status = 'activable'; // pas 'active' par defaut, car c'est le JS qui activera si le service-worker est bien charge
// est-ce qu'on a bien une collection buildee pour cet objet, ou faut-il lancer le build en cron ?
if (!offline_urls_to_load_objet($objet, $id_objet, _VAR_MODE ? 'refresh' : false)) {
$status = 'unactive';
}
$contexte = array(
'objet' => $objet,
'id_objet' => $id_objet,
'status' => $status,
'label_active' => $label_active,
'label_unactive' => $label_unactive,
);
$html = recuperer_fond('offline/bouton-telecharger', $contexte);
return $html;
}
\ No newline at end of file
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment