Feat: ajout d'une vue Gamutable pour les contenus récupérées du JSONL
This commit is contained in:
parent
cdeb5f0b61
commit
20663f23ff
6 changed files with 265 additions and 5 deletions
101
content/contenu_jsonl.html
Normal file
101
content/contenu_jsonl.html
Normal 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{<,<}|replace{>,>})]</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{<,<}|replace{>,>}|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>
|
|
@ -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"
|
||||
|
||||
]
|
||||
<h1>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
|
||||
<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 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>
|
||||
</p>
|
||||
<div class="la_une">
|
||||
|
@ -20,7 +21,7 @@
|
|||
[(#REM)
|
||||
{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}})]})]
|
||||
<div>
|
||||
<h4 class="aff_masq">Page #VALEUR :</h4>
|
||||
|
@ -45,7 +46,7 @@
|
|||
<li>
|
||||
<div class="aff_masq">Titraille :</div>
|
||||
<textarea class="details">[(#VALEUR|base64_decode|affiche_titraille)]</textarea>
|
||||
</li>
|
||||
</li>
|
||||
]
|
||||
[(#CLE|=={htmlBytes}|non)
|
||||
<li>
|
||||
|
|
54
content/synthese_jsonl.html
Normal file
54
content/synthese_jsonl.html
Normal 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>
|
|
@ -145,7 +145,6 @@ function affiche_titraille($html) {
|
|||
$titraille[] = '<h'.$h.'>'.$m[2].'</h'.$h.'>';
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return join("\r\n", $titraille);
|
||||
|
@ -165,4 +164,31 @@ function human_filesize($bytes, $decimals = 2) {
|
|||
$sz = 'BKMGTP';
|
||||
$factor = floor((strlen($bytes) - 1) / 3);
|
||||
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];
|
||||
}
|
|
@ -13,6 +13,7 @@
|
|||
<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_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) }
|
||||
</fieldset>
|
||||
|
||||
|
|
77
json_affiche_corpus.json.html
Normal file
77
json_affiche_corpus.json.html
Normal 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{<,<}|replace{>,>}|replace{§§,<br>}|replace{"\n", <br>})]})] ]
|
||||
[(#CLE|=={htmlmeta:head:title}|oui) [(#SET{title, title: [(#VALEUR|print|replace{<br>,§§}|replace{<br />,§§}|replace{<,<}|replace{>,>}|replace{§§,<br>}|replace{"\n", <br>})]})] ]
|
||||
[(#CLE|=={htmlmeta:head:keywords}|oui) [(#SET{keywords, keywords: [(#VALEUR|print|replace{<br>,§§}|replace{<br />,§§}|replace{<,<}|replace{>,>}|replace{§§,<br>}|replace{"\n", <br>})]})] ]
|
||||
[(#CLE|=={htmlmeta:head:description}|oui) [(#SET{description, desc: [(#VALEUR|print|replace{<br>,§§}|replace{<br />,§§}|replace{<,<}|replace{>,>}|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>
|
||||
]
|
Loading…
Add table
Reference in a new issue