7#include "convertToString.h"
9#include "OptionParser.h"
10#include "pxml_utils.h"
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/");
22 parser.addOption(
"input",
"i", OptionType::FILENAME,
true,
"list of input files to be treated");
24 PString defaultOutputDir(
".");
25 parser.addOption(
"output",
"o", defaultOutputDir,
"Output directory");
35 long unsigned int end;
44typedef std::vector<long unsigned int>
PSlide;
56 if(pxml_getAttrIfExist(attrXml, layerXml,
"inkscape:label")){
57 attr = attrXml.getValue();
67 long unsigned int i(0lu);
68 for(PVecXml::const_iterator itLayer(vecLayer.begin()); itLayer != vecLayer.end(); ++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);
75 for(PVecString::iterator it(listNb.begin()); it != listNb.end(); ++it){
78 end = atol(it->c_str());
81 begin = atol(it->c_str());
82 isBeginDefined =
true;
85 if(*it ==
"N" && isBeginDefined){
87 std::cout <<
"\t=> until end";
92 std::cout << std::endl;
93 if(!isBeginDefined && !isEndDefine){
100 if(isEndDefine){layer.
end = end;}
101 else{layer.
end = begin;}
102 vecLayerSlide.push_back(layer);
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){
126 if(vecLayerSlide.size() == 0lu){
return;}
127 PVecLayer::iterator it(vecLayerSlide.begin());
128 long unsigned int minSlide(it->begin), maxSlide(it->end);
130 while(it != vecLayerSlide.end()){
131 if(it->begin < minSlide){minSlide = it->begin;}
132 if(it->end > maxSlide){maxSlide = it->end;}
135 for(PVecLayer::iterator itCmd(vecLayerSlide.begin()); itCmd != vecLayerSlide.end(); ++itCmd){
136 if(itCmd->command ==
"UntilEnd"){
137 itCmd->end = maxSlide;
140 for(
long unsigned int i(minSlide); i < maxSlide + 1lu; ++i){
143 vecSlide.push_back(slide);
153 return "0" + valueToString(i);
155 return valueToString(i);
167 const PVecSlide & vecSlides,
const PVecXml & vecLayerXml,
const PXml & lighRoot)
169 long unsigned int i(0lu);
170 for(PVecSlide::const_iterator itSlide(vecSlides.begin()); itSlide != vecSlides.end(); ++itSlide){
171 PXml tmpRoot(lighRoot);
173 PXml * svgPtr = pxml_getChildPtr(tmpRoot,
"svg");
174 const PSlide & slide = *itSlide;
175 for(PSlide::const_iterator it(slide.begin()); it != slide.end(); ++it){
177 PXml tmpLayer(vecLayerXml[*it]);
178 pxml_setAttr(tmpLayer,
"style",
"display:inline");
179 svgPtr->getVecChild().push_back(tmpLayer);
182 PPath outputSlide(PPath(
"./") + baseOutputName + PPath(
"_") +
getSlideNumber(i) + PPath(
".svg"));
184 PString slideContent(pxml_baliseStr(tmpRoot,
true));
190 if(!outputSlide.saveFileContent(slideContent)){
191 std::cerr <<
"saveSlides : can't save svg file '"<<outputSlide<<
"'" << std::endl;
195 PPath outputSlidePng(baseOutputName + PPath(
"_") +
getSlideNumber(i) + PPath(
".png"));
197 PString command(PString(
"convert ") + outputSlide + PString(
" ") + outputSlidePng);
200 if(system(command.c_str()) != 0){
201 std::cerr <<
"saveSlides : can't create png file with command '"<<command<<
"'" << std::endl;
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;
220 if(inputFile ==
""){
return false;}
222 if(!pxml_parserFile(root, inputFile)){
223 std::cerr <<
"processFileSvg : can't load file '"<<inputFile<<
"'" << std::endl;
232 if(!pxml_getChildIfExist(svgBalise, root,
"svg")){
233 std::cerr <<
"processFileSvg : can't find 'svg' balise in root" << std::endl;
243 if(!pxml_getVecChildIfExist(vecLayer, svgBalise,
"g")){
244 std::cerr <<
"processFileSvg : can't find 'g' balise in svg" << std::endl;
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;
254 if(vecLayerSlide.size() == 0lu){
255 std::cerr <<
"processFileSvg : no layer defined with -begin-end synthax" << std::endl;
262 PXml * svgPtr = pxml_getChildPtr(lighRoot,
"svg");
263 PXml svgNoLayer(pxml_eraseVecChild(*svgPtr,
"g"));
264 *svgPtr = svgNoLayer;
267 PString baseOutputSlideName(inputFile.getFileName().eraseExtension());
269 bool b =
saveSlides(outputMode, baseOutputSlideName, vecSlides, vecLayer, lighRoot);
279 if(listInputFile.size() == 0lu){
280 std::cerr <<
"processFiles : no input file" << std::endl;
284 for(std::vector<PPath>::const_iterator it(listInputFile.begin()); it != listInputFile.end() && b; ++it){
290int main(
int argc,
char** argv){
292 parser.parseArgument(argc, argv);
294 const OptionMode & defaultMode = parser.getDefaultMode();
295 std::vector<PPath> listInputFile;
296 defaultMode.getValue(listInputFile,
"input");
std::vector< PSlide > PVecSlide
Define the layer in slide.
std::vector< PLayer > PVecLayer
Vector of layer.
PString getInkscapeLabel(const PXml &layerXml)
Get the inkscape label of current PXml.
void createVecSlide(PVecSlide &vecSlide, PVecLayer &vecLayerSlide)
Create the vector of slides.
int main(int argc, char **argv)
void createSlideWithLayer(PSlide &slide, const PVecLayer &vecLayerSlide, long unsigned int index)
Create the slide to be generated.
int processFiles(const std::vector< PPath > &listInputFile)
Process all the input files.
bool saveSlides(POutoutMode &outputMode, const PPath &baseOutputName, const PVecSlide &vecSlides, const PVecXml &vecLayerXml, const PXml &lighRoot)
Save the slides.
void createVectorSlide(PVecLayer &vecLayerSlide, const PVecXml &vecLayer)
Create the vector of slide layer.
OptionParser createOptionParser()
Create the OptionParser of this program.
bool processFileSvg(const PPath &inputFile)
Process all the input files.
PString getSlideNumber(long unsigned int i)
Convert the slide index into string.
std::vector< long unsigned int > PSlide
Slide composed of layer.
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.
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.
Get the begin and end slide for current layer.
long unsigned int end
Last slide where the layer has to be printed.
long unsigned int begin
first slide where the layer has to be printed
PString command
Extra command.
Output mode of the html backend.
PMapSlide mapSlide
Map of the formula which are already saved as png files.