Hyppää sisältöön

Getting Nikola

Nikola

En ole kovin aktiivinen bloggaaja, ja näyttääkin siltä, että edellisestä kirjoituksestanikin on jo tovi. Varmaan osasyy siihen on eräänlainen hankaluus ja vaiva, joka aiheutuu kirjoittamisesta ja sivujen tuottamisesta. Itse asian kirjoittaminen vaatii tietenkin oman työnsa, mutta josko sivuston tuottamisen ja ylläpitämisen saisi vaivattomammaksi.

Aluksi tein sivuni ihan suoraan HTML:nä, sitten kirjoitin sivuja reStructuredTextinä ja generoin niistä docutilsilla HTML:ää. Apuna oli joukko omatekoisia työkaluja. Niiden käyttö vaan aina tuntui tarvitsevan jotain korjaamista, kun halusi tehdä jotain. Jotain helpompaa halusin. En halua Wordpressiä tai muita vastaavia. Tuki Pythonille olisi kiva, jos pitäisi kuitenkin ruveta säätämään. Siispä etsimään jotain parempaa.

Nikola on työkalu, jolla saa generoitua HTML-sivuja. Ei siis välttämättä tarvitse asentaa palvelimelle ohjelmistoa. Nikola tukee tavallisia sivuja ja blogi-kirjoituksia. Kirjoituksista generoituu arkisto, avainsanalista ja RSS-syötteet sekä paljon muuta.

Aloitin kokeilun luomalla virtualenvin ja asentamalla sinne Nikolan. Tätä kirjoittaessani Nikolan versio on 7.1.0. Asennus onnistui kutakuinkin näin:

python3 -m venv env
. env/bin/activate
pip install nikola
pip install requests      # Tämä tarvittiin teemojen lataamista varten.
pip install livereload    # Jotta "nikola auto" toimisi.

Tämän jälkeen Nikolaa pystyi helposti kokeilemaan luomalla demo-sivuston:

nikola init --demo demosite
cd demosite
nikola build

conf.py-tiedostosta sisältää sivuston asetukset. Sitä muuttelemalla ja muutaman sivun luomalla tulin siihen lopputulokseen, että saisin sivustolleni haluamani ominaisuudet, muunmuassa:

  • nätit URL:it,
  • kuvat,
  • omat tyylit,
  • RSS-syötteet ja
  • ennen kaikkea sain pois sellaiset asiat, joita en halua (ainakaan vielä).

Varsinaisen tyhjän pohjan sivustolleni sain komennolla:

nikola init site

Tämä loi site-hakemistoon, jossa kaikki sivustoon liittyvät tiedostot ovat. Siirsin sinne pages- ja posts-hakemistoihin vanhat sivuni, jotka olivat jo valmiiksi rst-muotoisia tekstitiedostoja. Blogikirjoitukset laitoin posts/<vuosi>/<kuukausi>/jokin-juttu.txt-nimisiin tiedostoihin.

Seuraavilla asetuksilla sain sivut generoitumaan suoraan sivustoni juureen niin, että sivut generoituivat sivu/index.html-tiedostoon eikä sivu.html-tiedostoon. Lisäksi linkit sivuihin ovat muotoa sivu/, joten URL:eihin ei tule näkyviin varsinaista tiedoston nimeä eikä myöstään tiedoston .html-päätettä.

POSTS = (
    ("posts/*.txt", "", "post.tmpl"),
)
PAGES = (
    ("pages/*.txt", "", "story.tmpl"),
)
PRETTY_URLS = True
STRIP_INDEXES = True

Sivujen siirto oli helppoa. Muutoksia ei juuri tarvinnut. Lisäsin sivuille Nikolan tukemat metatiedot ja poistin jotain ylimääräistä, kuten erillisen artikkeliini kirjoittaman päiväyksen, joka nyt kuuluu metatietoihin.

.. title: HTTP-frameworkia Pythonilla
.. slug: http-frameworkkia-pythonilla
.. date: 2009-08-14
.. tags:
.. link:
.. description:
.. type: text

Lisäsin sivuille myös merkinnän, jolla määritellään, mihin asti artikkelia näytetään etusivulla.

.. TEASER_END

Lisäksi määrittelin conf.py-tiedostoon asetukset, joilla kyseinen merkintä otetaan käyttöön, ja myös sen, kuinka monta artikkelia näytetään etusivulla.

INDEX_TEASERS = True
INDEX_DISPLAY_POST_COUNT = 7

Kuvat, joita minulla on aika vähän, sijoitin files-hakemistoon sivua vastaavaan rakenteeseen. Jos sivu on tiedostossa posts/2008/07/tyylittelya.txt, siihen liittyvät kuvat sijoitin hakemistoon files/2008/07/tyylittelya/. Nikola siirsi silloin kuvat samaan hakemsitoon sivun index.html-tiedoston kanssa ja kuvaan pystyi sivulta viittamaamaan suoraan kuvan nimellä.

