1+ use std, types, files, yaml, functional
2+
3+ INPUT_PATH_FMT = "./modules/%s.yml"
4+ OUTPUT_DIR_FMT = "../docs/%s/modules"
5+ OUTPUT_PATH_FMT = OUTPUT_DIR_FMT + "/%s.md"
6+
7+ LANGS = ["en", "ru"]
8+ MODULES = [
9+ "std",
10+ "types",
11+ "math",
12+ "date",
13+ "files",
14+ "http",
15+ "socket",
16+ "downloader",
17+ "base64",
18+ "json",
19+ "yaml",
20+ "zip",
21+ "gzip",
22+ "functional",
23+ "robot",
24+ "ounit",
25+ "canvas",
26+ "canvasfx",
27+ "forms",
28+ "java",
29+ "jdbc",
30+ "regex",
31+ "android",
32+ "canvas_android",
33+ "forms_android",
34+ "imageprocessing_android",
35+ "gps_android"
36+ ]
37+ messages = {
38+ "constants": {"en": "Constants", "ru": "Константы"},
39+ "functions": {"en": "Functions", "ru": "Функции"},
40+ "types": {"en": "Types", "ru": "Типы"},
41+ "example": {"en": "Example", "ru": "Пример"},
42+ "since": {"en": "since", "ru": "начиная с"}
43+ }
44+
45+ // Write modules pages to vuepress config
46+ f = fopen("../docs/.vuepress/configs/modules.js", "w")
47+ writeLine(f, "export default [")
48+ writeLine(f, stream(MODULES).map(def(m) = " \"%s.md\"".sprintf(m)).joining(",\n"))
49+ writeLine(f, "]")
50+ flush(f)
51+ fclose(f)
52+
53+ // Create output dirs
54+ for lang : LANGS {
55+ mkdirs(sprintf(OUTPUT_DIR_FMT, lang))
56+ }
57+
58+ for moduleName : MODULES {
59+ module = readYml(sprintf(INPUT_PATH_FMT, moduleName))
60+ for lang : LANGS {
61+ println "" + module.name + " / " + lang
62+ file = sprintf(OUTPUT_PATH_FMT, lang, moduleName)
63+ f = fopen(file, "w")
64+
65+ writeHeader(f, module, lang)
66+ writeConstants(f, module.constants ?? [], lang)
67+ writeFunctions(f, module.functions ?? [], lang, 2);
68+ writeTypes(f, module.types ?? [], lang);
69+
70+ flush(f)
71+ fclose(f)
72+ }
73+ }
74+
75+ // -- write
76+ def writeHeader(f, module, lang) {
77+ writeText(f, header(module.name, 1))
78+ if length(module.scope ?? "") && (module.scope != "both") {
79+ writeText(f, " (" + module.scope + ")")
80+ }
81+ writeLine(f, "\n")
82+ if length(module.since ?? "") {
83+ writeSince(f, module.since, lang)
84+ }
85+ writeDescription(f, module, lang, "\n%s\n")
86+ }
87+
88+ def writeConstants(f, constants, lang) {
89+ if (constants.isEmpty()) return 0
90+
91+ writeLine(f, "\n\n## " + messages.constants[lang])
92+ for info : constants {
93+ writeText(f, "\n`%s` : *%s*".sprintf(info.name, info.typeName))
94+ writeScope(f, info.scope ?? "")
95+ writeText(f, " = ")
96+ constValue = getValue(info, "value", lang)
97+ if (info.type != MAP && info.type != CLASS) {
98+ writeText(f, "`%s`".sprintf(constValue))
99+ } else {
100+ mapValues = constValue.substring(1, constValue.length - 1).split(", ")
101+ if (mapValues.length >= 7) {
102+ writeText(f, "\n\n```own\n{\n ");
103+ writeText(f, mapValues.joinToString(",\n "));
104+ writeText(f, "\n}\n```");
105+ } else {
106+ writeText(f, "`%s`".sprintf(constValue));
107+ }
108+ }
109+ writeLine(f, "")
110+ writeDescription(f, info, lang, "\n%s\n")
111+ }
112+
113+ }
114+
115+ def writeFunctions(f, functions, lang, level = 2) {
116+ if (functions.isEmpty()) return 0
117+
118+ writeLine(f, "\n\n" + header(messages.functions[lang], level))
119+ for info : functions {
120+ writeText(f, "\n`%s(%s)`".sprintf(info.name, info.args))
121+ writeScope(f, info.scope ?? "")
122+ if length(info.since ?? "") {
123+ writeSince(f, info.since, lang)
124+ }
125+ writeDescription(f, info, lang, " — %s")
126+ writeLine(f, "")
127+
128+ example = getValue(info, "example", lang)
129+ if (length(example ?? "")) {
130+ writeLine(f, "\n```own")
131+ writeLine(f, example)
132+ writeLine(f, "```")
133+ }
134+ }
135+ }
136+
137+ def writeTypes(f, types, lang) {
138+ if (types.isEmpty()) return 0
139+
140+ writeLine(f, "\n\n" + header(messages.types[lang]))
141+ for info : types {
142+ writeText(f, "\n\n" + header("`%s`".sprintf(info.name), 3))
143+ writeScope(f, info.scope ?? "")
144+ writeDescription(f, info, lang, "%s\n")
145+ writeFunctions(f, info.functions ?? [], lang, 4);
146+ writeLine(f, "")
147+ }
148+ }
149+
150+ def writeScope(f, scope) = match(scope) {
151+ case "android": writeText(f, " <Badge text=\"Android\" />")
152+ case "desktop": writeText(f, " <Badge text=\"Desktop\" />")
153+ case _: { }
154+ }
155+
156+ def writeDescription(f, obj, lang, format = "%s") {
157+ str = getValue(obj, "desc", lang)
158+ if (str != "") {
159+ writeText(f, sprintf(format, str))
160+ }
161+ }
162+
163+ def writeSince(f, since, lang) {
164+ writeText(f, "<Badge text=\"%s %s\" />".sprintf(messages.since[lang], since))
165+ }
166+
167+ // -- utils
168+ def getValue(object, key, lang = "en") {
169+ newKey = (lang != "en") ? (key + "_" + lang) : key
170+ return object[newKey] ?? object[key] ?? ""
171+ }
172+
173+ def header(text, level = 2) = ("#" * level) + " " + text
174+
175+ def readYml(filename) {
176+ f = fopen(filename, "r")
177+ s = readText(f)
178+ fclose(f)
179+ return yamldecode(s)
180+ }
0 commit comments