Switched to Pélican

This commit is contained in:
Darks 2020-09-07 23:32:20 +02:00
parent 13320d864a
commit 8e25640394
Signed by: Darks
GPG Key ID: F61F10FA138E797C
44 changed files with 398 additions and 451 deletions

11
Gemfile
View File

@ -1,11 +0,0 @@
source "https://rubygems.org"
ruby RUBY_VERSION
gem "jekyll", "3.7.0"
group :jekyll_plugins do
gem "jekyll-feed", "~> 0.6"
gem "jekyll-assets"
end
# Windows does not include zoneinfo files, so bundle the tzinfo-data gem
gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby]

View File

@ -1,107 +0,0 @@
GEM
remote: https://rubygems.org/
specs:
activesupport (5.2.0)
concurrent-ruby (~> 1.0, >= 1.0.2)
i18n (>= 0.7, < 2)
minitest (~> 5.1)
tzinfo (~> 1.1)
addressable (2.5.2)
public_suffix (>= 2.0.2, < 4.0)
colorator (1.1.0)
concurrent-ruby (1.0.5)
em-websocket (0.5.1)
eventmachine (>= 0.12.9)
http_parser.rb (~> 0.6.0)
eventmachine (1.2.7)
execjs (2.7.0)
extras (0.3.0)
forwardable-extended (~> 2.5)
fastimage (2.1.3)
ffi (1.9.23)
forwardable-extended (2.6.0)
http_parser.rb (0.6.0)
i18n (0.9.5)
concurrent-ruby (~> 1.0)
jekyll (3.7.0)
addressable (~> 2.4)
colorator (~> 1.0)
em-websocket (~> 0.5)
i18n (~> 0.7)
jekyll-sass-converter (~> 1.0)
jekyll-watch (~> 2.0)
kramdown (~> 1.14)
liquid (~> 4.0)
mercenary (~> 0.3.3)
pathutil (~> 0.9)
rouge (>= 1.7, < 4)
safe_yaml (~> 1.0)
jekyll-assets (3.0.11)
activesupport (~> 5.0)
execjs (~> 2.7)
extras (~> 0.2)
fastimage (~> 2.0, >= 1.8)
jekyll (>= 3.5, < 4.0)
jekyll-sanity (~> 1.2)
liquid-tag-parser (~> 1.0)
nokogiri (~> 1.8)
pathutil (~> 0.16)
sprockets (>= 3.3, < 4.1.beta)
jekyll-feed (0.9.3)
jekyll (~> 3.3)
jekyll-sanity (1.2.0)
jekyll (~> 3.1)
jekyll-sass-converter (1.5.2)
sass (~> 3.4)
jekyll-watch (2.0.0)
listen (~> 3.0)
kramdown (1.17.0)
liquid (4.0.0)
liquid-tag-parser (1.9.0)
extras (~> 0.3)
liquid (>= 3.0, < 5.0)
listen (3.1.5)
rb-fsevent (~> 0.9, >= 0.9.4)
rb-inotify (~> 0.9, >= 0.9.7)
ruby_dep (~> 1.2)
mercenary (0.3.6)
mini_portile2 (2.3.0)
minitest (5.11.3)
nokogiri (1.8.2)
mini_portile2 (~> 2.3.0)
pathutil (0.16.1)
forwardable-extended (~> 2.6)
public_suffix (3.0.2)
rack (2.0.5)
rb-fsevent (0.10.3)
rb-inotify (0.9.10)
ffi (>= 0.5.0, < 2)
rouge (3.1.1)
ruby_dep (1.5.0)
safe_yaml (1.0.4)
sass (3.5.6)
sass-listen (~> 4.0.0)
sass-listen (4.0.0)
rb-fsevent (~> 0.9, >= 0.9.4)
rb-inotify (~> 0.9, >= 0.9.7)
sprockets (3.7.1)
concurrent-ruby (~> 1.0)
rack (> 1, < 3)
thread_safe (0.3.6)
tzinfo (1.2.5)
thread_safe (~> 0.1)
PLATFORMS
ruby
DEPENDENCIES
jekyll (= 3.7.0)
jekyll-assets
jekyll-feed (~> 0.6)
tzinfo-data
RUBY VERSION
ruby 2.5.1p57
BUNDLED WITH
1.16.2

