site builder ok

This commit is contained in:
Tykayn 2024-11-11 00:58:44 +01:00 committed by tykayn
parent 7e9e8f2436
commit 83dd9f7472
27 changed files with 526 additions and 235 deletions

View File

@ -26,17 +26,37 @@ regex_orgroam = r"^(\d{14})_([a-zA-Z0-9_-]+)\.gmi$"
use_article_file_for_name=False
website_name = args.source
def extract_body_content(html_content):
pattern = r'<body>.+?</body>'
match = re.search(pattern, html_content, re.DOTALL)
if match:
return match.group(1)
else:
return None
def extract_body_content(html_content):
pattern = r'<body[^>]*?>(.*?)</body>'
match = re.search(pattern, html_content, re.DOTALL)
if match:
return match.group(1)
else:
return None
def trouver_nom_article(fichier_org):
def trouver_nom_article(fichier_org, format="html"):
print('fichier_org, ',fichier_org)
with open(fichier_org, 'r') as file:
lignes = file.readlines()
# Expressions régulières pour trouver les titres de niveau 1 et 2
titre_niveau_1 = r'^\*+ (.+)$'
titre_niveau_2 = r'^\*\*+ (.+)$'
nom_article = None
# Expressions régulières pour trouver les titres de niveau 1 et 2
if format == 'html':
titre_niveau_1 = r'^\<h1 id.*?\>(.+)\<\/h1\>$'
titre_niveau_2 = r'^\<h2.*?\>(.+)\<\/h2\>$'
else:
titre_niveau_1 = r'^\*+ (.+)$'
titre_niveau_2 = r'^\*\*+ (.+)$'
# Itérer sur les lignes du fichier
for ligne in lignes:
@ -182,9 +202,9 @@ def generer_index(dossier_source, fichier_index, titre_index):
if use_article_file_for_name:
article_name = link_html
else:
file_path_org = os.path.join(dossier_parent,"sources",website_name,link_org)
file_path_org = os.path.join(dossier_parent,"sources",website_name, link_org)
print('-------------- trouver_nom_article ',file_path_org)
article_name=trouver_nom_article(file_path_org)
article_name=trouver_nom_article(file_path_org, 'org')
if not article_name:
article_name = link_html

View File

