1 /*
2 For general Scribus (>=1.3.2) copyright and licensing information please refer
3 to the COPYING file provided with the program. Following this notice may exist
4 a copyright and/or license notice that predates the release of Scribus 1.3.2
5 for which a new license (GPL+exception) is in place.
6 */
7 /***************************************************************************
8                           scriptplugin.cpp  -  description
9                              -------------------
10     begin                : Thu Oct 3 08:00:00 CEST 2002
11     copyright            : (C) 2002 by Franz Schmid
12     email                : Franz.Schmid@altmuehlnet.de
13  ***************************************************************************/
14 
15 /***************************************************************************
16  *                                                                         *
17  *   This program is free software; you can redistribute it and/or modify  *
18  *   it under the terms of the GNU General Public License as published by  *
19  *   the Free Software Foundation; either version 2 of the License, or     *
20  *   (at your option) any later version.                                   *
21  *                                                                         *
22  ***************************************************************************/
23 
24 // include cmdvar.h first, as it pulls in <Python.h>
25 #include "cmdannotations.h"
26 #include "cmdvar.h"
27 #include "cmdcell.h"
28 #include "cmdcolor.h"
29 #include "cmddialog.h"
30 #include "cmddoc.h"
31 #include "cmdgetprop.h"
32 #include "cmdgetsetprop.h"
33 #include "cmdmani.h"
34 #include "cmdmisc.h"
35 #include "cmdobj.h"
36 #include "cmdpage.h"
37 #include "cmdsetprop.h"
38 #include "cmdtable.h"
39 #include "cmdtext.h"
40 #include "cmdutil.h"
41 #include "cmdstyle.h"
42 #include "guiapp.h"
43 #include "iconmanager.h"
44 #include "objimageexport.h"
45 #include "objpdffile.h"
46 #include "objprinter.h"
47 #include "prefs_scripter.h"
48 #include "scconfig.h"
49 #include "scpaths.h"
50 #include "scribuscore.h"
51 #include "scribusstructs.h"
52 #include "scriptercore.h"
53 #include "scriptplugin.h"
54 #include "svgimport.h"
55 #include "ui/customfdialog.h"
56 #include "ui/helpbrowser.h"
57 #include "ui/propertiespalette.h"
58 #include "ui/scmwmenumanager.h"
59 #include "units.h"
60 
61 #include "api/api_application.h"
62 
63 #include <QApplication>
64 #include <QMessageBox>
65 #include <QTextCodec>
66 #include <QRegExp>
67 #include <QPixmap>
68 #include <QWidget>
69 #include <QString>
70 //Added by qt3to4:
71 #include <QByteArray>
72 #include <cstdlib>
73 #include <iostream>
74 
75 
76 #ifdef HAVE_SCRIPTER2
77 extern void scripter2_init();
78 #endif
79 
80 // Exceptions; visible from cmdvar.h, set up in initscribus()
81 PyObject* ScribusException;
82 PyObject* NoDocOpenError;
83 PyObject* WrongFrameTypeError;
84 PyObject* NoValidObjectError;
85 PyObject* NotFoundError;
86 PyObject* NameExistsError;
87 
88 // Other extern variables defined in cmdvar.h
89 PyObject* wrappedMainWindow;
90 PyObject* wrappedQApp;
91 ScripterCore* scripterCore;
92 
93 
scriptplugin_py2x_getPluginAPIVersion()94 int scriptplugin_py2x_getPluginAPIVersion()
95 {
96 	return PLUGIN_API_VERSION;
97 }
98 
scriptplugin_py2x_getPlugin()99 ScPlugin* scriptplugin_py2x_getPlugin()
100 {
101 	scripterCore=nullptr;
102 	ScriptPlugin* plug = new ScriptPlugin();
103 	Q_CHECK_PTR(plug);
104 	return plug;
105 }
106 
scriptplugin_py2x_freePlugin(ScPlugin * plugin)107 void scriptplugin_py2x_freePlugin(ScPlugin* plugin)
108 {
109 	ScriptPlugin* plug = qobject_cast<ScriptPlugin*>(plugin);
110 	Q_ASSERT(plug);
111 	delete plug;
112 }
113 
ScriptPlugin()114 ScriptPlugin::ScriptPlugin()
115 {
116 	// Set action info in languageChange, so we only have to do
117 	// it in one place.
118 	languageChange();
119 }
120 
121 ScriptPlugin::~ScriptPlugin() = default;
122 
languageChange()123 void ScriptPlugin::languageChange()
124 {
125 	if (scripterCore)
126 		scripterCore->languageChange();
127 }
128 
addToMainWindowMenu(ScribusMainWindow * mw)129 void ScriptPlugin::addToMainWindowMenu(ScribusMainWindow* mw)
130 {
131 	if (scripterCore)
132 		scripterCore->addToMainWindowMenu(mw);
133 }
134 
fullTrName() const135 QString ScriptPlugin::fullTrName() const
136 {
137 	return QObject::tr("Scripter for Python 2.x");
138 }
139 
getAboutData() const140 const ScActionPlugin::AboutData* ScriptPlugin::getAboutData() const
141 {
142 	AboutData* about = new AboutData;
143 	Q_CHECK_PTR(about);
144 	about->authors = QString::fromUtf8(
145 			"Petr Van\xc4\x9bk <petr@scribus.info>, "
146 			"Franz Schmid <franz@scribus.info>, "
147 			"Craig Ringer <craig@scribus.info>");
148 	about->shortDescription = tr("Embedded Python scripting support for Python 2.x.");
149 	// about->description = tr("Write me!")
150 	// about->releaseDate
151 	// about->copyright
152 	// about->license
153 	return about;
154 }
155 
deleteAboutData(const AboutData * about) const156 void ScriptPlugin::deleteAboutData(const AboutData* about) const
157 {
158 	Q_ASSERT(about);
159 	delete about;
160 }
161 
initPlugin()162 bool ScriptPlugin::initPlugin()
163 {
164 #if defined(Q_OS_WIN)
165 	QString pyHome = qApp->applicationDirPath() + "/python";
166 	if (QDir(pyHome).exists())
167 	{
168 		QString ph = QDir::toNativeSeparators(pyHome);
169 		pythonHome = ph.toLocal8Bit();
170 		Py_SetPythonHome(pythonHome.data());
171 	}
172 #endif
173 	Py_Initialize();
174 	if (PyUnicode_SetDefaultEncoding("utf-8"))
175 	{
176 		qDebug("Failed to set default encoding to utf-8.\n");
177 		PyErr_Clear();
178 	}
179 
180 	scripterCore = new ScripterCore(ScCore->primaryMainWindow());
181 	Q_CHECK_PTR(scripterCore);
182 	initscribus(ScCore->primaryMainWindow());
183 #ifdef HAVE_SCRIPTER2
184 	scripter2_init();
185 #endif
186 	scripterCore->setupMainInterpreter();
187 	scripterCore->initExtensionScripts();
188 	return true;
189 }
190 
cleanupPlugin()191 bool ScriptPlugin::cleanupPlugin()
192 {
193 	if (scripterCore)
194 	{
195 		delete scripterCore;
196 		scripterCore = nullptr;
197 	}
198 	Py_Finalize();
199 	return true;
200 }
201 
newPrefsPanelWidget(QWidget * parent,Prefs_Pane * & panel)202 bool ScriptPlugin::newPrefsPanelWidget(QWidget* parent, Prefs_Pane*& panel)
203 {
204 	panel = new Prefs_Scripter(parent);
205 	Q_CHECK_PTR(panel);
206 	connect(panel, SIGNAL(prefsChanged()), scripterCore, SLOT(updateSyntaxHighlighter()));
207 	return true;
208 }
209 
210 /*  TEMPORARILY DISABLED
211 void run()
212 {
213 	QString pfad = ScPaths::instance().docDir();
214 	QString pfad2;
215 	pfad2 = QDir::toNativeSeparators(pfad + "en/Scripter/index.html");
216 	HelpBrowser *dia = new HelpBrowser(0, QObject::tr("Online Reference"), ScCore->primaryMainWindow()->getGuiLanguage(), "scripter");
217 	dia->show();
218 }
219 */
220 
221 
222 /****************************************************************************************/
223 /*                                                                                      */
224 /*   Definitions of the Python commands                                                 */
225 /*                                                                                      */
226 /****************************************************************************************/
227 
scribus_py2x_retval(PyObject *,PyObject * args)228 /*static */PyObject *scribus_py2x_retval(PyObject* /*self*/, PyObject* args)
229 {
230 	char *Name = nullptr;
231 	if (!PyArg_ParseTuple(args, (char*) "s", &Name))
232 		return nullptr;
233 	// Because sysdefaultencoding is not utf-8, Python is returning utf-8 encoded
234 	// 8-bit char* strings. Make sure Qt understands that the input is utf-8 not
235 	// the default local encoding (usually latin-1) by using QString::fromUtf8()
236 	/*RetString = QString::fromUtf8(Name);
237 	RetVal = retV;*/
238 	scripterCore->returnString = QString::fromUtf8(Name);
239 	return PyInt_FromLong(0L);
240 }
241 
scribus_py2x_getval(PyObject *)242 /*static */PyObject *scribus_py2x_getval(PyObject* /*self*/)
243 {
244 	return PyString_FromString(scripterCore->inValue.toUtf8().data());
245 }
246 
247 /*! \brief Translate a docstring. Small helper function for use with the
248  * PyMethodDef struct.
249  */
tr(const char * docstringConstant)250 char* tr(const char* docstringConstant)
251 {
252 	// Alas, there's a lot of wasteful string copying going on
253 	// here.
254 	QString translated = QObject::tr(docstringConstant, "scripter docstring");
255 	// pv - hack for ugly formating in console removing
256 	translated.replace("\n\n", "<P>");
257 	translated.replace('\n', " ");
258 	translated.replace("<P>", "\n\n");
259 	/*
260 	 * Python doesn't support 'unicode' object docstrings in the PyMethodDef,
261 	 * and has no way to specify what encoding docstrings are in. The passed C
262 	 * strings passed are made into 'str' objects as-is. These are interpreted
263 	 * as being in the Python sysdefaultencoding, usually 'ascii', when used.
264 	 * We now set systemdefaultencoding to 'utf-8' ...  so we're going to pass
265 	 * Python an 8-bit utf-8 encoded string in a char* .  With
266 	 * sysdefaultencoding set correctly, Python will interpret it correctly and
267 	 * we'll have our unicode docstrings. It's not as ugly a hack as it sounds,
268 	 * you just have to remember that C and Python strings can both be
269 	 * considered 8-bit strings of binary data that can be later interpreted as
270 	 * a text string in a particular text encoding.
271 	 */
272 	//QCString utfTranslated = translated.utf8();
273 	QByteArray trch = translated.toUtf8();
274 	char* utfstr = strdup(trch.data());
275 	if (!utfstr)
276 		// Complain, but then return NULL anyway. Python will treat NULL as
277 		// "no value" so that's fine.
278 		qDebug("scriptplugin.cpp:tr() - strdup() failure");
279 	return utfstr;
280 }
281 
282 /* Now we're using the more pythonic convention for names:
283  * class - ClassName
284  * procedure/function/method - procedureName
285  * etc. */
286 PyMethodDef scribus_methods[] = {
287 	// 2004/10/03 pv - aliases with common Python syntax - ClassName methodName
288 	// 2004-11-06 cr - move aliasing to dynamically generated wrapper functions, sort methoddef
289 	{const_cast<char*>("applyMasterPage"), scribus_applymasterpage, METH_VARARGS, tr(scribus_applymasterpage__doc__)},
290 	{const_cast<char*>("changeColor"), scribus_setcolor, METH_VARARGS, tr(scribus_setcolor__doc__)},
291 	{const_cast<char*>("changeColorCMYK"), scribus_setcolorcmyk, METH_VARARGS, tr(scribus_setcolorcmyk__doc__)},
292 	{const_cast<char*>("changeColorCMYKFloat"), scribus_setcolorcmykfloat, METH_VARARGS, tr(scribus_setcolorcmykfloat__doc__)},
293 	{const_cast<char*>("changeColorLab"), scribus_setcolorlab, METH_VARARGS, tr(scribus_setcolorlab__doc__) },
294 	{const_cast<char*>("changeColorRGB"), scribus_setcolorrgb, METH_VARARGS, tr(scribus_setcolorrgb__doc__)},
295 	{const_cast<char*>("changeColorRGBFloat"), scribus_setcolorrgbfloat, METH_VARARGS, tr(scribus_setcolorrgbfloat__doc__)},
296 	{const_cast<char*>("closeDoc"), (PyCFunction)scribus_closedoc, METH_NOARGS, tr(scribus_closedoc__doc__)},
297 	{const_cast<char*>("closeMasterPage"), (PyCFunction)scribus_closemasterpage, METH_NOARGS, tr(scribus_closemasterpage__doc__)},
298 	{const_cast<char*>("createBezierLine"), scribus_createbezierline, METH_VARARGS, tr(scribus_createbezierline__doc__)},
299 	{const_cast<char*>("createCharStyle"), (PyCFunction)scribus_createcharstyle, METH_VARARGS|METH_KEYWORDS, tr(scribus_createcharstyle__doc__)},
300 	{const_cast<char*>("createCustomLineStyle"), scribus_createcustomlinestyle, METH_VARARGS, tr(scribus_createcustomlinestyle__doc__)},
301 	{const_cast<char*>("createEllipse"), scribus_createellipse, METH_VARARGS, tr(scribus_createellipse__doc__)},
302 	{const_cast<char*>("createImage"), scribus_createimage, METH_VARARGS, tr(scribus_createimage__doc__)},
303 	{const_cast<char*>("createLayer"), scribus_createlayer, METH_VARARGS, tr(scribus_createlayer__doc__)},
304 	{const_cast<char*>("createLine"), scribus_createline, METH_VARARGS, tr(scribus_createline__doc__)},
305 	{const_cast<char*>("createMasterPage"), scribus_createmasterpage, METH_VARARGS, tr(scribus_createmasterpage__doc__)},
306 	{const_cast<char*>("createParagraphStyle"), (PyCFunction)scribus_createparagraphstyle, METH_VARARGS|METH_KEYWORDS, tr(scribus_createparagraphstyle__doc__)},
307 	{const_cast<char*>("createPathText"), scribus_createpathtext, METH_VARARGS, tr(scribus_createpathtext__doc__)},
308 	{const_cast<char*>("createPolyLine"), scribus_createpolyline, METH_VARARGS, tr(scribus_createpolyline__doc__)},
309 	{const_cast<char*>("createPolygon"), scribus_createpolygon, METH_VARARGS, tr(scribus_createpolygon__doc__)},
310 	{const_cast<char*>("createRect"), scribus_createrect, METH_VARARGS, tr(scribus_createrect__doc__)},
311 	{const_cast<char*>("createTable"), scribus_createtable, METH_VARARGS, tr(scribus_createtable__doc__)},
312 	{const_cast<char*>("createText"), scribus_createtext, METH_VARARGS, tr(scribus_createtext__doc__)},
313 	{const_cast<char*>("currentPage"), (PyCFunction)scribus_currentpage, METH_NOARGS, tr(scribus_currentpage__doc__)},
314 	{const_cast<char*>("defineColor"), scribus_newcolor, METH_VARARGS, tr(scribus_newcolor__doc__)},
315 	{const_cast<char*>("defineColorCMYK"), scribus_newcolorcmyk, METH_VARARGS, tr(scribus_newcolorcmyk__doc__)},
316 	{const_cast<char*>("defineColorCMYKFloat"), scribus_newcolorcmykfloat, METH_VARARGS, tr(scribus_newcolorcmykfloat__doc__)},
317 	{const_cast<char*>("defineColorLab"), scribus_newcolorlab, METH_VARARGS, tr(scribus_newcolorlab__doc__) },
318 	{const_cast<char*>("defineColorRGB"), scribus_newcolorrgb, METH_VARARGS, tr(scribus_newcolorrgb__doc__)},
319 	{const_cast<char*>("defineColorRGBFloat"), scribus_newcolorrgb, METH_VARARGS, tr(scribus_newcolorrgbfloat__doc__)},
320 	{const_cast<char*>("dehyphenateText"), scribus_dehyphenatetext, METH_VARARGS, tr(scribus_dehyphenatetext__doc__)},
321 	{const_cast<char*>("deleteColor"), scribus_deletecolor, METH_VARARGS, tr(scribus_deletecolor__doc__)},
322 	{const_cast<char*>("deleteLayer"), scribus_deletelayer, METH_VARARGS, tr(scribus_deletelayer__doc__)},
323 	{const_cast<char*>("deleteMasterPage"), scribus_deletemasterpage, METH_VARARGS, tr(scribus_deletemasterpage__doc__)},
324 	{const_cast<char*>("deleteObject"), scribus_deleteobject, METH_VARARGS, tr(scribus_deleteobject__doc__)},
325 	{const_cast<char*>("deletePage"), scribus_deletepage, METH_VARARGS, tr(scribus_deletepage__doc__)},
326 	{const_cast<char*>("deleteText"), scribus_deletetext, METH_VARARGS, tr(scribus_deletetext__doc__)},
327 	{const_cast<char*>("deselectAll"), (PyCFunction)scribus_deselectall, METH_NOARGS, tr(scribus_deselectall__doc__)},
328 	{const_cast<char*>("docChanged"), scribus_docchanged, METH_VARARGS, tr(scribus_docchanged__doc__)},
329 	{const_cast<char*>("editMasterPage"), scribus_editmasterpage, METH_VARARGS, tr(scribus_editmasterpage__doc__)},
330 	{const_cast<char*>("fileDialog"), (PyCFunction)scribus_filedialog, METH_VARARGS|METH_KEYWORDS, tr(scribus_filedialog__doc__)},
331 	{const_cast<char*>("fileQuit"), scribus_filequit, METH_VARARGS, tr(scribus_filequit__doc__)},
332 	{const_cast<char*>("flipObject"), scribus_flipobject, METH_VARARGS, tr(scribus_flipobject__doc__)},
333 	{const_cast<char*>("getActiveLayer"), (PyCFunction)scribus_getactivelayer, METH_NOARGS, tr(scribus_getactivelayer__doc__)},
334 	{const_cast<char*>("getAllObjects"), (PyCFunction)scribus_getallobjects, METH_VARARGS|METH_KEYWORDS, tr(scribus_getallobjects__doc__)},
335 	{const_cast<char*>("getAllStyles"), (PyCFunction)scribus_getparagraphstyles, METH_NOARGS, tr(scribus_getallstyles__doc__)}, //Deprecated
336 	{const_cast<char*>("getAllText"), scribus_getalltext, METH_VARARGS, tr(scribus_getalltext__doc__)},
337 	{const_cast<char*>("getCellColumnSpan"), scribus_getcellcolumnspan, METH_VARARGS, tr(scribus_getcellcolumnspan__doc__)},
338 	{const_cast<char*>("getCellFillColor"), scribus_getcellfillcolor, METH_VARARGS, tr(scribus_getcellfillcolor__doc__)},
339 	{const_cast<char*>("getCellRowSpan"), scribus_getcellrowspan, METH_VARARGS, tr(scribus_getcellrowspan__doc__)},
340 	{const_cast<char*>("getCellStyle"), scribus_getcellstyle, METH_VARARGS, tr(scribus_getcellstyle__doc__)},
341 	{const_cast<char*>("getCellStyles"), (PyCFunction)scribus_getcellstyles, METH_VARARGS, tr(scribus_getcellstyles__doc__)},
342 	{const_cast<char*>("getCellText"), scribus_getcelltext, METH_VARARGS, tr(scribus_getcelltext__doc__)},
343 	{const_cast<char*>("getCharStyles"), (PyCFunction)scribus_getcharstyles, METH_NOARGS, tr(scribus_getcharstyles__doc__)},
344 	{const_cast<char*>("getCharacterStyle"), scribus_getcharacterstyle, METH_VARARGS, tr(scribus_getcharacterstyle__doc__) },
345 	{const_cast<char*>("getColor"), scribus_getcolor, METH_VARARGS, tr(scribus_getcolor__doc__)},
346 	{const_cast<char*>("getColorAsRGB"), scribus_getcolorasrgb, METH_VARARGS, tr(scribus_getcolorasrgb__doc__)},
347 	{const_cast<char*>("getColorAsRGBFloat"), scribus_getcolorasrgbfloat, METH_VARARGS, tr(scribus_getcolorasrgbfloat__doc__)},
348 	{const_cast<char*>("getColorFloat"), scribus_getcolorfloat, METH_VARARGS, tr(scribus_getcolorfloat__doc__)},
349 	{const_cast<char*>("getColorNames"), (PyCFunction)scribus_getcolornames, METH_NOARGS, tr(scribus_getcolornames__doc__)},
350 	{const_cast<char*>("getColumnGap"), scribus_getcolumngap, METH_VARARGS, tr(scribus_getcolumngap__doc__)},
351 	{const_cast<char*>("getColumns"), scribus_getcolumns, METH_VARARGS, tr(scribus_getcolumns__doc__)},
352 	{const_cast<char*>("getCornerRadius"), scribus_getcornerradius, METH_VARARGS, tr(scribus_getcornerradius__doc__)},
353 	{const_cast<char*>("getCustomLineStyle"), scribus_getcustomlinestyle, METH_VARARGS, tr(scribus_getcustomlinestyle__doc__)},
354 	{const_cast<char*>("getDocName"), (PyCFunction)scribus_getdocname, METH_NOARGS, tr(scribus_getdocname__doc__)},
355 	{const_cast<char*>("getFillBlendmode"), scribus_getfillblendmode, METH_VARARGS, tr(scribus_getfillblendmode__doc__)},
356 	{const_cast<char*>("getFillColor"), scribus_getfillcolor, METH_VARARGS, tr(scribus_getfillcolor__doc__)},
357 	{const_cast<char*>("getFillShade"), scribus_getfillshade, METH_VARARGS, tr(scribus_getfillshade__doc__)},
358 	{const_cast<char*>("getFillTransparency"), scribus_getfilltransparency, METH_VARARGS, tr(scribus_getfilltransparency__doc__)},
359 	{const_cast<char*>("getFirstLineOffset"), scribus_getfirstlineoffset, METH_VARARGS, tr(scribus_getfirstlineoffset__doc__)},
360 	{const_cast<char*>("getFirstLinkedFrame"), scribus_getfirstlinkedframe, METH_VARARGS, tr(scribus_getfirstlinkedframe__doc__)},
361 	{const_cast<char*>("getFont"), scribus_getfont, METH_VARARGS, tr(scribus_getfont__doc__)},
362 	{const_cast<char*>("getFontFeatures"), scribus_getfontfeatures, METH_VARARGS, tr(scribus_getfontfeatures__doc__)},
363 	{const_cast<char*>("getFontNames"), (PyCFunction)scribus_getfontnames, METH_NOARGS, tr(scribus_getfontnames__doc__)},
364 	{const_cast<char*>("getFontSize"), scribus_getfontsize, METH_VARARGS, tr(scribus_getfontsize__doc__)},
365 	{const_cast<char*>("getFrameText"), scribus_getframetext, METH_VARARGS, tr(scribus_getframetext__doc__)},
366 	{const_cast<char*>("getGuiLanguage"), (PyCFunction)scribus_getlanguage, METH_NOARGS, tr(scribus_getlanguage__doc__)},
367 	{const_cast<char*>("getHGuides"), (PyCFunction)scribus_getHguides, METH_NOARGS, tr(scribus_getHguides__doc__)},
368 	{const_cast<char*>("getImageColorSpace"), scribus_getimagecolorspace, METH_VARARGS, tr(scribus_getimagecolorspace__doc__) },
369 	{const_cast<char*>("getImageFile"), scribus_getimagefile, METH_VARARGS, tr(scribus_getimagefile__doc__)},
370 	{const_cast<char*>("getImageOffset"), scribus_getimageoffset, METH_VARARGS, tr(scribus_getimageoffset__doc__)},
371 	{const_cast<char*>("getImageScale"), scribus_getimagescale, METH_VARARGS, tr(scribus_getimagescale__doc__)},
372 	{const_cast<char*>("getLastLinkedFrame"), scribus_getlastlinkedframe, METH_VARARGS, tr(scribus_getlastlinkedframe__doc__)},
373 	{const_cast<char*>("getLayerBlendmode"), scribus_getlayerblendmode, METH_VARARGS, tr(scribus_getlayerblendmode__doc__)},
374 	{const_cast<char*>("getLayerTransparency"), scribus_getlayertransparency, METH_VARARGS, tr(scribus_getlayertransparency__doc__)},
375 	{const_cast<char*>("getLayers"), (PyCFunction)scribus_getlayers, METH_NOARGS, tr(scribus_getlayers__doc__)},
376 	{const_cast<char*>("getLineBlendmode"), scribus_getlineblendmode, METH_VARARGS, tr(scribus_getlineblendmode__doc__)},
377 	{const_cast<char*>("getLineCap"), scribus_getlinecap, METH_VARARGS, tr(scribus_getlinecap__doc__)},
378 	{const_cast<char*>("getLineColor"), scribus_getlinecolor, METH_VARARGS, tr(scribus_getlinecolor__doc__)},
379 	{const_cast<char*>("getLineJoin"), scribus_getlinejoin, METH_VARARGS, tr(scribus_getlinejoin__doc__)},
380 	{const_cast<char*>("getLineShade"), scribus_getlineshade, METH_VARARGS, tr(scribus_getlineshade__doc__)},
381 	{const_cast<char*>("getLineSpacing"), scribus_getlinespacing, METH_VARARGS, tr(scribus_getlinespacing__doc__)},
382 	{const_cast<char*>("getLineStyle"), scribus_getlinestyle, METH_VARARGS, tr(scribus_getlinestyle__doc__)},
383 	{const_cast<char*>("getLineStyles"), (PyCFunction)scribus_getlinestyles, METH_VARARGS, tr(scribus_getlinestyles__doc__)},
384 	{const_cast<char*>("getLineTransparency"), scribus_getlinetransparency, METH_VARARGS, tr(scribus_getlinetransparency__doc__)},
385 	{const_cast<char*>("getLineWidth"), scribus_getlinewidth, METH_VARARGS, tr(scribus_getlinewidth__doc__)},
386 	{const_cast<char*>("getMasterPage"), scribus_getmasterpage, METH_VARARGS, tr(scribus_getmasterpage__doc__)},
387 	{const_cast<char*>("getNextLinkedFrame"), scribus_getnextlinkedframe, METH_VARARGS, tr(scribus_getnextlinkedframe__doc__)},
388 	{const_cast<char*>("getObjectAttributes"), scribus_getobjectattributes, METH_VARARGS, tr(scribus_getobjectattributes__doc__)},
389 	{const_cast<char*>("getObjectType"), scribus_getobjecttype, METH_VARARGS, tr(scribus_getobjecttype__doc__)},
390 	{const_cast<char*>("getPageItems"), (PyCFunction)scribus_getpageitems, METH_NOARGS, tr(scribus_getpageitems__doc__)},
391 	{const_cast<char*>("getPageMargins"), (PyCFunction)scribus_getpagemargins, METH_NOARGS, tr(scribus_getpagemargins__doc__)},
392 	{const_cast<char*>("getPageNMargins"), scribus_getpagenmargins, METH_VARARGS, tr(scribus_getpagenmargins__doc__)},
393 	{const_cast<char*>("getPageNSize"), scribus_getpagensize, METH_VARARGS, tr(scribus_getpagensize__doc__)},
394 	{const_cast<char*>("getPageSize"), (PyCFunction)scribus_getpagesize, METH_NOARGS, tr(scribus_getpagesize__doc__)},
395 	{const_cast<char*>("getPageType"), (PyCFunction)scribus_getpagetype, METH_VARARGS, tr(scribus_getpagetype__doc__)},
396 	{const_cast<char*>("getParagraphStyle"), scribus_getparagraphstyle, METH_VARARGS, tr(scribus_getparagraphstyle__doc__) },
397 	{const_cast<char*>("getParagraphStyles"), (PyCFunction)scribus_getparagraphstyles, METH_NOARGS, tr(scribus_getparagraphstyles__doc__)},
398 	{const_cast<char*>("getPosition"), scribus_getposition, METH_VARARGS, tr(scribus_getposition__doc__)},
399 	{const_cast<char*>("getPrevLinkedFrame"), scribus_getprevlinkedframe, METH_VARARGS, tr(scribus_getprevlinkedframe__doc__)},
400 	{const_cast<char*>("getRotation"), scribus_getrotation, METH_VARARGS, tr(scribus_getrotation__doc__)},
401 	{const_cast<char*>("getSelectedObject"), scribus_getselectedobject, METH_VARARGS, tr(scribus_getselectedobject__doc__)},
402 	{const_cast<char*>("getSize"), scribus_getsize, METH_VARARGS, tr(scribus_getsize__doc__)},
403 	{const_cast<char*>("getStyle"), scribus_getparagraphstyle, METH_VARARGS, tr(scribus_getstyle__doc__) }, // Deprecated
404 	{const_cast<char*>("getTableColumnWidth"), scribus_gettablecolumnwidth, METH_VARARGS, tr(scribus_gettablecolumnwidth__doc__)},
405 	{const_cast<char*>("getTableColumns"), scribus_gettablecolumns, METH_VARARGS, tr(scribus_gettablecolumns__doc__)},
406 	{const_cast<char*>("getTableFillColor"), scribus_gettablefillcolor, METH_VARARGS, tr(scribus_gettablefillcolor__doc__)},
407 	{const_cast<char*>("getTableRowHeight"), scribus_gettablerowheight, METH_VARARGS, tr(scribus_gettablerowheight__doc__)},
408 	{const_cast<char*>("getTableRows"), scribus_gettablerows, METH_VARARGS, tr(scribus_gettablerows__doc__)},
409 	{const_cast<char*>("getTableStyle"), scribus_gettablestyle, METH_VARARGS, tr(scribus_gettablestyle__doc__)},
410 	{const_cast<char*>("getTableStyles"), (PyCFunction)scribus_gettablestyles, METH_VARARGS, tr(scribus_gettablestyles__doc__)},
411 	{const_cast<char*>("getText"), scribus_getframetext, METH_VARARGS, tr(scribus_gettext__doc__)}, // Deprecated
412 	{const_cast<char*>("getTextColor"), scribus_gettextcolor, METH_VARARGS, tr(scribus_gettextcolor__doc__)},
413 	{const_cast<char*>("getTextDistances"), scribus_gettextdistances, METH_VARARGS, tr(scribus_gettextdistances__doc__)},
414 	{const_cast<char*>("getTextFlowMode"), scribus_gettextflowmode, METH_VARARGS, tr(scribus_gettextflowmode__doc__)},
415 	{const_cast<char*>("getTextLength"), scribus_gettextlength, METH_VARARGS, tr(scribus_gettextlength__doc__)},
416 	{const_cast<char*>("getTextLines"), scribus_gettextlines, METH_VARARGS, tr(scribus_gettextlines__doc__)},
417 	{const_cast<char*>("getTextShade"), scribus_gettextshade, METH_VARARGS, tr(scribus_gettextshade__doc__)},
418 	{const_cast<char*>("getTextVerticalAlignment"), scribus_gettextverticalalignment, METH_VARARGS, tr(scribus_gettextverticalalignment__doc__)},
419 	{const_cast<char*>("getUnit"), (PyCFunction)scribus_getunit, METH_NOARGS, tr(scribus_getunit__doc__)},
420 	{const_cast<char*>("getVGuides"), (PyCFunction)scribus_getVguides, METH_NOARGS, tr(scribus_getVguides__doc__)},
421 	{const_cast<char*>("getXFontNames"), (PyCFunction)scribus_xfontnames, METH_NOARGS, tr(scribus_xfontnames__doc__)},
422 	{const_cast<char*>("gotoPage"), scribus_gotopage, METH_VARARGS, tr(scribus_gotopage__doc__)},
423 	{const_cast<char*>("groupObjects"), (PyCFunction)scribus_groupobjects, METH_VARARGS, tr(scribus_groupobjects__doc__)},
424 	{const_cast<char*>("haveDoc"), (PyCFunction)scribus_havedoc, METH_NOARGS, tr(scribus_havedoc__doc__)},
425 	{const_cast<char*>("hyphenateText"), scribus_hyphenatetext, METH_VARARGS, tr(scribus_hyphenatetext__doc__)},
426 	{const_cast<char*>("importPage"), scribus_importpage, METH_VARARGS, tr(scribus_importpage__doc__)},
427 	{const_cast<char*>("insertHtmlText"), scribus_inserthtmltext, METH_VARARGS, tr(scribus_inserthtmltext__doc__)},
428 	{const_cast<char*>("insertTableColumns"), scribus_inserttablecolumns, METH_VARARGS, tr(scribus_inserttablecolumns__doc__)},
429 	{const_cast<char*>("insertTableRows"), scribus_inserttablerows, METH_VARARGS, tr(scribus_inserttablerows__doc__)},
430 	{const_cast<char*>("insertText"), scribus_inserttext, METH_VARARGS, tr(scribus_inserttext__doc__)},
431 	{const_cast<char*>("isLayerFlow"), scribus_islayerflow, METH_VARARGS, tr(scribus_islayerflow__doc__)},
432 	{const_cast<char*>("isLayerLocked"), scribus_islayerlocked, METH_VARARGS, tr(scribus_islayerlocked__doc__)},
433 	{const_cast<char*>("isLayerOutlined"), scribus_islayeroutlined, METH_VARARGS, tr(scribus_islayeroutlined__doc__)},
434 	{const_cast<char*>("isLayerPrintable"), scribus_islayerprintable, METH_VARARGS, tr(scribus_islayerprintable__doc__)},
435 	{const_cast<char*>("isLayerVisible"), scribus_islayervisible, METH_VARARGS, tr(scribus_islayervisible__doc__)},
436 	{const_cast<char*>("isLocked"), scribus_islocked, METH_VARARGS, tr(scribus_islocked__doc__)},
437 	{const_cast<char*>("isPDFBookmark"), scribus_ispdfbookmark, METH_VARARGS, tr(scribus_ispdfbookmark__doc__)},
438 	{const_cast<char*>("isSpotColor"), scribus_isspotcolor, METH_VARARGS, tr(scribus_isspotcolor__doc__)},
439 	{const_cast<char*>("layoutText"), scribus_layouttext, METH_VARARGS, tr(scribus_layouttext__doc__)},
440 	{const_cast<char*>("layoutTextChain"), scribus_layouttextchain, METH_VARARGS, tr(scribus_layouttextchain__doc__)},
441 	{const_cast<char*>("linkTextFrames"), scribus_linktextframes, METH_VARARGS, tr(scribus_linktextframes__doc__)},
442 	{const_cast<char*>("loadImage"), scribus_loadimage, METH_VARARGS, tr(scribus_loadimage__doc__)},
443 	{const_cast<char*>("loadStylesFromFile"), scribus_loadstylesfromfile, METH_VARARGS, tr(scribus_loadstylesfromfile__doc__)},
444 	{const_cast<char*>("lockObject"), scribus_lockobject, METH_VARARGS, tr(scribus_lockobject__doc__)},
445 	{const_cast<char*>("lowerActiveLayer"), (PyCFunction)scribus_loweractivelayer, METH_NOARGS, tr(scribus_loweractivelayer__doc__)},
446 	{const_cast<char*>("masterPageNames"), (PyCFunction)scribus_masterpagenames, METH_NOARGS, tr(scribus_masterpagenames__doc__)},
447 	{const_cast<char*>("mergeTableCells"), scribus_mergetablecells, METH_VARARGS, tr(scribus_mergetablecells__doc__)},
448 	{const_cast<char*>("messageBox"), (PyCFunction)scribus_messagebox, METH_VARARGS|METH_KEYWORDS, tr(scribus_messagebox__doc__)},
449 	{const_cast<char*>("messagebarText"), scribus_statusmessage, METH_VARARGS, tr(scribus_statusmessage__doc__)}, // Deprecated
450 	{const_cast<char*>("moveObject"), scribus_moveobjectrel, METH_VARARGS, tr(scribus_moveobjectrel__doc__)},
451 	{const_cast<char*>("moveObjectAbs"), scribus_moveobjectabs, METH_VARARGS, tr(scribus_moveobjectabs__doc__)},
452 	{const_cast<char*>("moveSelectionToBack"), (PyCFunction)scribus_moveselectiontoback, METH_NOARGS, tr(scribus_moveselectiontoback__doc__) },
453 	{const_cast<char*>("moveSelectionToFront"), (PyCFunction)scribus_moveselectiontofront, METH_NOARGS, tr(scribus_moveselectiontofront__doc__) },
454 	{const_cast<char*>("newDoc"), scribus_newdoc, METH_VARARGS, tr(scribus_newdoc__doc__)},
455 	{const_cast<char*>("newDocDialog"), (PyCFunction)scribus_newdocdialog, METH_NOARGS, tr(scribus_newdocdialog__doc__)},
456 	{const_cast<char*>("newDocument"), scribus_newdocument, METH_VARARGS, tr(scribus_newdocument__doc__)},
457 	{const_cast<char*>("newPage"), scribus_newpage, METH_VARARGS, tr(scribus_newpage__doc__)},
458 	{const_cast<char*>("newStyleDialog"), scribus_newstyledialog, METH_NOARGS, tr(scribus_newstyledialog__doc__)},
459 	{const_cast<char*>("objectExists"),scribus_objectexists, METH_VARARGS, tr(scribus_objectexists__doc__)},
460 	{const_cast<char*>("openDoc"), scribus_opendoc, METH_VARARGS, tr(scribus_opendoc__doc__)},
461 	{const_cast<char*>("outlineText"), scribus_outlinetext, METH_VARARGS, tr(scribus_outlinetext__doc__)},
462 	{const_cast<char*>("pageCount"), (PyCFunction)scribus_pagecount, METH_NOARGS, tr(scribus_pagecount__doc__)},
463 	{const_cast<char*>("pageDimension"), (PyCFunction)scribus_getpagesize, METH_NOARGS, "Obsolete function. Don't use it."},
464 	{const_cast<char*>("placeEPS"), scribus_placevec, METH_VARARGS, tr(scribus_placeeps__doc__)},
465 	{const_cast<char*>("placeODG"), scribus_placevec, METH_VARARGS, tr(scribus_placeodg__doc__)},
466 	{const_cast<char*>("placeSVG"), scribus_placevec, METH_VARARGS, tr(scribus_placesvg__doc__)},
467 	{const_cast<char*>("placeSXD"), scribus_placevec, METH_VARARGS, tr(scribus_placesxd__doc__)},
468 	{const_cast<char*>("placeVectorFile"), scribus_placevec, METH_VARARGS, tr(scribus_placevec__doc__)},
469 	{const_cast<char*>("progressReset"), (PyCFunction)scribus_progressreset, METH_NOARGS, tr(scribus_progressreset__doc__)},
470 	{const_cast<char*>("progressSet"), scribus_progresssetprogress, METH_VARARGS, tr(scribus_progresssetprogress__doc__)},
471 	{const_cast<char*>("progressTotal"), scribus_progresssettotalsteps, METH_VARARGS, tr(scribus_progresssettotalsteps__doc__)},
472 	{const_cast<char*>("raiseActiveLayer"), (PyCFunction)scribus_raiseactivelayer, METH_NOARGS, tr(scribus_raiseactivelayer__doc__)},
473 	{const_cast<char*>("readPDFOptions"), (PyCFunction)scribus_readpdfoptions, METH_VARARGS, tr(scribus_readpdfoptions__doc__)},
474 	{const_cast<char*>("redrawAll"), (PyCFunction)scribus_redraw, METH_NOARGS, tr(scribus_redraw__doc__)},
475 	{const_cast<char*>("removeTableColumns"), scribus_removetablecolumns, METH_VARARGS, tr(scribus_removetablecolumns__doc__)},
476 	{const_cast<char*>("removeTableRows"), scribus_removetablerows, METH_VARARGS, tr(scribus_removetablerows__doc__)},
477 	{const_cast<char*>("renderFont"), (PyCFunction)scribus_renderfont, METH_VARARGS|METH_KEYWORDS, tr(scribus_renderfont__doc__)},
478 	{const_cast<char*>("replaceColor"), scribus_replcolor, METH_VARARGS, tr(scribus_replcolor__doc__)},
479 	{const_cast<char*>("resizeTableColumn"), scribus_resizetablecolumn, METH_VARARGS, tr(scribus_resizetablecolumn__doc__)},
480 	{const_cast<char*>("resizeTableRow"), scribus_resizetablerow, METH_VARARGS, tr(scribus_resizetablerow__doc__)},
481 	{const_cast<char*>("revertDoc"), (PyCFunction)scribus_revertdoc, METH_NOARGS, tr(scribus_revertdoc__doc__)},
482 	{const_cast<char*>("rotateObject"), scribus_rotateobjectrel, METH_VARARGS, tr(scribus_rotateobjectrel__doc__)},
483 	{const_cast<char*>("rotateObjectAbs"), scribus_rotateobjectabs, METH_VARARGS, tr(scribus_rotateobjectabs__doc__)},
484 	{const_cast<char*>("saveDoc"), (PyCFunction)scribus_savedoc, METH_NOARGS, tr(scribus_savedoc__doc__)},
485 	{const_cast<char*>("saveDocAs"), scribus_savedocas, METH_VARARGS, tr(scribus_savedocas__doc__)},
486 	{const_cast<char*>("savePDFOptions"), (PyCFunction)scribus_savepdfoptions, METH_VARARGS, tr(scribus_savepdfoptions__doc__)},
487 	{const_cast<char*>("savePageAsEPS"), scribus_savepageeps, METH_VARARGS, tr(scribus_savepageeps__doc__)},
488 	{const_cast<char*>("scaleGroup"), scribus_scalegroup, METH_VARARGS, tr(scribus_scalegroup__doc__)},
489 	{const_cast<char*>("scaleImage"), scribus_scaleimage, METH_VARARGS, tr(scribus_scaleimage__doc__)},
490 	{const_cast<char*>("scrollDocument"), scribus_scrolldocument, METH_VARARGS, tr(scribus_scrolldocument__doc__) },
491 	{const_cast<char*>("selectFrameText"), scribus_selectframetext, METH_VARARGS, tr(scribus_selectframetext__doc__)},
492 	{const_cast<char*>("selectObject"), scribus_selectobject, METH_VARARGS, tr(scribus_selectobject__doc__)},
493 	{const_cast<char*>("selectText"), scribus_selecttext, METH_VARARGS, tr(scribus_selecttext__doc__)},
494 	{const_cast<char*>("selectionCount"), (PyCFunction)scribus_selectioncount, METH_NOARGS, tr(scribus_selectioncount__doc__)},
495 	{const_cast<char*>("sendToLayer"), scribus_sendtolayer, METH_VARARGS, tr(scribus_sendtolayer__doc__)},
496 	{const_cast<char*>("sentToLayer"), scribus_sendtolayer, METH_VARARGS, tr(scribus_sendtolayer__doc__)}, // Deprecated, alias to sentToLayer
497 	{const_cast<char*>("setActiveLayer"), scribus_setactivelayer, METH_VARARGS, tr(scribus_setactivelayer__doc__)},
498 	{const_cast<char*>("setBaseLine"), scribus_setbaseline, METH_VARARGS, tr(scribus_setbaseline__doc__)},
499 	{const_cast<char*>("setBleeds"), scribus_setbleeds, METH_VARARGS, tr(scribus_setbleeds__doc__)},
500 	{const_cast<char*>("setCellBottomBorder"), scribus_setcellbottomborder, METH_VARARGS, tr(scribus_setcellbottomborder__doc__)},
501 	{const_cast<char*>("setCellBottomPadding"), scribus_setcellbottompadding, METH_VARARGS, tr(scribus_setcellbottompadding__doc__)},
502 	{const_cast<char*>("setCellFillColor"), scribus_setcellfillcolor, METH_VARARGS, tr(scribus_setcellfillcolor__doc__)},
503 	{const_cast<char*>("setCellLeftBorder"), scribus_setcellleftborder, METH_VARARGS, tr(scribus_setcellleftborder__doc__)},
504 	{const_cast<char*>("setCellLeftPadding"), scribus_setcellleftpadding, METH_VARARGS, tr(scribus_setcellleftpadding__doc__)},
505 	{const_cast<char*>("setCellRightBorder"), scribus_setcellrightborder, METH_VARARGS, tr(scribus_setcellrightborder__doc__)},
506 	{const_cast<char*>("setCellRightPadding"), scribus_setcellrightpadding, METH_VARARGS, tr(scribus_setcellrightpadding__doc__)},
507 	{const_cast<char*>("setCellStyle"), scribus_setcellstyle, METH_VARARGS, tr(scribus_setcellstyle__doc__)},
508 	{const_cast<char*>("setCellText"), scribus_setcelltext, METH_VARARGS, tr(scribus_setcelltext__doc__)},
509 	{const_cast<char*>("setCellTopBorder"), scribus_setcelltopborder, METH_VARARGS, tr(scribus_setcelltopborder__doc__)},
510 	{const_cast<char*>("setCellTopPadding"), scribus_setcelltoppadding, METH_VARARGS, tr(scribus_setcelltoppadding__doc__)},
511 	{const_cast<char*>("setCharacterStyle"), scribus_setcharstyle, METH_VARARGS, tr(scribus_setcharstyle__doc__) },
512 	{const_cast<char*>("setColumnGap"), scribus_setcolumngap, METH_VARARGS, tr(scribus_setcolumngap__doc__)},
513 	{const_cast<char*>("setColumns"), scribus_setcolumns, METH_VARARGS, tr(scribus_setcolumns__doc__)},
514 	{const_cast<char*>("setCornerRadius"), scribus_setcornerradius, METH_VARARGS, tr(scribus_setcornerradius__doc__)},
515 	{const_cast<char*>("setCursor"), scribus_setcursor, METH_VARARGS, tr(scribus_setcursor__doc__)},
516 	{const_cast<char*>("setCustomLineStyle"), scribus_setcustomlinestyle, METH_VARARGS, tr(scribus_setcustomlinestyle__doc__)},
517 	{const_cast<char*>("setDocType"), scribus_setdoctype, METH_VARARGS, tr(scribus_setdoctype__doc__)},
518 	{const_cast<char*>("setFillBlendmode"), scribus_setfillblend, METH_VARARGS, tr(scribus_setfillblend__doc__)},
519 	{const_cast<char*>("setFillColor"), scribus_setfillcolor, METH_VARARGS, tr(scribus_setfillcolor__doc__)},
520 	{const_cast<char*>("setFillShade"), scribus_setfillshade, METH_VARARGS, tr(scribus_setfillshade__doc__)},
521 	{const_cast<char*>("setFillTransparency"), scribus_setfilltrans, METH_VARARGS, tr(scribus_setfilltrans__doc__)},
522 	{const_cast<char*>("setFirstLineOffset"), scribus_setfirstlineoffset, METH_VARARGS, tr(scribus_setfirstlineoffset__doc__)},
523 	{const_cast<char*>("setFont"), scribus_setfont, METH_VARARGS, tr(scribus_setfont__doc__)},
524 	{const_cast<char*>("setFontFeatures"), scribus_setfontfeatures, METH_VARARGS, tr(scribus_setfontfeatures__doc__)},
525 	{const_cast<char*>("setFontSize"), scribus_setfontsize, METH_VARARGS, tr(scribus_setfontsize__doc__)},
526 	{const_cast<char*>("setGradientFill"), scribus_setgradfill, METH_VARARGS, tr(scribus_setgradfill__doc__)},
527 	{const_cast<char*>("setGradientStop"), scribus_setgradstop, METH_VARARGS, tr(scribus_setgradstop__doc__)},
528 	{const_cast<char*>("setHGuides"), scribus_setHguides, METH_VARARGS, tr(scribus_setHguides__doc__)},
529 	{const_cast<char*>("setImageBrightness"), scribus_setimagebrightness, METH_VARARGS, tr(scribus_setimagebrightness__doc__)},
530 	{const_cast<char*>("setImageGrayscale"), scribus_setimagegrayscale, METH_VARARGS, tr(scribus_setimagegrayscale__doc__)},
531 	{const_cast<char*>("setImageOffset"), scribus_setimageoffset, METH_VARARGS, tr(scribus_setimageoffset__doc__)},
532 	{const_cast<char*>("setImageScale"), scribus_setimagescale, METH_VARARGS, tr(scribus_setimagescale__doc__)},
533 	{const_cast<char*>("setInfo"), scribus_setinfo, METH_VARARGS, tr(scribus_setinfo__doc__)},
534 	{const_cast<char*>("setItemName"), scribus_setitemname, METH_VARARGS, tr(scribus_setitemname__doc__)},
535 	{const_cast<char*>("setLayerBlendmode"), scribus_setlayerblendmode, METH_VARARGS, tr(scribus_setlayerblendmode__doc__)},
536 	{const_cast<char*>("setLayerFlow"), scribus_setlayerflow, METH_VARARGS, tr(scribus_setlayerflow__doc__)},
537 	{const_cast<char*>("setLayerLocked"), scribus_setlayerlocked, METH_VARARGS, tr(scribus_setlayerlocked__doc__)},
538 	{const_cast<char*>("setLayerOutlined"), scribus_setlayeroutlined, METH_VARARGS, tr(scribus_setlayeroutlined__doc__)},
539 	{const_cast<char*>("setLayerPrintable"), scribus_setlayerprintable, METH_VARARGS, tr(scribus_setlayerprintable__doc__)},
540 	{const_cast<char*>("setLayerTransparency"), scribus_setlayertransparency, METH_VARARGS, tr(scribus_setlayertransparency__doc__)},
541 	{const_cast<char*>("setLayerVisible"), scribus_setlayervisible, METH_VARARGS, tr(scribus_setlayervisible__doc__)},
542 	{const_cast<char*>("setLineBlendmode"), scribus_setlineblend, METH_VARARGS, tr(scribus_setlineblend__doc__)},
543 	{const_cast<char*>("setLineCap"), scribus_setlinecap, METH_VARARGS, tr(scribus_setlinecap__doc__)},
544 	{const_cast<char*>("setLineColor"), scribus_setlinecolor, METH_VARARGS, tr(scribus_setlinecolor__doc__)},
545 	{const_cast<char*>("setLineJoin"), scribus_setlinejoin, METH_VARARGS, tr(scribus_setlinejoin__doc__)},
546 	{const_cast<char*>("setLineShade"), scribus_setlineshade, METH_VARARGS, tr(scribus_setlineshade__doc__)},
547 	{const_cast<char*>("setLineSpacing"), scribus_setlinespacing, METH_VARARGS, tr(scribus_setlinespacing__doc__)},
548 	{const_cast<char*>("setLineSpacingMode"), scribus_setlinespacingmode, METH_VARARGS, tr(scribus_setlinespacingmode__doc__)},
549 	{const_cast<char*>("setLineStyle"), scribus_setlinestyle, METH_VARARGS, tr(scribus_setlinestyle__doc__)},
550 	{const_cast<char*>("setLineTransparency"), scribus_setlinetrans, METH_VARARGS, tr(scribus_setlinetrans__doc__)},
551 	{const_cast<char*>("setLineWidth"), scribus_setlinewidth, METH_VARARGS, tr(scribus_setlinewidth__doc__)},
552 	{const_cast<char*>("setMargins"), scribus_setmargins, METH_VARARGS, tr(scribus_setmargins__doc__)},
553 	{const_cast<char*>("setMultiLine"), scribus_setmultiline, METH_VARARGS, tr(scribus_setmultiline__doc__)},
554 	{const_cast<char*>("setNewName"), scribus_setitemname, METH_VARARGS, tr(scribus_setitemname__doc__)}, // Deprecated, was in fact never documented
555 	{const_cast<char*>("setObjectAttributes"), scribus_setobjectattributes, METH_VARARGS, tr(scribus_setobjectattributes__doc__)},
556 	{const_cast<char*>("setPDFBookmark"), scribus_setpdfbookmark, METH_VARARGS, tr(scribus_setpdfbookmark__doc__)},
557 	{const_cast<char*>("setParagraphStyle"), scribus_setparagraphstyle, METH_VARARGS, tr(scribus_setparagraphstyle__doc__)},
558 	{const_cast<char*>("setRedraw"), scribus_setredraw, METH_VARARGS, tr(scribus_setredraw__doc__)},
559 	{const_cast<char*>("setScaleFrameToImage"), (PyCFunction)scribus_setscaleframetoimage, METH_VARARGS, tr(scribus_setscaleframetoimage__doc__)},
560 	{const_cast<char*>("setScaleImageToFrame"), (PyCFunction)scribus_setscaleimagetoframe, METH_VARARGS|METH_KEYWORDS, tr(scribus_setscaleimagetoframe__doc__)},
561 	{const_cast<char*>("setSpotColor"), scribus_setspotcolor, METH_VARARGS, tr(scribus_setspotcolor__doc__)},
562 	{const_cast<char*>("setStyle"), scribus_setparagraphstyle, METH_VARARGS, tr(scribus_setstyle__doc__)}, // Deprecated
563 	{const_cast<char*>("setTableBottomBorder"), scribus_settablebottomborder, METH_VARARGS, tr(scribus_settablebottomborder__doc__)},
564 	{const_cast<char*>("setTableFillColor"), scribus_settablefillcolor, METH_VARARGS, tr(scribus_settablefillcolor__doc__)},
565 	{const_cast<char*>("setTableLeftBorder"), scribus_settableleftborder, METH_VARARGS, tr(scribus_settableleftborder__doc__)},
566 	{const_cast<char*>("setTableRightBorder"), scribus_settablerightborder, METH_VARARGS, tr(scribus_settablerightborder__doc__)},
567 	{const_cast<char*>("setTableStyle"), scribus_settablestyle, METH_VARARGS, tr(scribus_settablestyle__doc__)},
568 	{const_cast<char*>("setTableTopBorder"), scribus_settabletopborder, METH_VARARGS, tr(scribus_settabletopborder__doc__)},
569 	{const_cast<char*>("setText"), scribus_settext, METH_VARARGS, tr(scribus_settext__doc__)},
570 	{const_cast<char*>("setTextAlignment"), scribus_settextalignment, METH_VARARGS, tr(scribus_settextalignment__doc__)},
571 	{const_cast<char*>("setTextColor"), scribus_settextfill, METH_VARARGS, tr(scribus_settextfill__doc__)},
572 	{const_cast<char*>("setTextDirection"), scribus_setdirection, METH_VARARGS, tr(scribus_setdirection__doc__)},
573 	{const_cast<char*>("setTextDistances"), scribus_settextdistances, METH_VARARGS, tr(scribus_settextdistances__doc__)},
574 	{const_cast<char*>("setTextFlowMode"), scribus_settextflowmode, METH_VARARGS, tr(scribus_settextflowmode__doc__)},
575 	{const_cast<char*>("setTextScalingH"), scribus_settextscalingh, METH_VARARGS, tr(scribus_settextscalingh__doc__)},
576 	{const_cast<char*>("setTextScalingV"), scribus_settextscalingv, METH_VARARGS, tr(scribus_settextscalingv__doc__)},
577 	{const_cast<char*>("setTextShade"), scribus_settextshade, METH_VARARGS, tr(scribus_settextshade__doc__)},
578 	{const_cast<char*>("setTextStroke"), scribus_settextstroke, METH_VARARGS, tr(scribus_settextstroke__doc__)},
579 	{const_cast<char*>("setTextVerticalAlignment"), scribus_settextverticalalignment, METH_VARARGS, tr(scribus_settextverticalalignment__doc__)},
580 	{const_cast<char*>("setUnit"), scribus_setunit, METH_VARARGS, tr(scribus_setunit__doc__)},
581 	{const_cast<char*>("setVGuides"), scribus_setVguides, METH_VARARGS, tr(scribus_setVguides__doc__)},
582 	{const_cast<char*>("sizeObject"), scribus_sizeobject, METH_VARARGS, tr(scribus_sizeobject__doc__)},
583 	{const_cast<char*>("statusMessage"), scribus_statusmessage, METH_VARARGS, tr(scribus_statusmessage__doc__)},
584 	{const_cast<char*>("textFlowMode"), scribus_settextflowmode, METH_VARARGS, tr(scribus_textflowmode__doc__)}, // Deprecated
585 	{const_cast<char*>("textOverflows"), (PyCFunction)scribus_istextoverflowing, METH_VARARGS|METH_KEYWORDS, tr(scribus_istextoverflowing__doc__) },
586 	{const_cast<char*>("traceText"), scribus_outlinetext, METH_VARARGS, tr(scribus_tracetext__doc__)},
587 	{const_cast<char*>("unGroupObject"), scribus_ungroupobjects, METH_VARARGS, tr(scribus_ungroupobjects__doc__)}, // Deprecated, now alias for unGroupObjects()
588 	{const_cast<char*>("unGroupObjects"), scribus_ungroupobjects, METH_VARARGS, tr(scribus_ungroupobjects__doc__)},
589 	{const_cast<char*>("unlinkTextFrames"), scribus_unlinktextframes, METH_VARARGS, tr(scribus_unlinktextframes__doc__)},
590 	{const_cast<char*>("valueDialog"), scribus_valuedialog, METH_VARARGS, tr(scribus_valuedialog__doc__)},
591 	{const_cast<char*>("zoomDocument"), scribus_zoomdocument, METH_VARARGS, tr(scribus_zoomdocument__doc__)},
592 	// Property magic
593 	{const_cast<char*>("getPropertyCType"), (PyCFunction)scribus_propertyctype, METH_VARARGS|METH_KEYWORDS, tr(scribus_propertyctype__doc__)},
594 	{const_cast<char*>("getPropertyNames"), (PyCFunction)scribus_getpropertynames, METH_VARARGS|METH_KEYWORDS, tr(scribus_getpropertynames__doc__)},
595 	{const_cast<char*>("getProperty"), (PyCFunction)scribus_getproperty, METH_VARARGS|METH_KEYWORDS, tr(scribus_getproperty__doc__)},
596 	{const_cast<char*>("setProperty"), (PyCFunction)scribus_setproperty, METH_VARARGS|METH_KEYWORDS, tr(scribus_setproperty__doc__)},
597 // 	{const_cast<char*>("getChildren"), (PyCFunction)scribus_getchildren, METH_VARARGS|METH_KEYWORDS, tr(scribus_getchildren__doc__)},
598 // 	{const_cast<char*>("getChild"), (PyCFunction)scribus_getchild, METH_VARARGS|METH_KEYWORDS, tr(scribus_getchild__doc__)},
599 	// by Christian Hausknecht
600 	{const_cast<char*>("copyObject"), scribus_copyobject, METH_VARARGS, tr(scribus_copyobject__doc__)}, // Deprecated
601 	{const_cast<char*>("copyObjects"), scribus_copyobjects, METH_VARARGS, tr(scribus_copyobjects__doc__)},
602 	{const_cast<char*>("duplicateObject"), scribus_duplicateobject, METH_VARARGS, tr(scribus_duplicateobject__doc__)}, // Deprecated
603 	{const_cast<char*>("duplicateObjects"), scribus_duplicateobjects, METH_VARARGS, tr(scribus_duplicateobjects__doc__)},
604 	{const_cast<char*>("pasteObject"), scribus_pasteobject, METH_NOARGS, tr(scribus_pasteobject__doc__)}, // Deprecated
605 	{const_cast<char*>("pasteObjects"), scribus_pasteobjects, METH_NOARGS, tr(scribus_pasteobjects__doc__)},
606 	// by Tj (hacker@iam.tj>
607 	{const_cast<char*>("combinePolygons"), (PyCFunction)scribus_combinepolygons, METH_NOARGS, tr(scribus_combinepolygons__doc__)},
608 	// Internal methods - Not for public use
609 	{const_cast<char*>("retval"), (PyCFunction)scribus_py2x_retval, METH_VARARGS, const_cast<char*>("Scribus internal.")},
610 	{const_cast<char*>("getval"), (PyCFunction)scribus_py2x_getval, METH_NOARGS, const_cast<char*>("Scribus internal.")},
611 	{const_cast<char*>("setLinkAnnotation"), scribus_setlinkannotation, METH_VARARGS,tr(scribus_setlinkannotation__doc__)},
612 	{const_cast<char*>("setFileAnnotation"), (PyCFunction)scribus_setfileannotation, METH_VARARGS|METH_KEYWORDS,tr(scribus_setfileannotation__doc__)},
613 	{const_cast<char*>("setURIAnnotation"), scribus_seturiannotation, METH_VARARGS,tr(scribus_seturiannotation__doc__)},
614 	{const_cast<char*>("setTextAnnotation"), scribus_settextannotation, METH_VARARGS,tr(scribus_settextannotation__doc__)},
615 	{const_cast<char*>("createPdfAnnotation"), scribus_createpdfannotation, METH_VARARGS,tr(scribus_createpdfannotation__doc__)},
616 	{const_cast<char*>("isAnnotated"),(PyCFunction)scribus_isannotated, METH_VARARGS|METH_KEYWORDS,tr(scribus_isannotated__doc__)},
617 	{const_cast<char*>("setJSActionScript"), scribus_setjsactionscript, METH_VARARGS,tr(scribus_setjsactionscript__doc__)},
618 	{const_cast<char*>("getJSActionScript"), scribus_getjsactionscript, METH_VARARGS,tr(scribus_getjsactionscript__doc__)},
619 	{nullptr, (PyCFunction)(nullptr), 0, nullptr} /* sentinel */
620 };
621 
initscribus_failed(const char * fileName,int lineNo)622 void initscribus_failed(const char* fileName, int lineNo)
623 {
624 	qDebug("Scripter setup failed (%s:%i)", fileName, lineNo);
625 	if (PyErr_Occurred())
626 		PyErr_Print();
627 }
628 
initscribus(ScribusMainWindow * mainWin)629 void initscribus(ScribusMainWindow *mainWin)
630 {
631 	if (!scripterCore)
632 	{
633 		qWarning("scriptplugin: Tried to init scribus module, but no scripter core. Aborting.");
634 		return;
635 	}
636 	PyObject *m, *d;
637 	PyImport_AddModule((char*)"scribus");
638 
639 	PyType_Ready(&Printer_Type);
640 	PyType_Ready(&PDFfile_Type);
641 	PyType_Ready(&ImageExport_Type);
642 	m = Py_InitModule((char*)"scribus", scribus_methods);
643 	Py_INCREF(&Printer_Type);
644 	PyModule_AddObject(m, (char*)"Printer", (PyObject *) &Printer_Type);
645 	Py_INCREF(&PDFfile_Type);
646 	PyModule_AddObject(m, (char*)"PDFfile", (PyObject *) &PDFfile_Type);
647 	Py_INCREF(&ImageExport_Type);
648 	PyModule_AddObject(m, (char*)"ImageExport", (PyObject *) &ImageExport_Type);
649 	d = PyModule_GetDict(m);
650 
651 	// Set up the module exceptions
652 	// common exc.
653 	ScribusException = PyErr_NewException((char*)"scribus.ScribusException", nullptr, nullptr);
654 	Py_INCREF(ScribusException);
655 	PyModule_AddObject(m, (char*)"ScribusException", ScribusException);
656 	// no doc open
657 	NoDocOpenError = PyErr_NewException((char*)"scribus.NoDocOpenError", ScribusException, nullptr);
658 	Py_INCREF(NoDocOpenError);
659 	PyModule_AddObject(m, (char*)"NoDocOpenError", NoDocOpenError);
660 	// wrong type of frame for operation
661 	WrongFrameTypeError = PyErr_NewException((char*)"scribus.WrongFrameTypeError", ScribusException, nullptr);
662 	Py_INCREF(WrongFrameTypeError);
663 	PyModule_AddObject(m, (char*)"WrongFrameTypeError", WrongFrameTypeError);
664 	// Couldn't find named object, or no named object and no selection
665 	NoValidObjectError = PyErr_NewException((char*)"scribus.NoValidObjectError", ScribusException, nullptr);
666 	Py_INCREF(NoValidObjectError);
667 	PyModule_AddObject(m, (char*)"NoValidObjectError", NoValidObjectError);
668 	// Couldn't find the specified resource - font, color, etc.
669 	NotFoundError = PyErr_NewException((char*)"scribus.NotFoundError", ScribusException, nullptr);
670 	Py_INCREF(NotFoundError);
671 	PyModule_AddObject(m, (char*)"NotFoundError", NotFoundError);
672 	// Tried to create an object with the same name as one that already exists
673 	NameExistsError = PyErr_NewException((char*)"scribus.NameExistsError", ScribusException, nullptr);
674 	Py_INCREF(NameExistsError);
675 	PyModule_AddObject(m, (char*)"NameExistsError", NameExistsError);
676 	// Done with exception setup
677 
678 	// CONSTANTS
679 	// Units
680 	PyDict_SetItemString(d, const_cast<char*>("UNIT_POINTS"), PyLong_FromLong(unitIndexFromString("pt")));
681 	PyDict_SetItemString(d, const_cast<char*>("UNIT_MILLIMETERS"), PyLong_FromLong(unitIndexFromString("mm")));
682 	PyDict_SetItemString(d, const_cast<char*>("UNIT_INCHES"), PyLong_FromLong(unitIndexFromString("in")));
683 	PyDict_SetItemString(d, const_cast<char*>("UNIT_PICAS"), PyLong_FromLong(unitIndexFromString("p")));
684 	PyDict_SetItemString(d, const_cast<char*>("UNIT_CENTIMETRES"), PyLong_FromLong(unitIndexFromString("cm")));
685 	PyDict_SetItemString(d, const_cast<char*>("UNIT_CICERO"), PyLong_FromLong(unitIndexFromString("c")));
686 	PyDict_SetItemString(d, const_cast<char*>("UNIT_PT"), PyLong_FromLong(unitIndexFromString("pt")));
687 	PyDict_SetItemString(d, const_cast<char*>("UNIT_MM"), PyLong_FromLong(unitIndexFromString("mm")));
688 	PyDict_SetItemString(d, const_cast<char*>("UNIT_IN"), PyLong_FromLong(unitIndexFromString("in")));
689 	PyDict_SetItemString(d, const_cast<char*>("UNIT_P"), PyLong_FromLong(unitIndexFromString("p")));
690 	PyDict_SetItemString(d, const_cast<char*>("UNIT_CM"), PyLong_FromLong(unitIndexFromString("cm")));
691 	PyDict_SetItemString(d, const_cast<char*>("UNIT_C"), PyLong_FromLong(unitIndexFromString("c")));
692 	// Page orientation
693 	PyDict_SetItemString(d, const_cast<char*>("PORTRAIT"), Py_BuildValue(const_cast<char*>("i"), portraitPage));
694 	PyDict_SetItemString(d, const_cast<char*>("LANDSCAPE"), Py_BuildValue(const_cast<char*>("i"), landscapePage));
695 	// Page layout
696 	PyDict_SetItemString(d, const_cast<char*>("NOFACINGPAGES"), Py_BuildValue(const_cast<char*>("i"), 0));
697 	PyDict_SetItemString(d, const_cast<char*>("FACINGPAGES"),  Py_BuildValue(const_cast<char*>("i"), 1));
698 	// First page position
699 	PyDict_SetItemString(d, const_cast<char*>("FIRSTPAGERIGHT"), Py_BuildValue(const_cast<char*>("i"), 1));
700 	PyDict_SetItemString(d, const_cast<char*>("FIRSTPAGELEFT"), Py_BuildValue(const_cast<char*>("i"), 0));
701 	// Text horizontal alignment
702 	PyDict_SetItemString(d, const_cast<char*>("ALIGN_LEFT"), Py_BuildValue(const_cast<char*>("i"), 0));
703 	PyDict_SetItemString(d, const_cast<char*>("ALIGN_RIGHT"), Py_BuildValue(const_cast<char*>("i"), 2));
704 	PyDict_SetItemString(d, const_cast<char*>("ALIGN_CENTERED"), Py_BuildValue(const_cast<char*>("i"), 1));
705 	PyDict_SetItemString(d, const_cast<char*>("ALIGN_BLOCK"), Py_BuildValue(const_cast<char*>("i"), 3));
706 	PyDict_SetItemString(d, const_cast<char*>("ALIGN_FORCED"), Py_BuildValue(const_cast<char*>("i"), 4));
707 	// Text vertical alignment
708 	PyDict_SetItemString(d, const_cast<char*>("ALIGNV_TOP"), Py_BuildValue(const_cast<char*>("i"), 0));
709 	PyDict_SetItemString(d, const_cast<char*>("ALIGNV_CENTERED"), Py_BuildValue(const_cast<char*>("i"), 1));
710 	PyDict_SetItemString(d, const_cast<char*>("ALIGNV_BOTTOM"), Py_BuildValue(const_cast<char*>("i"), 2));
711 	// Text direction
712 	PyDict_SetItemString(d, const_cast<char*>("DIRECTION_LTR"), Py_BuildValue(const_cast<char*>("i"), 0));
713 	PyDict_SetItemString(d, const_cast<char*>("DIRECTION_RTL"), Py_BuildValue(const_cast<char*>("i"), 1));
714 	// First line offset
715 	PyDict_SetItemString(d, const_cast<char*>("FLOP_REALGLYPHHEIGHT"), Py_BuildValue(const_cast<char*>("i"), (int) FLOPRealGlyphHeight));
716 	PyDict_SetItemString(d, const_cast<char*>("FLOP_FONTASCENT"), Py_BuildValue(const_cast<char*>("i"), (int) FLOPFontAscent));
717 	PyDict_SetItemString(d, const_cast<char*>("FLOP_LINESPACING"), Py_BuildValue(const_cast<char*>("i"), (int) FLOPLineSpacing));
718 	PyDict_SetItemString(d, const_cast<char*>("FLOP_BASELINEGRID"), Py_BuildValue(const_cast<char*>("i"), (int) FLOPBaselineGrid));
719 	// Fill mode
720 	PyDict_SetItemString(d, const_cast<char*>("FILL_NOG"), Py_BuildValue(const_cast<char*>("i"), 0));
721 	PyDict_SetItemString(d, const_cast<char*>("FILL_HORIZONTALG"), Py_BuildValue(const_cast<char*>("i"), 1));
722 	PyDict_SetItemString(d, const_cast<char*>("FILL_VERTICALG"), Py_BuildValue(const_cast<char*>("i"), 2));
723 	PyDict_SetItemString(d, const_cast<char*>("FILL_DIAGONALG"), Py_BuildValue(const_cast<char*>("i"), 3));
724 	PyDict_SetItemString(d, const_cast<char*>("FILL_CROSSDIAGONALG"), Py_BuildValue(const_cast<char*>("i"), 4));
725 	PyDict_SetItemString(d, const_cast<char*>("FILL_RADIALG"), Py_BuildValue(const_cast<char*>("i"), 5));
726 	// Stroke type
727 	PyDict_SetItemString(d, const_cast<char*>("LINE_SOLID"), Py_BuildValue(const_cast<char*>("i"), Qt::SolidLine));
728 	PyDict_SetItemString(d, const_cast<char*>("LINE_DASH"), Py_BuildValue(const_cast<char*>("i"), Qt::DashLine));
729 	PyDict_SetItemString(d, const_cast<char*>("LINE_DOT"), Py_BuildValue(const_cast<char*>("i"), Qt::DotLine));
730 	PyDict_SetItemString(d, const_cast<char*>("LINE_DASHDOT"), Py_BuildValue(const_cast<char*>("i"), Qt::DashDotLine));
731 	PyDict_SetItemString(d, const_cast<char*>("LINE_DASHDOTDOT"), Py_BuildValue(const_cast<char*>("i"), Qt::DashDotDotLine));
732 	// Line join type
733 	PyDict_SetItemString(d, const_cast<char*>("JOIN_MITTER"), Py_BuildValue(const_cast<char*>("i"), Qt::MiterJoin));
734 	PyDict_SetItemString(d, const_cast<char*>("JOIN_BEVEL"), Py_BuildValue(const_cast<char*>("i"), Qt::BevelJoin));
735 	PyDict_SetItemString(d, const_cast<char*>("JOIN_ROUND"), Py_BuildValue(const_cast<char*>("i"), Qt::RoundJoin));
736 	// Line cap type
737 	PyDict_SetItemString(d, const_cast<char*>("CAP_FLAT"), Py_BuildValue(const_cast<char*>("i"), Qt::FlatCap));
738 	PyDict_SetItemString(d, const_cast<char*>("CAP_SQUARE"), Py_BuildValue(const_cast<char*>("i"), Qt::SquareCap));
739 	PyDict_SetItemString(d, const_cast<char*>("CAP_ROUND"), Py_BuildValue(const_cast<char*>("i"), Qt::RoundCap));
740 	// QMessageBox buttons
741 	PyDict_SetItemString(d, const_cast<char*>("BUTTON_NONE"), Py_BuildValue(const_cast<char*>("i"), QMessageBox::NoButton));
742 	PyDict_SetItemString(d, const_cast<char*>("BUTTON_OK"), Py_BuildValue(const_cast<char*>("i"), QMessageBox::Ok));
743 	PyDict_SetItemString(d, const_cast<char*>("BUTTON_CANCEL"), Py_BuildValue(const_cast<char*>("i"), QMessageBox::Cancel));
744 	PyDict_SetItemString(d, const_cast<char*>("BUTTON_YES"), Py_BuildValue(const_cast<char*>("i"), QMessageBox::Yes));
745 	PyDict_SetItemString(d, const_cast<char*>("BUTTON_NO"), Py_BuildValue(const_cast<char*>("i"), QMessageBox::No));
746 	PyDict_SetItemString(d, const_cast<char*>("BUTTON_ABORT"), Py_BuildValue(const_cast<char*>("i"), QMessageBox::Abort));
747 	PyDict_SetItemString(d, const_cast<char*>("BUTTON_RETRY"), Py_BuildValue(const_cast<char*>("i"), QMessageBox::Retry));
748 	PyDict_SetItemString(d, const_cast<char*>("BUTTON_IGNORE"), Py_BuildValue(const_cast<char*>("i"), QMessageBox::Ignore));
749 	PyDict_SetItemString(d, const_cast<char*>("BUTTON_DEFAULT"), Py_BuildValue(const_cast<char*>("i"), QMessageBox::Default));
750 	PyDict_SetItemString(d, const_cast<char*>("BUTTON_ESCAPE"), Py_BuildValue(const_cast<char*>("i"), QMessageBox::Escape));
751 	// QMessageBox icons
752 	PyDict_SetItemString(d, const_cast<char*>("ICON_NONE"), Py_BuildValue(const_cast<char*>("i"), QMessageBox::NoIcon));
753 	PyDict_SetItemString(d, const_cast<char*>("ICON_INFORMATION"), Py_BuildValue(const_cast<char*>("i"), QMessageBox::Information));
754 	PyDict_SetItemString(d, const_cast<char*>("ICON_WARNING"), Py_BuildValue(const_cast<char*>("i"), QMessageBox::Warning));
755 	PyDict_SetItemString(d, const_cast<char*>("ICON_CRITICAL"), Py_BuildValue(const_cast<char*>("i"), QMessageBox::Critical));
756 	// Paper formats
757 	PyDict_SetItemString(d, const_cast<char*>("PAPER_A0"), Py_BuildValue(const_cast<char*>("(ff)"), 2380.0, 3368.0));
758 	PyDict_SetItemString(d, const_cast<char*>("PAPER_A1"), Py_BuildValue(const_cast<char*>("(ff)"), 1684.0, 2380.0));
759 	PyDict_SetItemString(d, const_cast<char*>("PAPER_A2"), Py_BuildValue(const_cast<char*>("(ff)"), 1190.0, 1684.0));
760 	PyDict_SetItemString(d, const_cast<char*>("PAPER_A3"), Py_BuildValue(const_cast<char*>("(ff)"), 842.0, 1190.0));
761 	PyDict_SetItemString(d, const_cast<char*>("PAPER_A4"), Py_BuildValue(const_cast<char*>("(ff)"), 595.0, 842.0));
762 	PyDict_SetItemString(d, const_cast<char*>("PAPER_A5"), Py_BuildValue(const_cast<char*>("(ff)"), 421.0, 595.0));
763 	PyDict_SetItemString(d, const_cast<char*>("PAPER_A6"), Py_BuildValue(const_cast<char*>("(ff)"), 297.0, 421.0));
764 	PyDict_SetItemString(d, const_cast<char*>("PAPER_A7"), Py_BuildValue(const_cast<char*>("(ff)"), 210.0, 297.0));
765 	PyDict_SetItemString(d, const_cast<char*>("PAPER_A8"), Py_BuildValue(const_cast<char*>("(ff)"), 148.0, 210.0));
766 	PyDict_SetItemString(d, const_cast<char*>("PAPER_A9"), Py_BuildValue(const_cast<char*>("(ff)"), 105.0, 148.0));
767 	PyDict_SetItemString(d, const_cast<char*>("PAPER_A0_MM"), Py_BuildValue(const_cast<char*>("(ff)"), 841.0, 1189.0));
768 	PyDict_SetItemString(d, const_cast<char*>("PAPER_A1_MM"), Py_BuildValue(const_cast<char*>("(ff)"), 594.0, 841.0));
769 	PyDict_SetItemString(d, const_cast<char*>("PAPER_A2_MM"), Py_BuildValue(const_cast<char*>("(ff)"), 420.0, 594.0));
770 	PyDict_SetItemString(d, const_cast<char*>("PAPER_A3_MM"), Py_BuildValue(const_cast<char*>("(ff)"), 297.0, 420.0));
771 	PyDict_SetItemString(d, const_cast<char*>("PAPER_A4_MM"), Py_BuildValue(const_cast<char*>("(ff)"), 210.0, 297.0));
772 	PyDict_SetItemString(d, const_cast<char*>("PAPER_A5_MM"), Py_BuildValue(const_cast<char*>("(ff)"), 148.0, 210.0));
773 	PyDict_SetItemString(d, const_cast<char*>("PAPER_A6_MM"), Py_BuildValue(const_cast<char*>("(ff)"), 105.0, 148.0));
774 	PyDict_SetItemString(d, const_cast<char*>("PAPER_A7_MM"), Py_BuildValue(const_cast<char*>("(ff)"), 74.0, 105.0));
775 	PyDict_SetItemString(d, const_cast<char*>("PAPER_A8_MM"), Py_BuildValue(const_cast<char*>("(ff)"), 52.0, 74.0));
776 	PyDict_SetItemString(d, const_cast<char*>("PAPER_A9_MM"), Py_BuildValue(const_cast<char*>("(ff)"), 37.0, 52.0));
777 	PyDict_SetItemString(d, const_cast<char*>("PAPER_B0"), Py_BuildValue(const_cast<char*>("(ff)"), 2836.0, 4008.0));
778 	PyDict_SetItemString(d, const_cast<char*>("PAPER_B1"), Py_BuildValue(const_cast<char*>("(ff)"), 2004.0, 2836.0));
779 	PyDict_SetItemString(d, const_cast<char*>("PAPER_B2"), Py_BuildValue(const_cast<char*>("(ff)"), 1418.0, 2004.0));
780 	PyDict_SetItemString(d, const_cast<char*>("PAPER_B3"), Py_BuildValue(const_cast<char*>("(ff)"), 1002.0, 1418.0));
781 	PyDict_SetItemString(d, const_cast<char*>("PAPER_B4"), Py_BuildValue(const_cast<char*>("(ff)"), 709.0, 1002.0));
782 	PyDict_SetItemString(d, const_cast<char*>("PAPER_B5"), Py_BuildValue(const_cast<char*>("(ff)"), 501.0, 709.0));
783 	PyDict_SetItemString(d, const_cast<char*>("PAPER_B6"), Py_BuildValue(const_cast<char*>("(ff)"), 355.0, 501.0));
784 	PyDict_SetItemString(d, const_cast<char*>("PAPER_B7"), Py_BuildValue(const_cast<char*>("(ff)"), 250.0, 355.0));
785 	PyDict_SetItemString(d, const_cast<char*>("PAPER_B8"), Py_BuildValue(const_cast<char*>("(ff)"), 178.0, 250.0));
786 	PyDict_SetItemString(d, const_cast<char*>("PAPER_B9"), Py_BuildValue(const_cast<char*>("(ff)"), 125.0, 178.0));
787 	PyDict_SetItemString(d, const_cast<char*>("PAPER_B10"), Py_BuildValue(const_cast<char*>("(ff)"), 89.0, 125.0));
788 	PyDict_SetItemString(d, const_cast<char*>("PAPER_B0_MM"), Py_BuildValue(const_cast<char*>("(ff)"), 1000.0, 1414.0));
789 	PyDict_SetItemString(d, const_cast<char*>("PAPER_B1_MM"), Py_BuildValue(const_cast<char*>("(ff)"), 707.0, 1000.0));
790 	PyDict_SetItemString(d, const_cast<char*>("PAPER_B2_MM"), Py_BuildValue(const_cast<char*>("(ff)"), 500.0, 707.0));
791 	PyDict_SetItemString(d, const_cast<char*>("PAPER_B3_MM"), Py_BuildValue(const_cast<char*>("(ff)"), 353.0, 500.0));
792 	PyDict_SetItemString(d, const_cast<char*>("PAPER_B4_MM"), Py_BuildValue(const_cast<char*>("(ff)"), 250.0, 353.0));
793 	PyDict_SetItemString(d, const_cast<char*>("PAPER_B5_MM"), Py_BuildValue(const_cast<char*>("(ff)"), 176.0, 250.0));
794 	PyDict_SetItemString(d, const_cast<char*>("PAPER_B6_MM"), Py_BuildValue(const_cast<char*>("(ff)"), 125.0, 176.0));
795 	PyDict_SetItemString(d, const_cast<char*>("PAPER_B7_MM"), Py_BuildValue(const_cast<char*>("(ff)"), 88.0, 125.0));
796 	PyDict_SetItemString(d, const_cast<char*>("PAPER_B8_MM"), Py_BuildValue(const_cast<char*>("(ff)"), 62.0, 88.0));
797 	PyDict_SetItemString(d, const_cast<char*>("PAPER_B9_MM"), Py_BuildValue(const_cast<char*>("(ff)"), 44.0, 62.0));
798 	PyDict_SetItemString(d, const_cast<char*>("PAPER_B10_MM"), Py_BuildValue(const_cast<char*>("(ff)"), 31.0, 44.0));
799 	PyDict_SetItemString(d, const_cast<char*>("PAPER_C5E"), Py_BuildValue(const_cast<char*>("(ff)"), 462.0, 649.0));
800 	PyDict_SetItemString(d, const_cast<char*>("PAPER_COMM10E"), Py_BuildValue(const_cast<char*>("(ff)"), 298.0, 683.0));
801 	PyDict_SetItemString(d, const_cast<char*>("PAPER_DLE"),  Py_BuildValue(const_cast<char*>("(ff)"), 312.0, 624.0));
802 	PyDict_SetItemString(d, const_cast<char*>("PAPER_EXECUTIVE"), Py_BuildValue(const_cast<char*>("(ff)"), 542.0, 720.0));
803 	PyDict_SetItemString(d, const_cast<char*>("PAPER_FOLIO"), Py_BuildValue(const_cast<char*>("(ff)"), 595.0, 935.0));
804 	PyDict_SetItemString(d, const_cast<char*>("PAPER_LEDGER"), Py_BuildValue(const_cast<char*>("(ff)"), 1224.0, 792.0));
805 	PyDict_SetItemString(d, const_cast<char*>("PAPER_LEGAL"), Py_BuildValue(const_cast<char*>("(ff)"), 612.0, 1008.0));
806 	PyDict_SetItemString(d, const_cast<char*>("PAPER_LETTER"), Py_BuildValue(const_cast<char*>("(ff)"), 612.0, 792.0));
807 	PyDict_SetItemString(d, const_cast<char*>("PAPER_TABLOID"), Py_BuildValue(const_cast<char*>("(ff)"), 792.0, 1224.0));
808 	// PageItem types
809 	PyDict_SetItemString(d, const_cast<char*>("ITEMTYPE_ITEMTYPE1"),  Py_BuildValue(const_cast<char*>("i"), (int) PageItem::ItemType1));
810 	PyDict_SetItemString(d, const_cast<char*>("ITEMTYPE_IMAGEFRAME"), Py_BuildValue(const_cast<char*>("i"), (int) PageItem::ImageFrame));
811 	PyDict_SetItemString(d, const_cast<char*>("ITEMTYPE_ITEMTYPE3"),  Py_BuildValue(const_cast<char*>("i"), (int) PageItem::ItemType3));
812 	PyDict_SetItemString(d, const_cast<char*>("ITEMTYPE_TEXTFRAME"),  Py_BuildValue(const_cast<char*>("i"), (int) PageItem::TextFrame));
813 	PyDict_SetItemString(d, const_cast<char*>("ITEMTYPE_LINE"),       Py_BuildValue(const_cast<char*>("i"), (int) PageItem::Line));
814 	PyDict_SetItemString(d, const_cast<char*>("ITEMTYPE_POLYGON"),    Py_BuildValue(const_cast<char*>("i"), (int) PageItem::Polygon));
815 	PyDict_SetItemString(d, const_cast<char*>("ITEMTYPE_POLYLINE"),   Py_BuildValue(const_cast<char*>("i"), (int) PageItem::PolyLine));
816 	PyDict_SetItemString(d, const_cast<char*>("ITEMTYPE_PATHTEXT"),   Py_BuildValue(const_cast<char*>("i"), (int) PageItem::PathText));
817 	PyDict_SetItemString(d, const_cast<char*>("ITEMTYPE_LATEXFRAME"), Py_BuildValue(const_cast<char*>("i"), (int) PageItem::LatexFrame));
818 	PyDict_SetItemString(d, const_cast<char*>("ITEMTYPE_OSGFRAME"),   Py_BuildValue(const_cast<char*>("i"), (int) PageItem::OSGFrame));
819 	PyDict_SetItemString(d, const_cast<char*>("ITEMTYPE_SYMBOL"),     Py_BuildValue(const_cast<char*>("i"), (int) PageItem::Symbol));
820 	PyDict_SetItemString(d, const_cast<char*>("ITEMTYPE_GROUP"),      Py_BuildValue(const_cast<char*>("i"), (int) PageItem::Group));
821 	PyDict_SetItemString(d, const_cast<char*>("ITEMTYPE_REGULARPOLYGON"), Py_BuildValue(const_cast<char*>("i"), (int) PageItem::RegularPolygon));
822 	PyDict_SetItemString(d, const_cast<char*>("ITEMTYPE_ARC"),        Py_BuildValue(const_cast<char*>("i"), (int) PageItem::Arc));
823 	PyDict_SetItemString(d, const_cast<char*>("ITEMTYPE_SPIRAL"),     Py_BuildValue(const_cast<char*>("i"), (int) PageItem::Spiral));
824 	PyDict_SetItemString(d, const_cast<char*>("ITEMTYPE_TABLE"),      Py_BuildValue(const_cast<char*>("i"), (int) PageItem::Table));
825 	PyDict_SetItemString(d, const_cast<char*>("ITEMTYPE_NOTEFRAME"),  Py_BuildValue(const_cast<char*>("i"), (int) PageItem::NoteFrame));
826 	PyDict_SetItemString(d, const_cast<char*>("ITEMTYPE_MULTIPLE"),   Py_BuildValue(const_cast<char*>("i"), (int) PageItem::Multiple));
827 	// Colorspaces
828 	PyDict_SetItemString(d, const_cast<char*>("CSPACE_UNDEFINED"), Py_BuildValue(const_cast<char*>("i"), -1));
829 	PyDict_SetItemString(d, const_cast<char*>("CSPACE_RGB"), Py_BuildValue(const_cast<char*>("i"), 0));
830 	PyDict_SetItemString(d, const_cast<char*>("CSPACE_CMYK"), Py_BuildValue(const_cast<char*>("i"), 1));
831 	PyDict_SetItemString(d, const_cast<char*>("CSPACE_GRAY"), Py_BuildValue(const_cast<char*>("i"), 2));
832 	PyDict_SetItemString(d, const_cast<char*>("CSPACE_DUOTONE"), Py_BuildValue(const_cast<char*>("i"), 3));
833 	PyDict_SetItemString(d, const_cast<char*>("CSPACE_MONOCHROME"), Py_BuildValue(const_cast<char*>("i"), 4));
834 	// Blend modes
835 	PyDict_SetItemString(d, const_cast<char*>("NORMAL"), Py_BuildValue(const_cast<char*>("i"), 0));
836 	PyDict_SetItemString(d, const_cast<char*>("DARKEN"), Py_BuildValue(const_cast<char*>("i"), 1));
837 	PyDict_SetItemString(d, const_cast<char*>("LIGHTEN"), Py_BuildValue(const_cast<char*>("i"), 2));
838 	PyDict_SetItemString(d, const_cast<char*>("MULTIPLY"), Py_BuildValue(const_cast<char*>("i"), 3));
839 	PyDict_SetItemString(d, const_cast<char*>("SCREEN"), Py_BuildValue(const_cast<char*>("i"), 4));
840 	PyDict_SetItemString(d, const_cast<char*>("OVERLAY"), Py_BuildValue(const_cast<char*>("i"), 5));
841 	PyDict_SetItemString(d, const_cast<char*>("HARD_LIGHT"), Py_BuildValue(const_cast<char*>("i"), 6));
842 	PyDict_SetItemString(d, const_cast<char*>("SOFT_LIGHT"), Py_BuildValue(const_cast<char*>("i"), 7));
843 	PyDict_SetItemString(d, const_cast<char*>("DIFFERENCE"), Py_BuildValue(const_cast<char*>("i"), 8));
844 	PyDict_SetItemString(d, const_cast<char*>("EXCLUSION"), Py_BuildValue(const_cast<char*>("i"), 9));
845 	PyDict_SetItemString(d, const_cast<char*>("COLOR_DODGE"), Py_BuildValue(const_cast<char*>("i"), 10));
846 	PyDict_SetItemString(d, const_cast<char*>("COLOR_BURN"), Py_BuildValue(const_cast<char*>("i"), 11));
847 	PyDict_SetItemString(d, const_cast<char*>("HUE"), Py_BuildValue(const_cast<char*>("i"), 12));
848 	PyDict_SetItemString(d, const_cast<char*>("SATURATION"), Py_BuildValue(const_cast<char*>("i"), 13));
849 	PyDict_SetItemString(d, const_cast<char*>("COLOR"), Py_BuildValue(const_cast<char*>("i"), 14));
850 	PyDict_SetItemString(d, const_cast<char*>("LUMINOSITY"), Py_BuildValue(const_cast<char*>("i"), 15));
851 	// Preset page layouts
852 	PyDict_SetItemString(d, const_cast<char*>("PAGE_1"), Py_BuildValue(const_cast<char*>("i"), 0));
853 	PyDict_SetItemString(d, const_cast<char*>("PAGE_2"), Py_BuildValue(const_cast<char*>("i"), 1));
854 	PyDict_SetItemString(d, const_cast<char*>("PAGE_3"), Py_BuildValue(const_cast<char*>("i"), 2));
855 	PyDict_SetItemString(d, const_cast<char*>("PAGE_4"), Py_BuildValue(const_cast<char*>("i"), 3));
856 	// Print languages
857 	PyDict_SetItemString(d, const_cast<char*>("PRNLANG_POSTSCRIPT1"), Py_BuildValue(const_cast<char*>("i"), (int) PrintLanguage::PostScript1));
858 	PyDict_SetItemString(d, const_cast<char*>("PRNLANG_POSTSCRIPT2"), Py_BuildValue(const_cast<char*>("i"), (int) PrintLanguage::PostScript2));
859 	PyDict_SetItemString(d, const_cast<char*>("PRNLANG_POSTSCRIPT3"), Py_BuildValue(const_cast<char*>("i"), (int) PrintLanguage::PostScript3));
860 	PyDict_SetItemString(d, const_cast<char*>("PRNLANG_WINDOWSGDI"),  Py_BuildValue(const_cast<char*>("i"), (int) PrintLanguage::WindowsGDI));
861 	PyDict_SetItemString(d, const_cast<char*>("PRNLANG_PDF"),         Py_BuildValue(const_cast<char*>("i"), (int) PrintLanguage::PDF));
862 	// Tab alignment
863 	PyDict_SetItemString(d, const_cast<char*>("TAB_LEFT"), Py_BuildValue(const_cast<char*>("i"), 0));
864 	PyDict_SetItemString(d, const_cast<char*>("TAB_RIGHT"), Py_BuildValue(const_cast<char*>("i"), 1));
865 	PyDict_SetItemString(d, const_cast<char*>("TAB_PERIOD"), Py_BuildValue(const_cast<char*>("i"), 2));
866 	PyDict_SetItemString(d, const_cast<char*>("TAB_COMMA"), Py_BuildValue(const_cast<char*>("i"), 3));
867 	PyDict_SetItemString(d, const_cast<char*>("TAB_CENTER"), Py_BuildValue(const_cast<char*>("i"), 4));
868 
869 	// Measurement units understood by Scribus's units.cpp functions are exported as constant conversion
870 	// factors to be used from Python.
871 	for (int i = 0; i <= unitGetMaxIndex()-2; ++i)
872 	{
873 		PyObject* value = PyFloat_FromDouble(unitGetRatioFromIndex(i));
874 		if (!value)
875 		{
876 			initscribus_failed(__FILE__, __LINE__);
877 			return;
878 		}
879 		// `in' is a reserved word in Python so we must replace it
880 		PyObject* name;
881 		if (unitGetUntranslatedStrFromIndex(i) == "in")
882 			name = PyString_FromString("inch");
883 		else
884 			name = PyString_FromString(unitGetUntranslatedStrFromIndex(i).toLatin1().constData());
885 		if (!name)
886 		{
887 			initscribus_failed(__FILE__, __LINE__);
888 			return;
889 		}
890 		if (PyDict_SetItem(d, name, value))
891 		{
892 			initscribus_failed(__FILE__, __LINE__);
893 			return;
894 		}
895 	}
896 
897 	// Export the Scribus version into the module namespace so scripts know what they're running in
898 	PyDict_SetItemString(d, const_cast<char*>("scribus_version"), PyString_FromString(ScribusAPI::getVersion().toLatin1().constData()));
899 	// Now build a version tuple like that provided by Python in sys.version_info
900 	// The tuple is of the form (major, minor, patchlevel, extraversion, reserved)
901 	int majorVersion = ScribusAPI::getVersionMajor();
902 	int minorVersion = ScribusAPI::getVersionMinor();
903 	int patchVersion = ScribusAPI::getVersionPatch();
904 	QString extraVersion = ScribusAPI::getVersionSuffix();
905 	PyObject* versionTuple = Py_BuildValue(const_cast<char*>("(iiisi)"), majorVersion, minorVersion, patchVersion, (const char*)extraVersion.toUtf8(), 0);
906 	if (versionTuple != nullptr)
907 		PyDict_SetItemString(d, const_cast<char*>("scribus_version_info"), versionTuple);
908 	else
909 		qDebug()<<"Failed to build version tuple for version string "<< ScribusAPI::getVersion() << " in scripter";
910 
911 	// Function aliases for compatibility
912 	// We need to import the __builtins__, warnings and exceptions modules to be able to run
913 	// the generated Python functions from inside the `scribus' module's context.
914 	// This code makes it possible to extend the `scribus' module by running Python code
915 	// from C in other ways too.
916 	PyObject* builtinModule = PyImport_ImportModuleEx(const_cast<char*>("__builtin__"),
917 			d, d, Py_BuildValue(const_cast<char*>("[]")));
918 	if (builtinModule == nullptr)
919 	{
920 		qDebug("Failed to import __builtin__ module. Something is probably broken with your Python.");
921 		return;
922 	}
923 	PyDict_SetItemString(d, const_cast<char*>("__builtin__"), builtinModule);
924 	PyObject* exceptionsModule = PyImport_ImportModuleEx(const_cast<char*>("exceptions"),
925 			d, d, Py_BuildValue(const_cast<char*>("[]")));
926 	if (exceptionsModule == nullptr)
927 	{
928 		qDebug("Failed to import exceptions module. Something is probably broken with your Python.");
929 		return;
930 	}
931 	PyDict_SetItemString(d, const_cast<char*>("exceptions"), exceptionsModule);
932 	PyObject* warningsModule = PyImport_ImportModuleEx(const_cast<char*>("warnings"),
933 			d, d, Py_BuildValue(const_cast<char*>("[]")));
934 	if (warningsModule == nullptr)
935 	{
936 		qDebug("Failed to import warnings module. Something is probably broken with your Python.");
937 		return;
938 	}
939 	PyDict_SetItemString(d, const_cast<char*>("warnings"), warningsModule);
940 	// Create the module-level docstring. This can be a proper unicode string, unlike
941 	// the others, because we can just create a Unicode object and insert it in our
942 	// module dictionary.
943 	QString docstring = QObject::tr("Scribus Python interface module\n\
944 \n\
945 This module is the Python interface for Scribus. It provides functions\n\
946 to control scribus and to manipulate objects on the canvas. Each\n\
947 function is documented individually below.\n\
948 \n\
949 A few things are common across most of the interface.\n\
950 \n\
951 Most functions operate on frames. Frames are identified by their name,\n\
952 a string - they are not real Python objects. Many functions take an\n\
953 optional (non-keyword) parameter, a frame name.\n\
954 Many exceptions are also common across most functions. These are\n\
955 not currently documented in the docstring for each function.\n\
956 - Many functions will raise a NoDocOpenError if you try to use them\n\
957 without a document to operate on.\n\
958 - If you do not pass a frame name to a function that requires one,\n\
959 the function will use the currently selected frame, if any, or\n\
960 raise a NoValidObjectError if it can't find anything to operate\n\
961 on.\n\
962 - Many functions will raise WrongFrameTypeError if you try to use them\n\
963 on a frame type that they do not make sense with. For example, setting\n\
964 the text color on a graphics frame doesn't make sense, and will result\n\
965 in this exception being raised.\n\
966 - Errors resulting from calls to the underlying Python API will be\n\
967 passed through unaltered. As such, the list of exceptions thrown by\n\
968 any function as provided here and in its docstring is incomplete.\n\
969 \n\
970 Details of what exceptions each function may throw are provided on the\n\
971 function's documentation, though as with most Python code this list\n\
972 is not exhaustive due to exceptions from called functions.\n\
973 ");
974 
975 	PyObject* docStr = PyString_FromString(docstring.toUtf8().data());
976 	if (!docStr)
977 		qDebug("Failed to create module-level docstring (couldn't make str)");
978 	else
979 	{
980 		PyObject* uniDocStr = PyUnicode_FromEncodedObject(docStr, "utf-8", nullptr);
981 		Py_DECREF(docStr);
982 		docStr = nullptr;
983 		if (!uniDocStr)
984 			qDebug("Failed to create module-level docstring object (couldn't make unicode)");
985 		else
986 			PyDict_SetItemString(d, const_cast<char*>("__doc__"), uniDocStr);
987 		Py_DECREF(uniDocStr);
988 		uniDocStr = nullptr;
989 	}
990 
991 	// Wrap up pointers to the the QApp and main window and push them out
992 	// to Python.
993 	wrappedQApp = wrapQObject(qApp);
994 	if (!wrappedQApp)
995 	{
996 		qDebug("Failed to wrap up QApp");
997 		PyErr_Print();
998 	}
999 	// Push it into the module dict, stealing a ref in the process
1000 	PyDict_SetItemString(d, const_cast<char*>("qApp"), wrappedQApp);
1001 	Py_DECREF(wrappedQApp);
1002 	wrappedQApp = nullptr;
1003 
1004 	wrappedMainWindow = wrapQObject(mainWin);
1005 	if (!wrappedMainWindow)
1006 	{
1007 		qDebug("Failed to wrap up ScribusMainWindow");
1008 		PyErr_Print();
1009 	}
1010 	// Push it into the module dict, stealing a ref in the process
1011 	PyDict_SetItemString(d, const_cast<char*>("mainWindow"), wrappedMainWindow);
1012 	Py_DECREF(wrappedMainWindow);
1013 	wrappedMainWindow = nullptr;
1014 }
1015 
1016 /*! HACK: this removes "warning: 'blah' defined but not used" compiler warnings
1017 with header files structure untouched (docstrings are kept near declarations)
1018 PV */
scriptplugindocwarnings()1019 void scriptplugindocwarnings()
1020 {
1021 	QStringList s;
1022 	s <<printer__doc__<<pdffile__doc__<<imgexp__doc__<<imgexp_dpi__doc__<<imgexp_scale__doc__ << imgexp_transparentBkgnd__doc__ <<imgexp_quality__doc__<<imgexp_filename__doc__<<imgexp_type__doc__<<imgexp_alltypes__doc__ << imgexp_save__doc__ << imgexp_saveas__doc__;
1023 }
1024