Fork it

Svjestan sam koliko je ovo grozno i da se krv mogla bolje napraviti, glava bolje odrezati a mozak pametnije narezati ali eto…. Kliktanje po Illustratoru je u zadnje vrijeme postala moja Adobe Joga. Meni to super.

Styling your book on the Web

As you know, you can use Booktype to publish your books into different formats but you can also view them on the web. In this blog post I will try to show how that web view can be customized with simple template modification. By default Booktype comes with predefined templates but they can all be easily customized to your own needs (templates can also be multilingual).

Let us imagine we are publishing shop “Awesome Sun” who is interested in publishing books about solar power. Booktype project has been installed in /var/www/awesomesun/ directory on our web hosting server. We are not so happy with the default look and feel so we decided to change it. Where should our web designers look at? In the case of “Awesome Sun” template files should be placed in /var/www/awesomesun/templates/ directory while all static files (CSS files, JavaScript files, images, …) should be placed in /var/www/awesomesun/static/ directory. Fairly simple for now. Before doing any work it would be wise to check documentation how to work with Django templates. As you could guess, examples in this blog post are oversimplified.

By default, to present books on the web Booktype comes with Django application called “Reader” and we will customize templates for that application. Original templates for this application are placed in $BOOKTYPESOURCE/lib/booki/reader/templates/ directory and our customized templates will be placed in /var/www/awesomesun/templates/reader/ directory. All you have to do is either copy original template files into awesomesun project and modify them or write new templates from scratch.

What kind of modifications are we making? As you can see on the screenshots bellow we want to have very simple book view, we want our “Table of contents” to be always visible while we scroll the page and we want our header to be fixed on top with name of the book and chapter we are currently reading.

To make it work I created new base template called new_base.html and placed it in /var/www/awesomesun/templates/ directory. This is a base template which other templates for “Reader” application should include. This template just includes jQuery library and creates place holders for future content.

{% load i18n messaging_tags booki_tags %}

{% booki_site_favicon %}
{% booki_site_metadata %}

{% block header %}
{% endblock %}

{% block content %}
{% endblock %}

Then I had to create /var/www/awesomesun/templates/reader/book_chapter.html template file. This is where I include additional JavaScript library, CSS file, display “Table of contents” and content of chapter. Besides HTML and CSS there are just two important things to look at. Chapter content is inserted with {% booki_format content %} and “Table of contents” is inside of variable chapters. It all depends how you want to show your “Table of Contents” but here I am using “for” loop to construct unordered list with chapter titles. Everything else is just CSS styling.

{% extends "new_base.html" %}
{% load i18n booki_tags %}

{% block header %}
{% blocktrans with book.title as booktitle %}/book: {{ booktitle }}{% endblocktrans %}

{% endblock %}

{% block content %}

{% booki_format content %}

{% endblock %}

Essentialy this is how you customize Booktype templates. I have compiled all needed files (with CSS and additional JavaScript) from this blog post here. Please download it if you are interested in more details.

Folk Radio One

DJ Aco Pretnja i DJ Edgy Borko imaju novi projekat pod nazivom Folk Radio One. Dva sata čiste folk zabave svakog petka od 10:00 do 12:00. Repriza nedjeljom od 10:00 do 12:00.

Pratite radio na Facebooku – a jinglove pronađite na SoundCloudu – Džinglovi i naše trkeljanje koje ima muziku u pozadini nije završilo na SondCloudu. Čemu radio pitate se vi? Čist zato da se upoznamo sa radom Airtime softwarea za online radio stanice. Bilo je to lijepo iskustvo učenja rada u Audacity-u, nariktavanja mikrofona, proklinjanja jeke itd… Što smo naučili u svemu? Naučili smo da je dva sata za nas predugačak slot. Prvih sat vremena smo nekako i popunili ali drugih sat vremena smo popunili sa kvalitetnim metalom. Stvarno nismo imali ideja a ove silne mp3-ice su mi se samo nudile za upload.

Za slijedeći put ćemo probati znatno više pričati te se možda okrenuti  formi podcasta sa dodatnom muzikom. Bumo vidli. Uglavnom, danom smo puštali ovo:

Love Will Tear Us Apart by Joy Division
Brkovi by Brkovi
Jaitura (Novogodnyaya kolyada) by Zdob si Zdub
Debaser by Pixies
Enfilade by At the Drive-In
All The THings That I Have Done by The Killers
Don’t Think Lover by A Place To Bury Strangers
Someone Must Get Hurt by She Wants Revenge
Y-Control by Yeah Yeah Yeahs
Ball And Biscuit by The White Stripes
Nice ‘n’ Sleazy by The Stranglers
Someday by The Strokes
Devojka iz grada by Miroslav Ilic
Metal Music by Aco Pretnja
Beat The Bastards by The Exploited
Bleed For Ancient Gods by Amon Amarth
Zimushka by Arkona
The Watchtower by Cult Of Luna
Roman Land by Falkenbach
The Ancient Tale by FALCHION
Skogens Hämnd by Finntroll
Tuli Kokko by Korpiklaani
Oh Fog, Oh Dew by Skyforger
Blod for Blood by Wolfchant
Sahti-Waari by Turisas
Draugs Harg by Thyrfing
Tulkaapa Äijät! by Moonsorrow

Biro je u pogonu

Nakon dosta porođajnih muka biro samo-što-nije u pogonu. Dovoljno smo daleko odmakli da se može opravdati odlazak na gablec osobnim automobilom (donja slika). Stolovi boje javora su tu (gornja slika), igračke za motivaciju su tu (gornja slika), Club Mate je tu (gornja slika), wc kotlić u pogonu (ne vidi se na slikama), …

Nakon ovog slijedi uređenje lounge bara sa projektorom (na slikama u postu iz budućnosti), topla voda i plakati po zidu!

Navike, navike, navike …