72
Makefile Executable file → Normal file
View File

@ -1,38 +1,52 @@
#!/usr/bin/make -f
# The role of this Makefile is to make the commands accessible to the
# developer that may not know Jekyll that well.
# ---
# Here are the commands the developer should use:
#
# — Preview (run a local webserver and update automatically when a change is
# made to view the modifications before pushing them to the server).
# — Build (just build to install the thing).
PY?=python3
PELICAN?=pelican
PELICANOPTS=-t ./theme
all: -all-build
preview prev: -all-watch
BASEDIR=$(CURDIR)
INPUTDIR=$(BASEDIR)/content
OUTPUTDIR=$(BASEDIR)/output
CONFFILE=$(BASEDIR)/pelicanconf.py
PUBLISHCONF=$(BASEDIR)/publishconf.py
# ---
# Internal rules.
# ---
BUNDLE := bundle
JEK := $(BUNDLE) exec jekyll
DEBUG ?= 0
ifeq ($(DEBUG), 1)
PELICANOPTS += -D
endif
# Prepare the build by installing the modules that aren't installed to
# the local `vendor/` folder to avoid conflicts.
RELATIVE ?= 0
ifeq ($(RELATIVE), 1)
PELICANOPTS += --relative-urls
endif
-prepare:
$(BUNDLE) check || $(BUNDLE) install --path vendor/bundle
$(BUNDLE) update
PORT ?= 0
ifneq ($(PORT), 0)
PELICANOPTS += -p $(PORT)
endif
# Make the website for different contexts.
-all-watch: -prepare
$(JEK) serve --drafts --watch
-all-build: -prepare
$(JEK) build
help:
@echo 'Makefile for CreativeCalc site '
@echo ' '
@echo 'Usage: '
@echo ' make html (re)generate the web site '
@echo ' make clean remove the generated files '
@echo ' make serve serve files locally '
@echo ' make publish generate using production settings '
@echo ' '
@echo 'Push to master when your done '
.PHONY: preview prev show
.PHONY: -prepare -all -all-watch
html:
"$(PELICAN)" "$(INPUTDIR)" -o "$(OUTPUTDIR)" -s "$(CONFFILE)" $(PELICANOPTS)
# End of file.
clean:
[ ! -d "$(OUTPUTDIR)" ] || rm -rf "$(OUTPUTDIR)"
serve:
"$(PELICAN)" -l "$(INPUTDIR)" -o "$(OUTPUTDIR)" -s "$(CONFFILE)" $(PELICANOPTS)
publish:
"$(PELICAN)" "$(INPUTDIR)" -o "$(OUTPUTDIR)" -s "$(PUBLISHCONF)" $(PELICANOPTS)
.PHONY: html help clean serve publish

View File

