Use the schema package's Markdown parser and walk its AST to extract examples. These changes also rename StripNonRelevantExamples to FilterExamples. This is preparatory work for #4159 and #4632.
97 lines
3.6 KiB
Go
97 lines
3.6 KiB
Go
// Copyright 2016-2020, Pulumi Corporation.
|
|
//
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
|
|
package codegen
|
|
|
|
import (
|
|
"github.com/pgavlin/goldmark/ast"
|
|
|
|
"github.com/pulumi/pulumi/pkg/v2/codegen/schema"
|
|
)
|
|
|
|
// DocLanguageHelper is an interface for extracting language-specific information from a Pulumi schema.
|
|
// See the implementation for this interface under each of the language code generators.
|
|
type DocLanguageHelper interface {
|
|
GetPropertyName(p *schema.Property) (string, error)
|
|
GetDocLinkForResourceType(pkg *schema.Package, moduleName, typeName string) string
|
|
GetDocLinkForPulumiType(pkg *schema.Package, typeName string) string
|
|
GetDocLinkForResourceInputOrOutputType(pkg *schema.Package, moduleName, typeName string, input bool) string
|
|
GetDocLinkForFunctionInputOrOutputType(pkg *schema.Package, moduleName, typeName string, input bool) string
|
|
GetDocLinkForBuiltInType(typeName string) string
|
|
GetLanguageTypeString(pkg *schema.Package, moduleName string, t schema.Type, input, optional bool) string
|
|
|
|
GetFunctionName(modName string, f *schema.Function) string
|
|
// GetResourceFunctionResultName returns the name of the result type when a static resource function is used to lookup
|
|
// an existing resource.
|
|
GetResourceFunctionResultName(modName string, f *schema.Function) string
|
|
// GetModuleDocLink returns the display name and the link for a module (including root modules) in a given package.
|
|
GetModuleDocLink(pkg *schema.Package, modName string) (string, string)
|
|
}
|
|
|
|
func filterExamples(source []byte, node ast.Node, lang string) {
|
|
var c, next ast.Node
|
|
for c = node.FirstChild(); c != nil; c = next {
|
|
filterExamples(source, c, lang)
|
|
|
|
next = c.NextSibling()
|
|
switch c := c.(type) {
|
|
case *ast.FencedCodeBlock:
|
|
if string(c.Language(source)) != lang {
|
|
node.RemoveChild(node, c)
|
|
}
|
|
case *schema.Shortcode:
|
|
switch string(c.Name) {
|
|
case schema.ExampleShortcode:
|
|
hasCode := false
|
|
for gc := c.FirstChild(); gc != nil; gc = gc.NextSibling() {
|
|
if gc.Kind() == ast.KindFencedCodeBlock {
|
|
hasCode = true
|
|
break
|
|
}
|
|
}
|
|
if hasCode {
|
|
var grandchild, nextGrandchild ast.Node
|
|
for grandchild = c.FirstChild(); grandchild != nil; grandchild = nextGrandchild {
|
|
nextGrandchild = grandchild.NextSibling()
|
|
node.InsertBefore(node, c, grandchild)
|
|
}
|
|
}
|
|
node.RemoveChild(node, c)
|
|
case schema.ExamplesShortcode:
|
|
if first := c.FirstChild(); first != nil {
|
|
first.SetBlankPreviousLines(c.HasBlankPreviousLines())
|
|
}
|
|
|
|
var grandchild, nextGrandchild ast.Node
|
|
for grandchild = c.FirstChild(); grandchild != nil; grandchild = nextGrandchild {
|
|
nextGrandchild = grandchild.NextSibling()
|
|
node.InsertBefore(node, c, grandchild)
|
|
}
|
|
node.RemoveChild(node, c)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// FilterExamples filters the code snippets in a schema docstring to include only those that target the given language.
|
|
func FilterExamples(description string, lang string) string {
|
|
if description == "" {
|
|
return ""
|
|
}
|
|
|
|
source := []byte(description)
|
|
parsed := schema.ParseDocs(source)
|
|
filterExamples(source, parsed, lang)
|
|
return schema.RenderDocsToString(source, parsed)
|
|
}
|