PhoenixInkscape  0.8.0
Batch convert SVG to PNG with Inkscape
Loading...
Searching...
No Matches
main.cpp File Reference
#include "convertToString.h"
#include "PPath.h"
#include "OptionParser.h"
#include "pxml_utils.h"
#include "pinkscape_slide.h"
+ Include dependency graph for main.cpp:

Go to the source code of this file.

Classes

struct  PLayer
 Get the begin and end slide for current layer. More...
 

Typedefs

typedef std::vector< long unsigned int > PSlide
 Slide composed of layer.
 
typedef std::vector< PLayerPVecLayer
 Vector of layer.
 
typedef std::vector< PSlidePVecSlide
 Define the layer in slide.
 

Functions

OptionParser createOptionParser ()
 Create the OptionParser of this program.
 
void createSlideWithLayer (PSlide &slide, const PVecLayer &vecLayerSlide, long unsigned int index)
 Create the slide to be generated.
 
void createVecSlide (PVecSlide &vecSlide, PVecLayer &vecLayerSlide)
 Create the vector of slides.
 
void createVectorSlide (PVecLayer &vecLayerSlide, const PVecXml &vecLayer)
 Create the vector of slide layer.
 
PString getInkscapeLabel (const PXml &layerXml)
 Get the inkscape label of current PXml.
 
PString getSlideNumber (long unsigned int i)
 Convert the slide index into string.
 
int main (int argc, char **argv)
 
int processFiles (const std::vector< PPath > &listInputFile)
 Process all the input files.
 
bool processFileSvg (const PPath &inputFile)
 Process all the input files.
 
bool saveSlides (POutoutMode &outputMode, const PPath &baseOutputName, const PVecSlide &vecSlides, const PVecXml &vecLayerXml, const PXml &lighRoot)
 Save the slides.
 

Typedef Documentation

◆ PSlide

typedef std::vector<long unsigned int> PSlide

Slide composed of layer.

Definition at line 44 of file main.cpp.

◆ PVecLayer

typedef std::vector<PLayer> PVecLayer

Vector of layer.

Definition at line 41 of file main.cpp.

◆ PVecSlide

typedef std::vector<PSlide > PVecSlide

Define the layer in slide.

Definition at line 47 of file main.cpp.

Function Documentation

◆ createOptionParser()

OptionParser createOptionParser ( )

Create the OptionParser of this program.

Returns
OptionParser of this program

Definition at line 17 of file main.cpp.

17 {
18 OptionParser parser(true, __PROGRAM_VERSION__);
19 parser.setExampleLongOption("phoenix_inkscapesplitter --input=file.svg --output=output/dir/");
20 parser.setExampleShortOption("phoenix_inkscapesplitter -i file1.svg file1.svg fileN.svg -o output/dir/");
21
22 parser.addOption("input", "i", OptionType::FILENAME, true, "list of input files to be treated");
23
24 PString defaultOutputDir(".");
25 parser.addOption("output", "o", defaultOutputDir, "Output directory");
26
27 return parser;
28}

Referenced by main().

+ Here is the caller graph for this function:

◆ createSlideWithLayer()

void createSlideWithLayer ( PSlide & slide,
const PVecLayer & vecLayerSlide,
long unsigned int index )

Create the slide to be generated.

Parameters
[out]slide: slide to be generated
vecLayerSlide: vector of the desired slides for the layers
index: index of the current slide to be generated

Definition at line 111 of file main.cpp.

111 {
112 long unsigned int i(0lu);
113 for(PVecLayer::const_iterator it(vecLayerSlide.begin()); it != vecLayerSlide.end(); ++it){
114 if(index >= it->begin && index <= it->end){
115 slide.push_back(i);
116 }
117 ++i;
118 }
119}

Referenced by createVecSlide().

+ Here is the caller graph for this function:

◆ createVecSlide()

void createVecSlide ( PVecSlide & vecSlide,
PVecLayer & vecLayerSlide )

Create the vector of slides.

Parameters
[out]vecSlide: vector of slides to be created
vecLayerSlide: vector of the desired slides for the layers

Definition at line 125 of file main.cpp.

