github.com/whatlly/hugo@v0.47.1/output/docshelper.go (about)

     1  package output
     2  
     3  import (
     4  	"strings"
     5  
     6  	//	"fmt"
     7  
     8  	"github.com/gohugoio/hugo/docshelper"
     9  )
    10  
    11  // This is is just some helpers used to create some JSON used in the Hugo docs.
    12  func init() {
    13  	docsProvider := func() map[string]interface{} {
    14  		docs := make(map[string]interface{})
    15  
    16  		docs["formats"] = DefaultFormats
    17  		docs["layouts"] = createLayoutExamples()
    18  		return docs
    19  	}
    20  
    21  	docshelper.AddDocProvider("output", docsProvider)
    22  }
    23  
    24  func createLayoutExamples() interface{} {
    25  
    26  	type Example struct {
    27  		Example      string
    28  		Kind         string
    29  		OutputFormat string
    30  		Suffix       string
    31  		Layouts      []string `json:"Template Lookup Order"`
    32  	}
    33  
    34  	var (
    35  		basicExamples []Example
    36  		demoLayout    = "demolayout"
    37  		demoType      = "demotype"
    38  	)
    39  
    40  	for _, example := range []struct {
    41  		name string
    42  		d    LayoutDescriptor
    43  		f    Format
    44  	}{
    45  		// Taxonomy output.LayoutDescriptor={categories category taxonomy en  false Type Section
    46  		{"Single page in \"posts\" section", LayoutDescriptor{Kind: "page", Type: "posts"}, HTMLFormat},
    47  		{"Single page in \"posts\" section with layout set", LayoutDescriptor{Kind: "page", Type: "posts", Layout: demoLayout}, HTMLFormat},
    48  		{"AMP single page", LayoutDescriptor{Kind: "page", Type: "posts"}, AMPFormat},
    49  		{"AMP single page, French language", LayoutDescriptor{Kind: "page", Type: "posts", Lang: "fr"}, AMPFormat},
    50  		// All section or typeless pages gets "page" as type
    51  		{"Home page", LayoutDescriptor{Kind: "home", Type: "page"}, HTMLFormat},
    52  		{"Home page with type set", LayoutDescriptor{Kind: "home", Type: demoType}, HTMLFormat},
    53  		{"Home page with layout set", LayoutDescriptor{Kind: "home", Type: "page", Layout: demoLayout}, HTMLFormat},
    54  		{`AMP home, French language"`, LayoutDescriptor{Kind: "home", Type: "page", Lang: "fr"}, AMPFormat},
    55  		{"JSON home", LayoutDescriptor{Kind: "home", Type: "page"}, JSONFormat},
    56  		{"RSS home", LayoutDescriptor{Kind: "home", Type: "page"}, RSSFormat},
    57  		{"RSS section posts", LayoutDescriptor{Kind: "section", Type: "posts"}, RSSFormat},
    58  		{"Taxonomy list in categories", LayoutDescriptor{Kind: "taxonomy", Type: "categories", Section: "category"}, RSSFormat},
    59  		{"Taxonomy terms in categories", LayoutDescriptor{Kind: "taxonomyTerm", Type: "categories", Section: "category"}, RSSFormat},
    60  		{"Section list for \"posts\" section", LayoutDescriptor{Kind: "section", Type: "posts", Section: "posts"}, HTMLFormat},
    61  		{"Section list for \"posts\" section with type set to \"blog\"", LayoutDescriptor{Kind: "section", Type: "blog", Section: "posts"}, HTMLFormat},
    62  		{"Section list for \"posts\" section with layout set to \"demoLayout\"", LayoutDescriptor{Kind: "section", Layout: demoLayout, Section: "posts"}, HTMLFormat},
    63  
    64  		{"Taxonomy list in categories", LayoutDescriptor{Kind: "taxonomy", Type: "categories", Section: "category"}, HTMLFormat},
    65  		{"Taxonomy term in categories", LayoutDescriptor{Kind: "taxonomyTerm", Type: "categories", Section: "category"}, HTMLFormat},
    66  	} {
    67  
    68  		l := NewLayoutHandler()
    69  		layouts, _ := l.For(example.d, example.f)
    70  
    71  		basicExamples = append(basicExamples, Example{
    72  			Example:      example.name,
    73  			Kind:         example.d.Kind,
    74  			OutputFormat: example.f.Name,
    75  			Suffix:       example.f.MediaType.Suffix(),
    76  			Layouts:      makeLayoutsPresentable(layouts)})
    77  	}
    78  
    79  	return basicExamples
    80  
    81  }
    82  
    83  func makeLayoutsPresentable(l []string) []string {
    84  	var filtered []string
    85  	for _, ll := range l {
    86  		if strings.Contains(ll, "page/") {
    87  			// This is a valid lookup, but it's more confusing than useful.
    88  			continue
    89  		}
    90  		ll = "layouts/" + strings.TrimPrefix(ll, "_text/")
    91  
    92  		if !strings.Contains(ll, "indexes") {
    93  			filtered = append(filtered, ll)
    94  		}
    95  	}
    96  
    97  	return filtered
    98  }