Nikola is Near
I managed to do some minor work today on Nikola, the static website generator used to generate ... well, this static website.
Implemented tags (including per-tag RSS feeds)
Simplified templates
Separated code and configuration.
The last one was the trickiest. And as a teaser, here is the full configuration file to create this site, except HTML bits for analytics, google custom search and whatever that would make no sense on other sites. I hope it's somewhat clear.
# -*- coding: utf-8 -*- # post_pages contains (wildcard, destination, template) tuples. # # The wildcard is used to generate a list of reSt source files (whatever/thing.txt) # That fragment must have an associated metadata file (whatever/thing.meta), # and opcionally translated files (example for spanish, with code "es"): # whatever/thing.txt.es and whatever/thing.meta.es # # From those files, a set of HTML fragment files will be generated: # whatever/thing.html (and maybe whatever/thing.html.es) # # These files are combinated with the template to produce rendered # pages, which will be placed at # output / TRANSLATIONS[lang] / destination / pagename.html # # where "pagename" is specified in the metadata file. # post_pages = ( ("posts/*.txt", "weblog/posts", "post.tmpl"), ("stories/*.txt", "stories", "post.tmpl"), ) # What is the default language? DEFAULT_LANG = "en" # What languages do you have? # If a specific post is not translated to a language, then the version # in the default language will be shown instead. # The format is {"translationcode" : "path/to/translation" } # the path will be used as a prefix for the generated pages location TRANSLATIONS = { "en": "", "es": "tr/es", } # Data about this site BLOG_TITLE = "Lateral Opinion" BLOG_URL = "//ralsina.me" BLOG_EMAIL = "ralsina@kde.org" BLOG_DESCRIPTION = "I write free software. I have an opinion on almost "\ "everything. I write quickly. A weblog was inevitable." # Paths for different autogenerated bits. These are combined with the translation # paths. # Final locations are: # output / TRANSLATION[lang] / TAG_PATH / index.html (list of tags) # output / TRANSLATION[lang] / TAG_PATH / tag.html (list of posts for a tag) # output / TRANSLATION[lang] / TAG_PATH / tag.xml (RSS feed for a tag) TAG_PATH = "categories" # Final location is output / TRANSLATION[lang] / INDEX_PATH / index-*.html INDEX_PATH = "weblog" # Final locations for the archives are: # output / TRANSLATION[lang] / ARCHIVE_PATH / archive.html # output / TRANSLATION[lang] / ARCHIVE_PATH / YEAR / index.html ARCHIVE_PATH = "weblog" # Final locations are: # output / TRANSLATION[lang] / RSS_PATH / rss.xml RSS_PATH = "weblog" # A HTML fragment describing the license, for the sidebar. LICENSE = """ <a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/2.5/ar/"> <img alt="Creative Commons License" style="border-width:0; margin-bottom:12px;" src="http://i.creativecommons.org/l/by-nc-sa/2.5/ar/88x31.png"></a> """ # A search form to search this site, for the sidebar. Has to be a <li> # for the default template (base.tmpl). SEARCH_FORM = """ <!-- google custom search --> <!-- End of google custom search --> """ # Google analytics or whatever else you use. Added to the bottom of <body> # in the default template (base.tmpl). ANALYTICS = """ <!-- Start of StatCounter Code --> <!-- End of StatCounter Code --> <!-- Start of Google Analytics --> <!-- End of Google Analytics --> """ # Put in global_context things you want available on all your templates. # It can be anything, data, functions, modules, etc. GLOBAL_CONTEXT = { 'analytics': ANALYTICS, 'blog_title': BLOG_TITLE, 'blog_url': BLOG_URL, 'translations': TRANSLATIONS, 'license': LICENSE, 'search_form': SEARCH_FORM, # Locale-dependent links 'archives_link': { 'es': '<a href="/tr/es/weblog/archive.html">Archivo</a>', 'en': '<a href="/weblog/archive.html">Archives</a>', }, 'tags_link': { 'es': '<a href="/tr/es/categories/index.html">Tags</a>', 'en': '<a href="/categories/index.html">Tags</a>', }, } execfile("nikola/nikola.py")