From 0ff2c68eac0df510817b00986ba393620949aae5 Mon Sep 17 00:00:00 2001 From: Tykayn Date: Sun, 2 Nov 2025 18:40:04 +0100 Subject: [PATCH] up stats sections --- generate_blog_stats.py | 147 +++++++++++++----- ...24T171610__a-la-decouverte-du-clitoris.org | 42 ++--- templates/html/stats.html.j2 | 97 +++++++++++- 3 files changed, 223 insertions(+), 63 deletions(-) diff --git a/generate_blog_stats.py b/generate_blog_stats.py index 18e069f0..0c04aab0 100644 --- a/generate_blog_stats.py +++ b/generate_blog_stats.py @@ -10,7 +10,8 @@ import re import argparse import shutil from datetime import datetime -from collections import defaultdict +from collections import defaultdict, Counter +from urllib.parse import urlparse import locale try: @@ -164,6 +165,62 @@ def compter_signes(contenu, est_markdown=False): return len(contenu_clean) +def extraire_domaine(url): + """ + Extrait le domaine d'une URL. + Retourne None si ce n'est pas une URL valide. + """ + try: + # Ajouter http:// si l'URL ne commence pas par http:// ou https:// + if not url.startswith(('http://', 'https://')): + if url.startswith('www.'): + url = 'http://' + url + else: + return None + + parsed = urlparse(url) + domain = parsed.netloc + + # Supprimer www. si présent + if domain.startswith('www.'): + domain = domain[4:] + + # Ignorer les URLs locales ou non valides + if not domain or domain in ['localhost', '']: + return None + + return domain + except Exception: + return None + + +def extraire_liens(contenu, est_markdown=False): + """ + Extrait tous les liens du contenu et retourne une liste d'URLs. + """ + urls = [] + + if est_markdown: + # Extraire les liens markdown: [texte](url) ou ![alt](url) + liens_images = re.findall(r'!\[([^\]]*)\]\(([^\)]+)\)', contenu) + liens_autres = re.findall(r'(? 0 else 0 liens_images_moyen = liens_images_total / nb_articles_total if nb_articles_total > 0 else 0 liens_autres_moyen = liens_autres_total / nb_articles_total if nb_articles_total > 0 else 0 + + # Calculer les domaines des liens + domaines_liens = calculer_domaines_liens(articles) signes_moyen = signes_total / nb_articles_total if nb_articles_total > 0 else 0 temps_lecture_par_article = temps_lecture_total / nb_articles_total if nb_articles_total > 0 else 0 @@ -783,7 +843,8 @@ def generer_statistiques_blog(blog_name, sources_dir, html_websites_dir, env, te date_gen=date_gen, lecture_mots_par_minute=LECTURE_MOTS_PAR_MINUTE, css_path='stats.css', - sections_stats=None # Pas de sections pour l'analyse de blog complet + sections_stats=None, # Pas de sections pour l'analyse de blog complet + domaines_liens=domaines_liens ) # Sauvegarder le HTML @@ -1157,6 +1218,12 @@ def generer_page_combinee(blogs_data, output_file, html_websites_dir, env, objec # Calculer les statistiques NaNoWriMo combinées pour les 3 derniers mois stats_nanowrimo_combines = calculer_nanowrimo_combine(blogs_data, objectif_quotidien, objectif_mensuel) + # Calculer les domaines combinés de tous les blogs + tous_articles = [] + for blog_data in blogs_data: + tous_articles.extend(blog_data.get('articles', [])) + domaines_liens_combines = calculer_domaines_liens(tous_articles) if tous_articles else [] + # Générer les graphiques combinés graphiques_combines, graph_path_combines = generer_graphiques_combines(blogs_data, html_websites_dir) @@ -1422,6 +1489,9 @@ def generer_statistiques_fichier(filepath, html_websites_dir, env, template, dat liens_autres_total = article['liens_autres'] temps_lecture_total = article['temps_lecture'] + # Calculer les domaines des liens + domaines_liens = calculer_domaines_liens([article]) + # Parser les sections si c'est un fichier org sections_stats = None if ext == '.org': @@ -1509,7 +1579,8 @@ def generer_statistiques_fichier(filepath, html_websites_dir, env, template, dat nb_jours_avec_articles=1, nb_mois_avec_articles=1, nb_annees_avec_articles=1, - sections_stats=sections_stats + sections_stats=sections_stats, + domaines_liens=domaines_liens ) # Sauvegarder le HTML diff --git a/sources/qzine_blog/lang_fr/20160524T171610__a-la-decouverte-du-clitoris.org b/sources/qzine_blog/lang_fr/20160524T171610__a-la-decouverte-du-clitoris.org index df25375d..543d1503 100644 --- a/sources/qzine_blog/lang_fr/20160524T171610__a-la-decouverte-du-clitoris.org +++ b/sources/qzine_blog/lang_fr/20160524T171610__a-la-decouverte-du-clitoris.org @@ -28,7 +28,9 @@ documentaire "le clitoris ce cher inconnu" que la plupart des femmes entre 20 et 25 ans ne savaient pas situer leur clitoris, beaucoup croyaient que c'était la partie de leur sexe qui leur permettait d'uriner et ignoraient tout de son rôle dans le plaisir sexuel -féminin./[[https://qzine.fr/wp-content/uploads/2016/05/received_1198948796817047-723x1024.jpeg]]/Le mois +féminin. + +[[https://qzine.fr/wp-content/uploads/2016/05/received_1198948796817047-723x1024.jpeg]]/Le mois de mai a été [[https://next.liberation.fr/sexe/2012/05/04/en-mai-masturbez-vous_816162][déclaré mois de la masturbation]] en 2012, on serait donc en droit de croire que @@ -49,7 +51,10 @@ branleur êtes vous ?]]  et sextoys]] (avec des échantillons de personnes non sélectionnés) indiquent pour les personnes ayant répondu, que la masturbation fait partie de leur quotidien. La majorité des fréquences de masturbation se -situant entre deux fois par jour et un jour sur deux. Il reste plus +situant entre deux fois par jour et un jour sur deux. + + +Il reste plus facile pour tout le monde d'aborder le sujet entre amis comparé à des discussions entre membres de la famille.Il reste difficile d'objectivement dire pourquoi le plaisir est plus dur à @@ -79,10 +84,15 @@ participer au débat? Parce que bon, c'est à dire que l'anus contient de nombreuses terminaisons nerveuses (tout comme bien d'autres organes), faites pour ressentir plein de choses, quel que soit votre genre. Et pour celles qui jouissent de plusieurs endroits et qui n'ont pas de -préférence? En fait si.[caption id="" +préférence? En fait si. + +[caption id="" align="aligncenter" width="640"][[https://upload.wikimedia.org/wikipedia/commons/thumb/b/bd/Sch%C3%A9ma_strucurel_l%C3%A9gend%C3%A9_du_clitoris.svg/640px-Sch%C3%A9ma_strucurel_l%C3%A9gend%C3%A9_du_clitoris.svg.png?1464106481474]] -schéma de clitoris[/caption]Ce que l'on voit du +schéma de clitoris[/caption] + + +Ce que l'on voit du clitoris n'est que son gland, caché sous son capuchon. à moins qu'on s'appelle Jack l'éventreur et qu'on découpe des gens. Comme le montre le schéma ci contre, le clitoris englobe le vagin et se cache derrière les @@ -127,22 +137,14 @@ connaissent bien leur corps, ou si vous pensez que les femmes ont moins d'envie de plaisir sexuel que les hommes. -<> - -* Une erreur s'est produite. - -:PROPERTIES: -:CUSTOM_ID: une-erreur-sest-produite. - -:CLASS: message -:END: - -Impossible d'exécuter JavaScript. - - Première diffusion sur ARTE, le 16 Janvier 2004à 22h15, dans le cadre d'une THEMA : Le -sexedes -femmes [[https://qzine.fr/wp-content/uploads/2016/05/mamiepointG.png]](mamie -pantoufle par Milk)Heureusement que mamie pantoufle +sexe des +femmes + + + [[https://qzine.fr/wp-content/uploads/2016/05/mamiepointG.png]](mamie +pantoufle par Milk) + +Heureusement que mamie pantoufle est là pour rétablir la vérité! diff --git a/templates/html/stats.html.j2 b/templates/html/stats.html.j2 index c4a4cec9..19652e2e 100644 --- a/templates/html/stats.html.j2 +++ b/templates/html/stats.html.j2 @@ -270,6 +270,57 @@ {% if sections_stats %}

