feat(Phase 3): anchors for map-fixed, cloud keys in examples, russian headers, fix snapshot path

This commit is contained in:
“Naeel”
2026-08-10 13:52:28 +04:00
parent 04d9c4a191
commit c77e0327d0
2 changed files with 36 additions and 6 deletions
@@ -213,16 +213,16 @@ func htmlToMarkdown(s string) string {
func buildExamplePage(spec types.ServiceSpec, nav string, version string, apiEndpoint string, providerSource string) string { func buildExamplePage(spec types.ServiceSpec, nav string, version string, apiEndpoint string, providerSource string) string {
var b strings.Builder var b strings.Builder
b.WriteString(buildHeader(spec, nav, version)) b.WriteString(buildHeader(spec, nav, version))
b.WriteString(fmt.Sprintf("## Minimal example — only required parameters\n\n")) b.WriteString("## Минимальный пример (только обязательные параметры)\n\n")
b.WriteString("```hcl\n") b.WriteString("```hcl\n")
b.WriteString(minimalExampleBlock(spec, version, apiEndpoint, providerSource)) b.WriteString(minimalExampleBlock(spec, version, apiEndpoint, providerSource))
b.WriteString("```\n\n") b.WriteString("```\n\n")
b.WriteString("<details><summary>Full example (all parameters, including defaults)</summary>\n\n") b.WriteString("<details><summary>Полный пример (все параметры, включая значения по умолчанию)</summary>\n\n")
b.WriteString("```hcl\n") b.WriteString("```hcl\n")
b.WriteString(exampleBlock(spec, version, apiEndpoint, providerSource)) b.WriteString(exampleBlock(spec, version, apiEndpoint, providerSource))
b.WriteString("```\n\n") b.WriteString("```\n\n")
b.WriteString("</details>\n\n") b.WriteString("</details>\n\n")
b.WriteString("## Outputs usage\n\n") b.WriteString("## Использование выходных данных\n\n")
b.WriteString("```hcl\n") b.WriteString("```hcl\n")
b.WriteString("# Выходные параметры можно использовать как\n") b.WriteString("# Выходные параметры можно использовать как\n")
b.WriteString(fmt.Sprintf("nubes_%s.baza.state_params[\"имя_ключа\"]\n", spec.Name)) b.WriteString(fmt.Sprintf("nubes_%s.baza.state_params[\"имя_ключа\"]\n", spec.Name))
@@ -234,6 +234,27 @@ func buildExamplePage(spec types.ServiceSpec, nav string, version string, apiEnd
b.WriteString(fmt.Sprintf("nubes_%s.baza.vault_user_path\n", spec.Name)) b.WriteString(fmt.Sprintf("nubes_%s.baza.vault_user_path\n", spec.Name))
b.WriteString(fmt.Sprintf("nubes_%s.baza.vault_fields\n", spec.Name)) b.WriteString(fmt.Sprintf("nubes_%s.baza.vault_fields\n", spec.Name))
b.WriteString("```\n") b.WriteString("```\n")
// Реальные ключи из облака
snapshot, ok := CloudOutputByServiceID[spec.ServiceID]
if ok && (len(snapshot.OutPaths) > 0 || len(snapshot.VaultFields) > 0) {
b.WriteString("\n### Реальные ключи из облака\n\n")
b.WriteString("```hcl\n")
for _, key := range snapshot.OutPaths {
if strings.TrimSpace(key) == "" {
continue
}
b.WriteString(fmt.Sprintf("# %s = nubes_%s.baza.state_out_flat[\"%s\"]\n", key, spec.Name, key))
}
for _, key := range snapshot.VaultFields {
if strings.TrimSpace(key) == "" {
continue
}
b.WriteString(fmt.Sprintf("# %s = nubes_%s.baza.vault_secrets[\"%s\"]\n", key, spec.Name, key))
}
b.WriteString("```\n")
}
return b.String() return b.String()
} }
@@ -297,7 +318,7 @@ func minimalExampleBlock(spec types.ServiceSpec, version string, apiEndpoint str
b.WriteString(fmt.Sprintf(" api_endpoint = \"%s\"\n", apiEndpoint)) b.WriteString(fmt.Sprintf(" api_endpoint = \"%s\"\n", apiEndpoint))
b.WriteString("}\n") b.WriteString("}\n")
b.WriteString(fmt.Sprintf("resource \"nubes_%s\" \"baza\" {\n", spec.Name)) b.WriteString(fmt.Sprintf("resource \"nubes_%s\" \"baza\" {\n", spec.Name))
b.WriteString(" resource_name = \"my-resource\"\n\n") b.WriteString(" resource_name = \"my-" + spec.Name + "\"\n\n")
for _, p := range minimalParams { for _, p := range minimalParams {
b.WriteString(formatParamOrBlock(p, " ", true)) b.WriteString(formatParamOrBlock(p, " ", true))
@@ -325,6 +346,15 @@ func buildCreateParamsPage(spec types.ServiceSpec, nav string, version string) s
} }
def := defaultCell(p.Default) def := defaultCell(p.Default)
desc := escapeText(pickTextTable(p)) desc := escapeText(pickTextTable(p))
// Якорь-ссылка для map-fixed/array-map-fixed с вложенными параметрами
if p.HasSubParams && len(p.SubParams) > 0 && desc == "" {
anchor := strings.ToLower(p.Code)
if p.IsJson {
desc = fmt.Sprintf("[Развернуть ↓](#%s-array-map-fixed)", anchor)
} else {
desc = fmt.Sprintf("[Развернуть ↓](#%s-map-fixed)", anchor)
}
}
constr := escapeText(collectConstraints(p)) constr := escapeText(collectConstraints(p))
b.WriteString(fmt.Sprintf("| %s | %s | %s | %s | %s | %s |\n", code, dtype, req, def, desc, constr)) b.WriteString(fmt.Sprintf("| %s | %s | %s | %s | %s | %s |\n", code, dtype, req, def, desc, constr))
} }
@@ -539,7 +569,7 @@ func buildSubresourceExamplePage(spec types.ServiceSpec, srName string, nav stri
srResourceName := fmt.Sprintf("nubes_%s_%s", spec.Name, Slug(srName)) srResourceName := fmt.Sprintf("nubes_%s_%s", spec.Name, Slug(srName))
b.WriteString(fmt.Sprintf("# Resource %s — Example\n\n", srResourceName)) b.WriteString(fmt.Sprintf("# Resource %s — Example\n\n", srResourceName))
b.WriteString(fmt.Sprintf("Service: `nubes_%s` (ID: %d)\n\n", spec.Name, spec.ServiceID)) b.WriteString(fmt.Sprintf("Service: `nubes_%s` (ID: %d)\n\n", spec.Name, spec.ServiceID))
b.WriteString(fmt.Sprintf("## Copy-ready manifest (`%s_%s_main.tf`)\n\n", spec.Name, Slug(srName))) b.WriteString(fmt.Sprintf("## Готовый манифест (`%s_%s_main.tf`)\n\n", spec.Name, Slug(srName)))
b.WriteString("```hcl\n") b.WriteString("```hcl\n")
b.WriteString("terraform {\n") b.WriteString("terraform {\n")
+1 -1
View File
@@ -45,7 +45,7 @@ func main() {
panic("--docs is required") panic("--docs is required")
} }
servicesList := *servicesListFlag servicesList := *servicesListFlag
writers.CloudOutputByServiceID = writers.LoadCloudOutputSnapshot(*docsDirFlag) writers.CloudOutputByServiceID = writers.LoadCloudOutputSnapshot(".")
excludeSet := toSet(*excludeFlag) excludeSet := toSet(*excludeFlag)
version := *versionFlag version := *versionFlag
if version == "" { if version == "" {