125 {
126 if(vecLayerSlide.size() == 0lu){return;}
127 PVecLayer::iterator it(vecLayerSlide.begin());
128 long unsigned int minSlide(it->begin), maxSlide(it->end);
129 ++it;
130 while(it != vecLayerSlide.end()){
131 if(it->begin < minSlide){minSlide = it->begin;}
132 if(it->end > maxSlide){maxSlide = it->end;}
133 ++it;
134 }
135 for(PVecLayer::iterator itCmd(vecLayerSlide.begin()); itCmd != vecLayerSlide.end(); ++itCmd){
136 if(itCmd->command == "UntilEnd"){
137 itCmd->end = maxSlide;
138 }
139 }
140 for(long unsigned int i(minSlide); i < maxSlide + 1lu; ++i){
141 PSlide slide;
142 createSlideWithLayer(slide, vecLayerSlide, i);
143 vecSlide.push_back(slide);
144 }
145}
void createSlideWithLayer(PSlide &slide, const PVecLayer &vecLayerSlide, long unsigned int index)
Create the slide to be generated.
Definition main.cpp:111
std::vector< long unsigned int > PSlide
Slide composed of layer.
Definition main.cpp:44

References createSlideWithLayer().

Referenced by processFileSvg().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ createVectorSlide()

void createVectorSlide ( PVecLayer & vecLayerSlide,
const PVecXml & vecLayer )

Create the vector of slide layer.

Parameters
[out]vecLayerSlide: output vector of layer slide
vecLayer: vector of layer from svg file

Definition at line 66 of file main.cpp.

66 {
67 long unsigned int i(0lu);
68 for(PVecXml::const_iterator itLayer(vecLayer.begin()); itLayer != vecLayer.end(); ++itLayer){
69 PString inkscapeLabel(getInkscapeLabel(*itLayer));
70 std::cout << "\tlayer '" << inkscapeLabel << "'";
71 PVecString listNb(inkscapeLabel.split('-'));
72 long unsigned int begin(0lu), end(0lu);
73 bool isBeginDefined(false), isEndDefine(false);
74 PString command("");
75 for(PVecString::iterator it(listNb.begin()); it != listNb.end(); ++it){
76 if(it->isNumber()){
77 if(isBeginDefined){
78 end = atol(it->c_str());
79 isEndDefine = true;
80 }else{
81 begin = atol(it->c_str());
82 isBeginDefined = true;
83 }
84 }else{
85 if(*it == "N" && isBeginDefined){
86 command = "UntilEnd";
87 std::cout << "\t=> until end";
88 }
89
90 }
91 }
92 std::cout << std::endl;
93 if(!isBeginDefined && !isEndDefine){
94 begin = i;
95 end = i;
96 }
97 PLayer layer;
98 layer.command = command;
99 layer.begin = begin;
100 if(isEndDefine){layer.end = end;}
101 else{layer.end = begin;}
102 vecLayerSlide.push_back(layer);
103 }
104}
PString getInkscapeLabel(const PXml &layerXml)
Get the inkscape label of current PXml.
Definition main.cpp:53
Get the begin and end slide for current layer.
Definition main.cpp:31
long unsigned int end
Last slide where the layer has to be printed.
Definition main.cpp:35
long unsigned int begin
first slide where the layer has to be printed
Definition main.cpp:33
PString command
Extra command.
Definition main.cpp:37

References PLayer::begin, PLayer::command, PLayer::end, and getInkscapeLabel().

Referenced by processFileSvg().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ getInkscapeLabel()

PString getInkscapeLabel ( const PXml & layerXml)

Get the inkscape label of current PXml.

Parameters
layerXml: inkscape layer
Returns
inkscape label of current PXml

Definition at line 53 of file main.cpp.

53 {
54 PString attr("");
55 PXmlAttr attrXml;
56 if(pxml_getAttrIfExist(attrXml, layerXml, "inkscape:label")){
57 attr = attrXml.getValue();
58 }
59 return attr;
60}

Referenced by createVectorSlide().

+ Here is the caller graph for this function:

◆ getSlideNumber()

PString getSlideNumber ( long unsigned int i)

Convert the slide index into string.

Parameters
i: slide index
Returns
output string

Definition at line 151 of file main.cpp.

151 {
152 if(i < 10lu){
153 return "0" + valueToString(i);
154 }else{
155 return valueToString(i);
156 }
157}

Referenced by saveSlides().

+ Here is the caller graph for this function:

◆ main()

int main ( int argc,
char ** argv )

Definition at line 290 of file main.cpp.

