site builder ok
This commit is contained in:
parent
7e9e8f2436
commit
83dd9f7472
@ -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
|
||||
|
@ -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
|
||||
|
@ -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):
|
||||
|
@ -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
|
||||
|
@ -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>
|
||||
|
@ -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>
|
@ -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>> <a
|
||||
href="https://api-commerce.edf.fr/commerce/activet/v1/calendrier-jours-effacement?option=TEMPO&dateApplicationBorneInf=%7Bdate_inférieure%7D&dateApplicationBorneSup=%7Bdate_supérieure%7D&identifiantConsommateur=src">https://api-commerce.edf.fr/commerce/activet/v1/calendrier-jours-effacement?option=TEMPO&dateApplicationBorneInf={date_inférieure}&dateApplicationBorneSup={date_supérieure}&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">"%Y-%m-</span><span class="sc">%d</span><span class="st">"</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">"%Y-%m-</span><span class="sc">%d</span><span class="st">"</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'aujourd'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">"%Y-%m-</span><span class="sc">%d</span><span class="st">"</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">"%Y-%m-</span><span class="sc">%d</span><span class="st">"</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">"-0"</span>, <span class="st">"-"</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">"-0"</span>, <span class="st">"-"</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("Date inf :", inf)</span></span>
|
||||
<span id="cb1-24"><a href="#cb1-24" aria-hidden="true" tabindex="-1"></a> <span class="co"># print("Date sup:", 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'API d'EDF pour récupérer les informations sur les couleurs des jours de l'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"https://api-commerce.edf.fr/commerce/activet/v1/calendrier-jours-effacement?option=TEMPO&dateApplicationBorneInf=</span><span class="sc">{</span>inf<span class="sc">}</span><span class="ss">&dateApplicationBorneSup=</span><span class="sc">{</span>sup<span class="sc">}</span><span class="ss">&identifiantConsommateur=src"</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">"content"</span>][<span class="st">"options"</span>][<span class="dv">0</span>][<span class="st">"calendrier"</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">""</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">"dateApplication"</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">"statut"</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">"TEMPO_BLEU"</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"</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">"</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">"TEMPO_BLANC"</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"</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">"</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">"TEMPO_ROUGE"</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"</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">"</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"</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">"</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>
|
||||
|
@ -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>
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
||||
|
@ -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]]
|
@ -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>
|
||||
|
||||
|
@ -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
|
Loading…
Reference in New Issue
Block a user