Un simpatico pellicano

Il mio blog statico con Pelican

Dopo una settimana trovo un po' di tempo per scrivere un nuovo post. È il Linux Day quindi ne approfitto per salutare tutti i volontari e non che contribuiscono con il loro impegno alla promozione di Linux e più in generale all'open source, specialmente l'associazione GNU/Linux User Group di Perugia.

Come ho scritto nell'ultimo post, questo è un blog statico realizzato con Pelican. Dopo anni di WordPress (WP) ho deciso di seguire questa strada per alcuni semplici motivi:

Detto questo ci tengo a sottolineare la validità di uno strumento come WP che oggi fa funzionare il 26% del web, niente male direi.

Sicuramente mancano all'appello altri fattori e forse esistono dei motivi che non conosco a sfavore di questa mia scelta. In caso ti invito a dire la tua nei commenti (che al momento non sono ancora stati attivati purtroppo).

Questa non sarà purtroppo una guida passo passo su come muoversi con Pelican. Ci sono alcune informazioni su coma installarlo o come creare contenuti ma si tratta più di una sintesi della mia esperienza che di un vero tutorial. Nel caso fossi interessato a qualcosa di completo ti rimando alla documentazione ufficiale dalla quale io stesso ho attinto per alcune informazioni.

Installare Pelican

Per l'installazione la guida ufficiale consiglia l'uso di Virtualenv, anche se personalmente ho saltato questo passaggio ed installato il tutto nel sistema dando da terminale:

pip3 install pelican

Una volta installato è possibile generare uno scheletro del progetto con una procedura guidata che può essere avviata con il comando:

pelican-quickstart

Eseguita l'operazione la cartella del nostro progetto apparirà così:

nomeprogetto
├── content
│ └── (pages)
├── output
├── develop_server.sh
├── fabfile.py
├── Makefile
├── pelicanconf.py
└── publishconf.py

In 'Content' vanno i nostri articoli mentre in 'output' le pagine HTML che saranno generate dal sistema. 'Pelicancon.py' e 'publishconf.py' sono due file di configurazione del nostro progetto dove è possibile definire alcune variabili ed estendere alcune funzionalità del nostro tema.
È importante ricordare che le modifiche sul 'publishconf' vanno a sovrascrivere quelle effettuate su 'pelicanconf'.
'Makefile' e 'fabfile' vengono generati durante il quickstart e contengono informazioni di base del nostro progetto che possono essere modificate in base alle nostre esigenze. Personalmente non ho avuto bisogno ancora di modificare questi file.

Tra le varie voci nel 'pelicanconf' troviamo anche quelle per impostare il nome del sito, gli indirizzi per il feed atom/rss o il tema utilizzato. Di temi utilizzabili ne esistono molti e qui trovi una lista interessante.
Per quanto riguarda il tema di questo blog al momento ne sto utilizzando uno creato da Onur Aslan che si chiama Medius, al quale ho apportato qualche piccola modifica: alcuni widget in home oltre ai meta tag necessari per una migliore SEO ed alcuni interventi nel css.

Creare contenuto

Per quanto riguarda la creazione di contenuti, Pelican permette una certa flessibilità: di default si può ricorrere a file in formato rst. Le voci che possono essere usate in un file sono molte, qui trovi un esempio preso da uno dei miei file:

Titolo del post
###############
:date:
:tags:
:category:
:slug:
:SubTitle:
:summary:
:status: draft
:cover:
:thumbnail:
:alt:
:seo_desc:

I valori presenti in questi file vengono usati da Pelican per inserire negli output HTML delle informazioni in maniera automatizzata. Nel mio caso le info sono legate alla SEO o forniscono dati utili per una migliore presentazione dei link nei social network.

Il tema in uso aveva un file chiamato 'base.html' che forniva una struttura comune a tutte le pagine HTML generate da Pelican.
Tuttavia, i valori dei vari tag possono variare in base alla pagina in cui si trovano: un articolo per esempio, avrà un meta tag description differente da quello della home o di un altro articolo.
Per questo ho creato un duplicato della pagina 'base.html' pensato appositamente per gli articoli (OK hai ragione forse non è la strada migliore), al quale ho aggiunto queste voci all'interno dell'head:

meta name="Description" content="{{ article.seo_desc }}"/>
meta property="og:title" content="{{ article.title }} | {{ SITENAME }}"/>
meta property="og:description" content="{{ article.seo_desc }}"/>
meta property="og:type" content="website"/>
meta property="og:url" content="{{ SITEURL }}">
meta property="og:image" content="{{ SITEURL }}/{{ article.cover }}"/>
meta property="og:site_name" content="{{ SITENAME }}"/>
meta name="twitter:card" content="summary_large_image">
meta name="twitter:site" content="@twitterusername">
meta name="twitter:title" content="{{ article.title }} | {{ SITENAME }}">
meta name="twitter:description" content="{{ article.seo_desc }}">
meta name="twitter:image" content="{{ SITEURL }}/{{ article.cover }}">

