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