[Scribus] Scripter API

Craig Ringer craig
Sun Dec 23 17:51:31 CET 2007

Petr Van?k wrote:
> hi Joachim,
> On ne 23. prosince 2007, Joachim Neu wrote:
>> I thought it would be nice to have an object-oriented view for the
>> python scriptplugin instead of only a collection of functions.
>> So I yesterday implemented a document-object to see if I can do this
>> (I'm not so good in C++.) and it worked.
> Manual implementation of "scribus object model for python" cannot be done 
> IMHO. It will take years of work and it will be broken everytime there will 
> be a change in the "core". We can see it in the current Scripter. It always 
> contains bugs due changes in underlying methods.

I'd have to agree with this. It's a losing proposition to maintain 
hand-written bindings for an app with internals that change as much as 
Scribus's do. Use of the raw Python API makes more sense for (eg) 
wrapping a C library.

>> So (if possible) I'd like to implement this feature. I also found a
>> folder called "scripter2" within the scriptplugin-directory which looks
>> like a object-oriented rebuild of the scripterplugin but it seems not to
>> be useable.
>> So maybe someone can give me a hint what "scripter2" is and how I can
>> contribute to it, if this is the next generation of the scripter-api. If
>> not I'd be glad to hear what you think about my idea.
> There was a short debate about this one:
> http://nashi.altmuehlnet.de/pipermail/scribus/2007-November/026553.html
> Scripter2 directory was a Craig Ringer's boost:python testing stuff. It has 
> not been ever maintained. And there are no plans to do anything with it.

Yep. While I found that boost::python worked fairly well, and I was able 
to get nice transparent QString <--> Unicode conversion (removing much 
of the ugliness of text in the current engine), the internals of Scribus 
just are not suitable to be exposed directly to Python.

Exposing the internals directly requires the user to know about all 
sorts of rules and requirements for using the internal data structures. 
They can be complex (especially where things are deferred for 
performence reasons), they change release to release, they're not all 
documented, and a few of them don't make much sense - like when GUI code 
is deeply involved in manipulating canvas objects.

To use Boost::python or any other wrapper scheme, it will first be 
necessary to write a more stable C++ front-end API to wrap. That API can 
provide all the things a scripting interface (and most plugins) will 
want, like accessors on object properties that ensure that the 
appropriate parts of the app find out when changes are made. I just 
don't see any other reasonable way to expose the app to scripting 
languages. It'd help plugin authors out a lot, too.

It'd be simpler to write a pure C++ interface API to hide Scribus's 
innards then use a wrapper generator or boost::python to expose that to 
Python than it would be to hand-code a new interface. However, it's 
still a lot of work, and currently there's nobody interested in tackling it.

> We should make some decision about the future of Scribus scripting.
> Maybe we can take one "technology" named in the previous posts: Craig's 
> BOOST::PYTHON or Hennig's "Pure Python" playground and polish it for real 
> usage.

Unfortunately I presently don't have much time to work on open source 
projects as my work is very busy. I'm also not entirely enthused about 
tackling scripter work at present.

> Guys (Craig, Hennig), can you look at it too, please? And discuss some 
> pros/cons of your solutions?

Well, I've outlined above (and other times) what I think is probably the 
best way to tackle the problem in a long-term maintainable way. However, 
as I presently have no interest in building and maintaining that public 
C++ API for script wrapping & for plugins I'm not sure how much my 
opinion really counts for.

To me, though, it just comes down to the fact that we need a more usable 
interface for plugin writers too - and ideally for people to add other 
languages if they want later. Doing the "hide the nasty innards" work 
once with a C++ wrapper API for public consumption just seems like the 
obvious way to reduce duplicate work.

Craig Ringer

More information about the scribus mailing list