290 {
291 OptionParser parser = createOptionParser();
292 parser.parseArgument(argc, argv);
293
294 const OptionMode & defaultMode = parser.getDefaultMode();
295 std::vector<PPath> listInputFile;
296 defaultMode.getValue(listInputFile, "input");
297
298 return processFiles(listInputFile);
299}
int processFiles(const std::vector< PPath > &listInputFile)
Process all the input files.
Definition main.cpp:278
OptionParser createOptionParser()
Create the OptionParser of this program.
Definition main.cpp:17

References createOptionParser(), and processFiles().

+ Here is the call graph for this function:

◆ processFiles()

int processFiles ( const std::vector< PPath > & listInputFile)

Process all the input files.

Parameters
listInputFile: list of the input files
Returns
0 on success, -1 otherwise

Definition at line 278 of file main.cpp.

278 {
279 if(listInputFile.size() == 0lu){
280 std::cerr << "processFiles : no input file" << std::endl;
281 return -1;
282 }
283 bool b(true);
284 for(std::vector<PPath>::const_iterator it(listInputFile.begin()); it != listInputFile.end() && b; ++it){
285 b &= processFileSvg(*it);
286 }
287 return 1 - b;
288}
bool processFileSvg(const PPath &inputFile)
Process all the input files.
Definition main.cpp:219

References processFileSvg().

Referenced by main().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ processFileSvg()

bool processFileSvg ( const PPath & inputFile)

Process all the input files.

Parameters
inputFile: list of the input files
Returns
true on success, false otherwise

Definition at line 219 of file main.cpp.

219 {
220 if(inputFile == ""){return false;}
221 PXml root;
222 if(!pxml_parserFile(root, inputFile)){
223 std::cerr << "processFileSvg : can't load file '"<<inputFile<<"'" << std::endl;
224 return false;
225 }
226// cout << "processFileSvg : root nbChild : " << root.getVecChild().size() << endl;
227// PVecXml & vecChild = root.getVecChild();
228// for(PVecXml::iterator it(vecChild.begin()); it != vecChild.end(); ++it){
229// cout << "processFileSvg : '" << it->getName() << "'" << endl;
230// }
231 PXml svgBalise;
232 if(!pxml_getChildIfExist(svgBalise, root, "svg")){
233 std::cerr << "processFileSvg : can't find 'svg' balise in root" << std::endl;
234 return false;
235 }
236
237// PVecXml & vecChildSvg = svgBalise.getVecChild();
238// for(PVecXml::iterator it(vecChildSvg.begin()); it != vecChildSvg.end(); ++it){
239// cout << "processFileSvg : svg '" << it->getName() << "'" << endl;
240// }
241
242 PVecXml vecLayer;
243 if(!pxml_getVecChildIfExist(vecLayer, svgBalise, "g")){
244 std::cerr << "processFileSvg : can't find 'g' balise in svg" << std::endl;
245 return false;
246 }
247 long unsigned int nbCalque(vecLayer.size());
248 std::cout << "processFileSvg : get " << nbCalque << " layer";
249 if(nbCalque > 1lu){std::cout << "s";}
250 std::cout << std::endl;
251
252 PVecLayer vecLayerSlide;
253 createVectorSlide(vecLayerSlide, vecLayer);
254 if(vecLayerSlide.size() == 0lu){
255 std::cerr << "processFileSvg : no layer defined with -begin-end synthax" << std::endl;
256 return false;
257 }
258 PVecSlide vecSlides;
259 createVecSlide(vecSlides, vecLayerSlide);
260
261 PXml lighRoot(root);
262 PXml * svgPtr = pxml_getChildPtr(lighRoot, "svg");
263 PXml svgNoLayer(pxml_eraseVecChild(*svgPtr, "g"));
264 *svgPtr = svgNoLayer;
265
266 POutoutMode outputMode;
267 PString baseOutputSlideName(inputFile.getFileName().eraseExtension());
268 pinkscape_loadSlideMap(outputMode.mapSlide, baseOutputSlideName);
269 bool b = saveSlides(outputMode, baseOutputSlideName, vecSlides, vecLayer, lighRoot);
270 pinkscape_saveSlideMap(outputMode.mapSlide, baseOutputSlideName);
271 return b;
272}
std::vector< PSlide > PVecSlide
Define the layer in slide.
Definition main.cpp:47
std::vector< PLayer > PVecLayer
Vector of layer.
Definition main.cpp:41
void createVecSlide(PVecSlide &vecSlide, PVecLayer &vecLayerSlide)
Create the vector of slides.
Definition main.cpp:125
bool saveSlides(POutoutMode &outputMode, const PPath &baseOutputName, const PVecSlide &vecSlides, const PVecXml &vecLayerXml, const PXml &lighRoot)
Save the slides.
Definition main.cpp:166
void createVectorSlide(PVecLayer &vecLayerSlide, const PVecXml &vecLayer)
Create the vector of slide layer.
Definition main.cpp:66
void pinkscape_loadSlideMap(PMapSlide &mapFormula, const PPath &baseOutputName)
Load the map file of all the formulae if it exists.
void pinkscape_saveSlideMap(const PMapSlide &mapFormula, const PPath &baseOutputName)
Save the map file of the formulae to avoid extra latex call.
Output mode of the html backend.
PMapSlide mapSlide
Map of the formula which are already saved as png files.