Come puoi notare alcuni dei campi content vanno a ripescare informazioni direttamente dal file rst realizzato in precedenza, ad esempio article.seo_desc o article.cover.
In questo modo possiamo definire all'interno di ogni articolo dei valori e lasciare poi a Pelican il compito di generare file HTML completi.

Oltre al formato rst è possibile utilizzare Markdown ma questo linguaggio deve prima essere installato con:

pip3 install Markdown

Personalmente preferisco scrivere i miei contenuti in HTML, un linguaggio che Pelican gestisce nativamente e che permette la formattazione inline. Trovo che rst abbia alcuni limiti che me lo rendono scomodo da usare, o forse non ho ancora compreso le sue potenzialità. Per esempio la sintassi di rst per la creazione di un link è:

questo_ è un link

.. _questo: http://url

mentre quella per rendere un termine in grassetto è:

**termine**

e quando vogliamo inserire un link in una parola in grassetto?
In questo caso dobbiamo ricorrere ad un espediente:

|questo|_ è un link in grassetto

.. |questo| replace:: **questo**
.. _questo: http://url

in alternativa si può ricorrere al metodo raw ma a mio parere rallenta ulteriormente la scrittura.

Questo è un piccolo esempio di quello che per me è un limite del formato, un altro può essere quello di non permettere l'aggiunta del target="_blank" nei link.
(Ok, forse sono solo di parte e mi piace troppo l'HTML per passare ad altro.)

Non ho trovato informazioni per confutare quanto scritto, nel caso avessi delle dritte utili a dimostrare il contrario ti chiedo gentilmente di condividerle in modo da poter correggere il post, grazie.

Script per i contenuti

Stabiliti i tag interessanti per lo sviluppo del nostro sito non ci resta altro che creare di volta in volta un nuovo file (HTML, rst o md) da popolare con i nostri contenuti.

Trovando la cosa noiosa ho deciso di ricorrere ad una simpatica soluzione, spiegata in questo articolo, in cui l'autore condivide un piccolo script in Python che permette la creazione da terminale di nuovi file di partenza per i nostri articoli.
Per comodità inserisco un link per scaricare uno script per la generazione di file rst ed uno per file HTML.

Ho apportato ai file alcune modifiche come l'aggiunta di name='alt' content='' che fornisce al tema l'alt tag di cover e miniatura dell'articolo. Usando gli script il file generato sarà considerato una bozza grazie alla voce name='status' content='draft'.
Naturalmente i campi inseriti sono compatibili con le modifiche che ho apportato al tema ma non funzioneranno se non saranno previsti dal tuo.

Per utilizzare gli script basta spostarsi nella cartella dove sono contenuti e digitare:

python3 new-html.py Titolo_che_vuoi_dare_al_post

Fatto questo verrà generato un file html nella stessa cartella ed il titolo assegnato sarà impostato anche come slug dell'articolo, la stringa che costituirà l'url del tuo articolo, utile per fare SEO.

Testare il sito

OK, hai scelto il tema, hai creato il contenuto e adesso vuoi vedere il risultato prima di pubblicare tutto online. Come fare?

Da terminale spostati nella cartella del tuo progetto e poi digita:

make devserver

Adesso apri il browser e digita nella barra degli url:

localhost:8000

Fatto. Ora dovresti vedere il tuo sito in tutto il suo splendore.
Per interrompere il server basterà il comando:

make stopserver

Generare l'HTML e pubblicare il sito

Per le generazione del sito basta lanciare da terminale il comando:

pelican content -s publishconf.py

content è la cartella dove abbiamo messo il nostro contenuto e publishconf il file di configurazione che, nel mio caso, contiene alcune info utili per la generazione dell'HTML, come il codice per il tracking di Google Analytics e quello per l'implementazione di Disqus.

Il comando precedente andrà a creare la cartella "output", poi non resterà altro che caricare tutto online. Io ho fatto l'upload del mio tramite FTP, ma nella documentazione ufficiale si possono trovare altri metodi.

Sperimenta

Sono agli inizi con Pelican ma sento di aver trovato un valido alleato per la gestione di questo blog.
Il fatto di lavorare con Python mi dà la sensazione di avere tra le mani uno strumento estremamente malleabile, ora non resta altro da fare se non sperimentare e divertirsi.

Spero di esserti stato utile con questo post. Fammi sapere nei commenti cosa posso aggiungere per migliorarlo e grazie per il tuo tempo.