1 /************************************************************************
2 **
3 ** Copyright (C) 2016-2021 Kevin B. Hendricks, Stratford Ontario Canada
4 **
5 ** This file is part of Sigil.
6 **
7 ** Sigil is free software: you can redistribute it and/or modify
8 ** it under the terms of the GNU General Public License as published by
9 ** the Free Software Foundation, either version 3 of the License, or
10 ** (at your option) any later version.
11 **
12 ** Sigil is distributed in the hope that it will be useful,
13 ** but WITHOUT ANY WARRANTY; without even the implied warranty of
14 ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 ** GNU General Public License for more details.
16 **
17 ** You should have received a copy of the GNU General Public License
18 ** along with Sigil. If not, see <http://www.gnu.org/licenses/>.
19 **
20 *************************************************************************/
21 #include "EmbedPython/EmbeddedPython.h"
22
23 #include <QString>
24 #include <QList>
25 #include <QVariant>
26
27 #include "EmbedPython/PythonRoutines.h"
28
29
GenerateNcxInPython(const QString & navdata,const QString & navbkpath,const QString & ncxdir,const QString & doctitle,const QString & mainid)30 QString PythonRoutines::GenerateNcxInPython(const QString &navdata, const QString &navbkpath,
31 const QString &ncxdir, const QString &doctitle,
32 const QString &mainid)
33 {
34 QString results;
35 int rv = -1;
36 QString error_traceback;
37 QList<QVariant> args;
38 args.append(QVariant(navdata));
39 args.append(QVariant(navbkpath));
40 args.append(QVariant(ncxdir));
41 args.append(QVariant(doctitle));
42 args.append(QVariant(mainid));
43
44 EmbeddedPython * epython = EmbeddedPython::instance();
45
46 QVariant res = epython->runInPython( QString("ncxgenerator"),
47 QString("generateNCX"),
48 args,
49 &rv,
50 error_traceback);
51 if (rv == 0) {
52 results = res.toString();
53 }
54 return results;
55 }
56
57
GetMetadataInPython(const QString & opfdata,const QString & version)58 MetadataPieces PythonRoutines::GetMetadataInPython(const QString& opfdata, const QString& version)
59 {
60 int rv = 0;
61 QString traceback;
62 MetadataPieces mdp;
63
64 QString module = "metaproc2";
65 if (version.startsWith('3')) module = "metaproc3";
66 QList<QVariant> args;
67 args.append(QVariant(opfdata));
68 EmbeddedPython* epp = EmbeddedPython::instance();
69 QVariant res = epp->runInPython(module, QString("process_metadata"), args, &rv, traceback, true);
70 if (rv) {
71 fprintf(stderr, "process_meta error %d traceback %s\n",rv, traceback.toStdString().c_str());
72 }
73 PyObjectPtr mpo = PyObjectPtr(res);
74 args.clear();
75 res = epp->callPyObjMethod(mpo, QString("get_recognized_metadata"), args, &rv, traceback);
76 if (rv) {
77 fprintf(stderr, "get_recognized_metadata error %d traceback %s\n",rv, traceback.toStdString().c_str());
78 }
79 mdp.data = res.toString();
80 args.clear();
81 res = epp->callPyObjMethod(mpo, QString("get_other_meta_xml"), args, &rv, traceback);
82 if (rv) {
83 fprintf(stderr, "get_other_meta_xml error %d traceback %s\n",rv, traceback.toStdString().c_str());
84 }
85 mdp.otherxml = res.toString();
86 args.clear();
87 res = epp->callPyObjMethod(mpo, QString("get_id_list"), args, &rv, traceback);
88 if (rv) {
89 fprintf(stderr, "get_id_list error %d traceback %s\n",rv, traceback.toStdString().c_str());
90 }
91 mdp.idlist = res.toStringList();
92 args.clear();
93 res = epp->callPyObjMethod(mpo, QString("get_metadata_tag"), args, &rv, traceback);
94 if (rv) {
95 fprintf(stderr, "get_metadata_tag error %d traceback %s\n",rv, traceback.toStdString().c_str());
96 }
97 mdp.metatag = res.toString();
98 return mdp;
99 }
100
101
SetNewMetadataInPython(const MetadataPieces & mdp,const QString & opfdata,const QString & version)102 QString PythonRoutines::SetNewMetadataInPython(const MetadataPieces& mdp, const QString& opfdata, const QString& version)
103 {
104 int rv = 0;
105 QString traceback;
106 QString newopfdata= opfdata;
107 QString module = "metaproc2";
108 if (version.startsWith('3')) module = "metaproc3";
109 QList<QVariant> args;
110 args.append(QVariant(mdp.data));
111 args.append(QVariant(mdp.otherxml));
112 args.append(QVariant(mdp.idlist));
113 args.append(QVariant(mdp.metatag));
114 args.append(QVariant(opfdata));
115 EmbeddedPython* epp = EmbeddedPython::instance();
116 QVariant res = epp->runInPython(module, QString("set_new_metadata"), args, &rv, traceback, true);
117 if (rv) {
118 fprintf(stderr, "set_new_metadata error %d traceback %s\n",rv, traceback.toStdString().c_str());
119 return newopfdata;
120 }
121 newopfdata = res.toString();
122 return newopfdata;
123 }
124
125
PerformRepoCommitInPython(const QString & localRepo,const QString & bookid,const QStringList & bookinfo,const QString & bookroot,const QStringList & bookfiles)126 QString PythonRoutines::PerformRepoCommitInPython(const QString &localRepo,
127 const QString &bookid,
128 const QStringList &bookinfo,
129 const QString &bookroot,
130 const QStringList &bookfiles)
131 {
132 QString results;
133 int rv = -1;
134 QString error_traceback;
135 QList<QVariant> args;
136 args.append(QVariant(localRepo));
137 args.append(QVariant(bookid));
138 args.append(QVariant(bookinfo));
139 args.append(QVariant(bookroot));
140 args.append(QVariant(bookfiles));
141
142 EmbeddedPython * epython = EmbeddedPython::instance();
143
144 QVariant res = epython->runInPython( QString("repomanager"),
145 QString("performCommit"),
146 args,
147 &rv,
148 error_traceback);
149 if (rv == 0) {
150 results = res.toString();
151 }
152 return results;
153 }
154
155
PerformRepoEraseInPython(const QString & localRepo,const QString & bookid)156 bool PythonRoutines::PerformRepoEraseInPython(const QString& localRepo, const QString& bookid)
157 {
158 bool results = false;
159 int rv = -1;
160 QString error_traceback;
161 QList<QVariant> args;
162 args.append(QVariant(localRepo));
163 args.append(QVariant(bookid));
164
165 EmbeddedPython * epython = EmbeddedPython::instance();
166
167 QVariant res = epython->runInPython( QString("repomanager"),
168 QString("eraseRepo"),
169 args,
170 &rv,
171 error_traceback);
172 if (rv == 0) {
173 results = (res.toInt() > 0);
174 }
175 return results;
176 }
177
GetRepoTagsInPython(const QString & localRepo,const QString & bookid)178 QStringList PythonRoutines::GetRepoTagsInPython(const QString& localRepo, const QString& bookid)
179 {
180 QStringList results;
181 int rv = -1;
182 QString error_traceback;
183 QList<QVariant> args;
184 args.append(QVariant(localRepo));
185 args.append(QVariant(bookid));
186
187 EmbeddedPython * epython = EmbeddedPython::instance();
188
189 QVariant res = epython->runInPython( QString("repomanager"),
190 QString("get_tag_list"),
191 args,
192 &rv,
193 error_traceback);
194 if (rv == 0) {
195 results = res.toStringList();
196 }
197 return results;
198 }
199
200
GenerateEpubFromTagInPython(const QString & localRepo,const QString & bookid,const QString & tagname,const QString & filename,const QString & destpath)201 QString PythonRoutines::GenerateEpubFromTagInPython(const QString& localRepo,
202 const QString& bookid,
203 const QString& tagname,
204 const QString& filename,
205 const QString& destpath)
206 {
207 QString results;
208 int rv = -1;
209 QString error_traceback;
210 QList<QVariant> args;
211 args.append(QVariant(localRepo));
212 args.append(QVariant(bookid));
213 args.append(QVariant(tagname));
214 args.append(QVariant(filename));
215 args.append(QVariant(destpath));
216
217 EmbeddedPython * epython = EmbeddedPython::instance();
218
219 QVariant res = epython->runInPython( QString("repomanager"),
220 QString("generate_epub_from_tag"),
221 args,
222 &rv,
223 error_traceback);
224 if (rv == 0) {
225 results = res.toString();
226 }
227 return results;
228 }
229
230
GenerateDiffFromCheckPoints(const QString & localRepo,const QString & bookid,const QString & leftchkpoint,const QString & rightchkpoint)231 QString PythonRoutines::GenerateDiffFromCheckPoints(const QString& localRepo,
232 const QString& bookid,
233 const QString& leftchkpoint,
234 const QString& rightchkpoint)
235 {
236 QString results;
237 int rv = -1;
238 QString error_traceback;
239 QList<QVariant> args;
240 args.append(QVariant(localRepo));
241 args.append(QVariant(bookid));
242 args.append(QVariant(leftchkpoint));
243 args.append(QVariant(rightchkpoint));
244
245 EmbeddedPython * epython = EmbeddedPython::instance();
246
247 QVariant res = epython->runInPython( QString("repomanager"),
248 QString("generate_diff_from_checkpoints"),
249 args,
250 &rv,
251 error_traceback);
252 if (rv == 0) {
253 results = res.toString();
254 }
255 return results;
256 }
257
GenerateRepoLogSummaryInPython(const QString & localRepo,const QString & bookid)258 QString PythonRoutines::GenerateRepoLogSummaryInPython(const QString& localRepo,
259 const QString& bookid)
260 {
261 QString results;
262 int rv = -1;
263 QString error_traceback;
264 QList<QVariant> args;
265 args.append(QVariant(localRepo));
266 args.append(QVariant(bookid));
267
268 EmbeddedPython * epython = EmbeddedPython::instance();
269
270 QVariant res = epython->runInPython( QString("repomanager"),
271 QString("generate_log_summary"),
272 args,
273 &rv,
274 error_traceback);
275 if (rv == 0) {
276 results = res.toString();
277 }
278 return results;
279 }
280
281
GenerateParsedNDiffInPython(const QString & path1,const QString & path2)282 QList<DiffRecord::DiffRec> PythonRoutines::GenerateParsedNDiffInPython(const QString& path1,
283 const QString& path2)
284 {
285 QList<DiffRecord::DiffRec> results;
286 int rv = -1;
287 QString error_traceback;
288 QList<QVariant> args;
289 args.append(QVariant(path1));
290 args.append(QVariant(path2));
291
292 EmbeddedPython * epython = EmbeddedPython::instance();
293
294 QVariant res = epython->runInPython( QString("repomanager"),
295 QString("generate_parsed_ndiff"),
296 args,
297 &rv,
298 error_traceback);
299 if (rv == 0) {
300 QVariantList vlist = res.toList();
301 foreach(QVariant qv, vlist) {
302 QStringList fields = qv.toStringList();
303 DiffRecord::DiffRec dr;
304 dr.code = fields.at(0);
305 dr.line = fields.at(1);
306 dr.newline = fields.at(2);
307 dr.leftchanges = fields.at(3);
308 dr.rightchanges = fields.at(4);
309 results << dr;
310 }
311 }
312 return results;
313 }
314
315
316
GenerateUnifiedDiffInPython(const QString & path1,const QString & path2)317 QString PythonRoutines::GenerateUnifiedDiffInPython(const QString& path1, const QString& path2)
318 {
319 QString results;
320 int rv = -1;
321 QString error_traceback;
322 QList<QVariant> args;
323 args.append(QVariant(path1));
324 args.append(QVariant(path2));
325
326 EmbeddedPython * epython = EmbeddedPython::instance();
327
328 QVariant res = epython->runInPython( QString("repomanager"),
329 QString("generate_unified_diff"),
330 args,
331 &rv,
332 error_traceback);
333 if (rv == 0) {
334 results = res.toString();
335 }
336 return results;
337 }
338
339
340 // returns 3 string lists: deleted, added, and modified (in that order)
GetCurrentStatusVsDestDirInPython(const QString & bookroot,const QStringList & bookfiles,const QString & destdir)341 QList<QStringList> PythonRoutines::GetCurrentStatusVsDestDirInPython(const QString&bookroot,
342 const QStringList& bookfiles,
343 const QString& destdir)
344 {
345 QList<QStringList> results;
346 int rv = -1;
347 QString error_traceback;
348 QList<QVariant> args;
349 args.append(QVariant(bookroot));
350 args.append(QVariant(bookfiles));
351 args.append(QVariant(destdir));
352
353 EmbeddedPython * epython = EmbeddedPython::instance();
354
355 QVariant res = epython->runInPython( QString("repomanager"),
356 QString("get_current_status_vs_destdir"),
357 args,
358 &rv,
359 error_traceback);
360 if (rv == 0) {
361 QVariantList vlist = res.toList();
362 foreach(QVariant qv, vlist) {
363 results << qv.toStringList();
364 }
365 }
366 return results;
367 }
368
369
CopyTagToDestDirInPython(const QString & localRepo,const QString & bookid,const QString & tagname,const QString & destdir)370 QString PythonRoutines::CopyTagToDestDirInPython(const QString& localRepo,
371 const QString& bookid,
372 const QString& tagname,
373 const QString& destdir)
374 {
375 QString results;
376 int rv = -1;
377 QString error_traceback;
378 QList<QVariant> args;
379 args.append(QVariant(localRepo));
380 args.append(QVariant(bookid));
381 args.append(QVariant(tagname));
382 args.append(QVariant(destdir));
383
384 EmbeddedPython * epython = EmbeddedPython::instance();
385
386 QVariant res = epython->runInPython( QString("repomanager"),
387 QString("copy_tag_to_destdir"),
388 args,
389 &rv,
390 error_traceback);
391 if (rv == 0) {
392 results = res.toString();
393 }
394 return results;
395 }
396