“Tko se zadnji smije, dovrši sve taskove” – kaže stara narodna. Nije lijepo od mene ali prošle sam godine zbijao šalu na račun jedne TODO aplikacijom ( U međuvremenu se svašta tu nešto desilo (“Habbits are awarded by Croatian Chamber of Commerce with attendance to MWC in Barcelona 2012. Habbits are selected as one of ten finalists for HackFwd Pitch In Berlin that will occur on March 10th 2012. Habbits je dobio 30,000 eura ivesticije od startup akceleratora LAUNCHub) i iz svega toga se izrodila TODO aplikacija za djecu i one koji se tako osjećaju.

Baš lijepo…


Booktype Easy Install

A lot of people seems to have problems installing Booktype. Until we have native packages for each distribution installing vanilla Booktype from git repository will be the way to go.

I love all of my users the same and that is why I decided to work on a small install script which would do most of the steps for them. This script should help you even when your distribution does not provide valid native packages (Old Django packages and etc…). Anyhoo, I have done some basic testing on – Ubuntu 10.04, Ubuntu 12.04, CentOS 6.3, Debian 6 and I have tried to avoid combination of outdated system packages and latest packages installed with PIP (because that is what Google told you to do). I am aware there are many places where this script could go wrong but i have tried to fix at least basic problems. For instance, if you are on CentOS it will warn you and inform how to install EPAL repository.

Like all “double click” methods this script will also install unwanted packages. To avoid conflicts with different versions of python modules it will create virtualenv environment and install only those Python packages (and their versions) you really need. It will install packages using python package tools and not system packages. For some of the packages it means compiling. Compiling means having development tools on the system. Be aware of that.

Created Booktype instance will use Sqlite to store data. Sqlite is great database but it does not support easy upgrades of schema. If you are serious about Booktype you might want to look at PostgreSQL. After all, this is version 0.0.1 and we only support built in python web server. To make it work with Apache you will need to manually activate virtualenv environment in wsgi script. In the future install script will do this for you.

Where to get it

For now, Booktype Easy Install script is part of “Booktype Scrolls” project and you can get it here:

How to start it

Download the script and execute it. It will download and install required packages. When it is done it will tell you how to create user account and start Booktype. You don’t need to be root to start this install script but you do need sudo permissions in case it must install some system packages. You will need to confirm installation of new packages and you will be informed which commands are being executed in the background. Without your permission new packages will not be installed on the system. Feel free to analyze the script before you start it.


Use –help to get all available arguments:

python --help
python -p myproject
python -o ubuntu -p book

What now

It needs testing and support for more platforms. Please report to me if you have problems with it. Will try to fix it together!

Booktype scrolls – Importing WordPress site!

So…you left your job and went traveling throughout Asia for 4 months.  In small cyber cafe, somewhere in south Pakistan, you created WordPress site because you were lazy to send emails to friends and family. Internets loved you and your pictures were on the front page of Reddit many many times. Who could forget that great article about food poisoning in China or that unfortunate misunderstanding with gentleman in Bangkok…

When you got back everyone was like – “You should write a book!” and you said to yourself  – “Why not… Half of the book is already written.”. This brings us to the subject of this post – importing WordPress site as a Booktype book.


There are couple of ways you can do it (this can be applied to other systems also):

  • Use some kind of API to remotely access data. For this you only need permission to access data.
  • Write your own plugin to export data from WordPress. Besides knowing how to write plugin you need permissions to install it on the remote server. You can use WordPress API to render the articles properly, something you can’t really do with other 2 methods.
  • Finally the method we are using in this post. Parsing XML export file created with WordPress export plugin.

Importing data can be complex process and each method has its good and bad points. You probably don’t want to have chapter for each post in WordPress because that could be hundred and hundred of chapters at the end. Maybe you want to choose which chapters you want and sometimes to combine couple of posts as one chapter. These are just some of the issues.

How it works

As it is visible on the picture above you should go to Tools/Export and choose what you want to export. Download the “Export File” to you computer. Export file is just extended RSS file and you can (and should) use it to export content of your site. Notice that attachments and images are not part of this export file, we will need to download them separately! Besides content is in “raw” format (before everything was rendered to HTML).

Like I said, export file is extended RSS file and for parsing we use this great library feedparser. Book name can be specified with arguments but for the default name we use title of the WordPress site. Booktype cares about two titles. One is the full title of the book and the other one is unique url name of the book (usually slugified version of full title).

from import createBook

book = createBook(conf['user'],
                  status = 'new',

As you can see we use function createBook. It takes user object as first argument (someone has to be owner of the book), full book title, default book status (books can have different statuses) and slugified title name. Export file provides us with the information about WordPress administrator and Post author. We could use that information to find or create Booktype user with specific info and set that person as Book owner.

Parsing posts

After this we just go through the list of all the posts in export file and ignore those who don’t have ‘wp_status’ set ‘publish’. Like i said, content of that chapter is in “raw” format. For instance empty lines in text are representing start of new chapter and etc. If we were using specific tags to format our code (for instance, to prettify the source code) we would not get nice and colorful HTML.

In this example we just do two modifications. One is to create paragraphs in text and the 2nd one is to put Chapter title inside of H2 tag. That is one of the Booktype requirements at the moment.

content = "\n".join(["< p >%s< /p >" % p for p in content.split('\n\n') if p.strip() != ''])
content = u'< h2 >%s< /h2 >%s' % (chapterTitle, content)

And yes… I have some extra spaces in tags P and H2 because i am too lazy to figure out how to escape it in code prettifier plus the code to make paragraphs is not perfect (but this is just an example).


Now we parse Post content and search for the images. When we find one, we try to download it to our computer. Normally we wouldn’t need to do it, but Booktype really wants to have entire content of a book locally. When the image is successfully downloaded we save it as an attachment and we modify image location. All images must be placed inside of ‘static/’ directory. There are good reasons why it has to be relative path, but we will not talk about it now.

att = models.Attachment(book = book,
         version = book.version,
         status = stat)

f2 = File(StringIO(data)) f2.size = len(data), f2, save=True)
fileName = os.path.basename(att.attachment.path)
e.set('src', 'static/%s' % fileName)


At the end we just create new Chapter. This is very basic way of creating new chapter because we are not leaving any traces in our logs and etc… We can leave that for some other example. Also notice we are not doing anything with links to other posts/chapters on the same site/book. We just ignore that for now.

chapter = models.Chapter(book = book,
                         version = book.version,
                         url_title = bookiSlugify(chapterTitle),
                         title = chapterTitle,
                         status = stat,
                         content = content,
                         created = now,
                         modified = now)


Look at the full source for WordPress importer in my Booktype Scrolls repository. Purpose of this code is to be more educational and less production ready.

As you can see technical part of importer is very simple. Thumblr has API for remote access and it would be fairly simple task to make Thumblr importer (or for any other CMS). The biggest problem is still how to make their HTML work nicely inside of Booktype. If author is using custom CSS on WordPress side then Booktype would be completely unaware of it. For instance – <img class=”alignnone size-full wp-image-591″ … It would be the same for different WordPress plugins, broken HTML, headings at wrong place, JavaScript plugins and etc.