Sivuston ja sivujen perustiedot, kuten otsikot tekijät, URL:in yms. sai helposti määriteltyä conf.py-tiedostossa muuttujilla

BLOG_AUTHOR
BLOG_TITLE
SITE_URL
BLOG_EMAIL
BLOG_DESCRIPTION
CONTENT_FOOTER

Muita hyödyllisiä muuttujia olivat:

DEFAULT_LANG
TIMEZONE
DATE_FORMAT
INDEXES_TITLE

Faviconin pystyi niinikään myös määrittelemään konfiguraatioon ja itse ikonin tallentamaan tiedostoon files/favicon.png.

FAVICONS = {
    ("icon", "/favicon.png", "16x16"),
}

Sellaisia ominaisuuksia, joita en nykyisellään tarvitse, sain pois seuraavilla asetuksilla. Ns. "share"-nappeja en tarvitse, sivujen lähdekoodia ei tarvitse laittaa esille ja minulla ole kuvagalleriaa eikä erillisiä ohjelmalistauksia. Poistin siis ne käytöstä.

SOCIAL_BUTTONS_CODE = ''
COPY_SOURCES = False
DISABLED_PLUGINS = ["render_galleries", "render_listings"]

Oman tyylin sivuilleni sain asentamalla ensin Nikolan base-teeman ja sitten "periytin" siitä oman teemani. Omassa teemassa määrittelin vain css-tyylit.

Sähköpostiosoitteiden seulomisen häiritsemiseksi sivuiltani sovelsin ideaa, jossa osoitteet koodataan HTML:n merkkikoodeiksi. En tiedä, onko tämä tehokas keino, mutta koska spämmiä on aina liikaa, ei siitä varmaan haittaakaan ole.

Koodauksen tekeminen käsin sähköpostiosoitteille suoraan lähdetiedostoon olisi työlästä eikä se sitä paitsi olisi toiminutkaan. Nikola ajaa tuotetut HTML:t jonkin prosessin läpi, joka muuttaa merkkikoodit takaisin tavallisiksi merkeiksi. Parempi ratkaisu olikin määritellä suodatin, joka tekee muunnoksen valmiille HTML-tiedostoille. Suodattimen voi määritellä käyttöön conf.py-tiedostossa.

import sitefilters
from nikola.filters import apply_to_text_file
FILTERS = {
    ".html": [apply_to_text_file(sitefilters.obscure_emails)],
}

Ja itse suodatin on varsin yksinkertainen. Se muuntaa kaikki sähköpostiosoitteita muistuttavat merkkijonot &#xxx;-merkeiksi.

import re

def obscure_text(text):
    return ''.join('&#{};'.format(ord(char)) for char in text)

def obscure_emails(text):
    def obscure_match(match):
        return obscure_text(match.group(0))
    return re.sub('[a-zA-Z0-9.+]*:?[a-zA-Z0-9.+]+@[a-zA-Z0-9.+]+', obscure_match, text)

Sivuston generointi ja sen testaus (tai katselu) on helppoa. Nikolassa on seuraavat komennot, joilla se onnistuu

nikola build     # Generoi sivuston output-hakemistoon
nikola serve     # Käynnistää WWW-palvelimen osoitteeseen http://127.0.0.1:8000
nikola auto      # Tekee rakennuksen, käynnistää WWW-palvelimen ja
                 # tekee generoinnin aina uudestaan, kun sivuston lähdekoodia
                 # muuttaa
nikola clean     # Tyhjentää output-hakemiston.

Valmiin sivuston siirtämiseksi näkyville, Nikola tarjoaa deploy-komennon. Itse komento pitää määrittää conf.py-tiedostoon vaikka jotenkin seuraavasti:

DEPLOY_COMMANDS = [
    "rsync -rav --exclude '*~' --delete output/ xxx@yyy.zzz:~/public_html/",
]

Vaikka tähän alkusäätämiseen menikin muutama ilta, ei vastaavanlaista työtä tarvitse tehdä jokaisen kirjoituksen yhteydessä enää jatkossa. Jotain parannuksia jatkoon vielä jäi. Tyyleissä on vielä viilaamista, ja jonkinlainen kommentointisysteemi voisi olla kiva. Ja tietysti voisi kirjoittaa lisää jotain asiaakin (tai jotain asian vierestä).


Päivitys 2014-12-28: Nikola 7.2.0 versiosta lähtien deploy-komentojen määrittely on muuttunut. Arvo ei enää ole lista vaan dictionary, esimerkiksi:

DEPLOY_COMMANDS = { 'default' : [
    "rsync -rav --exclude '*~' --delete output/ xxx@yyy.zzz:~/public_html/",
]}

Kommentit