Aller au contenu principal

Astuces et paramètrages de Nikola

/images/previews/preview_astuces-nikola-blog.png

Dans cet article, vous trouverez un peu d'aide et quelques astuces pour paramétrer le générateur de blog Nikola. Comment modifier un thème, comment personnaliser son blog.. Je vous propose également un script personnel qui pourrait vous être utile.

Configuration de son blog Nikola

Nikola se configure dans un seul fichier : conf.py à la racine de son blog. Voici quelques astuces commentées afin de bien démarrer. Cherchez dedans les valeurs et définissez selon vos besoins.

nikola-astuces-conf.py (Source)

# Définissez votre licence (Creative Commons : ex CC-BY-SA)
LICENSE = """
<a  rel="License"
    href="https://creativecommons.org/licenses/by-sa/4.0/"
    title="Attribution-ShareAlike 4.0 International (CC BY-SA 4.0)"
    target="_blank">
    CC-BY-SA
</a>"""

# Pied de Page ; exemple :
CONTENT_FOOTER = """
Licence {license} {date}
<a href="mailto:{email}">{author}</a>
- Powered by
<a href="https://getnikola.com" rel="nofollow">Nikola</a>'
"""

# À la fin de votre "teaser",
# faites un retour à la ligne vide
# et placez cette balise reST
#
# .. END_TEASER

# Changer le format de la date affichée
DATE_FORMAT = 'yyyy-MM-dd'

# N'afficher que le début de l'article dans la page d'index
INDEX_TEASER = True

# Afficher l'artcile complet dans le flux RSS
FEED_TEASER = False

# Afficher le lien et la source de l'article. Décommenter
SHOW_SOURCELINK = True
COPY_SOURCES = True

# Changer le thème de l'affichage des codes
# https://help.farbox.com/pygments.html
CODE_COLOR_SCHEME = 'vim'

# favicon : créez différents formats/tailles.
# Copiez les dans le dossier files
# "nom", "uri", "taille"
FAVICONS = (
   ("icon", "/icon.ico", "16x16"),
   ("icon", "/icon_128x128.png", "128x128"),
)

# Dire au générateur de copier tous les fichiers dans "files" dans ouput/
FILES_FOLDERS = {'files': ''}

Création d'un thème

Il existe différents Thèmes pour Nikola avec plusieurs styles de formatage de code, comme jinja (sa documentation) ou mako. Pour ne pas partir de zéro, vous pouvez copier et renommer un thème déjà installé. Dans votre fichier conf.py, renseignez le nouveau nom du dosier. Toutefois, cette méthode est plus propre. Sinon, le référenciel pour créer la structure est ici.

Voici quelques exemples de personnalisation dans le format jinja.

Afficher la source de l'article dans son thème

{% if show_sourcelink %}
 | <span class="sourceline">
   <a class="article__meta__link hover:article__meta__link"
      href="{{ post.source_link() }}"
      class="sourcelink">
      {{ messages("Source") }}
   </a>
   </span>
{% endif %}

Afficher la date de modification de l'article

