5 #include <unordered_map>
6 #include <unordered_set>
21 using std::make_unique;
26 using std::unordered_map;
27 using std::unordered_set;
45 auto scriptMethods = miniScript->getMethods();
46 map<string, vector<pair<string, string>>> methodMarkupByCategory;
47 for (
auto scriptMethod: scriptMethods) {
48 if (omitMiniScript !=
nullptr && omitMiniScript->hasMethod(scriptMethod->getMethodName()) ==
true)
continue;
49 if (allClassMethods.find(scriptMethod->getMethodName()) != allClassMethods.end())
continue;
52 if (scriptMethod->getMethodName().rfind(
'.') != string::npos) category = StringTools::substring(scriptMethod->getMethodName(), 0, scriptMethod->getMethodName().rfind(
'.'));
55 description+= descriptions.
get(descriptionPrefix + scriptMethod->getMethodName(),
"Not documented");
56 if (scriptMethod->getContextFunctions().empty() ==
false) {
57 string contextFunctions;
58 for (
const auto& contextFunction: scriptMethod->getContextFunctions()) {
59 if (contextFunctions.empty() ==
false) contextFunctions+=
", ";
60 contextFunctions+= contextFunction +
"()";
62 description+=
" - <i>available in " + contextFunctions +
"</i>";
64 while (description.size() < 99) description+=
" ";
66 result+= description +
"\n";
69 method+= scriptMethod->getMethodName();
71 method+= scriptMethod->getArgumentsInformation();
73 method+= EngineMiniScript::ScriptVariable::getReturnTypeAsString(scriptMethod->getReturnValueType(), scriptMethod->isReturnValueNullable());
75 while (method.size() < 99) method+=
" ";
79 methodMarkupByCategory[category].push_back(make_pair(scriptMethod->getMethodName(), result));
82 for (
const auto& [category, methodMarkup]: methodMarkupByCategory) {
83 categories.insert(category);
86 map<string, vector<string>> methodMarkupByCategory2;
87 for (
const auto& [category, methods]: methodMarkupByCategory) {
88 if (category.empty() ==
true)
continue;
89 for (
const auto& [methodName, methodMarkup]: methods) {
90 methodMarkupByCategory2[category].push_back(methodMarkup);
94 auto emptyCategoryMethodsIt = methodMarkupByCategory.find(
string());
95 if (emptyCategoryMethodsIt != methodMarkupByCategory.end()) {
96 const auto& methods = emptyCategoryMethodsIt->second;
97 for (
const auto& [methodName, methodMarkup]: methods) {
98 if (categories.contains(methodName) ==
true) {
99 methodMarkupByCategory2[methodName].insert(methodMarkupByCategory2[methodName].begin(), methodMarkup);
101 methodMarkupByCategory2[string()].push_back(methodMarkup);
107 Console::println(
"# " + to_string(mainHeadingIdx) +
". " + heading);
108 auto categoryIdx = 1;
109 for (
const auto& [category, methodsMarkup]: methodMarkupByCategory2) {
110 auto categoryName = descriptions.
get(descriptionPrefix +
"group." + (category.empty() ==
true?
"uncategorized":category),
"Not documented");
112 Console::println(
"## " + to_string(mainHeadingIdx) +
"." + to_string(categoryIdx++) +
" " + categoryName);
114 Console::println(
"| Table of methods |");
115 Console::println(
"|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|");
116 for (
const auto& methodMarkup: methodsMarkup) Console::print(methodMarkup);
121 auto scriptMethods = miniScript->getMethods();
123 for (
auto typeIdx =
static_cast<int>(EngineMiniScript::TYPE_STRING); typeIdx <= static_cast<int>(EngineMiniScript::TYPE_SET); typeIdx++) {
124 const auto& className = EngineMiniScript::ScriptVariable::getClassName(
static_cast<EngineMiniScript::ScriptVariableType
>(typeIdx));
125 allClassMethods.insert(className);
128 for (
auto scriptMethod: scriptMethods) {
130 if (scriptMethod->getMethodName().rfind(
'.') != string::npos) className = StringTools::substring(scriptMethod->getMethodName(), 0, scriptMethod->getMethodName().rfind(
'.'));
131 if (className.empty() ==
true && allClassMethods.find(scriptMethod->getMethodName()) == allClassMethods.end())
continue;
134 for (
auto typeIdx =
static_cast<int>(EngineMiniScript::TYPE_STRING); typeIdx <= static_cast<int>(EngineMiniScript::TYPE_SET); typeIdx++) {
135 if (EngineMiniScript::ScriptVariable::getClassName(
static_cast<EngineMiniScript::ScriptVariableType
>(typeIdx)) == className) {
140 if (_class ==
false)
continue;
143 StringTools::substring(
144 scriptMethod->getMethodName(),
145 className.empty() ==
true?0:className.size() + 1,
146 scriptMethod->getMethodName().size());
149 scriptMethod->getArgumentTypes().empty() ==
true ||
150 scriptMethod->getArgumentTypes()[0].name != className ||
151 EngineMiniScript::ScriptVariable::getClassName(scriptMethod->getArgumentTypes()[0].type) != className;
153 allClassMethods.insert(scriptMethod->getMethodName());
156 map<string, array<map<string, string>, 2>> methodMarkupByClassName;
157 for (
auto scriptMethod: scriptMethods) {
159 if (allClassMethods.find(scriptMethod->getMethodName()) == allClassMethods.end())
continue;
163 if (scriptMethod->getMethodName().rfind(
'.') != string::npos) className = StringTools::substring(scriptMethod->getMethodName(), 0, scriptMethod->getMethodName().rfind(
'.'));
165 auto _static =
false;
166 if (className.empty() ==
true) {
167 for (
auto typeIdx =
static_cast<int>(EngineMiniScript::TYPE_STRING); typeIdx <= static_cast<int>(EngineMiniScript::TYPE_SET); typeIdx++) {
168 const auto& possibleClassName = EngineMiniScript::ScriptVariable::getClassName(
static_cast<EngineMiniScript::ScriptVariableType
>(typeIdx));
169 if (scriptMethod->getMethodName() == possibleClassName) {
170 className = possibleClassName;
177 if (_static ==
false) {
179 scriptMethod->getArgumentTypes().empty() ==
true ||
180 scriptMethod->getArgumentTypes()[0].name != className ||
181 EngineMiniScript::ScriptVariable::getClassName(scriptMethod->getArgumentTypes()[0].type) != className;
186 description+= descriptions.
get(descriptionPrefix + scriptMethod->getMethodName(),
"Not documented");
187 while (description.size() < 99) description+=
" ";
189 result+= description +
"\n";
192 if (_static ==
true) {
193 method+=
"<b>static</b> ";
195 method+= _static ==
true?scriptMethod->getMethodName():StringTools::substring(scriptMethod->getMethodName(), className.size() + 1, scriptMethod->getMethodName().size());
197 method+= scriptMethod->getArgumentsInformation(_static ==
true?0:1);
199 method+= EngineMiniScript::ScriptVariable::getReturnTypeAsString(scriptMethod->getReturnValueType(), scriptMethod->isReturnValueNullable());
201 while (method.size() < 99) method+=
" ";
205 methodMarkupByClassName[className][_static ==
true?0:1][scriptMethod->getMethodName()] = result;
209 for (
auto typeIdx =
static_cast<int>(EngineMiniScript::TYPE_STRING); typeIdx <= static_cast<int>(EngineMiniScript::TYPE_SET); typeIdx++) {
210 const auto& className = EngineMiniScript::ScriptVariable::getClassName(
static_cast<EngineMiniScript::ScriptVariableType
>(typeIdx));
211 auto classNameDescription = descriptions.
get(
"miniscript.baseclass." + (className.empty() ==
true?
"No class":className),
"Not documented");
214 Console::println(
"## " + to_string(mainHeadingIdx) +
"." + to_string(classIdx++) +
" " + classNameDescription);
217 for (
auto staticIdx = 0; staticIdx < 2; staticIdx++) {
219 if (methodMarkupByClassName[className][staticIdx].empty() ==
true)
continue;
221 if (staticIdx == 0) {
222 Console::println(
"| Table of methods |");
223 Console::println(
"|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|");
224 Console::println(
"| |");
225 Console::println(
"| <b>STATIC METHODS</b> |");
227 Console::println(
"| |");
228 Console::println(
"| <b>NON STATIC METHODS</b> |");
231 for (
const auto& [method, methodMarkup]: methodMarkupByClassName[className][staticIdx]) {
232 Console::print(methodMarkup);
243 int main(
int argc,
char** argv)
245 Console::println(
string(
"createminiscriptdocumentation ") + Version::getVersion());
246 Console::println(Version::getCopyright());
250 descriptions.
load(
"resources/engine/code-completion",
"tscript-methods.properties");
253 EngineMiniScript::registerDataTypes();
256 auto baseMiniScript = make_unique<EngineMiniScript>();
257 baseMiniScript->registerMethods();
260 auto logicMiniScript = make_unique<LogicMiniScript>();
261 logicMiniScript->registerMethods();
264 auto guiMiniScript = make_unique<GUIMiniScript>(
nullptr);
265 guiMiniScript->registerMethods();
268 unordered_set<string> baseClassesCategories;
269 unordered_set<string> baseMethodCategories;
270 unordered_set<string> logicMethodCategories;
271 unordered_set<string> guiMethodCategories;
273 set<string> allClassMethods;
284 auto scriptOperatorMethods = baseMiniScript->getOperatorMethods();
285 vector<string> operators;
286 for (
auto scriptMethod: scriptOperatorMethods) {
287 string operatorString;
288 operatorString =
"| ";
289 operatorString+= StringTools::replace(EngineMiniScript::getOperatorAsString(scriptMethod->getOperator()),
"|",
"\\|");
290 while (operatorString.size() < 5) operatorString+=
" ";
291 operatorString+=
"| ";
292 operatorString+= scriptMethod->getMethodName();
293 operatorString+=
"(";
294 operatorString+= scriptMethod->getArgumentsInformation();
295 operatorString+=
"): ";
296 operatorString+= EngineMiniScript::ScriptVariable::getReturnTypeAsString(scriptMethod->getReturnValueType(), scriptMethod->isReturnValueNullable());
297 while (operatorString.size() < 99) operatorString+=
" ";
298 operatorString+=
"|";
299 operators.push_back(operatorString);
301 sort(operators.begin(), operators.end());
303 Console::println(
"# 10. Operators");
305 Console::println(
"| Op | Method |");
306 Console::println(
"|----|---------------------------------------------------------------------------------------------|");
307 for (
const auto& method: operators) Console::println(method);
311 Console::println(
"# properties methodname=human readable string");
314 Console::println(
"# base methods");
316 for (
const auto& baseMethodCategory: baseMethodCategories) {
317 Console::println(
"miniscript.basemethod.group." + (baseMethodCategory.empty() ==
true?
"uncategorized":baseMethodCategory) +
"=");
320 auto scriptMethods = baseMiniScript->getMethods();
321 for (
auto scriptMethod: scriptMethods) {
322 Console::println(
"miniscript.basemethod." + scriptMethod->getMethodName() +
"=");
326 Console::println(
"# miniscript logic methods");
328 for (
const auto& logicMethodCategory: logicMethodCategories) {
329 Console::println(
"miniscript.logicmethod.group." + (logicMethodCategory.empty() ==
true?
"uncategorized":logicMethodCategory) +
"=");
332 auto scriptMethods = logicMiniScript->getMethods();
333 for (
auto scriptMethod: scriptMethods) {
334 if (baseMiniScript->hasMethod(scriptMethod->getMethodName()) ==
true)
continue;
335 Console::println(
"miniscript.logicmethod." + scriptMethod->getMethodName() +
"=");
339 Console::println(
"# miniscript gui methods");
341 for (
const auto& guiMethodCategory: guiMethodCategories) {
342 Console::println(
"miniscript.group." + (guiMethodCategory.empty() ==
true?
"uncategorized":guiMethodCategory) +
"=");
345 auto scriptMethods = guiMiniScript->getMethods();
346 for (
auto scriptMethod: scriptMethods) {
347 if (baseMiniScript->hasMethod(scriptMethod->getMethodName()) ==
true)
continue;
348 Console::println(
"miniscript." + scriptMethod->getMethodName() +
"=");
354 Console::println(
"Keywords: ");
355 set<string> allMethods;
358 auto scriptMethods = baseMiniScript->getMethods();
359 for (
auto scriptMethod: scriptMethods) {
360 allMethods.insert(scriptMethod->getMethodName());
365 auto scriptMethods = logicMiniScript->getMethods();
366 for (
auto scriptMethod: scriptMethods) {
367 allMethods.insert(scriptMethod->getMethodName());
372 auto scriptMethods = guiMiniScript->getMethods();
373 for (
auto scriptMethod: scriptMethods) {
374 allMethods.insert(scriptMethod->getMethodName());
378 for (
const auto& method: allMethods) {
379 Console::print(method +
" ");
384 Application::exit(Application::EXITCODE_SUCCESS);
Application base class, please make sure to allocate application on heap to have correct application ...
Properties class, which helps out with storeing or loading key value pairs from/to property files.
const string & get(const string &key, const string &defaultValue) const
Get property value by key.
void load(const string &pathName, const string &fileName, FileSystemInterface *fileSystem=nullptr)
Load property file.
int main(int argc, char **argv)