40 #ifndef __OPENFLUID_BUDDIES_SIM2DOCBUDDY_HPP__ 41 #define __OPENFLUID_BUDDIES_SIM2DOCBUDDY_HPP__ 44 #if OPENFLUID_SIM2DOC_ENABLED 53 #include <boost/spirit/include/classic_core.hpp> 54 #include <boost/spirit/include/classic_file_iterator.hpp> 55 #include <boost/bind.hpp> 57 #include <openfluid/config.hpp> 64 using namespace BOOST_SPIRIT_CLASSIC_NS;
69 class BuddiesListener;
75 typedef std::map< std::string,std::vector<std::string> > SignatureData_t;
77 std::string m_CPPFile;
78 std::string m_LatexOutFile;
80 std::string m_InputDirPath;
81 std::string m_OutputDirPath;
82 std::string m_InputFilePath;
83 std::string m_OutputLatexFilePath;
84 std::string m_TplFilePath;
85 std::string m_CProcessedFilePath;
92 std::string m_ExtractedLatexDoc;
95 std::string m_NewCommands;
97 std::string m_SimName;
98 std::string m_SimVersion;
99 std::string m_SimStatus;
100 std::vector<std::string> m_SimAuthorsNames;
101 std::vector<std::string> m_SimAuthorsEmails;
102 std::string m_SimDomain;
103 std::string m_SimDescription;
104 std::string m_SimData;
106 std::string m_BeginSignatureTag;
107 std::string m_EndSignatureTag;
108 std::string m_BeginSim2DocTag;
109 std::string m_EndSim2DocTag;
111 std::string m_CurrentKeyValue;
112 std::string m_CurrentBuiltParam;
114 std::string m_HTMLPackageLatexCommand;
116 SignatureData_t m_InVars;
117 SignatureData_t m_OutVars;
118 SignatureData_t m_ModVars;
119 SignatureData_t m_InAttrs;
120 SignatureData_t m_OutAttrs;
121 SignatureData_t m_ParamsData;
122 SignatureData_t m_Events;
123 SignatureData_t m_ExtraFiles;
128 static std::string extractBetweenTags(std::string Content,
const std::string& BeginTag,
const std::string& EndTag);
130 static std::string toLatexFriendly(std::string Content);
132 static void addLatexDataCatBegin(std::string& Content,
const std::string& Title,
const std::string& ColsFormat);
134 static void addLatexDataCatEnd(std::string& Content);
136 std::string extractSignatureLines();
138 void copyDocDirectory();
140 void extractLatexDocFromCPP();
142 void cpreprocessCPP();
150 void buildParsedParam(
const char* First,
const char* Last);
155 void clearParsedParam();
161 void storeDataIntoString(std::string *Str);
167 void storeDataIntoVector(std::vector<std::string> *List);
175 void storeDataIntoKey(SignatureData_t *SignatureData,
const std::string& State);
181 void storeDataIntoSignatureData(SignatureData_t *SignatureData);
186 void storeDataIntoStatus();
193 void storeDataIntoUnitsClass(std::vector<openfluid::ware::SignatureUnitsClassItem> *UpdatedUnitsClass,
200 void setSchedulingFixed(
double Val);
206 void setSchedulingRange(
double Max);
213 void turnIntoLatexSyntax();
215 void processSignature();
217 void generateLatex();
219 bool isErrorInPDFLatexLog();
237 struct SimSignatureGrammar :
public grammar<SimSignatureGrammar>
239 Sim2DocBuddy *mp_Owner;
240 SimSignatureGrammar(Sim2DocBuddy *Owner) : mp_Owner(Owner) {}
243 template <
typename ScannerT>
247 rule<ScannerT> blank, linemarker, endLine, escapedQuote, string, varName, element, parameters, signature,
248 IDRule, NameRule, DescriptionRule, VersionRule, StatusRule, DomainRule, AuthorRule,
249 UsedParamRule, RequiredParamRule,
250 ProducedVarRule, UpdatedVarRule, RequiredVarRule, UsedVarRule,
251 ProducedAttributeRule, RequiredAttributeRule, UsedAttributeRule,
253 UsedExtraFilesRule, RequiredExtraFilesRule,
254 UpdatedUnitsGraphRule, UpdatedUnitsClassRule;
266 definition(SimSignatureGrammar
const&
self)
270 signature = str_p(
"BEGIN_SIMULATOR_SIGNATURE") >> *blank >>
'(' >> IDRule >>
')' >> endLine
271 >> *(str_p(
"DECLARE_NAME") >> *blank >>
'(' >> NameRule >>
')' >> endLine
272 | str_p(
"DECLARE_DESCRIPTION") >> *blank >>
'(' >> DescriptionRule >>
')' >> endLine
273 | str_p(
"DECLARE_VERSION") >> *blank >>
'(' >> VersionRule >>
')' >> endLine
274 | str_p(
"DECLARE_SDKVERSION") >> endLine
275 | str_p(
"DECLARE_STATUS") >> *blank >>
'(' >> StatusRule >>
')' >> endLine
276 | str_p(
"DECLARE_DOMAIN") >> *blank >>
'(' >> DomainRule >>
')' >> endLine
277 | str_p(
"DECLARE_PROCESS") >> *blank >>
'(' >> parameters >>
')' >> endLine
278 | str_p(
"DECLARE_METHOD") >> *blank >>
'(' >> parameters >>
')' >> endLine
279 | str_p(
"DECLARE_AUTHOR") >> *blank >>
'(' >> AuthorRule >>
')' >> endLine
281 | str_p(
"DECLARE_REQUIRED_PARAMETER") >> *blank >>
'(' >> RequiredParamRule >>
')' >> endLine
282 | str_p(
"DECLARE_USED_PARAMETER") >> *blank >>
'(' >> UsedParamRule >>
')' >> endLine
285 | str_p(
"DECLARE_SIMULATOR_PARAM") >> *blank >>
'(' >> UsedParamRule >>
')' >> endLine
287 | str_p(
"DECLARE_PRODUCED_VARIABLE") >> *blank >>
'(' >> ProducedVarRule >>
')' >> endLine
288 | str_p(
"DECLARE_UPDATED_VARIABLE") >> *blank >>
'(' >> UpdatedVarRule >>
')' >> endLine
289 | str_p(
"DECLARE_REQUIRED_VARIABLE") >> *blank >>
'(' >> RequiredVarRule >>
')' >> endLine
290 | str_p(
"DECLARE_USED_VARIABLE") >> *blank >>
'(' >> UsedVarRule >>
')' >> endLine
293 | str_p(
"DECLARE_PRODUCED_VAR") >> *blank >>
'(' >> ProducedVarRule >>
')' >> endLine
294 | str_p(
"DECLARE_UPDATED_VAR") >> *blank >>
'(' >> UpdatedVarRule >>
')' >> endLine
295 | str_p(
"DECLARE_REQUIRED_VAR") >> *blank >>
'(' >> RequiredVarRule >>
')' >> endLine
296 | str_p(
"DECLARE_USED_VAR") >> *blank >>
'(' >> UsedVarRule >>
')' >> endLine
298 | str_p(
"DECLARE_PRODUCED_ATTRIBUTE") >> *blank >>
'(' >> ProducedAttributeRule >>
')' >> endLine
299 | str_p(
"DECLARE_REQUIRED_ATTRIBUTE") >> *blank >>
'(' >> RequiredAttributeRule >>
')' >> endLine
300 | str_p(
"DECLARE_USED_ATTRIBUTE") >> *blank >>
'(' >> UsedAttributeRule >>
')' >> endLine
302 | str_p(
"DECLARE_USED_EVENTS") >> *blank >>
'(' >> UsedEventsRule >>
')' >> endLine
303 | str_p(
"DECLARE_USED_EXTRAFILE") >> *blank >>
'(' >> UsedExtraFilesRule >>
')' >> endLine
304 | str_p(
"DECLARE_REQUIRED_EXTRAFILE") >> *blank >>
'(' >> RequiredExtraFilesRule >>
')' >> endLine
306 | str_p(
"DECLARE_UPDATED_UNITSGRAPH") >> *blank >>
'(' >> UpdatedUnitsGraphRule >>
')' >> endLine
307 | str_p(
"DECLARE_UPDATED_UNITSCLASS") >> *blank >>
'(' >> UpdatedUnitsClassRule >>
')' >> endLine
309 | str_p(
"DECLARE_SCHEDULING_UNDEFINED")[boost::bind(&ware::SignatureTimeScheduling::setAsUndefined,
310 &
self.mp_Owner->m_TimeScheduling)] >> endLine
311 | str_p(
"DECLARE_SCHEDULING_DEFAULT")[boost::bind(
312 &ware::SignatureTimeScheduling::setAsDefaultDeltaT,
313 &
self.mp_Owner->m_TimeScheduling)] >> endLine
314 | str_p(
"DECLARE_SCHEDULING_FIXED") >> *blank >>
'(' >> *blank
315 >> real_p[boost::bind(&Sim2DocBuddy::setSchedulingFixed,
self.mp_Owner, _1)]
316 >> *blank >>
')' >> endLine
317 | str_p(
"DECLARE_SCHEDULING_RANGE") >> *blank >>
'(' 318 >> *blank >> real_p[boost::bind(&Sim2DocBuddy::setSchedulingFixed,
self.mp_Owner, _1)]
320 >> *blank >> real_p[boost::bind(&Sim2DocBuddy::setSchedulingRange,
self.mp_Owner, _1)]
321 >> *blank >>
')' >> endLine
323 | linemarker >> endLine
325 >> str_p(
"END_SIMULATOR_SIGNATURE") >> endLine
334 linemarker =
'#' >> *(anychar_p - eol_p) >> eol_p;
336 blank = blank_p | eol_p;
337 endLine = *(blank |
';');
338 escapedQuote = str_p(
"\\\"");
340 string = *(escapedQuote | (anychar_p -
'"'));
342 varName = *(print_p -
')');
345 element = (+(*blank >>
'"' >>
string[boost::bind(&Sim2DocBuddy::buildParsedParam,
self.mp_Owner, _1, _2)]
347 | (*blank >> varName[boost::bind(&Sim2DocBuddy::buildParsedParam,
self.mp_Owner, _1, _2)]
351 parameters = element[boost::bind(&Sim2DocBuddy::clearParsedParam,
self.mp_Owner)]
352 >> *(
',' >> element[boost::bind(&Sim2DocBuddy::clearParsedParam,
self.mp_Owner)]);
358 element[boost::bind(&Sim2DocBuddy::storeDataIntoString,
self.mp_Owner, &
self.mp_Owner->m_SimID)];
360 element[boost::bind(&Sim2DocBuddy::storeDataIntoString,
self.mp_Owner, &
self.mp_Owner->m_SimName)];
362 element[boost::bind(&Sim2DocBuddy::storeDataIntoString,
self.mp_Owner, &
self.mp_Owner->m_SimDescription)];
364 element[boost::bind(&Sim2DocBuddy::storeDataIntoString,
self.mp_Owner, &
self.mp_Owner->m_SimVersion)];
366 StatusRule = element[boost::bind(&Sim2DocBuddy::storeDataIntoStatus,
self.mp_Owner)];
369 element[boost::bind(&Sim2DocBuddy::storeDataIntoString,
self.mp_Owner, &
self.mp_Owner->m_SimDomain)];
371 element[boost::bind(&Sim2DocBuddy::storeDataIntoVector,
self.mp_Owner, &
self.mp_Owner->m_SimAuthorsNames)]
373 element[boost::bind(&Sim2DocBuddy::storeDataIntoVector,
self.mp_Owner,
374 &
self.mp_Owner->m_SimAuthorsEmails)];
376 UsedParamRule = element[boost::bind(&Sim2DocBuddy::storeDataIntoKey,
377 self.mp_Owner, &
self.mp_Owner->m_ParamsData,
"used")]
378 >> *(
',' >> element[boost::bind(&Sim2DocBuddy::storeDataIntoSignatureData,
379 self.mp_Owner, &
self.mp_Owner->m_ParamsData)]);
380 RequiredParamRule = element[boost::bind(&Sim2DocBuddy::storeDataIntoKey,
381 self.mp_Owner, &
self.mp_Owner->m_ParamsData,
"required")]
382 >> *(
',' >> element[boost::bind(&Sim2DocBuddy::storeDataIntoSignatureData,
383 self.mp_Owner, &
self.mp_Owner->m_ParamsData)]);
385 ProducedVarRule = element[boost::bind(&Sim2DocBuddy::storeDataIntoKey,
self.mp_Owner,
386 &
self.mp_Owner->m_OutVars,
"produced")]
387 >> *(
',' >> element[boost::bind(&Sim2DocBuddy::storeDataIntoSignatureData,
388 self.mp_Owner, &
self.mp_Owner->m_OutVars)]);
389 UpdatedVarRule = element[boost::bind(&Sim2DocBuddy::storeDataIntoKey,
self.mp_Owner,
390 &
self.mp_Owner->m_OutVars,
"updated")]
391 >> *(
',' >> element[boost::bind(&Sim2DocBuddy::storeDataIntoSignatureData,
392 self.mp_Owner, &
self.mp_Owner->m_OutVars)]);
393 RequiredVarRule = element[boost::bind(&Sim2DocBuddy::storeDataIntoKey,
self.mp_Owner,
394 &
self.mp_Owner->m_InVars,
"required")]
395 >> *(
',' >> element[boost::bind(&Sim2DocBuddy::storeDataIntoSignatureData,
396 self.mp_Owner, &
self.mp_Owner->m_InVars)]);
397 UsedVarRule = element[boost::bind(&Sim2DocBuddy::storeDataIntoKey,
self.mp_Owner,
398 &
self.mp_Owner->m_InVars,
"used")]
399 >> *(
',' >> element[boost::bind(&Sim2DocBuddy::storeDataIntoSignatureData,
400 self.mp_Owner, &
self.mp_Owner->m_InVars)]);
402 ProducedAttributeRule = element[boost::bind(&Sim2DocBuddy::storeDataIntoKey,
self.mp_Owner,
403 &
self.mp_Owner->m_OutAttrs,
"produced")]
404 >> *(
',' >> element[boost::bind(&Sim2DocBuddy::storeDataIntoSignatureData,
self.mp_Owner,
405 &
self.mp_Owner->m_OutAttrs)]);
406 RequiredAttributeRule = element[boost::bind(&Sim2DocBuddy::storeDataIntoKey,
self.mp_Owner,
407 &
self.mp_Owner->m_InAttrs,
"required")]
408 >> *(
',' >> element[boost::bind(&Sim2DocBuddy::storeDataIntoSignatureData,
self.mp_Owner,
409 &
self.mp_Owner->m_InAttrs)]);
410 UsedAttributeRule = element[boost::bind(&Sim2DocBuddy::storeDataIntoKey,
self.mp_Owner,
411 &
self.mp_Owner->m_InAttrs,
"used")]
412 >> *(
',' >> element[boost::bind(&Sim2DocBuddy::storeDataIntoSignatureData,
self.mp_Owner,
413 &
self.mp_Owner->m_InAttrs)]);
415 UsedEventsRule = element[boost::bind(&Sim2DocBuddy::storeDataIntoKey,
self.mp_Owner,
416 &
self.mp_Owner->m_Events,
"")];
417 UsedExtraFilesRule = element[boost::bind(&Sim2DocBuddy::storeDataIntoKey,
self.mp_Owner,
418 &
self.mp_Owner->m_ExtraFiles,
"used")];
419 RequiredExtraFilesRule = element[boost::bind(&Sim2DocBuddy::storeDataIntoKey,
self.mp_Owner,
420 &
self.mp_Owner->m_ExtraFiles,
"required")];
422 UpdatedUnitsGraphRule = element[boost::bind(&Sim2DocBuddy::storeDataIntoString,
self.mp_Owner,
423 &
self.mp_Owner->m_UnitsGraph.UpdatedUnitsGraph)];
424 UpdatedUnitsClassRule = element[boost::bind(&Sim2DocBuddy::storeDataIntoUnitsClass,
self.mp_Owner,
425 &
self.mp_Owner->m_UnitsGraph.UpdatedUnitsClass, 1)]
426 >>
',' >> element[boost::bind(&Sim2DocBuddy::storeDataIntoUnitsClass,
self.mp_Owner,
427 &
self.mp_Owner->m_UnitsGraph.UpdatedUnitsClass, 2)];
433 rule<ScannerT>
const& start()
const {
return signature; }
Definition: ExternalProgram.hpp:54
Definition: SimulatorSignature.hpp:249
Definition: BuddiesListener.hpp:54
Definition: ApplicationException.hpp:47
#define OPENFLUID_API
Definition: dllexport.hpp:86
Definition: SimulatorSignature.hpp:222