(modifié: <time class="modified dt-published"
                datetime="{{ post.formatted_updated('webiso') }}"
                title="{{ post.formatted_updated(date_format)|e }}">
{{ post.formatted_updated(date_format)|e }

Script personnel

Je vous propose mon script nikoblog_script écrit en bash qui pourra peut-être vous être utile. Il permet de vérifier que tous vos articles (dans le dossier posts) disposent de la directive ".. updated:".

En effet, cette directive n'est pas toujours inscrite par l'auteur, et si ce dernier modifie régulièrement ses articles, il faudrait également qu'il pense à la remplir avec la nouvelle date.

Ce script - nikoblog_script - sous licence libre GPLv3 - va récupérer la date de chaque ficher depuis la commande "ls" et mettre à jour leur directive. Si, elle n'a jamais été inscrite, nikoblog_script se chargera de la rajouter avec les bonnes valeurs. Il abandonnera si la directive ".. date:" n'est pas renseignée.

Installation de nikoblog_script

  • Téléchargez-le

  • Définissez les répertoires des variables:

    • niko_dir_blog=""

    • niko_dir_posts=""

  • Sourcez le script dans votre .bashrc

  • Ouvrez un nouveau terminal

  • Lancez la commande niko (affiche les options uniquement)

# Sourcez le script
# Ajoutez et adaptez le lien du fichier dans .bashrc
[[ -f ~/nikoblog_script ]] && . ~/nikoblog_script

Code de nikoblog_script

nikoblog_script (Source)

#!/bin/bash
# Version 0.1
# Author: echolib {xmpp:echolib@a-lec.org}
# file: nikoblog_script
# Description:
# Script for Nikola's blogs.
# Checking directive '.. updated' and update/add in all posts from ls time-style
# License:
# GPLv3 > https://codeberg.org/echolib/bash-tools/src/branch/main/LICENSE

niko() {
unset ${!niko_@}

# Set your posts directory
niko_dir_blog="$HOME/my-nikola-blog/"
niko_dir_posts="$HOME/my-nikola-blog/posts/"

! [[ -d $niko_dir_blog ]] \
   && echo "! Error directory: Missing $niko_dir_blog" \
   && return

! [[ -d $niko_dir_posts ]] \
   && echo "! Error directory: Missing $niko_dir_posts" \
   && return

niko_current_dir=${PWD}

case "$1" in
   -d|date)          niko__newdate ;;
   -s|start-server)  niko__start_server ;;
   -h|help|*)        niko__help ;;
esac

cd "$niko_current_dir"
unset ${!niko_@}
}


niko__newdate() {
niko_term_upd=".. updated:"
cd "$niko_dir_posts"
! (( `ls | wc -l` > 0 )) \
   && echo "! Nohting here: skipping" \
   && return

echo "# Sending new update time to post:"
while read -r "niko_post"
do

# Getting new date fom ls command
niko_new_date=`echo "$niko_post" | awk '{print $6}'`
niko_directive_new_date="$niko_term_upd $niko_new_date"
niko_filename=`echo "$niko_post" | awk '{print $8}'`

# Checking if basic ".. date:" directive, else skipping file
niko_cat_date=`
      cat -n "$niko_dir_posts$niko_filename" 2>/dev/null \
         | grep ".. date:"`

if [[ $niko_cat_date ]];then
   niko_cat_date_line_nbr=`echo $niko_cat_date | awk '{print $1}'`
   niko_cat_updated_line_nbr=$(( niko_cat_date_line_nbr + 1 ))
else
   echo "! Error date: $niko_filename | Skipping..."
   continue
fi

# Getting line ".. updated:" from filename
niko_cat_updated=`
   cat -n "$niko_dir_posts$niko_filename" 2>/dev/null \
      | grep "$niko_term_upd" `

# No directive ".. updated:"
if ! [[ $niko_cat_updated ]];then
   printf   '%s%s\n' \
            "+ Add update: $niko_filename | " \
            "Line $niko_cat_updated_line_nbr = .. updated: $niko_new_date"

   sed -i   "${niko_cat_updated_line_nbr}i.. updated: $niko_new_date" \
            "$niko_filename"
   continue
fi

# Getting line and old time from filename
niko_cat_updated_line_nbr=`echo $niko_cat_updated | awk '{print $1}'`
niko_old_date=`echo $niko_cat_updated | awk '{print $4}'`

# Compare if new date
[[ $niko_old_date == $niko_new_date ]] \
   && echo "= No changes: $niko_filename" \
   && continue

# Printing new updated line
printf   '%s%s\n' \
         "+ New update: $niko_filename | Line $niko_cat_updated_line_nbr : " \
         "$niko_old_date > $niko_new_date"

niko_directive_old_date="$niko_term_upd $niko_old_date"
sed -i   "${niko_cat_updated_line_nbr}s|$niko_directive_old_date|$niko_directive_new_date|" \
         "$niko_filename"

done < <(ls -l --time-style=long-iso | tail -n +2)
}


niko__start_server() {
cd "$niko_dir_blog"
nikola build && nikola serve
}


niko__help() {
cat << EOH
# niko [OPTION]
   -d | date         : Add/Change posts updated date
   -s | start-server : Short for local build && serve; whereever you are
EOH
}

Documentations et ressources