41 #ifndef __OPENFLUID_BUDDIES_SIM2DOCBUDDY_HPP__ 42 #define __OPENFLUID_BUDDIES_SIM2DOCBUDDY_HPP__ 45 #include <openfluid/config.hpp> 48 #if OPENFLUID_SIM2DOC_ENABLED 57 #include <boost/spirit/include/classic_core.hpp> 58 #include <boost/spirit/include/classic_file_iterator.hpp> 59 #include <boost/bind.hpp> 66 using namespace BOOST_SPIRIT_CLASSIC_NS;
70 class BuddiesListener;
76 typedef std::map< std::string,std::vector<std::string> > SignatureData_t;
78 std::string m_CPPFile;
79 std::string m_LatexOutFile;
81 std::string m_InputDirPath;
82 std::string m_OutputDirPath;
83 std::string m_InputFilePath;
84 std::string m_OutputLatexFilePath;
85 std::string m_TplFilePath;
86 std::string m_CProcessedFilePath;
93 std::string m_ExtractedLatexDoc;
96 std::string m_NewCommands;
98 std::string m_SimName;
99 std::string m_SimVersion;
100 std::string m_SimStatus;
101 std::vector<std::string> m_SimAuthorsNames;
102 std::vector<std::string> m_SimAuthorsEmails;
103 std::string m_SimDomain;
104 std::string m_SimDescription;
105 std::string m_SimData;
107 std::string m_BeginSignatureTag;
108 std::string m_EndSignatureTag;
109 std::string m_BeginSim2DocTag;
110 std::string m_EndSim2DocTag;
112 std::string m_CurrentKeyValue;
113 std::string m_CurrentBuiltParam;
115 std::string m_HTMLPackageLatexCommand;
117 SignatureData_t m_InVars;
118 SignatureData_t m_OutVars;
119 SignatureData_t m_ModVars;
120 SignatureData_t m_InAttrs;
121 SignatureData_t m_OutAttrs;
122 SignatureData_t m_ParamsData;
123 SignatureData_t m_Events;
124 SignatureData_t m_ExtraFiles;
129 static std::string extractBetweenTags(std::string Content,
const std::string& BeginTag,
const std::string& EndTag);
131 static std::string toLatexFriendly(std::string Content);
133 static void addLatexDataCatBegin(std::string& Content,
const std::string& Title,
const std::string& ColsFormat);
135 static void addLatexDataCatEnd(std::string& Content);
137 std::string extractSignatureLines();
139 void copyDocDirectory();
141 void extractLatexDocFromCPP();
143 void cpreprocessCPP();
151 void buildParsedParam(
const char* First,
const char* Last);
156 void clearParsedParam();
162 void storeDataIntoString(std::string *Str);
168 void storeDataIntoVector(std::vector<std::string> *List);
176 void storeDataIntoKey(SignatureData_t *SignatureData,
const std::string& State);
182 void storeDataIntoSignatureData(SignatureData_t *SignatureData);
187 void storeDataIntoStatus();
194 void storeDataIntoUnitsClass(std::vector<openfluid::ware::SignatureUnitsClassItem> *UpdatedUnitsClass,
201 void setSchedulingFixed(
double Val);
207 void setSchedulingRange(
double Max);
214 void turnIntoLatexSyntax();
216 void processSignature();
218 void generateLatex();
220 bool isErrorInPDFLatexLog();
238 struct SimSignatureGrammar :
public grammar<SimSignatureGrammar>
240 Sim2DocBuddy *mp_Owner;
241 SimSignatureGrammar(Sim2DocBuddy *Owner) : mp_Owner(Owner) {}
244 template <
typename ScannerT>
248 rule<ScannerT> blank, linemarker, endLine, escapedQuote, string, varName, element, parameters, signature,
249 IDRule, NameRule, DescriptionRule, VersionRule, StatusRule, DomainRule, AuthorRule,
250 UsedParamRule, RequiredParamRule,
251 ProducedVarRule, UpdatedVarRule, RequiredVarRule, UsedVarRule,
252 ProducedAttributeRule, RequiredAttributeRule, UsedAttributeRule,
254 UsedExtraFilesRule, RequiredExtraFilesRule,
255 UpdatedUnitsGraphRule, UpdatedUnitsClassRule;
267 definition(SimSignatureGrammar
const&
self)
271 signature = str_p(
"BEGIN_SIMULATOR_SIGNATURE") >> *blank >>
'(' >> IDRule >>
')' >> endLine
272 >> *(str_p(
"DECLARE_NAME") >> *blank >>
'(' >> NameRule >>
')' >> endLine
273 | str_p(
"DECLARE_DESCRIPTION") >> *blank >>
'(' >> DescriptionRule >>
')' >> endLine
274 | str_p(
"DECLARE_VERSION") >> *blank >>
'(' >> VersionRule >>
')' >> endLine
275 | str_p(
"DECLARE_SDKVERSION") >> endLine
276 | str_p(
"DECLARE_STATUS") >> *blank >>
'(' >> StatusRule >>
')' >> endLine
277 | str_p(
"DECLARE_DOMAIN") >> *blank >>
'(' >> DomainRule >>
')' >> endLine
278 | str_p(
"DECLARE_PROCESS") >> *blank >>
'(' >> parameters >>
')' >> endLine
279 | str_p(
"DECLARE_METHOD") >> *blank >>
'(' >> parameters >>
')' >> endLine
280 | str_p(
"DECLARE_AUTHOR") >> *blank >>
'(' >> AuthorRule >>
')' >> endLine
282 | str_p(
"DECLARE_REQUIRED_PARAMETER") >> *blank >>
'(' >> RequiredParamRule >>
')' >> endLine
283 | str_p(
"DECLARE_USED_PARAMETER") >> *blank >>
'(' >> UsedParamRule >>
')' >> endLine
286 | str_p(
"DECLARE_SIMULATOR_PARAM") >> *blank >>
'(' >> UsedParamRule >>
')' >> endLine
288 | str_p(
"DECLARE_PRODUCED_VARIABLE") >> *blank >>
'(' >> ProducedVarRule >>
')' >> endLine
289 | str_p(
"DECLARE_UPDATED_VARIABLE") >> *blank >>
'(' >> UpdatedVarRule >>
')' >> endLine
290 | str_p(
"DECLARE_REQUIRED_VARIABLE") >> *blank >>
'(' >> RequiredVarRule >>
')' >> endLine
291 | str_p(
"DECLARE_USED_VARIABLE") >> *blank >>
'(' >> UsedVarRule >>
')' >> endLine
294 | str_p(
"DECLARE_PRODUCED_VAR") >> *blank >>
'(' >> ProducedVarRule >>
')' >> endLine
295 | str_p(
"DECLARE_UPDATED_VAR") >> *blank >>
'(' >> UpdatedVarRule >>
')' >> endLine
296 | str_p(
"DECLARE_REQUIRED_VAR") >> *blank >>
'(' >> RequiredVarRule >>
')' >> endLine
297 | str_p(
"DECLARE_USED_VAR") >> *blank >>
'(' >> UsedVarRule >>
')' >> endLine
299 | str_p(
"DECLARE_PRODUCED_ATTRIBUTE") >> *blank >>
'(' >> ProducedAttributeRule >>
')' >> endLine
300 | str_p(
"DECLARE_REQUIRED_ATTRIBUTE") >> *blank >>
'(' >> RequiredAttributeRule >>
')' >> endLine
301 | str_p(
"DECLARE_USED_ATTRIBUTE") >> *blank >>
'(' >> UsedAttributeRule >>
')' >> endLine
303 | str_p(
"DECLARE_USED_EVENTS") >> *blank >>
'(' >> UsedEventsRule >>
')' >> endLine
304 | str_p(
"DECLARE_USED_EXTRAFILE") >> *blank >>
'(' >> UsedExtraFilesRule >>
')' >> endLine
305 | str_p(
"DECLARE_REQUIRED_EXTRAFILE") >> *blank >>
'(' >> RequiredExtraFilesRule >>
')' >> endLine
307 | str_p(
"DECLARE_UPDATED_UNITSGRAPH") >> *blank >>
'(' >> UpdatedUnitsGraphRule >>
')' >> endLine
308 | str_p(
"DECLARE_UPDATED_UNITSCLASS") >> *blank >>
'(' >> UpdatedUnitsClassRule >>
')' >> endLine
310 | str_p(
"DECLARE_SCHEDULING_UNDEFINED")[boost::bind(&ware::SignatureTimeScheduling::setAsUndefined,
311 &
self.mp_Owner->m_TimeScheduling)] >> endLine
312 | str_p(
"DECLARE_SCHEDULING_DEFAULT")[boost::bind(
313 &ware::SignatureTimeScheduling::setAsDefaultDeltaT,
314 &
self.mp_Owner->m_TimeScheduling)] >> endLine
315 | str_p(
"DECLARE_SCHEDULING_FIXED") >> *blank >>
'(' >> *blank
316 >> real_p[boost::bind(&Sim2DocBuddy::setSchedulingFixed,
self.mp_Owner, _1)]
317 >> *blank >>
')' >> endLine
318 | str_p(
"DECLARE_SCHEDULING_RANGE") >> *blank >>
'(' 319 >> *blank >> real_p[boost::bind(&Sim2DocBuddy::setSchedulingFixed,
self.mp_Owner, _1)]
321 >> *blank >> real_p[boost::bind(&Sim2DocBuddy::setSchedulingRange,
self.mp_Owner, _1)]
322 >> *blank >>
')' >> endLine
324 | linemarker >> endLine
326 >> str_p(
"END_SIMULATOR_SIGNATURE") >> endLine
335 linemarker =
'#' >> *(anychar_p - eol_p) >> eol_p;
337 blank = blank_p | eol_p;
338 endLine = *(blank |
';');
339 escapedQuote = str_p(
"\\\"");
341 string = *(escapedQuote | (anychar_p -
'"'));
343 varName = *(print_p -
')');
346 element = (+(*blank >>
'"' >>
string[boost::bind(&Sim2DocBuddy::buildParsedParam,
self.mp_Owner, _1, _2)]
348 | (*blank >> varName[boost::bind(&Sim2DocBuddy::buildParsedParam,
self.mp_Owner, _1, _2)]
352 parameters = element[boost::bind(&Sim2DocBuddy::clearParsedParam,
self.mp_Owner)]
353 >> *(
',' >> element[boost::bind(&Sim2DocBuddy::clearParsedParam,
self.mp_Owner)]);
360 element[boost::bind(&Sim2DocBuddy::storeDataIntoString,
self.mp_Owner, &
self.mp_Owner->m_SimID)];
362 element[boost::bind(&Sim2DocBuddy::storeDataIntoString,
self.mp_Owner, &
self.mp_Owner->m_SimName)];
364 element[boost::bind(&Sim2DocBuddy::storeDataIntoString,
self.mp_Owner, &
self.mp_Owner->m_SimDescription)];
366 element[boost::bind(&Sim2DocBuddy::storeDataIntoString,
self.mp_Owner, &
self.mp_Owner->m_SimVersion)];
368 StatusRule = element[boost::bind(&Sim2DocBuddy::storeDataIntoStatus,
self.mp_Owner)];
371 element[boost::bind(&Sim2DocBuddy::storeDataIntoString,
self.mp_Owner, &
self.mp_Owner->m_SimDomain)];
373 element[boost::bind(&Sim2DocBuddy::storeDataIntoVector,
self.mp_Owner, &
self.mp_Owner->m_SimAuthorsNames)]
375 element[boost::bind(&Sim2DocBuddy::storeDataIntoVector,
self.mp_Owner,
376 &
self.mp_Owner->m_SimAuthorsEmails)];
378 UsedParamRule = element[boost::bind(&Sim2DocBuddy::storeDataIntoKey,
379 self.mp_Owner, &
self.mp_Owner->m_ParamsData,
"used")]
380 >> *(
',' >> element[boost::bind(&Sim2DocBuddy::storeDataIntoSignatureData,
381 self.mp_Owner, &
self.mp_Owner->m_ParamsData)]);
382 RequiredParamRule = element[boost::bind(&Sim2DocBuddy::storeDataIntoKey,
383 self.mp_Owner, &
self.mp_Owner->m_ParamsData,
"required")]
384 >> *(
',' >> element[boost::bind(&Sim2DocBuddy::storeDataIntoSignatureData,
385 self.mp_Owner, &
self.mp_Owner->m_ParamsData)]);
387 ProducedVarRule = element[boost::bind(&Sim2DocBuddy::storeDataIntoKey,
self.mp_Owner,
388 &
self.mp_Owner->m_OutVars,
"produced")]
389 >> *(
',' >> element[boost::bind(&Sim2DocBuddy::storeDataIntoSignatureData,
390 self.mp_Owner, &
self.mp_Owner->m_OutVars)]);
391 UpdatedVarRule = element[boost::bind(&Sim2DocBuddy::storeDataIntoKey,
self.mp_Owner,
392 &
self.mp_Owner->m_OutVars,
"updated")]
393 >> *(
',' >> element[boost::bind(&Sim2DocBuddy::storeDataIntoSignatureData,
394 self.mp_Owner, &
self.mp_Owner->m_OutVars)]);
395 RequiredVarRule = element[boost::bind(&Sim2DocBuddy::storeDataIntoKey,
self.mp_Owner,
396 &
self.mp_Owner->m_InVars,
"required")]
397 >> *(
',' >> element[boost::bind(&Sim2DocBuddy::storeDataIntoSignatureData,
398 self.mp_Owner, &
self.mp_Owner->m_InVars)]);
399 UsedVarRule = element[boost::bind(&Sim2DocBuddy::storeDataIntoKey,
self.mp_Owner,
400 &
self.mp_Owner->m_InVars,
"used")]
401 >> *(
',' >> element[boost::bind(&Sim2DocBuddy::storeDataIntoSignatureData,
402 self.mp_Owner, &
self.mp_Owner->m_InVars)]);
404 ProducedAttributeRule = element[boost::bind(&Sim2DocBuddy::storeDataIntoKey,
self.mp_Owner,
405 &
self.mp_Owner->m_OutAttrs,
"produced")]
406 >> *(
',' >> element[boost::bind(&Sim2DocBuddy::storeDataIntoSignatureData,
self.mp_Owner,
407 &
self.mp_Owner->m_OutAttrs)]);
408 RequiredAttributeRule = element[boost::bind(&Sim2DocBuddy::storeDataIntoKey,
self.mp_Owner,
409 &
self.mp_Owner->m_InAttrs,
"required")]
410 >> *(
',' >> element[boost::bind(&Sim2DocBuddy::storeDataIntoSignatureData,
self.mp_Owner,
411 &
self.mp_Owner->m_InAttrs)]);
412 UsedAttributeRule = element[boost::bind(&Sim2DocBuddy::storeDataIntoKey,
self.mp_Owner,
413 &
self.mp_Owner->m_InAttrs,
"used")]
414 >> *(
',' >> element[boost::bind(&Sim2DocBuddy::storeDataIntoSignatureData,
self.mp_Owner,
415 &
self.mp_Owner->m_InAttrs)]);
417 UsedEventsRule = element[boost::bind(&Sim2DocBuddy::storeDataIntoKey,
self.mp_Owner,
418 &
self.mp_Owner->m_Events,
"")];
419 UsedExtraFilesRule = element[boost::bind(&Sim2DocBuddy::storeDataIntoKey,
self.mp_Owner,
420 &
self.mp_Owner->m_ExtraFiles,
"used")];
421 RequiredExtraFilesRule = element[boost::bind(&Sim2DocBuddy::storeDataIntoKey,
self.mp_Owner,
422 &
self.mp_Owner->m_ExtraFiles,
"required")];
424 UpdatedUnitsGraphRule = element[boost::bind(&Sim2DocBuddy::storeDataIntoString,
self.mp_Owner,
425 &
self.mp_Owner->m_UnitsGraph.UpdatedUnitsGraph)];
426 UpdatedUnitsClassRule = element[boost::bind(&Sim2DocBuddy::storeDataIntoUnitsClass,
self.mp_Owner,
427 &
self.mp_Owner->m_UnitsGraph.UpdatedUnitsClass, 1)]
428 >>
',' >> element[boost::bind(&Sim2DocBuddy::storeDataIntoUnitsClass,
self.mp_Owner,
429 &
self.mp_Owner->m_UnitsGraph.UpdatedUnitsClass, 2)];
435 rule<ScannerT>
const& start()
const {
return signature; }
Definition: BuddiesListener.hpp:55
Definition: SimulatorSignature.hpp:223
Definition: ExternalProgram.hpp:53
#define OPENFLUID_API
Definition: dllexport.hpp:87
Definition: SimulatorSignature.hpp:250
Definition: ApplicationException.hpp:47