References createVecSlide(), createVectorSlide(), POutoutMode::mapSlide, pinkscape_loadSlideMap(), pinkscape_saveSlideMap(), and saveSlides().

Referenced by processFiles().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ saveSlides()

bool saveSlides ( POutoutMode & outputMode,
const PPath & baseOutputName,
const PVecSlide & vecSlides,
const PVecXml & vecLayerXml,
const PXml & lighRoot )

Save the slides.

Parameters
baseOutputName: base of the slides output names
vecSlides: vector of slides to be created
vecLayerXml: vector of xml layer to be used
lighRoot: root xml without the layers in svg
Returns
true on success, false otherwise

Definition at line 166 of file main.cpp.

168{
169 long unsigned int i(0lu);
170 for(PVecSlide::const_iterator itSlide(vecSlides.begin()); itSlide != vecSlides.end(); ++itSlide){
171 PXml tmpRoot(lighRoot);
172 tmpRoot.setName("");
173 PXml * svgPtr = pxml_getChildPtr(tmpRoot, "svg");
174 const PSlide & slide = *itSlide;
175 for(PSlide::const_iterator it(slide.begin()); it != slide.end(); ++it){
176// We need to suppress attribute : style="display:none"
177 PXml tmpLayer(vecLayerXml[*it]);
178 pxml_setAttr(tmpLayer, "style", "display:inline");
179 svgPtr->getVecChild().push_back(tmpLayer); //We add the corresponding layer
180 }
181 //Save svg file
182 PPath outputSlide(PPath("./") + baseOutputName + PPath("_") + getSlideNumber(i) + PPath(".svg"));
183 //Get the svg content
184 PString slideContent(pxml_baliseStr(tmpRoot, true));
185 //Check if the svg is already saved
186 if(pinkscape_isSlideKnown(outputMode, outputSlide, slideContent)){
187 continue;
188 }
189 //If not, save the svg into png image
190 if(!outputSlide.saveFileContent(slideContent)){
191 std::cerr << "saveSlides : can't save svg file '"<<outputSlide<<"'" << std::endl;
192 return false;
193 }
194 //Call inkscape to make png file
195 PPath outputSlidePng(baseOutputName + PPath("_") + getSlideNumber(i) + PPath(".png"));
196// PString command("inkscape --without-gui -e "+outputSlidePng+" "+outputSlide);
197 PString command(PString("convert ") + outputSlide + PString(" ") + outputSlidePng);
198// PString command("inkscape --batch-process -o "+outputSlidePng+" "+outputSlide); //for Inkscape 1.1.2 (0a00cf5339, 2022-02-04)
199
200 if(system(command.c_str()) != 0){
201 std::cerr << "saveSlides : can't create png file with command '"<<command<<"'" << std::endl;
202 return false;
203 }
204 //Removing the temporary svg files
205 command = PString("rm ") + outputSlide;
206 if(system(command.c_str()) != 0){
207 std::cerr << "saveSlides : can't remove temporary svg file with command '"<<command<<"'" << std::endl;
208 return false;
209 }
210 ++i;
211 }
212 return true;
213}
PString getSlideNumber(long unsigned int i)
Convert the slide index into string.
Definition main.cpp:151
bool pinkscape_isSlideKnown(POutoutMode &outputMode, const PPath &outputSlide, const PString &slideContent)
Check if the slide we are going to save was already saved (with the same content) or not.

References getSlideNumber(), and pinkscape_isSlideKnown().

Referenced by processFileSvg().

+ Here is the call graph for this function:
+ Here is the caller graph for this function: