80fbfa7263107fc91594777ef97d30690fd0f1d7
[hsd_doku_tool.git] / src / SourceChapter.h
1 ///////////////////////////////////////////////////////////////////////////
2 // Workfile: SourceChapter.h
3 // Author: Daniel Giritzer <daniel@giritzer.eu>
4 // Date: 25.03.2018
5 // Description: Einfache Klasse zum Speichern Kapiteln.
6 // Remarks: Diese Klasse besteht nur aus einer Header Datei.
7 ///////////////////////////////////////////////////////////////////////////
8 #ifndef SOURCECHAPTER_H
9 #define SOURCECHAPTER_H
10
11 #include <iostream>
12 #include "Object.h"
13 #include "ChapterIF.h"
14 #include <fstream>
15
16 /////////////////////////////////////////////////
17 /// \brief Klasse zum speichern von
18 ///        Kapitelinformationen.
19 /////////////////////////////////////////////////
20 class SourceChapter : public Object, public ChapterIF
21 {
22 public:
23     SourceChapter(std::string type)
24     {
25         mType = type;
26     }
27     virtual ~SourceChapter() = default;
28
29     std::string GetType() const
30     {
31         return mType;
32     }
33
34     void WriteFile(ModelIF* model)
35     {
36
37         if(!mFSHelp.dirExists(model->getOutPath()))
38             throw std::string("Output directory does not exist: " + model->getOutPath());
39
40         std::string outPath = mFSHelp.addDirLastSlash(model->getOutPath());
41
42         if(!mFSHelp.dirExists(mContent))
43             throw std::string("The source directory entered in Chapter " + mPrettyName + " (" + std::to_string(mNum) + ")" + " does not exist!\n" + mContent);
44
45         std::string srcDir = mFSHelp.addDirLastSlash(outPath + mOutFileName + "_src");
46         mFSHelp.copyDir(mContent, srcDir);
47
48         std::vector<FSHelper::File> sourceFiles;
49         if(!mFSHelp.listFilesRecursive(srcDir, sourceFiles, true))
50             throw std::string("Failed to get filenames of source files!");
51
52
53         // Nach dateiendung filtern
54         auto it = std::remove_if(sourceFiles.begin(),
55                                  sourceFiles.end(),
56                                  [this, model](FSHelper::File x)
57         {
58
59             unsigned int ind = x.second.find_last_of(".");
60             if(ind ==  std::string::npos) return true; //Keine Dateiendung
61
62             // Dateiendung cpp oder h
63             if((x.second.substr(ind) == model->getSourceFileExtension()) ||
64                (x.second.substr(ind) == model->getHeaderFileExtension()))
65                 return false;
66
67             // Alle anderen
68             return true;
69         });
70         sourceFiles.erase(it, sourceFiles.end());
71
72         // Nach namen sortieren (header vor cpp)
73         std::sort(sourceFiles.begin(), sourceFiles.end(),
74                   [](FSHelper::File left, FSHelper::File right)
75                     {
76                         return left.second > right.second;
77                     }
78
79                  );
80
81         std::ofstream out;
82         out.open(outPath + mOutFileName, std::ios_base::out);
83         if(out.good())
84             for(auto curElem : sourceFiles)
85             {
86                 curElem.first.replace(curElem.first.find(outPath), outPath.length(), ""); //Erzeuge relativen Pfade
87                 out << "\\lstinputlisting[language=C++]{" << mFSHelp.convertPathToUnix(curElem.first) << curElem.second <<"}" << std::endl;
88             }
89         else
90             throw std::string("Failed to write sourcefiles chapter.");
91
92         out.close();
93     }
94
95 private:
96     std::string mType;
97 };
98
99 #endif // SOURCECHAPTER_H