Scribuksen Python-apin laajentaminen

Scribuksen irc-kanavalla (irc.freenode.net, #scribus) tänään käydyn keskustelun pohjalta sain ajatuksen tähän kirjoitukseen. Scribuksessa tylsiä ja usein toistuvia tehtäviä voi automatisoida Python-komentosarjoilla (kansankielellä skripteillä). Skriptejä voi käyttää myös muuttuvan datan tulostukseen (variable data printing), kuten Open source publishing -blogin artikkelissa print, flip and turn kerrotaan.

Joskus saattaa tulla vastaan tilanne, että haluttua toimintoa ei löydy Python-apista. Mitä silloin tapahtuukaan? Avaat irc-ohjelmasi ja suuntaat Scribuksen irc-kanavalle ja huutelet apua. Kun apua ei kohtuuajassa kuulu, alat etsiä Scribuksen lähdekoodia toivoen, että jostain löytäisit skriptejä koskevat tiedostot. Voin nyt jo avittaa hieman ja kertoa, että ne löytyvät hakemistosta scribus/plugins/scriptplugin/.

Hienoahan olisi, jos Scribuksen Python-api dynaamisesti eläisi Scribuksen mukana ja kaikki toiminnot olisivat aina saatavilla skripteissä. Koska näin ei kuitenkaan ole, on skriptien käyttäjien aika-ajoin tarttutava lapioon ja sukellettava likaiseen Scribus-lähdekoodin maailmaan.

Irc-kanavalla kyseltiin tänään, voiko tekstin etäisyyttä kehyksen reunoista säädellä skriptin avulla. Ei voinut. Onneksi kysyjä oli riittävän noheva ja alkoi tutkailla vaihtoehtoja. Hän päätyi lisäämään funktiot Scribuksen lähdekoodiin itse. Toimintojen lisäys Scribuksen Python-apiin sisälsi 74 riviä. Jokainen aloitteleva koodarikin suoltaa tällaisen määrän ulos kahvitauollaan. Jotta muutokset saataisiin kaikille, hän loi uuden kohteen bugityökaluun ja lisäsi koodinsa sinne. Tuloksena oli kaksi uutta Python-funktiota, getTextDistances() ja setTextDistances(), joitten avulla voidaan kysyä tekstin etäisyyttä kehyksen reunoista sekä säädellä sitä.

Lyhykäisyydessään Python-apin laajennus menee seuraavasti:

  1. Etsi haluamasi toiminto Scribuksen lähdekoodista ja katso miten se tehdään
  2. Ala työstää skrpiterin koodia seuraavasti:
    • tekstin muokkausta käsittelevät toiminnot lisätään tiedostoon cmdtext.h ja cmdtext.cpp (muun tyyppisille muokkauksille löytyy omat cmd-alkuiset tiedostot)
    • funktiot paljastetaan skripterille lisäämällä ne scriptplugin.cpp-tiedostoon

Skripterille ei juuri nyt kannata alkaa tehdä suurempia korjailuja. Tämä siksi, että kesän Google Summer of Code -projektissa on tarkoitus luoda uusi skripteri QtScriptiä apuna käyttäen. Uuden skripterin olisi myös tarkoitus elää dynaamisesti Scribuksen kanssa.