Getting 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