@ -1,43 +0,0 @@
# Portail web de CreativeCalc
Ceci est le (simple) portail web de [CreativeCalc](http://creativecalc.fr/),
l'association derrière [Planète Casio](https://www.planet-casio.com).
Il est construit avec Jekyll.
## Développement du site
Il vous faudra installer Ruby et Bundle. Pour visualiser en local et en
direct les changements que vous faites, il vous faudra faire la commande
suivante:
make preview
Le résultat sera disponible sur `localhost:4000` (ou `127.0.0.1:4000` si
vous préférez), et sera automatiquement mis à jour lorsque vous éditez un
fichier faisant partie du projet (excepté la configuration, il vous faudra
relancer la prévisualisation pour cela).
## Production
Pour des raisons de tracabilité, les contributeurs de ce site ne sont pas
censés mettre à jour le site directement, il faut pour cela téléverser vos
modifications sur le dépôt git de base (présent sur CreativeCalc) et demander
à un serveur, que l'on nomme l'`adm`, de mettre à jour le site à partir de
ce qu'il y a sur ce dépôt.
Si vous n'avez pas de double de clés SSH, faites-en un avec `ssh-keygen`
(votre moteur de recherche favori vous renseignera).
Si vous n'êtes pas déjà inscrit à l'adm, demandez à un administrateur
de vous y rajouter. (si vous êtes un administrateur et que vous ne savez
pas comment faire, vous devriez avoir reçu des instructions plus fines par
mail ou par tout autre moyen alternatif que vous avez communiqué au reste
de l'équipe)
Il est conseillé, dans sa configuration SSH, de faire une entrée pour l'adm
du VPS de Planète Casio :
Host admpc
Hostname git.planet-casio.com
IdentityFile ~/.ssh/<votre clé, e.g. id_rsa>
User adm
Ainsi, vous pouvez alors tout simplement faire :
ssh admpc update creativecalc.fr

View File

@ -1,46 +0,0 @@
#******************************************************************************
# _config.yml — website configuration.
# This file is **NOT** reloaded while previewing.
#******************************************************************************
encoding: UTF-8
# Website settings.
url: https://www.creativecalc.fr
baseurl: ""
title: CreativeCalc
author: creativecalc
description: >-
CreativeCalc est une association à but non lucratif promouvant
l'apprentissage de la programmation.
# Folders and files.
plugins:
- jekyll-feed
- jekyll-assets
exclude:
- Gemfile
- Gemfile.lock
- vendor
- Makefile
- README.md
# Markdown settings.
markdown: kramdown
highlighter: rouge
# Assets settings.
assets:
source_maps: false
compress:
css: false
js: false
digest: true
sources:
- _assets
- _assets/css
- _assets/fonts
# End of file.

View File

@ -1,67 +0,0 @@
# ---
# Personnes morales.
# ---
creativecalc:
name:
username: Association CreativeCalc
born: 2015-04-29T00:00:00+01:00
website: https://creativecalc.fr
email: contact@creativecalc.fr
twitter: PlaneteCasio
github: PlaneteCasio
president: darks
tresorier: nemhardy
secretaire: lightmare
# ---
# Personnes physiques.
# ---
darks:
name:
first_name: Louis
username: Dark Storm
last_name: Gatin
gender: male
born: 1996-11-03T00:00:00+01:00
website: https://blog.darks.fr/
email: l.gatin@protonmail.com
lephenixnoir:
name:
first_name: Sébastien
username: Lephenixnoir
last_name: Michelland
gender: male
born: 1999-11-26T00:00:00+01:00
website: http://www.planet-casio.com/Fr/compte/voir_profil.php?membre=Lephenixnoir
email: sebastien.mld@numericable.fr
cakeisalie5:
name:
first_name: Thomas
username: Cakeisalie5
last_name: Touhey
gender: male
born: 1996-12-28T00:00:00+01:00
website: https://thomas.touhey.fr/
email: thomas@touhey.fr
twitter: thecakefive
nemhardy:
name:
first_name: Némo
username: Nemhardy
last_name: Fournier
gender: male
born: 1999-05-17T00:00:00+01:00
twitter: https://twitter.com/N3mhh
lightmare:
name:
first_name: Mathias
username: Lightmare
last_name: Kowalski
gender: male
email: mathiaskowalski1@gmail.com

View File

@ -1,56 +0,0 @@
{% if page.description %}{% assign desc = page.description
%}{% else %}{% assign desc = page.title
%}{% endif
%}{% if page.author %}{% assign author = site.data.authors[page.author]
%}{% else %}{% assign author = site.data.authors[site.author]
%}{% endif
%}<title>{% if page.title %}{{ page.title }} {% endif %}{{ site.title }}</title>
<link rel="canonical" href="{{ site.url }}{{ page.url }}">
{% if author.name.first_name
%}{% if author.name.last_name
%}<meta name="author" content="{{ author.name.first_name }} {% if author.name.username %}“{{ author.name.username }}” {% endif %}{{ author.name.last_name }}">
{% else
%}<meta name="author" content="{{ author.name.first_name }}, {{ author.name.username }}">
{% endif
%}{% else
%}<meta name="author" content="{{ author.name.username }}">
{% endif
%}{% if author.website
%}<link rel="author" href="{{ author.website }}">
{% endif
%}<meta property="og:description" name="description" content="{{ desc }}">
<link rel="icon" type="image/png" href="{{ site.baseurl }}/favicon.png">
<!--[if IE]>
<link rel="shortcut-icon" type="image/ico" href="{{ site.baseurl }}/favicon.ico">
<[endif]-->
<!-- OpenGraph -->
<meta property="og:title" content="{% if page.title %}{{ page.title }}{% else %}{{ site.title }}{% endif %}">
<meta property="og:site_name" content="{{ site.title }}">
<meta property="og:url" content="{{ site.url }}{{ page.url }}">
{% if page.layout == "post"
%}<meta property="og:type" content="article">
<meta property="article:published_time" content="{{ page.date | date_to_xmlschema }}">
{% if author.name.first_name
%}<meta property="article:author:first_name" content="{{ author.name.first_name }}">
{% endif
%}{% if author.name.username
%}<meta property="article:author:username" content="{{ author.name.username }}">
{% endif
%}{% if author.name.last_name
%}<meta property="article:author:last_name" content="{{ author.name.last_name }}">
{% endif
%}{% if author.gender
%}<meta property="article:author:gender" content="{{ author.gender }}">
{% endif
%}{% else
%}<meta property="og:type" content="website">
{% endif
%}
<!-- Twitter -->
<meta name="twitter:card" content="summary">
<meta name="twitter:title" content="{% if page.title %}{{ page.title }}{% else %}{{ site.title }}{% endif %}">
<meta name="twitter:description" content="{{ desc }}">
<meta name="twitter:url" content="{{ site.url }}{{ page.url }}">

View File

@ -1,20 +0,0 @@
<!DOCTYPE html>
<html lang="fr"><head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
{% include meta.html %}
{% asset css/main.css %}
</head><body>
<nav>
<a href="{{ site.baseurl }}/" class="h">CreativeCalc</a>
<div>
<a href="{{ site.baseurl }}/statuts.html">Statuts</a>
<a href="{{ site.baseurl }}/bureau.html">Bureau</a>
<a href="{{ site.baseurl }}/contact.html">Contact</a>
</div>
</nav>
{{ content }}
</body></html>

View File

@ -1,16 +0,0 @@
---
layout: default
---
<article>
<h2>CreativeCalc en quelques mots</h2>
{{ page.content | markdownify }}
</article>
<div class="separator"></div>
{% for post in site.posts %}
<article class="post" itemscope itemtype="http://schema.org/BlogPosting">
<h2><a href="{{ post.url }}">{{ post.title }}</a></h2>
{{ post.content }}
</article>
{% endfor %}

View File

@ -1,7 +0,0 @@
---
layout: default
---
<article class="post">
<h2 class="post-title">{{ page.title }}</h2>
{{ page.content | markdownify }}
</article>

View File

@ -1,7 +0,0 @@
---
layout: default
---
<article>
<h2>{{ page.title }}</h2>
{{ page.content | markdownify }}
</article>

View File

@ -1,15 +0,0 @@
---
layout: page
title: Composition du bureau
description: >-
Membres du conseil de CreativeCalc, élus démocratiquement lors d'assemblées
générales.
---
### Président
Louis Gatin, alias Dark Storm.
### Trésorier
Némo Fournier, alias Nemhardy.
### Secrétaire
Sébastien Michelland, alias Lephénixnoir.

View File

@ -1,6 +1,6 @@
---
layout: post
title: "Résumé de l'AG de février 2017"
title: Résumé de l'AG de février 2017
date: 2017-02-20
author: lephenixnoir
---
@ -10,4 +10,4 @@ présentation des comptes et vote d'un budget, présentation des objectifs
d'année, avancement de la v5 de Planète Casio.
Vous pouvez trouver le procès-verbal de cette assemblée
[ici]({{ site.baseurl }}/files/2017-02-12-AG.pdf).
[ici](/files/2017-02-12-AG.pdf).

View File

@ -1,6 +1,6 @@
---
layout: post
title: "Réunion du Conseil d'Administration de Juillet 2017"
title: Réunion du Conseil d'Administration de Juillet 2017
date: 2017-07-10
author: lephenixnoir
---
@ -10,4 +10,4 @@ de la v5 de Planète Casio et du rôle de l'association par rapport aux
réformes récentes.
Le compte-rendu de cette réunion se trouve
[ici]({{ site.baseurl }}/files/2017-07-09-CA.pdf).
[ici](/files/2017-07-09-CA.pdf).

View File

@ -1,6 +1,6 @@
---
layout: post
title: "Résumé de l'AG de février 2018"
title: Résumé de l'AG de février 2018
date: 2018-03-01
author: lephenixnoir
---
@ -10,4 +10,4 @@ nouveaux événements du forum pour 2018, une proposition d'acquisition de
Graph 90+E et l'actualisation de nombreuses pages oubliées du site.
Le procès-verbal de cette assemblée est accessible
[ici]({{ site.baseurl }}/files/2018-02-25-AG.pdf).
[ici](/files/2018-02-25-AG.pdf).

View File

@ -1,6 +1,6 @@
---
layout: post
title: "Résumé de l'AGE de mai 2018"
title: Résumé de l'AGE de mai 2018
date: 2018-05-31
author: cakeisalie5
---
@ -10,4 +10,4 @@ pour le relancement d'une activité plus soutenue du site et de l'association
et la désignation de personnes pour s'occuper de diverses parties de ce plan.
Le procès-verbal de cette assemblée est accessible
[ici]({{ site.baseurl }}/files/2018-05-31-AGE.pdf).
[ici](/files/2018-05-31-AGE.pdf).

View File

@ -1,6 +1,6 @@
---
layout: post
title: "Assemblée Générale Ordinaire de Juin 2019"
title: Assemblée Générale Ordinaire de Juin 2019
date: 2019-06-09
author: lephenixnoir
---
@ -10,4 +10,4 @@ rôle de CreativeCalc par rapport à Planète Casio. Trois articles des statuts
ont été modifiés pour le préciser et améliorer la dynamique du forum.
Le compte-rendu de cette assemblée est
[disponible en ligne]({{ site.baseurl }}/files/2019-06-09-AG.pdf).
[disponible en ligne](/files/2019-06-09-AG.pdf).

View File

@ -1,6 +1,6 @@
---
layout: post
title: "Assemblée Générale Ordinaire d'Août 2020"
title: Assemblée Générale Ordinaire d'Août 2020
date: 2020-09-06
author: lephenixnoir
---
@ -9,4 +9,4 @@ bilan moral et financier a été dressé, le bureau a été réélu, et une
proposition pour aligner les cotisations sur l'année civile a été adoptée.
Le compte-rendu de cette assemblée est
[disponible en ligne]({{ site.baseurl }}/files/2020-08-29-AG.pdf).
[disponible en ligne](/files/2020-08-29-AG.pdf).

View File

Before

Width:  |  Height:  |  Size: 198 B

After

Width:  |  Height:  |  Size: 198 B

View File

Before

Width:  |  Height:  |  Size: 274 B

After

Width:  |  Height:  |  Size: 274 B

2
content/extra/robots.txt Normal file
View File

@ -0,0 +1,2 @@
User-agent: *
Disallow: /contact.html

12
content/pages/bureau.md Normal file
View File

@ -0,0 +1,12 @@
---
layout: page
title: Composition du bureau
shorttitle: Bureau
description: >-
Membres du conseil de CreativeCalc, élus lors d'assemblées générales.
---
### Président
Louis Gatin, alias Dark Storm.
### Trésorier - Secrétaire
Sébastien Michelland, alias Lephénixnoir.

View File

@ -1,8 +1,9 @@
---
layout: page
title: Comment nous contacter ?
shorttitle: Contact
description: >-
Coordonnées de l'association.
Coordonnées de l'association
---
Si vous souhaitez rejoindre l'association ou nous poser directement
une question, vous pouvez nous contacter en envoyant un email à

View File

@ -1,7 +1,8 @@
---
layout: home
layout: page
title: CreativeCalc en quelques mots
permalink: /index.html
shorttitle: À propos
status: hidden
---
CreativeCalc est une association de loi 1901 à but non lucratif, qui gère le
site et la communauté de [Planète Casio](https://www.planet-casio.com).
@ -12,4 +13,3 @@ déplacements.
CreativeCalc regroupe des membres actifs et motivés de la communauté et sert
également à réguler l'administration du site.

View File

@ -1,7 +1,8 @@
---
layout: page
title: Nos statuts
description: >-
shorttitle: Statuts
description: >
Ensemble de règles régissant CreativeCalc et ses membres.
---
### Article premier Nom
@ -170,7 +171,7 @@ veto sur une décision émanant du Bureau qui peut conduire à une demande de
remboursement de la part d'un membre. À chaque Assemblée Générale Ordinaire,
il doit présenter à tous les membres un bref récapitulatif des recettes et des
dépenses de l'année précédente. À tout moment et sur demande du Bureau, il doit
pouvoir fournir une liste des entrées et sorties sur une période précise.
pouvoir fournir une liste des entrées et sorties sur une période précise.
### Article 15 Indemnités
Toutes les fonctions, y compris celles des membres du Conseil dAdministration
@ -179,7 +180,7 @@ laccomplissement de leur mandat, suite à une demande émanant du Bureau, son
remboursés sur justificatifs auprès du Trésorier lors de l'Assemblée Générale
Ordinaire la plus proche. Une demande d'indemnisation de frais délivrée plus
de 2 ans à compter de la date de paiement de ces frais ne pourra être prise
en compte.
en compte.
### Article 16 Règlement intérieur
Si le besoin s'en fait sentir, un règlement intérieur peut être établi par le

40
pelicanconf.py Normal file
View File

@ -0,0 +1,40 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*- #
AUTHOR = 'CreativeCalc'
SITENAME = 'CreativeCalc'
SITEURL = ''
PATH = 'content'
STATIC_PATHS = ['files', 'images', 'extra']
EXTRA_PATH_METADATA = {
'extra/robots.txt': {'path': 'robots.txt'},
'extra/favicon.ico': {'path': 'favicon.ico'},
'extra/favicon.png': {'path': 'favicon.png'},
}
TIMEZONE = 'Europe/Paris'
DEFAULT_LANG = 'fr'
# Feed generation is usually not desired when developing
FEED_ALL_ATOM = None
CATEGORY_FEED_ATOM = None
TRANSLATION_FEED_ATOM = None
AUTHOR_FEED_ATOM = None
AUTHOR_FEED_RSS = None
# Blogroll
# LINKS = (('Pelican', 'https://getpelican.com/'),
# ('Python.org', 'https://www.python.org/'),
# ('Jinja2', 'https://palletsprojects.com/p/jinja/'),
# ('You can modify those links in your config file', '#'),)
# Social widget
# SOCIAL = (('You can add links in your config file', '#'),
# ('Another social link', '#'),)
DEFAULT_PAGINATION = 5
# Uncomment following line if you want document-relative URLs when developing
#RELATIVE_URLS = True

18
publishconf.py Normal file
View File

@ -0,0 +1,18 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*- #
# This file is only used if you use `make publish` or
# explicitly specify it as your config file.
import os
import sys
sys.path.append(os.curdir)
from pelicanconf import *
# If your site is available via HTTPS, make sure SITEURL begins with https://
SITEURL = 'https://creativecalc.fr'
RELATIVE_URLS = False
FEED_ALL_RSS = 'feed.xml'
DELETE_OUTPUT_DIRECTORY = True

View File

@ -1,2 +0,0 @@
User-agent: *
Disallow: /contact.html

118
tasks.py Normal file
View File

@ -0,0 +1,118 @@
# -*- coding: utf-8 -*-
import os
import shlex
import shutil
import sys
import datetime
from invoke import task
from invoke.main import program
from invoke.util import cd
from pelican import main as pelican_main
from pelican.server import ComplexHTTPRequestHandler, RootedHTTPServer
from pelican.settings import DEFAULT_CONFIG, get_settings_from_file
SETTINGS_FILE_BASE = 'pelicanconf.py'
SETTINGS = {}
SETTINGS.update(DEFAULT_CONFIG)
LOCAL_SETTINGS = get_settings_from_file(SETTINGS_FILE_BASE)
SETTINGS.update(LOCAL_SETTINGS)
CONFIG = {
'settings_base': SETTINGS_FILE_BASE,
'settings_publish': 'publishconf.py',
# Output path. Can be absolute or relative to tasks.py. Default: 'output'
'deploy_path': SETTINGS['OUTPUT_PATH'],
# Host and port for `serve`
'host': 'localhost',
'port': 8000,
}
@task
def clean(c):
"""Remove generated files"""
if os.path.isdir(CONFIG['deploy_path']):
shutil.rmtree(CONFIG['deploy_path'])
os.makedirs(CONFIG['deploy_path'])
@task
def build(c):
"""Build local version of site"""
pelican_run('-s {settings_base}'.format(**CONFIG))
@task
def rebuild(c):
"""`build` with the delete switch"""
pelican_run('-d -s {settings_base}'.format(**CONFIG))
@task
def regenerate(c):
"""Automatically regenerate site upon file modification"""
pelican_run('-r -s {settings_base}'.format(**CONFIG))
@task
def serve(c):
"""Serve site at http://$HOST:$PORT/ (default is localhost:8000)"""
class AddressReuseTCPServer(RootedHTTPServer):
allow_reuse_address = True
server = AddressReuseTCPServer(
CONFIG['deploy_path'],
(CONFIG['host'], CONFIG['port']),
ComplexHTTPRequestHandler)
sys.stderr.write('Serving at {host}:{port} ...\n'.format(**CONFIG))
server.serve_forever()
@task
def reserve(c):
"""`build`, then `serve`"""
build(c)
serve(c)
@task
def preview(c):
"""Build production version of site"""
pelican_run('-s {settings_publish}'.format(**CONFIG))
@task
def livereload(c):
"""Automatically reload browser tab upon file modification."""
from livereload import Server
build(c)
server = Server()
# Watch the base settings file
server.watch(CONFIG['settings_base'], lambda: build(c))
# Watch content source files
content_file_extensions = ['.md', '.rst']
for extension in content_file_extensions:
content_blob = '{0}/**/*{1}'.format(SETTINGS['PATH'], extension)
server.watch(content_blob, lambda: build(c))
# Watch the theme's templates and static assets
theme_path = SETTINGS['THEME']
server.watch('{}/templates/*.html'.format(theme_path), lambda: build(c))
static_file_extensions = ['.css', '.js']
for extension in static_file_extensions:
static_file = '{0}/static/**/*{1}'.format(theme_path, extension)
server.watch(static_file, lambda: build(c))
# Serve output path on configured host and port
server.serve(host=CONFIG['host'], port=CONFIG['port'], root=CONFIG['deploy_path'])
@task
def publish(c):
"""Publish to production via rsync"""
pelican_run('-s {settings_publish}'.format(**CONFIG))
c.run(
'rsync --delete --exclude ".DS_Store" -pthrvz -c '
'-e "ssh -p {ssh_port}" '
'{} {ssh_user}@{ssh_host}:{ssh_path}'.format(
CONFIG['deploy_path'].rstrip('/') + '/',
**CONFIG))
def pelican_run(cmd):
cmd += ' ' + program.core.remainder # allows to pass-through args to pelican
pelican_main(shlex.split(cmd))

View File

@ -1,6 +1,3 @@
---
---
/*
Fonts
*/
@ -74,15 +71,25 @@ article {
border: 1px solid rgba(0,0,0,.1);
border-top-width: 0; }
article div.info {
text-align: right;
color: #444444;
}
div + article {
border-top-width: 1px; }
article h2 {
article h1 {
margin: 0 0 24px 0;
font-size: 24px;
color: #333333;
text-align: center; }
article h2 {
margin: 0 0 24px 0;
font-size: 20px;
color: #333333; }
article h3 {
margin: 32px 0 16px 0;
font-size: 18px;
@ -100,7 +107,8 @@ article h2 a {
color: unset;
}
article a:hover {
article a:hover,
article a:focus {
text-decoration: underline; }
article ul {
@ -117,5 +125,25 @@ hr {
color: #e8e8e8; }
div.separator {
height: 24px;
height: 24px; }
div.paginator {
display: flex;
justify-content: center;
font-size: 18px;
}
div.paginator > * {
margin: 5px;
}
div.paginator a,
div.paginator a:visited {
text-decoration: none;
color: #cc3434;
}
div.paginator a:hover,
div.paginator a:focus {
text-decoration: underline;
}

View File

@ -0,0 +1,17 @@
{% extends "base.html" %}
{% block head -%}
{{ super() -}}
{% if article.summary %}
<meta name="description" content="{{ article.summary | striptags | safe | truncate(150) }}" />
{% endif %}
{% endblock %}
{% block title %}{{ article.title|striptags }}{% endblock %}
{% block content %}
<article>
<h1>{{ article.title }}</h1>
{% include 'article_infos.html' %}
{{ article.content }}
</article>
{% endblock %}

View File

@ -0,0 +1,11 @@
<div class="info">
<abbr class="published" title="{{ article.date.isoformat() }}">
Publié le {{ article.date|strftime('%d/%m/%Y') }}
</abbr>
{% if article.authors %}
<address class="vcard author">
Par {% for author in article.authors %}{{ author }}{% endfor %}
</address>
{% endif %}
</div>

27
theme/templates/base.html Normal file
View File

@ -0,0 +1,27 @@
<!DOCTYPE html>
<html lang="fr" dir="ltr">
<head>
{% block head %}
<meta charset="utf-8">
<title>{% block title %}{{ SITENAME }}{% endblock %}</title>
<link rel="stylesheet" href="{{ SITEURL }}/{{ THEME_STATIC_DIR }}/css/{{ CSS_FILE }}" />
{% if FEED_ALL_RSS %}
<link href="{{ FEED_DOMAIN }}/{% if FEED_ALL_RSS_URL %}{{ FEED_ALL_RSS_URL }}{% else %}{{ FEED_ALL_RSS }}{% endif %}" type="application/rss+xml" rel="alternate" title="{{ SITENAME }} RSS Feed" />
{% endif %}
{% endblock head %}
</head>
<body>
<nav>
<a href="{{ SITEURL }}/" class="h">CreativeCalc</a>
<div>
{% for pg in pages|sort(attribute="date", reverse=True) %}
<a href="{{ SITEURL }}/{{ pg.url }}">{{ pg.shorttitle }}</a>
{% endfor %}
</div>
</nav>
{% block content %}
{% endblock %}
</body>
</html>

View File

@ -0,0 +1,20 @@
{% extends "base.html" %}
{% block content %}
<article>
{% for page in hidden_pages %}
{{ page.content }}
{% endfor %}
</article>
<div class="separator"></div>
{% if articles %}
{% for article in articles_page.object_list %}
<article class="post" itemscope itemtype="http://schema.org/BlogPosting">
<h2><a href="{{ article.url }}">{{ article.title }}</a></h2>
{{ article.content }}
</article>
{% endfor %}
{% include 'pagination.html' %}
{% endif %}
{% endblock content %}

16
theme/templates/page.html Normal file
View File

@ -0,0 +1,16 @@
{% extends "base.html" %}
{% block head -%}
{{ super() -}}
{% if page.summary %}
<meta name="description" content="{{ page.summary | striptags | safe | truncate(150) }}" />
{% endif %}
{% endblock %}
{% block title %}{{ page.title|striptags }}{% endblock %}
{% block content %}
<article>
<h1>{{ page.title }}</h1>
{{ page.content }}
</article>
{% endblock %}

View File

@ -0,0 +1,19 @@
{% if DEFAULT_PAGINATION %}
{% if pages %}
<div class="paginator">
{% if articles_page.has_previous() %}
<a href="{{ SITEURL }}/{{ articles_previous_page.url }}"></a>
{% endif %}
{% for p in range(1, articles_paginator.num_pages + 1) %}
{% if articles_page.number == p %}
<span>{{ p }}</span>
{% else %}
<a href="{{ SITEURL }}/{{ articles_paginator.page(p).url }}">{{ p }}</a>
{% endif %}
{% endfor %}
{% if articles_page.has_next() %}
<a href="{{ SITEURL }}/{{ articles_next_page.url }}"></a>
{% endif %}
</div>
{% endif %}
{% endif %}