7 #include <unordered_set>
22 using std::unordered_set;
30 const set<string> Documentation::getAllClassMethods(
MinitScript* minitScript) {
31 set<string> allClassMethods;
33 for (
auto typeIdx =
static_cast<int>(MinitScript::TYPE_STRING); ; typeIdx++) {
35 if (className.empty() ==
true)
break;
36 allClassMethods.insert(className);
39 for (
auto scriptMethod: minitScript->
getMethods()) {
41 if (scriptMethod->getMethodName().rfind(
"::") != string::npos) className = StringTools::substring(scriptMethod->getMethodName(), 0, scriptMethod->getMethodName().rfind(
"::"));
42 if (className.empty() ==
true && allClassMethods.find(scriptMethod->getMethodName()) == allClassMethods.end())
continue;
45 for (
auto typeIdx =
static_cast<int>(MinitScript::TYPE_STRING); ; typeIdx++) {
47 if (classNameCandidate.empty() ==
true)
break;
48 if (classNameCandidate == className) {
53 if (_class ==
false)
continue;
56 StringTools::substring(
57 scriptMethod->getMethodName(),
58 className.empty() ==
true?0:className.size() + 2,
59 scriptMethod->getMethodName().size());
62 scriptMethod->getArgumentTypes().empty() ==
true ||
63 scriptMethod->getArgumentTypes()[0].name != StringTools::toLowerCase(className) ||
64 MinitScript::Variable::getTypeAsString(scriptMethod->getArgumentTypes()[0].type) != className;
66 allClassMethods.insert(scriptMethod->getMethodName());
69 return allClassMethods;
72 const set<string> Documentation::getMethodsCategories(
MinitScript* minitScript,
const set<string>& allClassMethods,
MinitScript* excludeMinitScript) {
73 set<string> categories;
74 auto scriptMethods = minitScript->
getMethods();
75 for (
auto scriptMethod: scriptMethods) {
76 if (excludeMinitScript !=
nullptr && excludeMinitScript->
hasMethod(scriptMethod->getMethodName()) ==
true)
continue;
77 if (allClassMethods.find(scriptMethod->getMethodName()) != allClassMethods.end())
continue;
80 if (scriptMethod->getMethodName().rfind(
'.') != string::npos) category = StringTools::substring(scriptMethod->getMethodName(), 0, scriptMethod->getMethodName().rfind(
'.'));
81 categories.insert(category);
86 const string Documentation::generateClassesDocumentation(
const string& heading,
int mainHeadingIdx,
MinitScript* minitScript,
Properties& descriptions,
const string& descriptionPrefix,
const set<string>& allClassMethods) {
87 auto scriptMethods = minitScript->
getMethods();
89 map<string, array<map<string, string>, 2>> methodMarkupByClassName;
90 for (
auto scriptMethod: scriptMethods) {
92 if (allClassMethods.find(scriptMethod->getMethodName()) == allClassMethods.end())
continue;
96 if (scriptMethod->getMethodName().rfind(
"::") != string::npos) className = StringTools::substring(scriptMethod->getMethodName(), 0, scriptMethod->getMethodName().rfind(
"::"));
99 if (className.empty() ==
true) {
100 for (
auto typeIdx =
static_cast<int>(MinitScript::TYPE_STRING); ; typeIdx++) {
101 const auto& classNameCandidate = MinitScript::Variable::getTypeAsString(
static_cast<MinitScript::VariableType>(typeIdx));
102 if (classNameCandidate.empty() ==
true)
break;
103 if (scriptMethod->getMethodName() == classNameCandidate) {
104 className = classNameCandidate;
111 if (_static ==
false) {
113 scriptMethod->getArgumentTypes().empty() ==
true ||
114 scriptMethod->getArgumentTypes()[0].name != StringTools::toLowerCase(className) ||
115 MinitScript::Variable::getTypeAsString(scriptMethod->getArgumentTypes()[0].type) != className;
120 description+= descriptions.
get(descriptionPrefix + scriptMethod->getMethodName(),
"Not documented");
121 while (description.size() < 99) description+=
" ";
123 result+= description +
"\n";
126 if (_static ==
true) {
127 method+=
"<b>static</b> ";
129 method+= _static ==
true?scriptMethod->getMethodName():StringTools::substring(scriptMethod->getMethodName(), className.size() + 2, scriptMethod->getMethodName().size());
131 method+= scriptMethod->getArgumentsInformation(_static ==
true?0:1);
133 method+= MinitScript::Variable::getReturnTypeAsString(scriptMethod->getReturnValueType(), scriptMethod->isReturnValueNullable());
135 while (method.size() < 99) method+=
" ";
139 methodMarkupByClassName[className][_static ==
true?0:1][scriptMethod->getMethodName()] = result;
144 for (
auto typeIdx =
static_cast<int>(MinitScript::TYPE_STRING); ; typeIdx++) {
146 if (className.empty() ==
true)
break;
147 auto classNameDescription = descriptions.
get(
"minitscript.baseclass." + (className.empty() ==
true?
"No class":className),
"Not documented");
150 result+=
"## " + to_string(mainHeadingIdx) +
"." + to_string(classIdx++) +
". " + classNameDescription +
"\n";
153 for (
auto staticIdx = 0; staticIdx < 2; staticIdx++) {
155 if (methodMarkupByClassName[className][staticIdx].empty() ==
true)
continue;
157 if (staticIdx == 0) {
158 result+= string() +
"| Table of methods |" +
"\n";
159 result+= string() +
"|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|" +
"\n";
160 result+= string() +
"| |" +
"\n";
161 result+= string() +
"| <b>STATIC METHODS</b> |" +
"\n";
163 result+= string() +
"| |" +
"\n";
164 result+= string() +
"| <b>NON STATIC METHODS</b> |" +
"\n";
167 for (
const auto& [method, methodMarkup]: methodMarkupByClassName[className][staticIdx]) {
168 result+= methodMarkup;
176 const string Documentation::generateMethodsDocumentation(
const string& heading,
int mainHeadingIdx,
MinitScript* minitScript,
Properties& descriptions,
const string& descriptionPrefix,
const set<string>& allClassMethods,
MinitScript* excludeMinitScript) {
177 auto scriptMethods = minitScript->
getMethods();
178 map<string, vector<pair<string, string>>> methodMarkupByCategory;
179 for (
auto scriptMethod: scriptMethods) {
180 if (excludeMinitScript !=
nullptr && excludeMinitScript->
hasMethod(scriptMethod->getMethodName()) ==
true)
continue;
181 if (allClassMethods.find(scriptMethod->getMethodName()) != allClassMethods.end())
continue;
184 if (scriptMethod->getMethodName().rfind(
'.') != string::npos) category = StringTools::substring(scriptMethod->getMethodName(), 0, scriptMethod->getMethodName().rfind(
'.'));
187 description+= descriptions.
get(descriptionPrefix + scriptMethod->getMethodName(),
"Not documented");
188 if (scriptMethod->getContextFunctions().empty() ==
false) {
189 string contextFunctions;
190 for (
const auto& contextFunction: scriptMethod->getContextFunctions()) {
191 if (contextFunctions.empty() ==
false) contextFunctions+=
", ";
192 contextFunctions+= contextFunction +
"()";
194 description+=
" - <i>available in " + contextFunctions +
"</i>";
196 while (description.size() < 99) description+=
" ";
198 result+= description +
"\n";
201 method+= scriptMethod->getMethodName();
203 method+= scriptMethod->getArgumentsInformation();
205 method+= MinitScript::Variable::getReturnTypeAsString(scriptMethod->getReturnValueType(), scriptMethod->isReturnValueNullable());
207 while (method.size() < 99) method+=
" ";
211 methodMarkupByCategory[category].push_back(make_pair(scriptMethod->getMethodName(), result));
214 unordered_set<string> categories;
215 for (
const auto& [category, methodMarkup]: methodMarkupByCategory) {
216 categories.insert(category);
219 map<string, vector<string>> methodMarkupByCategory2;
220 for (
const auto& [category, methods]: methodMarkupByCategory) {
221 if (category.empty() ==
true)
continue;
222 for (
const auto& [methodName, methodMarkup]: methods) {
223 methodMarkupByCategory2[category].push_back(methodMarkup);
227 auto emptyCategoryMethodsIt = methodMarkupByCategory.find(
string());
228 if (emptyCategoryMethodsIt != methodMarkupByCategory.end()) {
229 const auto& methods = emptyCategoryMethodsIt->second;
230 for (
const auto& [methodName, methodMarkup]: methods) {
231 if (categories.contains(methodName) ==
true) {
232 methodMarkupByCategory2[methodName].insert(methodMarkupByCategory2[methodName].begin(), methodMarkup);
234 methodMarkupByCategory2[string()].push_back(methodMarkup);
241 result+=
"# " + to_string(mainHeadingIdx) +
". " + heading;
242 auto categoryIdx = 1;
243 for (
const auto& [category, methodsMarkup]: methodMarkupByCategory2) {
244 auto categoryName = descriptions.
get(descriptionPrefix +
"group." + (category.empty() ==
true?
"uncategorized":category),
"Not documented");
246 result+=
"## " + to_string(mainHeadingIdx) +
"." + to_string(categoryIdx++) +
". " + categoryName +
"\n";
248 result+= string() +
"| Table of methods |" +
"\n";
249 result+= string() +
"|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|" +
"\n";
250 for (
const auto& methodMarkup: methodsMarkup) result+= methodMarkup;
255 const string Documentation::generateOperatorsDocumentation(
256 const string& heading,
262 vector<string> operators;
263 for (
auto scriptMethod: scriptOperatorMethods) {
264 string operatorString;
265 operatorString =
"| ";
266 operatorString+= StringTools::replace(MinitScript::getOperatorAsString(scriptMethod->getOperator()),
"|",
"\\|");
267 while (operatorString.size() < 5) operatorString+=
" ";
268 operatorString+=
"| ";
269 operatorString+= scriptMethod->getMethodName();
270 operatorString+=
"(";
271 operatorString+= scriptMethod->getArgumentsInformation();
272 operatorString+=
"): ";
273 operatorString+= MinitScript::Variable::getReturnTypeAsString(scriptMethod->getReturnValueType(), scriptMethod->isReturnValueNullable());
274 while (operatorString.size() < 99) operatorString+=
" ";
275 operatorString+=
"|";
276 operators.push_back(operatorString);
278 sort(operators.begin(), operators.end());
281 result+= string() +
"\n";
282 result+= string() +
"# " + to_string(mainHeadingIdx) +
". " + heading +
"\n";
283 result+= string() +
"\n";
284 result+= string() +
"| Op | Method |" +
"\n";
285 result+= string() +
"|----|---------------------------------------------------------------------------------------------|" +
"\n";
286 for (
const auto& method: operators) result+= string() + method +
"\n";
290 const string Documentation::generateVariablesDocumentation(
291 const string& heading,
296 vector<string> variables;
298 string variableString;
299 variableString =
"| ";
300 variableString+= variableName;
301 while (variableString.size() < 62) variableString+=
" ";
302 variableString+=
"| ";
303 auto idx = variableString.size();
304 variableString+= variable->getValueAsString();
305 while (variableString.size() - idx < 35) variableString+=
" ";
306 variableString+=
"|";
307 variables.push_back(variableString);
309 sort(variables.begin(), variables.end());
312 result+= string() +
"\n";
313 result+= string() +
"# " + to_string(mainHeadingIdx) +
". " + heading +
"\n";
314 result+= string() +
"\n";
315 result+= string() +
"| Name | Value |" +
"\n";
316 result+= string() +
"|-------------------------------------------------------------|------------------------------------|" +
"\n";
317 for (
const auto& method: variables) result+= string() + method +
"\n";
MinitScript documentation.
ScriptState & getRootScriptState()
bool hasMethod(const string &methodName)
Returns if method with given name does exist.
const vector< Method * > getMethods()
const vector< Method * > getOperatorMethods()
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.
unordered_map< string, Variable * > variables