Feat: ajout d'une vue Gamutable pour les contenus récupérées du JSONL

This commit is contained in:
cy_altern 2023-05-28 16:49:22 +02:00
parent cdeb5f0b61
commit 20663f23ff
6 changed files with 265 additions and 5 deletions

101
content/contenu_jsonl.html Normal file
View file

@ -0,0 +1,101 @@
[(#REM)
affichage en boucle DATA des premières et dernières lignes des fichiers JSONL stockés dans un répertoire corpus
on fait tout un tas de traitements en fonction du type de donnée par champ pour essayer d'afficher qq chose de "lisible par un humain"
]
<h1>Extraction des contenus d'un lot de fichiers JSONL</h1>
<p>Chargement des fichiers Jsonl après leur décompaction et récupération de "contenus significatifs"
<br>Nombre de lignes configuré par le "pas" de l'itération dans les pages : ici <strong>#CONFIG{corpus_web/pas_corpus, 10}</strong> (1 = toutes les pages, 10 = 1 page sur 10...)
<br><small>pour mémoire : 1 ligne du fichier JSONL = 1 page HTML du site aspiré/archivé</small>
</p>
<div class="la_une">
<ul>
<BOUCLE_corpus(DATA){source ls, #CHEMIN{tmp}/#CONFIG{corpus_web/repertoire_corpus,corpus_jsonl}/*}{par basename}>
<li>
#SET{liste_lignes,#LISTE{1}} #SET{trop_gros,#CONFIG{corpus_web/taille_max}|mult{1000000}} [(#REM) trop gros = 100Mo ]
#SET{nb_lignes, #FILE|nombre_ligne} [(#GET{nb_lignes}|!={1}|oui) #SET{liste_lignes,#LISTE{1,#GET{nb_lignes}}}]
<h3 class="spip[ (#SIZE|>{#GET{trop_gros}}|oui)non_traite]">
[(#FILE|basename)] ([(#FILE|basename|recup_site)] / [(#FILE|basename|recup_aspi)]): [(#GET{nb_lignes}) [(#GET{nb_lignes}|singulier_ou_pluriel{page,pages})]] <small>([(#SIZE|human_filesize)o])</small>
[ (#SIZE|>{#GET{trop_gros}}|oui)<div>fichier trop gros pour traitement basique</div>]
</h3>
[(#REM)
{liste #GET{liste_lignes}}
]
<BOUCLE_2lignes(DATA){enum 1, #GET{nb_lignes}, #CONFIG{corpus_web/pas_corpus, 10}}{si #SIZE|<{#GET{trop_gros}}}>
[(#SET{num_ligne,[(#COMPTEUR_BOUCLE|=={1}|?{1,#GET{nb_lignes}})]})]
<div>
<h4 class="aff_masq">Page #VALEUR :</h4>
<div class="details">
[(#SET{content,[(#FILE|affiche_ligne{#GET{num_ligne}}|json_decode{true})]})]
<ul>
<BOUCLE_content(DATA){source table, #GET{content}}>
[(#CLE|=={htmlBytes}|oui)
[(#REM)
<li>
<div class=""><span class="aff_masq_">Title :</span> [(#VALEUR|base64_decode|affiche_title)]</div>
</li>
]
<li>
<div class="aff_masq">[(#CLE)] = HTML de la page (clic pour visualiser) </div>
<div class="details">
<textarea class="details">[(#VALEUR|base64_decode|replace{<,&lt;}|replace{>,&gt;})]</textarea>
</div>
</li>
<li>
<div class="aff_masq_">Titres :</div>
<div class="details_">[(#VALEUR|base64_decode|recup_titres)]</div>
</li>
]
[(#CLE|=={extractionContent}|oui)
<BOUCLE_ss(DATA){source table, #VALEUR}>
[(#CLE|in_array{#LISTE{boilerpipe:text, htmlmeta:head:title, htmlmeta:head:keywords, htmlmeta:head:description}}|oui)
<li>
<div class="aff_masq_">[(#CLE|replace{htmlmeta:head:, meta }|replace{boilerpipe:, ''}|ucfirst)] : </div>
<div class="details_">
[(#VALEUR|print|replace{<br>,§§}|replace{<br />,§§}|replace{<,&lt;}|replace{>,&gt;}|replace{§§,<br>}|replace{"\n", <br>})]
</div>
</li>
]
</BOUCLE_ss>
]
</BOUCLE_content>
</ul>
</div>
</div>
</BOUCLE_2lignes>
</li>
</BOUCLE_corpus>
</ul>
</div>
<script type="text/javascript">
jQuery(function () {
$('.aff_masq').each(function() {
$(this).siblings('.details').toggleClass('js-hidden');
});
$('.aff_masq').on('click', function() {
$(this).siblings('.details').toggleClass('js-hidden');
});
});
</script>
<style type="text/css" media="screen">
.aff_masq, .aff_masq_ {
cursor: pointer;
font-weight: bold;
}
.aff_masq:hover {
background-color: #DDD;
}
.details br:first-of-type {
display: none;
}
textarea {
width: 100%;
height: 200px;
}
.non_traite {
color: #777;
}
</style>

View file

@ -3,8 +3,9 @@
on fait tout un tas de traitements en fonction du type de donnée par champ pour essayer d'afficher qq chose de "lisible par un humain" on fait tout un tas de traitements en fonction du type de donnée par champ pour essayer d'afficher qq chose de "lisible par un humain"
] ]
<h1>Contenus d'un lot de fichiers JSONL</h1> <h1>Exploration des contenus d'un lot de fichiers JSONL</h1>
<p>Chargement des fichiers Jsonl après leur décompaction et affichage du contenu de toutes leurs lignes <p>Chargement des fichiers Jsonl après leur décompaction et affichage du contenu des lignes
<br>Nombre de lignes configuré par le "pas" de l'itération dans les pages : ici <strong>#CONFIG{corpus_web/pas_corpus, 10}</strong> (1 = toutes les pages, 10 = 1 page sur 10...)
<br><small>pour mémoire : 1 ligne du fichier JSONL = 1 page HTML du site aspiré/archivé</small> <br><small>pour mémoire : 1 ligne du fichier JSONL = 1 page HTML du site aspiré/archivé</small>
</p> </p>
<div class="la_une"> <div class="la_une">
@ -20,7 +21,7 @@
[(#REM) [(#REM)
{liste #GET{liste_lignes}} {liste #GET{liste_lignes}}
] ]
<BOUCLE_2lignes(DATA){enum 1, #GET{nb_lignes}}{si #SIZE|<{#GET{trop_gros}}}> <BOUCLE_2lignes(DATA){enum 1, #GET{nb_lignes}, #CONFIG{corpus_web/pas_corpus, 10}}{si #SIZE|<{#GET{trop_gros}}}>
[(#SET{num_ligne,[(#COMPTEUR_BOUCLE|=={1}|?{1,#GET{nb_lignes}})]})] [(#SET{num_ligne,[(#COMPTEUR_BOUCLE|=={1}|?{1,#GET{nb_lignes}})]})]
<div> <div>
<h4 class="aff_masq">Page #VALEUR :</h4> <h4 class="aff_masq">Page #VALEUR :</h4>
@ -45,7 +46,7 @@
<li> <li>
<div class="aff_masq">Titraille :</div> <div class="aff_masq">Titraille :</div>
<textarea class="details">[(#VALEUR|base64_decode|affiche_titraille)]</textarea> <textarea class="details">[(#VALEUR|base64_decode|affiche_titraille)]</textarea>
</li> </li>
] ]
[(#CLE|=={htmlBytes}|non) [(#CLE|=={htmlBytes}|non)
<li> <li>

View file

@ -0,0 +1,54 @@
[(#REM)
affichage en boucle DATA des premières et dernières lignes des fichiers JSONL stockés dans un répertoire corpus
on fait tout un tas de traitements en fonction du type de donnée par champ pour essayer d'afficher qq chose de "lisible par un humain"
]
<h1>Synthèse des contenus extraits d'un lot de fichiers JSONL</h1>
<p>Chargement des fichiers Jsonl après leur décompaction et récupération de "contenus significatifs" puis mise en tableau pour filtrages/tris/extractions CSV
<br>Nombre de lignes configuré par le "pas" de l'itération dans les pages : ici <strong>#CONFIG{corpus_web/pas_corpus, 10}</strong> (1 = toutes les pages, 10 = 1 page sur 10...)
<br><small>pour mémoire : 1 ligne du fichier JSONL = 1 page HTML du site aspiré/archivé</small>
</p>
</div></div>
<div class="la_une">
<INCLURE{fond=inclure/gamutable,
apiuri="spip.php?page=json_affiche_corpus.json",
tparpage=[15,25,50,'Tous'],
champcsv="search",
delimitercsv=";",
vueblocdefaut='tableau',
namecsv="extractions_corpus.csv",
env
}>
</div>
<script type="text/javascript">
jQuery(function () {
$('.aff_masq').each(function() {
$(this).siblings('.details').toggleClass('js-hidden');
});
$('.aff_masq').on('click', function() {
$(this).siblings('.details').toggleClass('js-hidden');
});
});
</script>
<style type="text/css" media="screen">
.aff_masq, .aff_masq_ {
cursor: pointer;
font-weight: bold;
}
.aff_masq:hover {
background-color: #DDD;
}
.details br:first-of-type {
display: none;
}
textarea {
width: 100%;
height: 200px;
}
.non_traite {
color: #777;
}
</style>

View file

@ -145,7 +145,6 @@ function affiche_titraille($html) {
$titraille[] = '<h'.$h.'>'.$m[2].'</h'.$h.'>'; $titraille[] = '<h'.$h.'>'.$m[2].'</h'.$h.'>';
} }
} }
} }
return join("\r\n", $titraille); return join("\r\n", $titraille);
@ -165,4 +164,31 @@ function human_filesize($bytes, $decimals = 2) {
$sz = 'BKMGTP'; $sz = 'BKMGTP';
$factor = floor((strlen($bytes) - 1) / 3); $factor = floor((strlen($bytes) - 1) / 3);
return sprintf("%.{$decimals}f", $bytes / pow(1024, $factor)) . @$sz[$factor]; return sprintf("%.{$decimals}f", $bytes / pow(1024, $factor)) . @$sz[$factor];
}
function recup_titres($html) {
// regexp : class="(titre|field-content)
// class="(titre|field-content)">(<[^>]*>)?([^<>]*)
$titres = [];
$html = str_replace(['<em>','</em>'], '', $html);
preg_match_all('/class="(titre|field-content|nodeTitle nobreak)">(<[^>]*>)?([^<>]*)/si', $html, $match, PREG_SET_ORDER);
if ($match) {
foreach($match as $m) {
if ($m[3] !== '') {
$titres[] = $m[3];
}
}
}
return count($titres) ? "<ul><li>".join("</li><li>", $titres)."</li></ul>" : '';
}
function recup_site($nom_fichier_jsonl) {
return explode('_', $nom_fichier_jsonl)[0];
}
function recup_aspi($nom_fichier_jsonl) {
$T = explode('_', $nom_fichier_jsonl)[1];
$T = explode('-', $T);
return $T[0].'-'.$T[1].'-'.$T[2];
} }

View file

@ -13,6 +13,7 @@
<legend>Configuration traitement JSONL</legend> <legend>Configuration traitement JSONL</legend>
#SAISIE{input, repertoire_apercu, label=repertoire_apercu, explication=nom du répertoire des fichiers JSONL pour l'aperçu (dans tmp/) } #SAISIE{input, repertoire_apercu, label=repertoire_apercu, explication=nom du répertoire des fichiers JSONL pour l'aperçu (dans tmp/) }
#SAISIE{input, repertoire_corpus, label=repertoire_corpus, explication=nom du répertoire des fichiers JSONL pour le corpus (dans tmp/) } #SAISIE{input, repertoire_corpus, label=repertoire_corpus, explication=nom du répertoire des fichiers JSONL pour le corpus (dans tmp/) }
#SAISIE{input, pas_corpus, label=pas_corpus, explication=pour le corpus "pas" de l'itération dans les pages <br><small>(1 = toutes les pages, 10 = 1 page sur 10)</small> }
#SAISIE{input, taille_max, label=taille_max, explication=taille maximum des fichiers à traiter (en Mo) } #SAISIE{input, taille_max, label=taille_max, explication=taille maximum des fichiers à traiter (en Mo) }
</fieldset> </fieldset>

View file

@ -0,0 +1,77 @@
#HTTP_HEADER{Content-Type: application/json; charset=#CHARSET}
[(#ENV{id}|setenv{id_jsonl})]
[{
"header":{
"id": "id jsonl",
"site": "Site",
"date_aspi": "Date archive",
"num_page": "Numéro page",
"title": "Meta title",
"desc": "Meta description",
"keywords": "Meta keywords",
"titres": "titres",
"text": "Texte"
},
"filtreCol" : {
"site" : "select",
"date_aspi": "select",
"num_page": "input",
"title": "input",
"desc": "input",
"keywords": "input",
"titres": "input",
"text": "input"
},
"classes":{
}
} #SET{id_jsonl,1}
<BOUCLE_corpus(DATA){source ls, #CHEMIN{tmp}/#CONFIG{corpus_web/repertoire_corpus,corpus_jsonl}/*}{par basename}>
[(#SET{site,#FILE|basename|recup_site})] [(#SET{date_aspi,#FILE|basename|recup_aspi})]
#SET{liste_lignes,#LISTE{1}} #SET{trop_gros,#CONFIG{corpus_web/taille_max}|mult{1000000}}
#SET{nb_lignes, #FILE|nombre_ligne} [(#GET{nb_lignes}|!={1}|oui) #SET{liste_lignes,#LISTE{1,#GET{nb_lignes}}}]
<BOUCLE_2lignes(DATA){enum 1, #GET{nb_lignes}, #CONFIG{corpus_web/pas_corpus, 10}}{si #SIZE|<{#GET{trop_gros}}}>
[(#SET{num_ligne,[(#COMPTEUR_BOUCLE|=={1}|?{1,#GET{nb_lignes}})]})]
[(#SET{content,[(#FILE|affiche_ligne{#GET{num_ligne}}|json_decode{true})]})]
#SET{num_page,Page #VALEUR} #SET{title,''} #SET{keywords,''} #SET{description,''} #SET{titres,''}
<BOUCLE_content(DATA){source table, #GET{content}}>
[(#CLE|=={extractionContent}|oui)
<BOUCLE_ss(DATA){source table, #VALEUR}>
[(#CLE|=={boilerpipe:text}|oui) [(#SET{text, text: [(#VALEUR|print|replace{<br>,§§}|replace{<br />,§§}|replace{<,&lt;}|replace{>,&gt;}|replace{§§,<br>}|replace{"\n", <br>})]})] ]
[(#CLE|=={htmlmeta:head:title}|oui) [(#SET{title, title: [(#VALEUR|print|replace{<br>,§§}|replace{<br />,§§}|replace{<,&lt;}|replace{>,&gt;}|replace{§§,<br>}|replace{"\n", <br>})]})] ]
[(#CLE|=={htmlmeta:head:keywords}|oui) [(#SET{keywords, keywords: [(#VALEUR|print|replace{<br>,§§}|replace{<br />,§§}|replace{<,&lt;}|replace{>,&gt;}|replace{§§,<br>}|replace{"\n", <br>})]})] ]
[(#CLE|=={htmlmeta:head:description}|oui) [(#SET{description, desc: [(#VALEUR|print|replace{<br>,§§}|replace{<br />,§§}|replace{<,&lt;}|replace{>,&gt;}|replace{§§,<br>}|replace{"\n", <br>})]})] ]
</BOUCLE_ss>
][(#CLE|=={htmlBytes}|oui)
[(#SET{titres, [(#VALEUR|base64_decode|recup_titres)]})]
]
</BOUCLE_content>
,{
"html": {
"id": [(#GET{id_jsonl})],
"site" : [(#GET{site}|json_encode)],
"date_aspi": [(#GET{date_aspi}|json_encode)],
"num_page": [(#GET{num_page}|json_encode)],
"title": [(#GET{title}|json_encode)],
"desc": [(#GET{description}|json_encode)],
"keywords": [(#GET{keywords}|json_encode)],
"titres": [(#GET{titres}|json_encode)],
"text": [(#GET{text}|json_encode)]
},
"classes": {
"titre":"transcription"
},
"search": {
"id": [(#GET{id_jsonl})],
"site" : [(#GET{site}|json_encode)],
"date_aspi": [(#GET{date_aspi}|json_encode)],
"num_page": [(#GET{num_page}|json_encode)],
"title": [(#GET{title}|json_encode)],
"desc": [(#GET{description}|json_encode)],
"keywords": [(#GET{keywords}|json_encode)],
"titres": [(#GET{titres}|json_encode)],
"text": [(#GET{text}|json_encode)]
}
} [(#SET{id_jsonl, #GET{id_jsonl}|plus{1}})]
</BOUCLE_2lignes>
</BOUCLE_corpus>
]