Analyse des sections

+ {% set niveaux_vus = [] %} + {% set objectifs_text = [] %} + {% for section in sections_stats %} + {% if section.niveau not in niveaux_vus %} + {% set _ = niveaux_vus.append(section.niveau) %} + {% set _ = objectifs_text.append("Niveau " + section.niveau|string + " : " + section.objectif|int|string + " mots") %} + {% endif %} + {% endfor %} +

+ Objectif par section : {{objectifs_text|join(" | ")}} +

+ @@ -298,11 +349,25 @@ {% endfor %} @@ -310,6 +375,28 @@
{{section.mots|int|format_number}} {{section.signes|int|format_number}} - {% if section.manquants > 0 %} - {{section.manquants|int|format_number}} - {% else %} - - {% endif %} + + {% if section.manquants > 0 %} + {{section.manquants|int|format_number}} + {% else %} + + {% endif %} + + Section: {{section.titre}}
+ Objectif (niveau {{section.niveau}}): {{section.objectif|int|format_number}} mots
+ Réalisé: {{section.mots|int|format_number}} mots
+ Signes: {{section.signes|int|format_number}}

+ État:
+ {% if section.depasse %} + ✓ Objectif atteint ! (+{{(section.mots - section.objectif)|int|format_number}} mots au-delà de l'objectif) + {% else %} + En cours ({{section.manquants|int|format_number}} mots manquants pour atteindre l'objectif) + {% endif %} +
+
{% endif %} + {% if domaines_liens %} +

Domaines des sites web liés

+ + + + + + + + + + {% for domaine, nombre in domaines_liens %} + + + + + + {% endfor %} + +
RangDomaineOccurrences
{{loop.index}}{{domaine}}{{nombre|int|format_number}}
+ {% endif %} +

Statistiques détaillées par mois