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_getPluginAPIVersion()94 int scriptplugin_getPluginAPIVersion()
95 {
96 	return PLUGIN_API_VERSION;
97 }
98 
scriptplugin_getPlugin()99 ScPlugin* scriptplugin_getPlugin()
100 {
101 	scripterCore=nullptr;
102 	ScriptPlugin* plug = new ScriptPlugin();
103 	Q_CHECK_PTR(plug);
104 	return plug;
105 }
106 
scriptplugin_freePlugin(ScPlugin * plugin)107 void scriptplugin_freePlugin(ScPlugin* plugin)
108 {
109 	ScriptPlugin* plug = dynamic_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");
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 3.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.resize(2 * ph.length() + 2);
170 		memcpy(pythonHome.data(), ph.utf16(), 2 * ph.length() + 2);
171 		Py_SetPythonHome((const wchar_t*) pythonHome.constData());
172 	}
173 #endif
174 
175 	scripterCore = new ScripterCore(ScCore->primaryMainWindow());
176 	Q_CHECK_PTR(scripterCore);
177 
178 	PyImport_AppendInittab("scribus", &PyInit_scribus);
179 	Py_Initialize();
180 
181 	//initscribus(ScCore->primaryMainWindow());
182 
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_retval(PyObject *,PyObject * args)228 /*static */PyObject *scribus_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 PyLong_FromLong(0L);
240 }
241 
scribus_getval(PyObject *)242 /*static */PyObject *scribus_getval(PyObject* /*self*/)
243 {
244 	return PyUnicode_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_retval, METH_VARARGS, const_cast<char*>("Scribus internal.")},
610 	{const_cast<char*>("getval"), (PyCFunction)scribus_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 
622 struct scribus_module_state
623 {
624     PyObject *error;
625 };
626 #define GETSTATE(m) ((struct scribus_module_state*) PyModule_GetState(m))
627 
scribus_extension_traverse(PyObject * m,visitproc visit,void * arg)628 static int scribus_extension_traverse(PyObject *m, visitproc visit, void *arg)
629 {
630 	Py_VISIT(GETSTATE(m)->error);
631 	return 0;
632 }
633 
scribus_extension_clear(PyObject * m)634 static int scribus_extension_clear(PyObject *m)
635 {
636 	Py_CLEAR(GETSTATE(m)->error);
637 	return 0;
638 }
639 
640 static struct PyModuleDef scribus_module_def = {
641         PyModuleDef_HEAD_INIT,
642         "scribus",
643         NULL,
644         sizeof(struct scribus_module_state),
645         scribus_methods,
646         NULL,
647         scribus_extension_traverse,
648         scribus_extension_clear,
649         NULL
650 };
651 
initscribus_failed(const char * fileName,int lineNo)652 void initscribus_failed(const char* fileName, int lineNo)
653 {
654 	qDebug("Scripter setup failed (%s:%i)", fileName, lineNo);
655 	if (PyErr_Occurred())
656 		PyErr_Print();
657 }
658 
PyInit_scribus(void)659 PyObject* PyInit_scribus(void)
660 {
661 	ScribusMainWindow* mainWin = ScCore->primaryMainWindow();
662 	if (!scripterCore)
663 	{
664 		qWarning("scriptplugin: Tried to init scribus module, but no scripter core. Aborting.");
665 		return nullptr;
666 	}
667 
668 	int result;
669 	PyObject *m, *d;
670 
671 	PyType_Ready(&Printer_Type);
672 	PyType_Ready(&PDFfile_Type);
673 	PyType_Ready(&ImageExport_Type);
674 
675 	m = PyModule_Create(&scribus_module_def);
676 
677 	Py_INCREF(&Printer_Type);
678 	result = PyModule_AddObject(m, (char*) "Printer", (PyObject *) &Printer_Type);
679 	if (result != 0)
680 		qDebug("scriptplugin: Could not create scribus.Printer module");
681 	Py_INCREF(&PDFfile_Type);
682 	result = PyModule_AddObject(m, (char*) "PDFfile", (PyObject *) &PDFfile_Type);
683 	if (result != 0)
684 		qDebug("scriptplugin: Could not create scribus.PDFfile module");
685 	Py_INCREF(&ImageExport_Type);
686 	PyModule_AddObject(m, (char*) "ImageExport", (PyObject *) &ImageExport_Type);
687 	if (result != 0)
688 		qDebug("scriptplugin: Could not create scribus.ImageExport module");
689 	d = PyModule_GetDict(m);
690 
691 	// Set up the module exceptions
692 	// common exc.
693 	ScribusException = PyErr_NewException((char*) "scribus.ScribusException", nullptr, nullptr);
694 	Py_INCREF(ScribusException);
695 	PyModule_AddObject(m, (char*) "ScribusException", ScribusException);
696 	// no doc open
697 	NoDocOpenError = PyErr_NewException((char*) "scribus.NoDocOpenError", ScribusException, nullptr);
698 	Py_INCREF(NoDocOpenError);
699 	PyModule_AddObject(m, (char*) "NoDocOpenError", NoDocOpenError);
700 	// wrong type of frame for operation
701 	WrongFrameTypeError = PyErr_NewException((char*) "scribus.WrongFrameTypeError", ScribusException, nullptr);
702 	Py_INCREF(WrongFrameTypeError);
703 	PyModule_AddObject(m, (char*) "WrongFrameTypeError", WrongFrameTypeError);
704 	// Couldn't find named object, or no named object and no selection
705 	NoValidObjectError = PyErr_NewException((char*) "scribus.NoValidObjectError", ScribusException, nullptr);
706 	Py_INCREF(NoValidObjectError);
707 	PyModule_AddObject(m, (char*) "NoValidObjectError", NoValidObjectError);
708 	// Couldn't find the specified resource - font, color, etc.
709 	NotFoundError = PyErr_NewException((char*) "scribus.NotFoundError", ScribusException, nullptr);
710 	Py_INCREF(NotFoundError);
711 	PyModule_AddObject(m, (char*) "NotFoundError", NotFoundError);
712 	// Tried to create an object with the same name as one that already exists
713 	NameExistsError = PyErr_NewException((char*) "scribus.NameExistsError", ScribusException, nullptr);
714 	Py_INCREF(NameExistsError);
715 	PyModule_AddObject(m, (char*) "NameExistsError", NameExistsError);
716 	// Done with exception setup
717 
718 	// CONSTANTS
719 	// Units
720 	PyDict_SetItemString(d, const_cast<char*>("UNIT_POINTS"), PyLong_FromLong(unitIndexFromString("pt")));
721 	PyDict_SetItemString(d, const_cast<char*>("UNIT_MILLIMETERS"), PyLong_FromLong(unitIndexFromString("mm")));
722 	PyDict_SetItemString(d, const_cast<char*>("UNIT_INCHES"), PyLong_FromLong(unitIndexFromString("in")));
723 	PyDict_SetItemString(d, const_cast<char*>("UNIT_PICAS"), PyLong_FromLong(unitIndexFromString("p")));
724 	PyDict_SetItemString(d, const_cast<char*>("UNIT_CENTIMETRES"), PyLong_FromLong(unitIndexFromString("cm")));
725 	PyDict_SetItemString(d, const_cast<char*>("UNIT_CICERO"), PyLong_FromLong(unitIndexFromString("c")));
726 	PyDict_SetItemString(d, const_cast<char*>("UNIT_PT"), PyLong_FromLong(unitIndexFromString("pt")));
727 	PyDict_SetItemString(d, const_cast<char*>("UNIT_MM"), PyLong_FromLong(unitIndexFromString("mm")));
728 	PyDict_SetItemString(d, const_cast<char*>("UNIT_IN"), PyLong_FromLong(unitIndexFromString("in")));
729 	PyDict_SetItemString(d, const_cast<char*>("UNIT_P"), PyLong_FromLong(unitIndexFromString("p")));
730 	PyDict_SetItemString(d, const_cast<char*>("UNIT_CM"), PyLong_FromLong(unitIndexFromString("cm")));
731 	PyDict_SetItemString(d, const_cast<char*>("UNIT_C"), PyLong_FromLong(unitIndexFromString("c")));
732 	// Page orientation
733 	PyDict_SetItemString(d, const_cast<char*>("PORTRAIT"), Py_BuildValue(const_cast<char*>("i"), portraitPage));
734 	PyDict_SetItemString(d, const_cast<char*>("LANDSCAPE"), Py_BuildValue(const_cast<char*>("i"), landscapePage));
735 	// Page layout
736 	PyDict_SetItemString(d, const_cast<char*>("NOFACINGPAGES"), Py_BuildValue(const_cast<char*>("i"), 0));
737 	PyDict_SetItemString(d, const_cast<char*>("FACINGPAGES"),  Py_BuildValue(const_cast<char*>("i"), 1));
738 	// First page position
739 	PyDict_SetItemString(d, const_cast<char*>("FIRSTPAGERIGHT"), Py_BuildValue(const_cast<char*>("i"), 1));
740 	PyDict_SetItemString(d, const_cast<char*>("FIRSTPAGELEFT"), Py_BuildValue(const_cast<char*>("i"), 0));
741 	// Text horizontal alignment
742 	PyDict_SetItemString(d, const_cast<char*>("ALIGN_LEFT"), Py_BuildValue(const_cast<char*>("i"), 0));
743 	PyDict_SetItemString(d, const_cast<char*>("ALIGN_RIGHT"), Py_BuildValue(const_cast<char*>("i"), 2));
744 	PyDict_SetItemString(d, const_cast<char*>("ALIGN_CENTERED"), Py_BuildValue(const_cast<char*>("i"), 1));
745 	PyDict_SetItemString(d, const_cast<char*>("ALIGN_BLOCK"), Py_BuildValue(const_cast<char*>("i"), 3));
746 	PyDict_SetItemString(d, const_cast<char*>("ALIGN_FORCED"), Py_BuildValue(const_cast<char*>("i"), 4));
747 	// Text vertical alignment
748 	PyDict_SetItemString(d, const_cast<char*>("ALIGNV_TOP"), Py_BuildValue(const_cast<char*>("i"), 0));
749 	PyDict_SetItemString(d, const_cast<char*>("ALIGNV_CENTERED"), Py_BuildValue(const_cast<char*>("i"), 1));
750 	PyDict_SetItemString(d, const_cast<char*>("ALIGNV_BOTTOM"), Py_BuildValue(const_cast<char*>("i"), 2));
751 	// Text direction
752 	PyDict_SetItemString(d, const_cast<char*>("DIRECTION_LTR"), Py_BuildValue(const_cast<char*>("i"), 0));
753 	PyDict_SetItemString(d, const_cast<char*>("DIRECTION_RTL"), Py_BuildValue(const_cast<char*>("i"), 1));
754 	// First line offset
755 	PyDict_SetItemString(d, const_cast<char*>("FLOP_REALGLYPHHEIGHT"), Py_BuildValue(const_cast<char*>("i"), (int) FLOPRealGlyphHeight));
756 	PyDict_SetItemString(d, const_cast<char*>("FLOP_FONTASCENT"), Py_BuildValue(const_cast<char*>("i"), (int) FLOPFontAscent));
757 	PyDict_SetItemString(d, const_cast<char*>("FLOP_LINESPACING"), Py_BuildValue(const_cast<char*>("i"), (int) FLOPLineSpacing));
758 	PyDict_SetItemString(d, const_cast<char*>("FLOP_BASELINEGRID"), Py_BuildValue(const_cast<char*>("i"), (int) FLOPBaselineGrid));
759 	// Fill mode
760 	PyDict_SetItemString(d, const_cast<char*>("FILL_NOG"), Py_BuildValue(const_cast<char*>("i"), 0));
761 	PyDict_SetItemString(d, const_cast<char*>("FILL_HORIZONTALG"), Py_BuildValue(const_cast<char*>("i"), 1));
762 	PyDict_SetItemString(d, const_cast<char*>("FILL_VERTICALG"), Py_BuildValue(const_cast<char*>("i"), 2));
763 	PyDict_SetItemString(d, const_cast<char*>("FILL_DIAGONALG"), Py_BuildValue(const_cast<char*>("i"), 3));
764 	PyDict_SetItemString(d, const_cast<char*>("FILL_CROSSDIAGONALG"), Py_BuildValue(const_cast<char*>("i"), 4));
765 	PyDict_SetItemString(d, const_cast<char*>("FILL_RADIALG"), Py_BuildValue(const_cast<char*>("i"), 5));
766 	// Stroke type
767 	PyDict_SetItemString(d, const_cast<char*>("LINE_SOLID"), Py_BuildValue(const_cast<char*>("i"), Qt::SolidLine));
768 	PyDict_SetItemString(d, const_cast<char*>("LINE_DASH"), Py_BuildValue(const_cast<char*>("i"), Qt::DashLine));
769 	PyDict_SetItemString(d, const_cast<char*>("LINE_DOT"), Py_BuildValue(const_cast<char*>("i"), Qt::DotLine));
770 	PyDict_SetItemString(d, const_cast<char*>("LINE_DASHDOT"), Py_BuildValue(const_cast<char*>("i"), Qt::DashDotLine));
771 	PyDict_SetItemString(d, const_cast<char*>("LINE_DASHDOTDOT"), Py_BuildValue(const_cast<char*>("i"), Qt::DashDotDotLine));
772 	// Line join type
773 	PyDict_SetItemString(d, const_cast<char*>("JOIN_MITTER"), Py_BuildValue(const_cast<char*>("i"), Qt::MiterJoin));
774 	PyDict_SetItemString(d, const_cast<char*>("JOIN_BEVEL"), Py_BuildValue(const_cast<char*>("i"), Qt::BevelJoin));
775 	PyDict_SetItemString(d, const_cast<char*>("JOIN_ROUND"), Py_BuildValue(const_cast<char*>("i"), Qt::RoundJoin));
776 	// Line cap type
777 	PyDict_SetItemString(d, const_cast<char*>("CAP_FLAT"), Py_BuildValue(const_cast<char*>("i"), Qt::FlatCap));
778 	PyDict_SetItemString(d, const_cast<char*>("CAP_SQUARE"), Py_BuildValue(const_cast<char*>("i"), Qt::SquareCap));
779 	PyDict_SetItemString(d, const_cast<char*>("CAP_ROUND"), Py_BuildValue(const_cast<char*>("i"), Qt::RoundCap));
780 	// QMessageBox buttons
781 	PyDict_SetItemString(d, const_cast<char*>("BUTTON_NONE"), Py_BuildValue(const_cast<char*>("i"), QMessageBox::NoButton));
782 	PyDict_SetItemString(d, const_cast<char*>("BUTTON_OK"), Py_BuildValue(const_cast<char*>("i"), QMessageBox::Ok));
783 	PyDict_SetItemString(d, const_cast<char*>("BUTTON_CANCEL"), Py_BuildValue(const_cast<char*>("i"), QMessageBox::Cancel));
784 	PyDict_SetItemString(d, const_cast<char*>("BUTTON_YES"), Py_BuildValue(const_cast<char*>("i"), QMessageBox::Yes));
785 	PyDict_SetItemString(d, const_cast<char*>("BUTTON_NO"), Py_BuildValue(const_cast<char*>("i"), QMessageBox::No));
786 	PyDict_SetItemString(d, const_cast<char*>("BUTTON_ABORT"), Py_BuildValue(const_cast<char*>("i"), QMessageBox::Abort));
787 	PyDict_SetItemString(d, const_cast<char*>("BUTTON_RETRY"), Py_BuildValue(const_cast<char*>("i"), QMessageBox::Retry));
788 	PyDict_SetItemString(d, const_cast<char*>("BUTTON_IGNORE"), Py_BuildValue(const_cast<char*>("i"), QMessageBox::Ignore));
789 	PyDict_SetItemString(d, const_cast<char*>("BUTTON_DEFAULT"), Py_BuildValue(const_cast<char*>("i"), QMessageBox::Default));
790 	PyDict_SetItemString(d, const_cast<char*>("BUTTON_ESCAPE"), Py_BuildValue(const_cast<char*>("i"), QMessageBox::Escape));
791 	// QMessageBox icons
792 	PyDict_SetItemString(d, const_cast<char*>("ICON_NONE"), Py_BuildValue(const_cast<char*>("i"), QMessageBox::NoIcon));
793 	PyDict_SetItemString(d, const_cast<char*>("ICON_INFORMATION"), Py_BuildValue(const_cast<char*>("i"), QMessageBox::Information));
794 	PyDict_SetItemString(d, const_cast<char*>("ICON_WARNING"), Py_BuildValue(const_cast<char*>("i"), QMessageBox::Warning));
795 	PyDict_SetItemString(d, const_cast<char*>("ICON_CRITICAL"), Py_BuildValue(const_cast<char*>("i"), QMessageBox::Critical));
796 	// Paper formats
797 	PyDict_SetItemString(d, const_cast<char*>("PAPER_A0"), Py_BuildValue(const_cast<char*>("(ff)"), 2380.0, 3368.0));
798 	PyDict_SetItemString(d, const_cast<char*>("PAPER_A1"), Py_BuildValue(const_cast<char*>("(ff)"), 1684.0, 2380.0));
799 	PyDict_SetItemString(d, const_cast<char*>("PAPER_A2"), Py_BuildValue(const_cast<char*>("(ff)"), 1190.0, 1684.0));
800 	PyDict_SetItemString(d, const_cast<char*>("PAPER_A3"), Py_BuildValue(const_cast<char*>("(ff)"), 842.0, 1190.0));
801 	PyDict_SetItemString(d, const_cast<char*>("PAPER_A4"), Py_BuildValue(const_cast<char*>("(ff)"), 595.0, 842.0));
802 	PyDict_SetItemString(d, const_cast<char*>("PAPER_A5"), Py_BuildValue(const_cast<char*>("(ff)"), 421.0, 595.0));
803 	PyDict_SetItemString(d, const_cast<char*>("PAPER_A6"), Py_BuildValue(const_cast<char*>("(ff)"), 297.0, 421.0));
804 	PyDict_SetItemString(d, const_cast<char*>("PAPER_A7"), Py_BuildValue(const_cast<char*>("(ff)"), 210.0, 297.0));
805 	PyDict_SetItemString(d, const_cast<char*>("PAPER_A8"), Py_BuildValue(const_cast<char*>("(ff)"), 148.0, 210.0));
806 	PyDict_SetItemString(d, const_cast<char*>("PAPER_A9"), Py_BuildValue(const_cast<char*>("(ff)"), 105.0, 148.0));
807 	PyDict_SetItemString(d, const_cast<char*>("PAPER_A0_MM"), Py_BuildValue(const_cast<char*>("(ff)"), 841.0, 1189.0));
808 	PyDict_SetItemString(d, const_cast<char*>("PAPER_A1_MM"), Py_BuildValue(const_cast<char*>("(ff)"), 594.0, 841.0));
809 	PyDict_SetItemString(d, const_cast<char*>("PAPER_A2_MM"), Py_BuildValue(const_cast<char*>("(ff)"), 420.0, 594.0));
810 	PyDict_SetItemString(d, const_cast<char*>("PAPER_A3_MM"), Py_BuildValue(const_cast<char*>("(ff)"), 297.0, 420.0));
811 	PyDict_SetItemString(d, const_cast<char*>("PAPER_A4_MM"), Py_BuildValue(const_cast<char*>("(ff)"), 210.0, 297.0));
812 	PyDict_SetItemString(d, const_cast<char*>("PAPER_A5_MM"), Py_BuildValue(const_cast<char*>("(ff)"), 148.0, 210.0));
813 	PyDict_SetItemString(d, const_cast<char*>("PAPER_A6_MM"), Py_BuildValue(const_cast<char*>("(ff)"), 105.0, 148.0));
814 	PyDict_SetItemString(d, const_cast<char*>("PAPER_A7_MM"), Py_BuildValue(const_cast<char*>("(ff)"), 74.0, 105.0));
815 	PyDict_SetItemString(d, const_cast<char*>("PAPER_A8_MM"), Py_BuildValue(const_cast<char*>("(ff)"), 52.0, 74.0));
816 	PyDict_SetItemString(d, const_cast<char*>("PAPER_A9_MM"), Py_BuildValue(const_cast<char*>("(ff)"), 37.0, 52.0));
817 	PyDict_SetItemString(d, const_cast<char*>("PAPER_B0"), Py_BuildValue(const_cast<char*>("(ff)"), 2836.0, 4008.0));
818 	PyDict_SetItemString(d, const_cast<char*>("PAPER_B1"), Py_BuildValue(const_cast<char*>("(ff)"), 2004.0, 2836.0));
819 	PyDict_SetItemString(d, const_cast<char*>("PAPER_B2"), Py_BuildValue(const_cast<char*>("(ff)"), 1418.0, 2004.0));
820 	PyDict_SetItemString(d, const_cast<char*>("PAPER_B3"), Py_BuildValue(const_cast<char*>("(ff)"), 1002.0, 1418.0));
821 	PyDict_SetItemString(d, const_cast<char*>("PAPER_B4"), Py_BuildValue(const_cast<char*>("(ff)"), 709.0, 1002.0));
822 	PyDict_SetItemString(d, const_cast<char*>("PAPER_B5"), Py_BuildValue(const_cast<char*>("(ff)"), 501.0, 709.0));
823 	PyDict_SetItemString(d, const_cast<char*>("PAPER_B6"), Py_BuildValue(const_cast<char*>("(ff)"), 355.0, 501.0));
824 	PyDict_SetItemString(d, const_cast<char*>("PAPER_B7"), Py_BuildValue(const_cast<char*>("(ff)"), 250.0, 355.0));
825 	PyDict_SetItemString(d, const_cast<char*>("PAPER_B8"), Py_BuildValue(const_cast<char*>("(ff)"), 178.0, 250.0));
826 	PyDict_SetItemString(d, const_cast<char*>("PAPER_B9"), Py_BuildValue(const_cast<char*>("(ff)"), 125.0, 178.0));
827 	PyDict_SetItemString(d, const_cast<char*>("PAPER_B10"), Py_BuildValue(const_cast<char*>("(ff)"), 89.0, 125.0));
828 	PyDict_SetItemString(d, const_cast<char*>("PAPER_B0_MM"), Py_BuildValue(const_cast<char*>("(ff)"), 1000.0, 1414.0));
829 	PyDict_SetItemString(d, const_cast<char*>("PAPER_B1_MM"), Py_BuildValue(const_cast<char*>("(ff)"), 707.0, 1000.0));
830 	PyDict_SetItemString(d, const_cast<char*>("PAPER_B2_MM"), Py_BuildValue(const_cast<char*>("(ff)"), 500.0, 707.0));
831 	PyDict_SetItemString(d, const_cast<char*>("PAPER_B3_MM"), Py_BuildValue(const_cast<char*>("(ff)"), 353.0, 500.0));
832 	PyDict_SetItemString(d, const_cast<char*>("PAPER_B4_MM"), Py_BuildValue(const_cast<char*>("(ff)"), 250.0, 353.0));
833 	PyDict_SetItemString(d, const_cast<char*>("PAPER_B5_MM"), Py_BuildValue(const_cast<char*>("(ff)"), 176.0, 250.0));
834 	PyDict_SetItemString(d, const_cast<char*>("PAPER_B6_MM"), Py_BuildValue(const_cast<char*>("(ff)"), 125.0, 176.0));
835 	PyDict_SetItemString(d, const_cast<char*>("PAPER_B7_MM"), Py_BuildValue(const_cast<char*>("(ff)"), 88.0, 125.0));
836 	PyDict_SetItemString(d, const_cast<char*>("PAPER_B8_MM"), Py_BuildValue(const_cast<char*>("(ff)"), 62.0, 88.0));
837 	PyDict_SetItemString(d, const_cast<char*>("PAPER_B9_MM"), Py_BuildValue(const_cast<char*>("(ff)"), 44.0, 62.0));
838 	PyDict_SetItemString(d, const_cast<char*>("PAPER_B10_MM"), Py_BuildValue(const_cast<char*>("(ff)"), 31.0, 44.0));
839 	PyDict_SetItemString(d, const_cast<char*>("PAPER_C5E"), Py_BuildValue(const_cast<char*>("(ff)"), 462.0, 649.0));
840 	PyDict_SetItemString(d, const_cast<char*>("PAPER_COMM10E"), Py_BuildValue(const_cast<char*>("(ff)"), 298.0, 683.0));
841 	PyDict_SetItemString(d, const_cast<char*>("PAPER_DLE"),  Py_BuildValue(const_cast<char*>("(ff)"), 312.0, 624.0));
842 	PyDict_SetItemString(d, const_cast<char*>("PAPER_EXECUTIVE"), Py_BuildValue(const_cast<char*>("(ff)"), 542.0, 720.0));
843 	PyDict_SetItemString(d, const_cast<char*>("PAPER_FOLIO"), Py_BuildValue(const_cast<char*>("(ff)"), 595.0, 935.0));
844 	PyDict_SetItemString(d, const_cast<char*>("PAPER_LEDGER"), Py_BuildValue(const_cast<char*>("(ff)"), 1224.0, 792.0));
845 	PyDict_SetItemString(d, const_cast<char*>("PAPER_LEGAL"), Py_BuildValue(const_cast<char*>("(ff)"), 612.0, 1008.0));
846 	PyDict_SetItemString(d, const_cast<char*>("PAPER_LETTER"), Py_BuildValue(const_cast<char*>("(ff)"), 612.0, 792.0));
847 	PyDict_SetItemString(d, const_cast<char*>("PAPER_TABLOID"), Py_BuildValue(const_cast<char*>("(ff)"), 792.0, 1224.0));
848 	// PageItem types
849 	PyDict_SetItemString(d, const_cast<char*>("ITEMTYPE_ITEMTYPE1"),  Py_BuildValue(const_cast<char*>("i"), (int) PageItem::ItemType1));
850 	PyDict_SetItemString(d, const_cast<char*>("ITEMTYPE_IMAGEFRAME"), Py_BuildValue(const_cast<char*>("i"), (int) PageItem::ImageFrame));
851 	PyDict_SetItemString(d, const_cast<char*>("ITEMTYPE_ITEMTYPE3"),  Py_BuildValue(const_cast<char*>("i"), (int) PageItem::ItemType3));
852 	PyDict_SetItemString(d, const_cast<char*>("ITEMTYPE_TEXTFRAME"),  Py_BuildValue(const_cast<char*>("i"), (int) PageItem::TextFrame));
853 	PyDict_SetItemString(d, const_cast<char*>("ITEMTYPE_LINE"),       Py_BuildValue(const_cast<char*>("i"), (int) PageItem::Line));
854 	PyDict_SetItemString(d, const_cast<char*>("ITEMTYPE_POLYGON"),    Py_BuildValue(const_cast<char*>("i"), (int) PageItem::Polygon));
855 	PyDict_SetItemString(d, const_cast<char*>("ITEMTYPE_POLYLINE"),   Py_BuildValue(const_cast<char*>("i"), (int) PageItem::PolyLine));
856 	PyDict_SetItemString(d, const_cast<char*>("ITEMTYPE_PATHTEXT"),   Py_BuildValue(const_cast<char*>("i"), (int) PageItem::PathText));
857 	PyDict_SetItemString(d, const_cast<char*>("ITEMTYPE_LATEXFRAME"), Py_BuildValue(const_cast<char*>("i"), (int) PageItem::LatexFrame));
858 	PyDict_SetItemString(d, const_cast<char*>("ITEMTYPE_OSGFRAME"),   Py_BuildValue(const_cast<char*>("i"), (int) PageItem::OSGFrame));
859 	PyDict_SetItemString(d, const_cast<char*>("ITEMTYPE_SYMBOL"),     Py_BuildValue(const_cast<char*>("i"), (int) PageItem::Symbol));
860 	PyDict_SetItemString(d, const_cast<char*>("ITEMTYPE_GROUP"),      Py_BuildValue(const_cast<char*>("i"), (int) PageItem::Group));
861 	PyDict_SetItemString(d, const_cast<char*>("ITEMTYPE_REGULARPOLYGON"), Py_BuildValue(const_cast<char*>("i"), (int) PageItem::RegularPolygon));
862 	PyDict_SetItemString(d, const_cast<char*>("ITEMTYPE_ARC"),        Py_BuildValue(const_cast<char*>("i"), (int) PageItem::Arc));
863 	PyDict_SetItemString(d, const_cast<char*>("ITEMTYPE_SPIRAL"),     Py_BuildValue(const_cast<char*>("i"), (int) PageItem::Spiral));
864 	PyDict_SetItemString(d, const_cast<char*>("ITEMTYPE_TABLE"),      Py_BuildValue(const_cast<char*>("i"), (int) PageItem::Table));
865 	PyDict_SetItemString(d, const_cast<char*>("ITEMTYPE_NOTEFRAME"),  Py_BuildValue(const_cast<char*>("i"), (int) PageItem::NoteFrame));
866 	PyDict_SetItemString(d, const_cast<char*>("ITEMTYPE_MULTIPLE"),   Py_BuildValue(const_cast<char*>("i"), (int) PageItem::Multiple));
867 	// Colorspaces
868 	PyDict_SetItemString(d, const_cast<char*>("CSPACE_UNDEFINED"), Py_BuildValue(const_cast<char*>("i"), -1));
869 	PyDict_SetItemString(d, const_cast<char*>("CSPACE_RGB"), Py_BuildValue(const_cast<char*>("i"), 0));
870 	PyDict_SetItemString(d, const_cast<char*>("CSPACE_CMYK"), Py_BuildValue(const_cast<char*>("i"), 1));
871 	PyDict_SetItemString(d, const_cast<char*>("CSPACE_GRAY"), Py_BuildValue(const_cast<char*>("i"), 2));
872 	PyDict_SetItemString(d, const_cast<char*>("CSPACE_DUOTONE"), Py_BuildValue(const_cast<char*>("i"), 3));
873 	PyDict_SetItemString(d, const_cast<char*>("CSPACE_MONOCHROME"), Py_BuildValue(const_cast<char*>("i"), 4));
874 	// Blend modes
875 	PyDict_SetItemString(d, const_cast<char*>("NORMAL"), Py_BuildValue(const_cast<char*>("i"), 0));
876 	PyDict_SetItemString(d, const_cast<char*>("DARKEN"), Py_BuildValue(const_cast<char*>("i"), 1));
877 	PyDict_SetItemString(d, const_cast<char*>("LIGHTEN"), Py_BuildValue(const_cast<char*>("i"), 2));
878 	PyDict_SetItemString(d, const_cast<char*>("MULTIPLY"), Py_BuildValue(const_cast<char*>("i"), 3));
879 	PyDict_SetItemString(d, const_cast<char*>("SCREEN"), Py_BuildValue(const_cast<char*>("i"), 4));
880 	PyDict_SetItemString(d, const_cast<char*>("OVERLAY"), Py_BuildValue(const_cast<char*>("i"), 5));
881 	PyDict_SetItemString(d, const_cast<char*>("HARD_LIGHT"), Py_BuildValue(const_cast<char*>("i"), 6));
882 	PyDict_SetItemString(d, const_cast<char*>("SOFT_LIGHT"), Py_BuildValue(const_cast<char*>("i"), 7));
883 	PyDict_SetItemString(d, const_cast<char*>("DIFFERENCE"), Py_BuildValue(const_cast<char*>("i"), 8));
884 	PyDict_SetItemString(d, const_cast<char*>("EXCLUSION"), Py_BuildValue(const_cast<char*>("i"), 9));
885 	PyDict_SetItemString(d, const_cast<char*>("COLOR_DODGE"), Py_BuildValue(const_cast<char*>("i"), 10));
886 	PyDict_SetItemString(d, const_cast<char*>("COLOR_BURN"), Py_BuildValue(const_cast<char*>("i"), 11));
887 	PyDict_SetItemString(d, const_cast<char*>("HUE"), Py_BuildValue(const_cast<char*>("i"), 12));
888 	PyDict_SetItemString(d, const_cast<char*>("SATURATION"), Py_BuildValue(const_cast<char*>("i"), 13));
889 	PyDict_SetItemString(d, const_cast<char*>("COLOR"), Py_BuildValue(const_cast<char*>("i"), 14));
890 	PyDict_SetItemString(d, const_cast<char*>("LUMINOSITY"), Py_BuildValue(const_cast<char*>("i"), 15));
891 	// Preset page layouts
892 	PyDict_SetItemString(d, const_cast<char*>("PAGE_1"), Py_BuildValue(const_cast<char*>("i"), 0));
893 	PyDict_SetItemString(d, const_cast<char*>("PAGE_2"), Py_BuildValue(const_cast<char*>("i"), 1));
894 	PyDict_SetItemString(d, const_cast<char*>("PAGE_3"), Py_BuildValue(const_cast<char*>("i"), 2));
895 	PyDict_SetItemString(d, const_cast<char*>("PAGE_4"), Py_BuildValue(const_cast<char*>("i"), 3));
896 	// Print languages
897 	PyDict_SetItemString(d, const_cast<char*>("PRNLANG_POSTSCRIPT1"), Py_BuildValue(const_cast<char*>("i"), (int) PrintLanguage::PostScript1));
898 	PyDict_SetItemString(d, const_cast<char*>("PRNLANG_POSTSCRIPT2"), Py_BuildValue(const_cast<char*>("i"), (int) PrintLanguage::PostScript2));
899 	PyDict_SetItemString(d, const_cast<char*>("PRNLANG_POSTSCRIPT3"), Py_BuildValue(const_cast<char*>("i"), (int) PrintLanguage::PostScript3));
900 	PyDict_SetItemString(d, const_cast<char*>("PRNLANG_WINDOWSGDI"),  Py_BuildValue(const_cast<char*>("i"), (int) PrintLanguage::WindowsGDI));
901 	PyDict_SetItemString(d, const_cast<char*>("PRNLANG_PDF"),         Py_BuildValue(const_cast<char*>("i"), (int) PrintLanguage::PDF));
902 	// Tab alignment
903 	PyDict_SetItemString(d, const_cast<char*>("TAB_LEFT"), Py_BuildValue(const_cast<char*>("i"), 0));
904 	PyDict_SetItemString(d, const_cast<char*>("TAB_RIGHT"), Py_BuildValue(const_cast<char*>("i"), 1));
905 	PyDict_SetItemString(d, const_cast<char*>("TAB_PERIOD"), Py_BuildValue(const_cast<char*>("i"), 2));
906 	PyDict_SetItemString(d, const_cast<char*>("TAB_COMMA"), Py_BuildValue(const_cast<char*>("i"), 3));
907 	PyDict_SetItemString(d, const_cast<char*>("TAB_CENTER"), Py_BuildValue(const_cast<char*>("i"), 4));
908 
909 	// Measurement units understood by Scribus's units.cpp functions are exported as constant conversion
910 	// factors to be used from Python.
911 	for (int i = 0; i <= unitGetMaxIndex()-2; ++i)
912 	{
913 		PyObject* value = PyFloat_FromDouble(unitGetRatioFromIndex(i));
914 		if (!value)
915 		{
916 			initscribus_failed(__FILE__, __LINE__);
917 			return nullptr;
918 		}
919 		// `in' is a reserved word in Python so we must replace it
920 		PyObject* name;
921 		if (unitGetUntranslatedStrFromIndex(i) == "in")
922 			name = PyUnicode_FromString("inch");
923 		else
924 			name = PyUnicode_FromString(unitGetUntranslatedStrFromIndex(i).toUtf8().constData());
925 		if (!name)
926 		{
927 			initscribus_failed(__FILE__, __LINE__);
928 			return nullptr;
929 		}
930 		if (PyDict_SetItem(d, name, value))
931 		{
932 			initscribus_failed(__FILE__, __LINE__);
933 			return nullptr;
934 		}
935 	}
936 
937 	// Export the Scribus version into the module namespace so scripts know what they're running in
938 	PyDict_SetItemString(d, const_cast<char*>("scribus_version"), PyUnicode_FromString(ScribusAPI::getVersion().toLatin1().constData()));
939 	// Now build a version tuple like that provided by Python in sys.version_info
940 	// The tuple is of the form (major, minor, patchlevel, extraversion, reserved)
941 	int majorVersion = ScribusAPI::getVersionMajor();
942 	int minorVersion = ScribusAPI::getVersionMinor();
943 	int patchVersion = ScribusAPI::getVersionPatch();
944 	QString extraVersion = ScribusAPI::getVersionSuffix();
945 
946 	PyObject* versionTuple = Py_BuildValue(const_cast<char*>("(iiisi)"), majorVersion, minorVersion, patchVersion, (const char*)extraVersion.toUtf8(), 0);
947 	if (versionTuple != nullptr)
948 		PyDict_SetItemString(d, const_cast<char*>("scribus_version_info"), versionTuple);
949 	else
950 		qDebug("Failed to build version tuple for version string '%s' in scripter", VERSION);
951 
952 
953 	// Function aliases for compatibility
954 	// We need to import the __builtins__, warnings and exceptions modules to be able to run
955 	// the generated Python functions from inside the `scribus' module's context.
956 	// This code makes it possible to extend the `scribus' module by running Python code
957 	// from C in other ways too.
958 	PyObject* builtinModule = PyImport_ImportModuleEx(const_cast<char*>("builtins"),
959 			d, d, Py_BuildValue(const_cast<char*>("[]")));
960 	if (builtinModule == nullptr)
961 	{
962 		qDebug("Failed to import builtins module. Something is probably broken with your Python.");
963 		return nullptr;
964 	}
965 	PyDict_SetItemString(d, const_cast<char*>("builtins"), builtinModule);
966 	PyObject* warningsModule = PyImport_ImportModuleEx(const_cast<char*>("warnings"),
967 			d, d, Py_BuildValue(const_cast<char*>("[]")));
968 	if (warningsModule == nullptr)
969 	{
970 		qDebug("Failed to import warnings module. Something is probably broken with your Python.");
971 		return nullptr;
972 	}
973 	PyDict_SetItemString(d, const_cast<char*>("warnings"), warningsModule);
974 	// Create the module-level docstring. This can be a proper unicode string, unlike
975 	// the others, because we can just create a Unicode object and insert it in our
976 	// module dictionary.
977 	QString docstring = QObject::tr("Scribus Python interface module\n\
978 \n\
979 This module is the Python interface for Scribus. It provides functions\n\
980 to control scribus and to manipulate objects on the canvas. Each\n\
981 function is documented individually below.\n\
982 \n\
983 A few things are common across most of the interface.\n\
984 \n\
985 Most functions operate on frames. Frames are identified by their name,\n\
986 a string - they are not real Python objects. Many functions take an\n\
987 optional (non-keyword) parameter, a frame name.\n\
988 Many exceptions are also common across most functions. These are\n\
989 not currently documented in the docstring for each function.\n\
990 - Many functions will raise a NoDocOpenError if you try to use them\n\
991 without a document to operate on.\n\
992 - If you do not pass a frame name to a function that requires one,\n\
993 the function will use the currently selected frame, if any, or\n\
994 raise a NoValidObjectError if it can't find anything to operate\n\
995 on.\n\
996 - Many functions will raise WrongFrameTypeError if you try to use them\n\
997 on a frame type that they do not make sense with. For example, setting\n\
998 the text color on a graphics frame doesn't make sense, and will result\n\
999 in this exception being raised.\n\
1000 - Errors resulting from calls to the underlying Python API will be\n\
1001 passed through unaltered. As such, the list of exceptions thrown by\n\
1002 any function as provided here and in its docstring is incomplete.\n\
1003 \n\
1004 Details of what exceptions each function may throw are provided on the\n\
1005 function's documentation, though as with most Python code this list\n\
1006 is not exhaustive due to exceptions from called functions.\n\
1007 ");
1008 
1009 	PyObject* docStr = PyUnicode_FromString(docstring.toUtf8().data());
1010 	if (!docStr)
1011 		qDebug("Failed to create module-level docstring (couldn't make str)");
1012 	else
1013 		PyDict_SetItemString(d, const_cast<char*>("__doc__"), docStr);
1014 
1015 	// Wrap up pointers to the the QApp and main window and push them out
1016 	// to Python.
1017 	wrappedQApp = wrapQObject(qApp);
1018 	if (!wrappedQApp)
1019 	{
1020 		qDebug("Failed to wrap up QApp");
1021 		PyErr_Print();
1022 	}
1023 	// Push it into the module dict, stealing a ref in the process
1024 	PyDict_SetItemString(d, const_cast<char*>("qApp"), wrappedQApp);
1025 	Py_DECREF(wrappedQApp);
1026 	wrappedQApp = nullptr;
1027 
1028 	wrappedMainWindow = wrapQObject(mainWin);
1029 	if (!wrappedMainWindow)
1030 	{
1031 		qDebug("Failed to wrap up ScribusMainWindow");
1032 		PyErr_Print();
1033 	}
1034 	// Push it into the module dict, stealing a ref in the process
1035 	PyDict_SetItemString(d, const_cast<char*>("mainWindow"), wrappedMainWindow);
1036 	Py_DECREF(wrappedMainWindow);
1037 	wrappedMainWindow = nullptr;
1038 
1039 	return m;
1040 }
1041 
1042 /*! HACK: this removes "warning: 'blah' defined but not used" compiler warnings
1043 with header files structure untouched (docstrings are kept near declarations)
1044 PV */
scriptplugindocwarnings()1045 void scriptplugindocwarnings()
1046 {
1047 	QStringList s;
1048 	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__;
1049 }
1050