@ -90,6 +90,10 @@ generate_website() {
cd sources/$website_name
convert_sources
cd templates
convert_sources ../
echo "----------- convert_sources : pages template $website_name converties"
cd ..
# traduction fr
cd lang_fr
@ -101,9 +105,10 @@ generate_website() {
cd lang_en
convert_sources ../
# echo "----------- pages en anglais du site web $website_name converties"
cd ..
cd ..
cd ..
pwd
@ -196,7 +201,7 @@ for website_name in "${blogs_folders[@]}"; do
# cp sources/$website_name/converted/*.html html-websites/$website_name/
cp index_$website_name.html html-websites/$website_name/index.html
# cp sources/$website_name/lang_fr/converted/*.html html-websites/$website_name/lang_fr/
# cp sources/$website_name/templates/converted/*.html html-websites/$website_name/templates/
# cp sources/$website_name/lang_en/converted/*.html html-websites/$website_name/lang_en/
python3 enrich_html.py html-websites/$website_name -t $website_name --style $style_file

View File

@ -15,10 +15,15 @@ style_file = args.style
blog_name = args.blog_name
source_blog = f"sources/{blog_name}"
header_content_path = f"{source_blog}/templates/header_page.org"
footer_content_path = f"{source_blog}/templates/footer_page.org"
header_content_path = f"{source_blog}/templates/converted/header_page.html"
footer_content_path = f"{source_blog}/templates/converted/footer_page.html"
static_page_path = f"{source_blog}/templates/html/static.html"
footer_content=''
after_article=''
# with open(footer_content_path, "r") as f:
# footer_content = f.read()
# variables du template de page
BANNIERE_ENTETE=''
BLOG_TITLE='Cipher Bliss'
@ -47,23 +52,14 @@ ARTICLE=''
FOOTER=''
def extract_body_content(html_content):
pattern = r'<body>.+?</body>'
pattern = r'<body[^>]*?>(.*?)</body>'
match = re.search(pattern, html_content, re.DOTALL)
if match:
return match.group(1)
else:
return None
def remove_before_body(text):
pattern = r"<!DOCTYPE>.+?<body>"
replacement = "<body>"
return re.sub(pattern, replacement, text, flags=re.DOTALL)
def remove_after_body(text):
pattern = r"</body>.+?</html>"
replacement = "</body>"
return re.sub(pattern, replacement, text, flags=re.DOTALL)
def remove_properties_section(text):
pattern = r"<h1 id=\"article\">Article</h1>.+?</ul>"
@ -85,13 +81,13 @@ def remove_hint_html(text):
def enrich_one_file(file, root_path):
print(' ----------- enrich html file:',os.path.join(root_path, file))
print(' ----------- enrich_html: file:',os.path.join(root_path, file))
css_content = ""
inline_the_css=False
# inline_the_css=True
print(' ----------- CSSS inline: ',inline_the_css)
print(' ----------- enrich_html: CSS inline: ',inline_the_css)
# Trouver le fichier entête
header_content=''
with open(os.path.join(root_path, file), "r") as f:
@ -101,12 +97,14 @@ def enrich_one_file(file, root_path):
html_content = f.read()
# remove some parts
# html_content = remove_properties_section(html_content)
# html_content = remove_article_head_properties_orgmode(html_content)
# html_content = remove_hint_html(html_content)
html_content = remove_properties_section(html_content)
html_content = remove_article_head_properties_orgmode(html_content)
html_content = remove_hint_html(html_content)
if inline_the_css == True:
print(' ----------- include css inline in each html page')
html_content = extract_body_content(html_content)
if inline_the_css is True:
print(' ----------- enrich_html: include css inline in each html page')
with open(os.path.join(root_path, file), "r") as f:
css_content = f.read()
css_content = "<style type='text/css'>{css_content}</style>"
@ -124,12 +122,9 @@ def enrich_one_file(file, root_path):
<meta property="og:description" content="{BLOG_SUBTITLE}">
<meta property="og:url" content="{NDD}">
<meta property="og:site_name" content="Cipher Bliss">
<link rel="alternate" type="application/rss+xml" title="Cipher Bliss » Flux"
href="{NDD}/feed/">
<link rel="alternate" type="application/rss+xml" title="Cipher Bliss » Flux" href="{NDD}/feed/">
<link href="/style.css" rel="stylesheet">
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>{TITLE}</title>
<meta name="author" content="{AUTHOR}">
@ -186,6 +181,9 @@ def enrich_one_file(file, root_path):
<main class="body-wrap boxed-container">
<article class="content">
{html_content}
<p class="after-article">
{after_article}
</p>
</article>
</main>
<footer class="site-footer has-top-divider">
@ -193,6 +191,7 @@ def enrich_one_file(file, root_path):
<div class="site-footer-inner">
{NAVIGATION}
</div>
@ -206,11 +205,11 @@ def enrich_one_file(file, root_path):
"""
html_path_enriched=os.path.join(root_path, file)
print(' html_path_enriched ============> ',html_path_enriched)
print(' ----------- enrich_html: html_path_enriched ============> ',html_path_enriched)
# Écrire le contenu modifié dans le fichier HTML
with open(html_path_enriched, "w") as f:
f.write(html_content)
print('\n ----------- html écrit ', html_path_enriched)
print('\n ----------- enrich_html: html écrit ', html_path_enriched)
# Parcourir tous les fichiers HTML dans le dossier
for root, _, files in os.walk(blog_name):

View File

@ -9,4 +9,6 @@
# Articles en Français
-------------------------
=> 20241108151758-ça-déménage.gmi
=> 20241109231603-connaître-la-couleur-des-jours-edf-tempo-en-ligne-de-commande.gmi
=> 20241109231110-tags.gmi
=> 2024-11-03-création-d'un-blog-gemini.gmi

View File

@ -0,0 +1,193 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta property="og:image" content="https://www.cipherbliss.com/wp-content/uploads/2016/12/rond.png">
<meta property="og:locale" content="fr_FR">
<meta property="og:description" content="Code, nouvelles technologies et entrepreneurariat par B. Lemoine">
<meta property="og:url" content="https://www.cipherbliss.com">
<meta property="og:site_name" content="Cipher Bliss">
<link rel="alternate" type="application/rss+xml" title="Cipher Bliss » Flux" href="https://www.cipherbliss.com/feed/">
<link href="/style.css" rel="stylesheet">
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title></title>
<meta name="author" content="">
<link rel="alternate" type="application/rss+xml" title="Cipher Bliss » Flux"
href="https://www.cipherbliss.com/feed/">
<meta property="og:title" content="">
<meta property="og:locale" content="fr_FR">
<!-- Description de la page -->
<meta name="description" content="">
<meta name="reply-to" content="contact@cipherbliss.com">
<link rel="icon" type="image/png" href="https://www.cipherbliss.com/wp-content/uploads/2016/12/rond.png">
</head>
<body>
<div id="page">
<header id="masthead" class="site-header">
<div class="header-image" style="background: url(https://www.cipherbliss.com/wp-content/uploads/2016/11/bg.jpg)">
<a href="/">
<img src="https://www.cipherbliss.com/wp-content/uploads/2016/12/rond.png" class="site-icon img">
</a>
<h1 class="blog-title">Cipher Bliss</h1>
<p class="blog-subtitle">Code, nouvelles technologies et entrepreneurariat par B. Lemoine</p>
</div>
<nav class="navbar is-fixed-top is-dark" role="navigation" aria-label="main navigation">
<div class="navbar-brand">
<a class="navbar-item" href="https://www.cipherbliss.com">
</a>
</div>
<div id="navbarBasicExample" class="navbar-menu">
<div class="navbar-start">
<a class="navbar-item" href="https://www.cipherbliss.com">
<img src="https://www.cipherbliss.com/wp-content/uploads/2016/12/rond.png"
class="img-fluid">
</a>
<nav>
<a href="/">Accueil</a>
<a href="https://portfolio.cipherbliss.com">Portfolio</a>
<a href="/feed">Flux RSS</a>
<a href="/contact">Contact</a>
<a href="/ressources-de-café-vie-privée">Ressources</a>
</nav>
</div>
<div class="navbar-end">
<div class="navbar-item">
<form role="search" method="get" class="search-form" action="/">
<label>
<input class="search-field" placeholder="Recherche" value="" name="s"
type="search">
</label>
<input class="is-hidden search-submit" value="Rechercher" type="submit">
</form>
</div>
</div>
</div>
</nav>
</header>
<main class="body-wrap boxed-container">
<article class="content">
<header id="title-block-header">
<h1 class="title">cipherbliss_blog</h1>
</header>
<h1 id="création-dun-blog-gemini-1">Création d'un blog gemini</h1>
<p>Et hop, un générateur qui fait le café à partir de fichiers orgmode
ou markdown.</p>
<p>Génération de capsules gemini et blog html à partir d'articles en
fichiers Orgmode.</p>
<p>exemple avec le blog de DragonFeu.
`sources/dragonfeu<sub>blog</sub>`</p>
<p>Les articles sont écrits dans le dossier source/, leur nom permet de
déduire l'ordre de publication grâce à une date YYY-MM-DD en début de
nom de fichier ## création d'un article Pour un article en langue En,
sur le blog cipherbliss<sub>blog</sub>, donner le titre entre guillemets
ainsi: ```shell python3 new<sub>article</sub>.py
cipherbliss<sub>blog</sub> en "Creation of a gemini blog" ``` ##
prérequis pour installation</p>
<p>Avoir des articles au format org, les mettre dans un dossier
source/nom<sub>dublog</sub>, et avoir quelques bibliothèques dispo:</p>
<p>```shell bash install.sh ``` [2024-11-04] Testé avec: Pandoc 2.9.2.1
<a
href="http://fr.archive.ubuntu.com/ubuntu/pool/universe/p/pandoc/pandoc_2.9.2.1-3ubuntu2_amd64.deb">http://fr.archive.ubuntu.com/ubuntu/pool/universe/p/pandoc/pandoc_2.9.2.1-3ubuntu2_amd64.deb</a></p>
<p>Python 3.10.12 ## Conversion des fichiers Org vers gemini et html
Ceci va convertir ce qui se trouve dans le dossier
`sources/tykayn<sub>blog</sub>` et produire un site web dans
`html<sub>output</sub>/tykayn<sub>blog</sub>` ainsi qu'une capsule
gemini dans `capsules-gemini/tykayn<sub>blog</sub>`</p>
<p>```shell bash converters.sh tykayn<sub>blog</sub> ```</p>
<p>## Conversion de blog en capsule gemini</p>
<p>L'idée est d'avoir un ensemble de billets de blogs en texte simple
versionnés avec git et servis par une capsule gemini ainsi que par un
site web. On aura besoin de convertir des billets existants, et de
rédiger les nouveaux dans un format qui nous convient, par exemple
markdown ou orgmode afin de rendre le tout le plus pérenne possible. On
aura aussi besoin de référencer les images dans un dossier de notre
dépot, et de gérer les relations entres articles pour que les liens
aient du sens sur la capsule gemini autant que dans la version web. On
souhaite aussi fournir un flux RSS, et un template de billet de blog
avec une entête et un pied de page commun qui donne des moyens de
contact, de soutenir l'auteur, et de revenir à l'accueil. On prendra
aussi en charge différentes pages:</p>
<ul>
<li>à propos</li>
<li>contact</li>
<li>nos projets</li>
<li>une liste des articles triés par date.</li>
</ul>
<p>Il nous faudra aussi un script de mise à jour du blog qui se charge
de mettre à jour le flux rss, le dépot git. On peut aller chercher de
l'automatisation dans la gestion de plusieurs capsules différentes en
tagguant les articles par nom de blog, ce qui nécessite un fichier de
config pour les correspondances.</p>
<p>## Depuis wordpress Connec à la base de données mysql, et extraction
de chaque article pour récupérer la partie HTML et la convertir en
markdown et en fichiers org.</p>
<p>## Depuis des fichiers orgmode. J'écris en orgmode une base de
connaissances qui contient aussi un export de mes anciens billets de
blog dans un dossier par blog. Pour cibler quels billets utiliser pour
quel blog j'ai donc deux possibilités: leur chemin de fichier, ou des
tags particuliers présents dans les fichiers org. <a
href="id:5a197a1b-ddfe-4c79-8934-d9a28ab6df65">Textes de blog en
préparation</a> <a
href="https://forge.chapril.org/tykayn/org-report-stats">https://forge.chapril.org/tykayn/org-report-stats</a></p>
<p>Rédaction, conversion, completion des nouveaux articles, régénération
des indexs et flux rss, mise à jour du dépot git, publication des
pages.</p>
<p>Offpunk LazyBlog Dotclear, Wordpress, Hugo, Pélican Pandoc, PandocGmi
<a
href="https://github.com/njamescouk/pandocGmi/tree/master">https://github.com/njamescouk/pandocGmi/tree/master</a></p>
<ul>
<li>config par site web de son nom de domaine</li>
<li>réécriture des liens internes</li>
<li>réécriture des url des images vers le dossier courant</li>
<li>réparer la génération de fichiers gmi</li>
<li>template footer article: gestion article suivant et précédent</li>
<li>conversion des liens avec nom de domaine si relatifs</li>
</ul>
<ul>
<li>navigation sur les pages d'article</li>
</ul>
<p>-gestion des langues dans la source et la destination</p>
<ul>
<li>gestion multi site et multi langue</li>
</ul>
<p class="after-article">
</p>
</article>
</main>
<footer class="site-footer has-top-divider">
<div class="container">
<div class="site-footer-inner">
<nav>
<a href="/">Accueil</a>
<a href="https://portfolio.cipherbliss.com">Portfolio</a>
<a href="/feed">Flux RSS</a>
<a href="/contact">Contact</a>
<a href="/ressources-de-café-vie-privée">Ressources</a>
</nav>
</div>
</div>
</footer>
</div>
</body>
<!-- généré avec orgmode-to-gemini-blog par Tykayn -->
</html>

View File

@ -10,12 +10,9 @@
<meta property="og:description" content="Code, nouvelles technologies et entrepreneurariat par B. Lemoine">
<meta property="og:url" content="https://www.cipherbliss.com">
<meta property="og:site_name" content="Cipher Bliss">
<link rel="alternate" type="application/rss+xml" title="Cipher Bliss » Flux"
href="https://www.cipherbliss.com/feed/">
<link rel="alternate" type="application/rss+xml" title="Cipher Bliss » Flux" href="https://www.cipherbliss.com/feed/">
<link href="/style.css" rel="stylesheet">
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title></title>
<meta name="author" content="">
@ -79,182 +76,60 @@
</header>
<main class="body-wrap boxed-container">
<article class="content">
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" lang="" xml:lang="">
<head>
<meta charset="utf-8" />
<meta name="generator" content="pandoc" />
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" />
<title>cipherbliss_blog</title>
<style>
html {
color: #1a1a1a;
background-color: #fdfdfd;
}
body {
margin: 0 auto;
max-width: 36em;
padding-left: 50px;
padding-right: 50px;
padding-top: 50px;
padding-bottom: 50px;
hyphens: auto;
overflow-wrap: break-word;
text-rendering: optimizeLegibility;
font-kerning: normal;
}
@media (max-width: 600px) {
body {
font-size: 0.9em;
padding: 12px;
}
h1 {
font-size: 1.8em;
}
}
@media print {
html {
background-color: white;
}
body {
background-color: transparent;
color: black;
font-size: 12pt;
}
p, h2, h3 {
orphans: 3;
widows: 3;
}
h2, h3, h4 {
page-break-after: avoid;
}
}
p {
margin: 1em 0;
}
a {
color: #1a1a1a;
}
a:visited {
color: #1a1a1a;
}
img {
max-width: 100%;
}
h1, h2, h3, h4, h5, h6 {
margin-top: 1.4em;
}
h5, h6 {
font-size: 1em;
font-style: italic;
}
h6 {
font-weight: normal;
}
ol, ul {
padding-left: 1.7em;
margin-top: 1em;
}
li > ol, li > ul {
margin-top: 0;
}
blockquote {
margin: 1em 0 1em 1.7em;
padding-left: 1em;
border-left: 2px solid #e6e6e6;
color: #606060;
}
code {
font-family: Menlo, Monaco, Consolas, 'Lucida Console', monospace;
font-size: 85%;
margin: 0;
hyphens: manual;
}
pre {
margin: 1em 0;
overflow: auto;
}
pre code {
padding: 0;
overflow: visible;
overflow-wrap: normal;
}
.sourceCode {
background-color: transparent;
overflow: visible;
}
hr {
background-color: #1a1a1a;
border: none;
height: 1px;
margin: 1em 0;
}
table {
margin: 1em 0;
border-collapse: collapse;
width: 100%;
overflow-x: auto;
display: block;
font-variant-numeric: lining-nums tabular-nums;
}
table caption {
margin-bottom: 0.75em;
}
tbody {
margin-top: 0.5em;
border-top: 1px solid #1a1a1a;
border-bottom: 1px solid #1a1a1a;
}
th {
border-top: 1px solid #1a1a1a;
padding: 0.25em 0.5em 0.25em 0.5em;
}
td {
padding: 0.125em 0.5em 0.25em 0.5em;
}
header {
margin-bottom: 4em;
text-align: center;
}
#TOC li {
list-style: none;
}
#TOC ul {
padding-left: 1.3em;
}
#TOC > ul {
padding-left: 0;
}
#TOC a:not(:hover) {
text-decoration: none;
}
code{white-space: pre-wrap;}
span.smallcaps{font-variant: small-caps;}
div.columns{display: flex; gap: min(4vw, 1.5em);}
div.column{flex: auto; overflow-x: auto;}
div.hanging-indent{margin-left: 1.5em; text-indent: -1.5em;}
/* The extra [class] is a hack that increases specificity enough to
override a similar rule in reveal.js */
ul.task-list[class]{list-style: none;}
ul.task-list li input[type="checkbox"] {
font-size: inherit;
width: 0.8em;
margin: 0 0.8em 0.2em -1.6em;
vertical-align: middle;
}
.display.math{display: block; text-align: center; margin: 0.5rem auto;}
</style>
</head>
<body>
<header id="title-block-header">
<h1 class="title">cipherbliss_blog</h1>
</header>
<h1 id="ça-déménage-1">Ça déménage</h1>
<p>Oui ce blog fait bouger les lignes avec son générateur statique fait
maison. La peinture est fraîche.</p>
</body>
</html>
<h1 id="tags---étiquettes-de-cipherbliss">Tags - Étiquettes de
cipherbliss</h1>
<p>Voici les thématiques abordées sur ce site:</p>
<p><a href="file:///tag/ai/">AI</a> <a
href="file:///tag/archives/">archives</a> <a
href="file:///tag/autohebergement/">autohébergement</a> <a
href="file:///tag/backup/">backup</a> <a
href="file:///tag/blockchain/">blockchain</a> <a
href="file:///tag/borg/">borg</a> <a
href="file:///tag/caisse/">caisse</a> <a
href="file:///tag/comptabilite/">comptabilité</a> <a
href="file:///tag/comptes/">comptes</a> <a
href="file:///tag/data-visualisation/">data visualisation</a> <a
href="file:///tag/design/">design</a> <a
href="file:///tag/email/">email</a> <a
href="file:///tag/entreprise/">entreprise</a> <a
href="file:///tag/entreprise-individuelle/">entreprise individuelle</a>
<a href="file:///tag/ethereum/">ethereum</a> <a
href="file:///tag/facebook/">facebook</a> <a
href="file:///tag/factures/">factures</a> <a
href="file:///tag/floss/">FLOSS</a> <a
href="file:///tag/fediverse/">fédiverse</a> <a
href="file:///tag/gestion-de-projet/">gestion de projet</a> <a
href="file:///tag/gestion-du-temps/">gestion du temps</a> <a
href="file:///tag/gestionnaire-de-mot-de-passe/">gestionnaire de mot de
passe</a> <a href="file:///tag/gimp/">gimp</a> <a
href="file:///tag/git/">git</a> <a
href="file:///tag/logiciellibre/">logiciellibre</a> <a
href="file:///tag/logiciel-libre/">logiciel libre</a> <a
href="file:///tag/mastodon/">mastodon</a> <a
href="file:///tag/mobilizon/">mobilizon</a> <a
href="file:///tag/mot-de-passe/">mot de passe</a> <a
href="file:///tag/mysql/">mysql</a> <a
href="file:///tag/nextcloud/">nextcloud</a> <a
href="file:///tag/open-source/">open source</a> <a
href="file:///tag/openstreetmap/">openstreetmap</a> <a
href="file:///tag/orgmode/">orgmode</a> <a
href="file:///tag/osm/">OSM</a> <a href="file:///tag/photos/">photos</a>
<a href="file:///tag/pim/">pim</a> <a
href="file:///tag/projet/">projet</a> <a
href="file:///tag/prevision/">prévision</a> <a
href="file:///tag/python/">python</a> <a
href="file:///tag/reseau-social/">réseau social</a> <a
href="file:///tag/sauvegardes/">sauvegardes</a> <a
href="file:///tag/script/">script</a> <a href="file:///tag/ux/">UX</a>
<a href="file:///tag/vie-privee/">vie privée</a></p>
<p class="after-article">
</p>
</article>
</main>
<footer class="site-footer has-top-divider">
@ -263,6 +138,7 @@ maison. La peinture est fraîche.</p>
<nav>
<a href="/">Accueil</a>
<a href="https://portfolio.cipherbliss.com">Portfolio</a>

View File

@ -0,0 +1,189 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta property="og:image" content="https://www.cipherbliss.com/wp-content/uploads/2016/12/rond.png">
<meta property="og:locale" content="fr_FR">
<meta property="og:description" content="Code, nouvelles technologies et entrepreneurariat par B. Lemoine">
<meta property="og:url" content="https://www.cipherbliss.com">
<meta property="og:site_name" content="Cipher Bliss">
<link rel="alternate" type="application/rss+xml" title="Cipher Bliss » Flux" href="https://www.cipherbliss.com/feed/">
<link href="/style.css" rel="stylesheet">
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title></title>
<meta name="author" content="">
<link rel="alternate" type="application/rss+xml" title="Cipher Bliss » Flux"
href="https://www.cipherbliss.com/feed/">
<meta property="og:title" content="">
<meta property="og:locale" content="fr_FR">
<!-- Description de la page -->
<meta name="description" content="">
<meta name="reply-to" content="contact@cipherbliss.com">
<link rel="icon" type="image/png" href="https://www.cipherbliss.com/wp-content/uploads/2016/12/rond.png">
</head>
<body>
<div id="page">
<header id="masthead" class="site-header">
<div class="header-image" style="background: url(https://www.cipherbliss.com/wp-content/uploads/2016/11/bg.jpg)">
<a href="/">
<img src="https://www.cipherbliss.com/wp-content/uploads/2016/12/rond.png" class="site-icon img">
</a>
<h1 class="blog-title">Cipher Bliss</h1>
<p class="blog-subtitle">Code, nouvelles technologies et entrepreneurariat par B. Lemoine</p>
</div>
<nav class="navbar is-fixed-top is-dark" role="navigation" aria-label="main navigation">
<div class="navbar-brand">
<a class="navbar-item" href="https://www.cipherbliss.com">
</a>
</div>
<div id="navbarBasicExample" class="navbar-menu">
<div class="navbar-start">
<a class="navbar-item" href="https://www.cipherbliss.com">
<img src="https://www.cipherbliss.com/wp-content/uploads/2016/12/rond.png"
class="img-fluid">
</a>
<nav>
<a href="/">Accueil</a>
<a href="https://portfolio.cipherbliss.com">Portfolio</a>
<a href="/feed">Flux RSS</a>
<a href="/contact">Contact</a>
<a href="/ressources-de-café-vie-privée">Ressources</a>
</nav>
</div>
<div class="navbar-end">
<div class="navbar-item">
<form role="search" method="get" class="search-form" action="/">
<label>
<input class="search-field" placeholder="Recherche" value="" name="s"
type="search">
</label>
<input class="is-hidden search-submit" value="Rechercher" type="submit">
</form>
</div>
</div>
</div>
</nav>
</header>
<main class="body-wrap boxed-container">
<article class="content">
<header id="title-block-header">
<h1 class="title">cipherbliss_blog</h1>
</header>
<h1
id="connaître-la-couleur-des-jours-edf-tempo-en-ligne-de-commande-1">Connaître
la couleur des jours EDF Tempo en ligne de commande</h1>
<p>EDF expose une API pour connaître les couleurs de jour TEMPO, mais
cette api n'est pas bien référencée sur le wouaib, ce sont donc des
sites qui n'ont rien à voir qui vous donneront cette info avec moult
trackers et pubs de partout.</p>
<p>Voici l'url dont vous avez besoin:</p>
<p>&gt; <a
href="https://api-commerce.edf.fr/commerce/activet/v1/calendrier-jours-effacement?option=TEMPO&amp;dateApplicationBorneInf=%7Bdate_inférieure%7D&amp;dateApplicationBorneSup=%7Bdate_supérieure%7D&amp;identifiantConsommateur=src">https://api-commerce.edf.fr/commerce/activet/v1/calendrier-jours-effacement?option=TEMPO&amp;dateApplicationBorneInf={date_inférieure}&amp;dateApplicationBorneSup={date_supérieure}&amp;identifiantConsommateur=src</a></p>
<p>Cette API de commerce EDF ne fonctionne que si vous demandez des
dates ayant 365 jours d'écart de différence, et si vous ne mettez pas de
zéro précédant le numéro de journée au format année-mois-jour. Autre
limitation, la couleur du jour du lendemain vous sera donnée seulement à
partir de 11h du matin dans la journée.</p>
<p>Fabriquez vous un petit script en python pour aller pêcher ce
calendrier, piocher les couleurs des deux derniers jours. Il vous
suffira d'un alias de commande pour lancer "python
mon<sub>scripttempo</sub>.py" en ayant le dossier où le script est placé
dans votre variable d'environnement PATH.</p>
<div class="sourceCode" id="cb1"><pre
class="sourceCode python"><code class="sourceCode python"><span id="cb1-1"><a href="#cb1-1" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb1-2"><a href="#cb1-2" aria-hidden="true" tabindex="-1"></a><span class="im">import</span> requests</span>
<span id="cb1-3"><a href="#cb1-3" aria-hidden="true" tabindex="-1"></a><span class="im">import</span> json</span>
<span id="cb1-4"><a href="#cb1-4" aria-hidden="true" tabindex="-1"></a><span class="im">from</span> datetime <span class="im">import</span> datetime, timedelta </span>
<span id="cb1-5"><a href="#cb1-5" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb1-6"><a href="#cb1-6" aria-hidden="true" tabindex="-1"></a><span class="kw">def</span> date_il_y_a_un_an(date):</span>
<span id="cb1-7"><a href="#cb1-7" aria-hidden="true" tabindex="-1"></a> date_obj <span class="op">=</span> datetime.strptime(date, <span class="st">&quot;%Y-%m-</span><span class="sc">%d</span><span class="st">&quot;</span>)</span>
<span id="cb1-8"><a href="#cb1-8" aria-hidden="true" tabindex="-1"></a> date_il_y_a_un_an <span class="op">=</span> date_obj <span class="op">-</span> timedelta(days<span class="op">=</span><span class="dv">365</span>)</span>
<span id="cb1-9"><a href="#cb1-9" aria-hidden="true" tabindex="-1"></a> <span class="cf">return</span> date_il_y_a_un_an.strftime(<span class="st">&quot;%Y-%m-</span><span class="sc">%d</span><span class="st">&quot;</span>)</span>
<span id="cb1-10"><a href="#cb1-10" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb1-11"><a href="#cb1-11" aria-hidden="true" tabindex="-1"></a><span class="kw">def</span> get_tempo_for_today_and_tomorrow():</span>
<span id="cb1-12"><a href="#cb1-12" aria-hidden="true" tabindex="-1"></a> <span class="co"># Obtenir la date d&#39;aujourd&#39;hui</span></span>
<span id="cb1-13"><a href="#cb1-13" aria-hidden="true" tabindex="-1"></a> datenow <span class="op">=</span> datetime.now()</span>
<span id="cb1-14"><a href="#cb1-14" aria-hidden="true" tabindex="-1"></a> sup <span class="op">=</span> (datenow <span class="op">+</span> timedelta(days<span class="op">=</span><span class="dv">1</span>))</span>
<span id="cb1-15"><a href="#cb1-15" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb1-16"><a href="#cb1-16" aria-hidden="true" tabindex="-1"></a> inf <span class="op">=</span> date_il_y_a_un_an(datenow.strftime(<span class="st">&quot;%Y-%m-</span><span class="sc">%d</span><span class="st">&quot;</span>))</span>
<span id="cb1-17"><a href="#cb1-17" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb1-18"><a href="#cb1-18" aria-hidden="true" tabindex="-1"></a> <span class="co"># Obtenir la date de demain</span></span>
<span id="cb1-19"><a href="#cb1-19" aria-hidden="true" tabindex="-1"></a> sup <span class="op">=</span> sup.strftime(<span class="st">&quot;%Y-%m-</span><span class="sc">%d</span><span class="st">&quot;</span>)</span>
<span id="cb1-20"><a href="#cb1-20" aria-hidden="true" tabindex="-1"></a> sup <span class="op">=</span> sup.replace(<span class="st">&quot;-0&quot;</span>, <span class="st">&quot;-&quot;</span>)</span>
<span id="cb1-21"><a href="#cb1-21" aria-hidden="true" tabindex="-1"></a> inf <span class="op">=</span> inf.replace(<span class="st">&quot;-0&quot;</span>, <span class="st">&quot;-&quot;</span>)</span>
<span id="cb1-22"><a href="#cb1-22" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb1-23"><a href="#cb1-23" aria-hidden="true" tabindex="-1"></a> <span class="co"># print(&quot;Date inf :&quot;, inf)</span></span>
<span id="cb1-24"><a href="#cb1-24" aria-hidden="true" tabindex="-1"></a> <span class="co"># print(&quot;Date sup:&quot;, sup)</span></span>
<span id="cb1-25"><a href="#cb1-25" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb1-26"><a href="#cb1-26" aria-hidden="true" tabindex="-1"></a> <span class="co"># URL de l&#39;API d&#39;EDF pour récupérer les informations sur les couleurs des jours de l&#39;offre Tempo</span></span>
<span id="cb1-27"><a href="#cb1-27" aria-hidden="true" tabindex="-1"></a> url <span class="op">=</span> <span class="ss">f&quot;https://api-commerce.edf.fr/commerce/activet/v1/calendrier-jours-effacement?option=TEMPO&amp;dateApplicationBorneInf=</span><span class="sc">{</span>inf<span class="sc">}</span><span class="ss">&amp;dateApplicationBorneSup=</span><span class="sc">{</span>sup<span class="sc">}</span><span class="ss">&amp;identifiantConsommateur=src&quot;</span></span>
<span id="cb1-28"><a href="#cb1-28" aria-hidden="true" tabindex="-1"></a> <span class="bu">print</span>(url)</span>
<span id="cb1-29"><a href="#cb1-29" aria-hidden="true" tabindex="-1"></a> <span class="co"># Effectuer la requête HTTP et récupérer la réponse JSON</span></span>
<span id="cb1-30"><a href="#cb1-30" aria-hidden="true" tabindex="-1"></a> response <span class="op">=</span> requests.get(url)</span>
<span id="cb1-31"><a href="#cb1-31" aria-hidden="true" tabindex="-1"></a> data <span class="op">=</span> json.loads(response.text)</span>
<span id="cb1-32"><a href="#cb1-32" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb1-33"><a href="#cb1-33" aria-hidden="true" tabindex="-1"></a> <span class="co"># Récupérer la liste des couleurs des jours pour les 30 prochains jours</span></span>
<span id="cb1-34"><a href="#cb1-34" aria-hidden="true" tabindex="-1"></a> calendrier <span class="op">=</span> data[<span class="st">&quot;content&quot;</span>][<span class="st">&quot;options&quot;</span>][<span class="dv">0</span>][<span class="st">&quot;calendrier&quot;</span>]</span>
<span id="cb1-35"><a href="#cb1-35" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb1-36"><a href="#cb1-36" aria-hidden="true" tabindex="-1"></a> texte_retour<span class="op">=</span><span class="st">&quot;&quot;</span></span>
<span id="cb1-37"><a href="#cb1-37" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb1-38"><a href="#cb1-38" aria-hidden="true" tabindex="-1"></a> <span class="co"># # Afficher les couleurs des jours pour le prochain jour</span></span>
<span id="cb1-39"><a href="#cb1-39" aria-hidden="true" tabindex="-1"></a> <span class="cf">for</span> jour <span class="kw">in</span> calendrier[<span class="op">-</span><span class="dv">2</span>:]:</span>
<span id="cb1-40"><a href="#cb1-40" aria-hidden="true" tabindex="-1"></a> date <span class="op">=</span> jour[<span class="st">&quot;dateApplication&quot;</span>]</span>
<span id="cb1-41"><a href="#cb1-41" aria-hidden="true" tabindex="-1"></a> code_couleur <span class="op">=</span> jour[<span class="st">&quot;statut&quot;</span>]</span>
<span id="cb1-42"><a href="#cb1-42" aria-hidden="true" tabindex="-1"></a> <span class="cf">if</span> code_couleur <span class="op">==</span> <span class="st">&quot;TEMPO_BLEU&quot;</span>:</span>
<span id="cb1-43"><a href="#cb1-43" aria-hidden="true" tabindex="-1"></a> texte_retour<span class="op">+=</span>(<span class="ss">f&quot;</span><span class="ch">\033</span><span class="ss">[34m</span><span class="sc">{</span>date<span class="sc">}</span><span class="ss">: journée </span><span class="sc">{</span>code_couleur<span class="sc">}</span><span class="ch">\033</span><span class="ss">[0m</span><span class="ch">\n</span><span class="ss">&quot;</span>)</span>
<span id="cb1-44"><a href="#cb1-44" aria-hidden="true" tabindex="-1"></a> <span class="cf">elif</span> code_couleur <span class="op">==</span> <span class="st">&quot;TEMPO_BLANC&quot;</span>:</span>
<span id="cb1-45"><a href="#cb1-45" aria-hidden="true" tabindex="-1"></a> texte_retour<span class="op">+=</span>(<span class="ss">f&quot;</span><span class="ch">\033</span><span class="ss">[37m</span><span class="sc">{</span>date<span class="sc">}</span><span class="ss">: journée </span><span class="sc">{</span>code_couleur<span class="sc">}</span><span class="ch">\033</span><span class="ss">[0m</span><span class="ch">\n</span><span class="ss">&quot;</span>)</span>
<span id="cb1-46"><a href="#cb1-46" aria-hidden="true" tabindex="-1"></a> <span class="cf">elif</span> code_couleur <span class="op">==</span> <span class="st">&quot;TEMPO_ROUGE&quot;</span>:</span>
<span id="cb1-47"><a href="#cb1-47" aria-hidden="true" tabindex="-1"></a> texte_retour<span class="op">+=</span>(<span class="ss">f&quot;</span><span class="ch">\033</span><span class="ss">[31m</span><span class="sc">{</span>date<span class="sc">}</span><span class="ss">: journée </span><span class="sc">{</span>code_couleur<span class="sc">}</span><span class="ch">\033</span><span class="ss">[0m</span><span class="ch">\n</span><span class="ss">&quot;</span>)</span>
<span id="cb1-48"><a href="#cb1-48" aria-hidden="true" tabindex="-1"></a> <span class="cf">else</span>:</span>
<span id="cb1-49"><a href="#cb1-49" aria-hidden="true" tabindex="-1"></a> texte_retour<span class="op">+=</span>(<span class="ss">f&quot;</span><span class="sc">{</span>date<span class="sc">}</span><span class="ss">: journée </span><span class="sc">{</span>code_couleur<span class="sc">}</span><span class="ss">&quot;</span>)</span>
<span id="cb1-50"><a href="#cb1-50" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb1-51"><a href="#cb1-51" aria-hidden="true" tabindex="-1"></a> <span class="cf">return</span> texte_retour</span>
<span id="cb1-52"><a href="#cb1-52" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb1-53"><a href="#cb1-53" aria-hidden="true" tabindex="-1"></a>texte <span class="op">=</span> get_tempo_for_today_and_tomorrow()</span>
<span id="cb1-54"><a href="#cb1-54" aria-hidden="true" tabindex="-1"></a><span class="bu">print</span>(texte)</span>
<span id="cb1-55"><a href="#cb1-55" aria-hidden="true" tabindex="-1"></a></span></code></pre></div>
<p>Bonne réduction des pointes de conso!</p>
<p class="after-article">
</p>
</article>
</main>
<footer class="site-footer has-top-divider">
<div class="container">
<div class="site-footer-inner">
<nav>
<a href="/">Accueil</a>
<a href="https://portfolio.cipherbliss.com">Portfolio</a>
<a href="/feed">Flux RSS</a>
<a href="/contact">Contact</a>
<a href="/ressources-de-café-vie-privée">Ressources</a>
</nav>
</div>
</div>
</footer>
</div>
</body>
<!-- généré avec orgmode-to-gemini-blog par Tykayn -->
</html>

View File

@ -10,12 +10,9 @@
<meta property="og:description" content="Code, nouvelles technologies et entrepreneurariat par B. Lemoine">
<meta property="og:url" content="https://www.cipherbliss.com">
<meta property="og:site_name" content="Cipher Bliss">
<link rel="alternate" type="application/rss+xml" title="Cipher Bliss » Flux"
href="https://www.cipherbliss.com/feed/">
<link rel="alternate" type="application/rss+xml" title="Cipher Bliss » Flux" href="https://www.cipherbliss.com/feed/">
<link href="/style.css" rel="stylesheet">
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title></title>
<meta name="author" content="">
@ -79,10 +76,13 @@
</header>
<main class="body-wrap boxed-container">
<article class="content">
<html><head><title>cipherbliss_blog</title><link rel="stylesheet" href="/style.css"></link></head><body>
<h1>Navigation</h1><br><a href=/index.html>Index</a><br><a href=/contact.html>Contact</a><h1>Articles en Français</h1><br><a href=/2024/20241108151758-ça-déménage>2024 20241108151758 ça déménage</a></article></body></html>
<h1>Navigation</h1><br><a href=/index.html>Index</a><br><a href=/contact.html>Contact</a><br><a href=/2024/20241109231603-connaître-la-couleur-des-jours-edf-tempo-en-ligne-de-commande>2024 20241109231603 connaître la couleur des jours edf tempo en ligne de commande</a><br><a href=/2024/20241109231110-tags>2024 20241109231110 tags</a><br><a href=/2024/2024-11-03-création-d'un-blog-gemini>2024 Création d'un blog gemini</a></article>
<p class="after-article">
</p>
</article>
</main>
<footer class="site-footer has-top-divider">
@ -91,6 +91,7 @@
<nav>
<a href="/">Accueil</a>
<a href="https://portfolio.cipherbliss.com">Portfolio</a>

View File

@ -9,4 +9,6 @@
# Articles en Français
-------------------------
=> 20241108151758-ça-déménage.gmi
=> 20241109231603-connaître-la-couleur-des-jours-edf-tempo-en-ligne-de-commande.gmi
=> 20241109231110-tags.gmi
=> 2024-11-03-création-d'un-blog-gemini.gmi

View File

@ -20,7 +20,7 @@ date_string = now.strftime("%Y%m%d%H%M%S")
date_string_full = now.strftime("%Y-%m-%d %H:%M:%S")
# date_string_full = now.strftime("%Y%m%d%H%M%S")
slug = args.title.lower().replace(" ", "-")
filename = f"sources/{args.blog_dir}/lang_{args.lang}/{date_string}-{slug}.org"
filename = f"sources/{args.blog_dir}/lang_{args.lang}/{date_string}_{args.blog_dir}_{slug}.org"
import uuid

View File

@ -7,8 +7,8 @@
#+SLUG: tags
#+BLOG: cipherbliss_blog
* Tags
* Tags - Étiquettes de cipherbliss
**** Étiquettes
Voici les thématiques abordées sur ce site:
[[/tag/ai/][AI]] [[/tag/archives/][archives]] [[/tag/autohebergement/][autohébergement]] [[/tag/backup/][backup]] [[/tag/blockchain/][blockchain]] [[/tag/borg/][borg]] [[/tag/caisse/][caisse]] [[/tag/comptabilite/][comptabilité]] [[/tag/comptes/][comptes]] [[/tag/data-visualisation/][data visualisation]] [[/tag/design/][design]] [[/tag/email/][email]] [[/tag/entreprise/][entreprise]] [[/tag/entreprise-individuelle/][entreprise individuelle]] [[/tag/ethereum/][ethereum]] [[/tag/facebook/][facebook]] [[/tag/factures/][factures]] [[/tag/floss/][FLOSS]] [[/tag/fediverse/][fédiverse]] [[/tag/gestion-de-projet/][gestion de projet]] [[/tag/gestion-du-temps/][gestion du temps]] [[/tag/gestionnaire-de-mot-de-passe/][gestionnaire de mot de passe]] [[/tag/gimp/][gimp]] [[/tag/git/][git]] [[/tag/logiciellibre/][logiciellibre]] [[/tag/logiciel-libre/][logiciel libre]] [[/tag/mastodon/][mastodon]] [[/tag/mobilizon/][mobilizon]] [[/tag/mot-de-passe/][mot de passe]] [[/tag/mysql/][mysql]] [[/tag/nextcloud/][nextcloud]] [[/tag/open-source/][open source]] [[/tag/openstreetmap/][openstreetmap]] [[/tag/orgmode/][orgmode]] [[/tag/osm/][OSM]] [[/tag/photos/][photos]] [[/tag/pim/][pim]] [[/tag/projet/][projet]] [[/tag/prevision/][prévision]] [[/tag/python/][python]] [[/tag/reseau-social/][réseau social]] [[/tag/sauvegardes/][sauvegardes]] [[/tag/script/][script]] [[/tag/ux/][UX]] [[/tag/vie-privee/][vie privée]]

View File

@ -53,16 +53,18 @@ documentation pour ne pas réinventer la roue:
:END:
:PROPERTIES:
:ID: 3154e447-b390-481f-8842-18f9ca75c58f
:END:
#+title:des-sauvegardes-qui-durent-mille-ans
#+post_ID: 1595
#+post_slug: des-sauvegardes-qui-durent-mille-ans
#+post_url: https://www.ciperbliss.com/2021/des-sauvegardes-qui-durent-mille-ans
:END: #+title:
des-sauvegardes-qui-durent-mille-ans #+post_ID:
1595 #+post_slug:
des-sauvegardes-qui-durent-mille-ans #+post_url:
https://www.ciperbliss.com/2021/des-sauvegardes-qui-durent-mille-ans
#+post_title: Des sauvegardes qui durent mille ans
#+post_type: post #+post_mime_types:
#+post_guid:https://www.cipherbliss.com/?p=1595 #+post_status:
publish #+post_date_published: <2021-09-27 09:22:38>
#+post_date_modified: <2021-09-27 09:22:42>
#+post_index_page_roam_id: [[id:1b454ab3-53f0-411f-94e6-d488718dee27][undefined]]
#+post_guid:
https://www.cipherbliss.com/?p=1595 #+post_status:
publish #+post_date_published: <2021-09-27
09:22:38> #+post_date_modified: <2021-09-27
09:22:42> #+post_index_page_roam_id:
[[id:1b454ab3-53f0-411f-94e6-d488718dee27][undefined]]
#+retrieved_from_db_at: <2024-11-07 22:57:06>

View File

@ -9,5 +9,7 @@
* Ça déménage
Oui ce blog fait bouger les lignes avec son générateur statique fait maison.
La peinture est fraîche.
Oui ce blog fait bouger les lignes avec son générateur statique fait maison à partir de fichiers Orgmode.
La peinture est fraîche.
https://forge.chapril.org/tykayn/orgmode-to-gemini-blog