xref: /aosp_15_r20/build/soong/cmd/soong_build/writedocs.go (revision 333d2b3687b3a337dbcca9d65000bca186795e39)
1*333d2b36SAndroid Build Coastguard Worker// Copyright 2017 Google Inc. All rights reserved.
2*333d2b36SAndroid Build Coastguard Worker//
3*333d2b36SAndroid Build Coastguard Worker// Licensed under the Apache License, Version 2.0 (the "License");
4*333d2b36SAndroid Build Coastguard Worker// you may not use this file except in compliance with the License.
5*333d2b36SAndroid Build Coastguard Worker// You may obtain a copy of the License at
6*333d2b36SAndroid Build Coastguard Worker//
7*333d2b36SAndroid Build Coastguard Worker//     http://www.apache.org/licenses/LICENSE-2.0
8*333d2b36SAndroid Build Coastguard Worker//
9*333d2b36SAndroid Build Coastguard Worker// Unless required by applicable law or agreed to in writing, software
10*333d2b36SAndroid Build Coastguard Worker// distributed under the License is distributed on an "AS IS" BASIS,
11*333d2b36SAndroid Build Coastguard Worker// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*333d2b36SAndroid Build Coastguard Worker// See the License for the specific language governing permissions and
13*333d2b36SAndroid Build Coastguard Worker// limitations under the License.
14*333d2b36SAndroid Build Coastguard Worker
15*333d2b36SAndroid Build Coastguard Workerpackage main
16*333d2b36SAndroid Build Coastguard Worker
17*333d2b36SAndroid Build Coastguard Workerimport (
18*333d2b36SAndroid Build Coastguard Worker	"bytes"
19*333d2b36SAndroid Build Coastguard Worker	"html/template"
20*333d2b36SAndroid Build Coastguard Worker	"io/ioutil"
21*333d2b36SAndroid Build Coastguard Worker	"path/filepath"
22*333d2b36SAndroid Build Coastguard Worker	"sort"
23*333d2b36SAndroid Build Coastguard Worker
24*333d2b36SAndroid Build Coastguard Worker	"android/soong/android"
25*333d2b36SAndroid Build Coastguard Worker
26*333d2b36SAndroid Build Coastguard Worker	"github.com/google/blueprint/bootstrap"
27*333d2b36SAndroid Build Coastguard Worker	"github.com/google/blueprint/bootstrap/bpdoc"
28*333d2b36SAndroid Build Coastguard Worker)
29*333d2b36SAndroid Build Coastguard Worker
30*333d2b36SAndroid Build Coastguard Workertype perPackageTemplateData struct {
31*333d2b36SAndroid Build Coastguard Worker	Name    string
32*333d2b36SAndroid Build Coastguard Worker	Modules []moduleTypeTemplateData
33*333d2b36SAndroid Build Coastguard Worker}
34*333d2b36SAndroid Build Coastguard Worker
35*333d2b36SAndroid Build Coastguard Workertype moduleTypeTemplateData struct {
36*333d2b36SAndroid Build Coastguard Worker	Name       string
37*333d2b36SAndroid Build Coastguard Worker	Synopsis   template.HTML
38*333d2b36SAndroid Build Coastguard Worker	Properties []bpdoc.Property
39*333d2b36SAndroid Build Coastguard Worker}
40*333d2b36SAndroid Build Coastguard Worker
41*333d2b36SAndroid Build Coastguard Worker// The properties in this map are displayed first, according to their rank.
42*333d2b36SAndroid Build Coastguard Worker// TODO(jungjw): consider providing module type-dependent ranking
43*333d2b36SAndroid Build Coastguard Workervar propertyRank = map[string]int{
44*333d2b36SAndroid Build Coastguard Worker	"name":             0,
45*333d2b36SAndroid Build Coastguard Worker	"src":              1,
46*333d2b36SAndroid Build Coastguard Worker	"srcs":             2,
47*333d2b36SAndroid Build Coastguard Worker	"exclude_srcs":     3,
48*333d2b36SAndroid Build Coastguard Worker	"defaults":         4,
49*333d2b36SAndroid Build Coastguard Worker	"host_supported":   5,
50*333d2b36SAndroid Build Coastguard Worker	"device_supported": 6,
51*333d2b36SAndroid Build Coastguard Worker}
52*333d2b36SAndroid Build Coastguard Worker
53*333d2b36SAndroid Build Coastguard Worker// For each module type, extract its documentation and convert it to the template data.
54*333d2b36SAndroid Build Coastguard Workerfunc moduleTypeDocsToTemplates(moduleTypeList []*bpdoc.ModuleType) []moduleTypeTemplateData {
55*333d2b36SAndroid Build Coastguard Worker	result := make([]moduleTypeTemplateData, 0)
56*333d2b36SAndroid Build Coastguard Worker
57*333d2b36SAndroid Build Coastguard Worker	// Combine properties from all PropertyStruct's and reorder them -- first the ones
58*333d2b36SAndroid Build Coastguard Worker	// with rank, then the rest of the properties in alphabetic order.
59*333d2b36SAndroid Build Coastguard Worker	for _, m := range moduleTypeList {
60*333d2b36SAndroid Build Coastguard Worker		item := moduleTypeTemplateData{
61*333d2b36SAndroid Build Coastguard Worker			Name:       m.Name,
62*333d2b36SAndroid Build Coastguard Worker			Synopsis:   m.Text,
63*333d2b36SAndroid Build Coastguard Worker			Properties: make([]bpdoc.Property, 0),
64*333d2b36SAndroid Build Coastguard Worker		}
65*333d2b36SAndroid Build Coastguard Worker		props := make([]bpdoc.Property, 0)
66*333d2b36SAndroid Build Coastguard Worker		for _, propStruct := range m.PropertyStructs {
67*333d2b36SAndroid Build Coastguard Worker			props = append(props, propStruct.Properties...)
68*333d2b36SAndroid Build Coastguard Worker		}
69*333d2b36SAndroid Build Coastguard Worker		sort.Slice(props, func(i, j int) bool {
70*333d2b36SAndroid Build Coastguard Worker			if rankI, ok := propertyRank[props[i].Name]; ok {
71*333d2b36SAndroid Build Coastguard Worker				if rankJ, ok := propertyRank[props[j].Name]; ok {
72*333d2b36SAndroid Build Coastguard Worker					return rankI < rankJ
73*333d2b36SAndroid Build Coastguard Worker				} else {
74*333d2b36SAndroid Build Coastguard Worker					return true
75*333d2b36SAndroid Build Coastguard Worker				}
76*333d2b36SAndroid Build Coastguard Worker			}
77*333d2b36SAndroid Build Coastguard Worker			if _, ok := propertyRank[props[j].Name]; ok {
78*333d2b36SAndroid Build Coastguard Worker				return false
79*333d2b36SAndroid Build Coastguard Worker			}
80*333d2b36SAndroid Build Coastguard Worker			return props[i].Name < props[j].Name
81*333d2b36SAndroid Build Coastguard Worker		})
82*333d2b36SAndroid Build Coastguard Worker		// Eliminate top-level duplicates. TODO(jungjw): improve bpdoc to handle this.
83*333d2b36SAndroid Build Coastguard Worker		previousPropertyName := ""
84*333d2b36SAndroid Build Coastguard Worker		for _, prop := range props {
85*333d2b36SAndroid Build Coastguard Worker			if prop.Name == previousPropertyName {
86*333d2b36SAndroid Build Coastguard Worker				oldProp := &item.Properties[len(item.Properties)-1].Properties
87*333d2b36SAndroid Build Coastguard Worker				bpdoc.CollapseDuplicateProperties(oldProp, &prop.Properties)
88*333d2b36SAndroid Build Coastguard Worker			} else {
89*333d2b36SAndroid Build Coastguard Worker				item.Properties = append(item.Properties, prop)
90*333d2b36SAndroid Build Coastguard Worker			}
91*333d2b36SAndroid Build Coastguard Worker			previousPropertyName = prop.Name
92*333d2b36SAndroid Build Coastguard Worker		}
93*333d2b36SAndroid Build Coastguard Worker		result = append(result, item)
94*333d2b36SAndroid Build Coastguard Worker	}
95*333d2b36SAndroid Build Coastguard Worker	sort.Slice(result, func(i, j int) bool { return result[i].Name < result[j].Name })
96*333d2b36SAndroid Build Coastguard Worker	return result
97*333d2b36SAndroid Build Coastguard Worker}
98*333d2b36SAndroid Build Coastguard Worker
99*333d2b36SAndroid Build Coastguard Workerfunc getPackages(ctx *android.Context) ([]*bpdoc.Package, error) {
100*333d2b36SAndroid Build Coastguard Worker	moduleTypeFactories := android.ModuleTypeFactoriesForDocs()
101*333d2b36SAndroid Build Coastguard Worker	return bootstrap.ModuleTypeDocs(ctx.Context, moduleTypeFactories)
102*333d2b36SAndroid Build Coastguard Worker}
103*333d2b36SAndroid Build Coastguard Worker
104*333d2b36SAndroid Build Coastguard Workerfunc writeDocs(ctx *android.Context, filename string) error {
105*333d2b36SAndroid Build Coastguard Worker	packages, err := getPackages(ctx)
106*333d2b36SAndroid Build Coastguard Worker	if err != nil {
107*333d2b36SAndroid Build Coastguard Worker		return err
108*333d2b36SAndroid Build Coastguard Worker	}
109*333d2b36SAndroid Build Coastguard Worker
110*333d2b36SAndroid Build Coastguard Worker	// Produce the top-level, package list page first.
111*333d2b36SAndroid Build Coastguard Worker	tmpl := template.Must(template.Must(template.New("file").Parse(packageListTemplate)).Parse(copyBaseUrl))
112*333d2b36SAndroid Build Coastguard Worker	buf := &bytes.Buffer{}
113*333d2b36SAndroid Build Coastguard Worker	err = tmpl.Execute(buf, packages)
114*333d2b36SAndroid Build Coastguard Worker	if err == nil {
115*333d2b36SAndroid Build Coastguard Worker		err = ioutil.WriteFile(filename, buf.Bytes(), 0666)
116*333d2b36SAndroid Build Coastguard Worker	}
117*333d2b36SAndroid Build Coastguard Worker
118*333d2b36SAndroid Build Coastguard Worker	// Now, produce per-package module lists with detailed information, and a list
119*333d2b36SAndroid Build Coastguard Worker	// of keywords.
120*333d2b36SAndroid Build Coastguard Worker	keywordsTmpl := template.Must(template.New("file").Parse(keywordsTemplate))
121*333d2b36SAndroid Build Coastguard Worker	keywordsBuf := &bytes.Buffer{}
122*333d2b36SAndroid Build Coastguard Worker	for _, pkg := range packages {
123*333d2b36SAndroid Build Coastguard Worker		// We need a module name getter/setter function because I couldn't
124*333d2b36SAndroid Build Coastguard Worker		// find a way to keep it in a variable defined within the template.
125*333d2b36SAndroid Build Coastguard Worker		currentModuleName := ""
126*333d2b36SAndroid Build Coastguard Worker		tmpl := template.Must(
127*333d2b36SAndroid Build Coastguard Worker			template.Must(template.New("file").Funcs(map[string]interface{}{
128*333d2b36SAndroid Build Coastguard Worker				"setModule": func(moduleName string) string {
129*333d2b36SAndroid Build Coastguard Worker					currentModuleName = moduleName
130*333d2b36SAndroid Build Coastguard Worker					return ""
131*333d2b36SAndroid Build Coastguard Worker				},
132*333d2b36SAndroid Build Coastguard Worker				"getModule": func() string {
133*333d2b36SAndroid Build Coastguard Worker					return currentModuleName
134*333d2b36SAndroid Build Coastguard Worker				},
135*333d2b36SAndroid Build Coastguard Worker			}).Parse(perPackageTemplate)).Parse(copyBaseUrl))
136*333d2b36SAndroid Build Coastguard Worker		buf := &bytes.Buffer{}
137*333d2b36SAndroid Build Coastguard Worker		modules := moduleTypeDocsToTemplates(pkg.ModuleTypes)
138*333d2b36SAndroid Build Coastguard Worker		data := perPackageTemplateData{Name: pkg.Name, Modules: modules}
139*333d2b36SAndroid Build Coastguard Worker		err = tmpl.Execute(buf, data)
140*333d2b36SAndroid Build Coastguard Worker		if err != nil {
141*333d2b36SAndroid Build Coastguard Worker			return err
142*333d2b36SAndroid Build Coastguard Worker		}
143*333d2b36SAndroid Build Coastguard Worker		pkgFileName := filepath.Join(filepath.Dir(filename), pkg.Name+".html")
144*333d2b36SAndroid Build Coastguard Worker		err = ioutil.WriteFile(pkgFileName, buf.Bytes(), 0666)
145*333d2b36SAndroid Build Coastguard Worker		if err != nil {
146*333d2b36SAndroid Build Coastguard Worker			return err
147*333d2b36SAndroid Build Coastguard Worker		}
148*333d2b36SAndroid Build Coastguard Worker		err = keywordsTmpl.Execute(keywordsBuf, data)
149*333d2b36SAndroid Build Coastguard Worker		if err != nil {
150*333d2b36SAndroid Build Coastguard Worker			return err
151*333d2b36SAndroid Build Coastguard Worker		}
152*333d2b36SAndroid Build Coastguard Worker	}
153*333d2b36SAndroid Build Coastguard Worker
154*333d2b36SAndroid Build Coastguard Worker	// Write out list of keywords. This includes all module and property names, which is useful for
155*333d2b36SAndroid Build Coastguard Worker	// building syntax highlighters.
156*333d2b36SAndroid Build Coastguard Worker	keywordsFilename := filepath.Join(filepath.Dir(filename), "keywords.txt")
157*333d2b36SAndroid Build Coastguard Worker	err = ioutil.WriteFile(keywordsFilename, keywordsBuf.Bytes(), 0666)
158*333d2b36SAndroid Build Coastguard Worker
159*333d2b36SAndroid Build Coastguard Worker	return err
160*333d2b36SAndroid Build Coastguard Worker}
161*333d2b36SAndroid Build Coastguard Worker
162*333d2b36SAndroid Build Coastguard Worker// TODO(jungjw): Consider ordering by name.
163*333d2b36SAndroid Build Coastguard Workerconst (
164*333d2b36SAndroid Build Coastguard Worker	packageListTemplate = `
165*333d2b36SAndroid Build Coastguard Worker<html>
166*333d2b36SAndroid Build Coastguard Worker<head>
167*333d2b36SAndroid Build Coastguard Worker<title>Build Docs</title>
168*333d2b36SAndroid Build Coastguard Worker<style>
169*333d2b36SAndroid Build Coastguard Worker#main {
170*333d2b36SAndroid Build Coastguard Worker  padding: 48px;
171*333d2b36SAndroid Build Coastguard Worker}
172*333d2b36SAndroid Build Coastguard Worker
173*333d2b36SAndroid Build Coastguard Workertable{
174*333d2b36SAndroid Build Coastguard Worker  table-layout: fixed;
175*333d2b36SAndroid Build Coastguard Worker}
176*333d2b36SAndroid Build Coastguard Worker
177*333d2b36SAndroid Build Coastguard Workertd {
178*333d2b36SAndroid Build Coastguard Worker  word-wrap:break-word;
179*333d2b36SAndroid Build Coastguard Worker}
180*333d2b36SAndroid Build Coastguard Worker
181*333d2b36SAndroid Build Coastguard Worker/* The following entries are copied from source.android.com's css file. */
182*333d2b36SAndroid Build Coastguard Workertd,td code {
183*333d2b36SAndroid Build Coastguard Worker    color: #202124
184*333d2b36SAndroid Build Coastguard Worker}
185*333d2b36SAndroid Build Coastguard Worker
186*333d2b36SAndroid Build Coastguard Workerth,th code {
187*333d2b36SAndroid Build Coastguard Worker    color: #fff;
188*333d2b36SAndroid Build Coastguard Worker    font: 500 16px/24px Roboto,sans-serif
189*333d2b36SAndroid Build Coastguard Worker}
190*333d2b36SAndroid Build Coastguard Worker
191*333d2b36SAndroid Build Coastguard Workertd,table.responsive tr:not(.alt) td td:first-child,table.responsive td tr:not(.alt) td:first-child {
192*333d2b36SAndroid Build Coastguard Worker    background: rgba(255,255,255,.95);
193*333d2b36SAndroid Build Coastguard Worker    vertical-align: top
194*333d2b36SAndroid Build Coastguard Worker}
195*333d2b36SAndroid Build Coastguard Worker
196*333d2b36SAndroid Build Coastguard Workertd,td code {
197*333d2b36SAndroid Build Coastguard Worker    padding: 7px 8px 8px
198*333d2b36SAndroid Build Coastguard Worker}
199*333d2b36SAndroid Build Coastguard Worker
200*333d2b36SAndroid Build Coastguard Workertr {
201*333d2b36SAndroid Build Coastguard Worker    border: 0;
202*333d2b36SAndroid Build Coastguard Worker    background: #78909c;
203*333d2b36SAndroid Build Coastguard Worker    border-top: 1px solid #cfd8dc
204*333d2b36SAndroid Build Coastguard Worker}
205*333d2b36SAndroid Build Coastguard Worker
206*333d2b36SAndroid Build Coastguard Workerth,td {
207*333d2b36SAndroid Build Coastguard Worker    border: 0;
208*333d2b36SAndroid Build Coastguard Worker    margin: 0;
209*333d2b36SAndroid Build Coastguard Worker    text-align: left
210*333d2b36SAndroid Build Coastguard Worker}
211*333d2b36SAndroid Build Coastguard Worker
212*333d2b36SAndroid Build Coastguard Workerth {
213*333d2b36SAndroid Build Coastguard Worker    height: 48px;
214*333d2b36SAndroid Build Coastguard Worker    padding: 8px;
215*333d2b36SAndroid Build Coastguard Worker    vertical-align: middle
216*333d2b36SAndroid Build Coastguard Worker}
217*333d2b36SAndroid Build Coastguard Worker
218*333d2b36SAndroid Build Coastguard Workertable {
219*333d2b36SAndroid Build Coastguard Worker    border: 0;
220*333d2b36SAndroid Build Coastguard Worker    border-collapse: collapse;
221*333d2b36SAndroid Build Coastguard Worker    border-spacing: 0;
222*333d2b36SAndroid Build Coastguard Worker    font: 14px/20px Roboto,sans-serif;
223*333d2b36SAndroid Build Coastguard Worker    margin: 16px 0;
224*333d2b36SAndroid Build Coastguard Worker    width: 100%
225*333d2b36SAndroid Build Coastguard Worker}
226*333d2b36SAndroid Build Coastguard Worker
227*333d2b36SAndroid Build Coastguard Workerh1 {
228*333d2b36SAndroid Build Coastguard Worker    color: #80868b;
229*333d2b36SAndroid Build Coastguard Worker    font: 300 34px/40px Roboto,sans-serif;
230*333d2b36SAndroid Build Coastguard Worker    letter-spacing: -0.01em;
231*333d2b36SAndroid Build Coastguard Worker    margin: 40px 0 20px
232*333d2b36SAndroid Build Coastguard Worker}
233*333d2b36SAndroid Build Coastguard Worker
234*333d2b36SAndroid Build Coastguard Workerh1,h2,h3,h4,h5,h6 {
235*333d2b36SAndroid Build Coastguard Worker    overflow: hidden;
236*333d2b36SAndroid Build Coastguard Worker    padding: 0;
237*333d2b36SAndroid Build Coastguard Worker    text-overflow: ellipsis
238*333d2b36SAndroid Build Coastguard Worker}
239*333d2b36SAndroid Build Coastguard Worker
240*333d2b36SAndroid Build Coastguard Worker:link,:visited {
241*333d2b36SAndroid Build Coastguard Worker    color: #039be5;
242*333d2b36SAndroid Build Coastguard Worker    outline: 0;
243*333d2b36SAndroid Build Coastguard Worker    text-decoration: none
244*333d2b36SAndroid Build Coastguard Worker}
245*333d2b36SAndroid Build Coastguard Worker
246*333d2b36SAndroid Build Coastguard Workerbody,html {
247*333d2b36SAndroid Build Coastguard Worker    color: #202124;
248*333d2b36SAndroid Build Coastguard Worker    font: 400 16px/24px Roboto,sans-serif;
249*333d2b36SAndroid Build Coastguard Worker    -moz-osx-font-smoothing: grayscale;
250*333d2b36SAndroid Build Coastguard Worker    -webkit-font-smoothing: antialiased;
251*333d2b36SAndroid Build Coastguard Worker    height: 100%;
252*333d2b36SAndroid Build Coastguard Worker    margin: 0;
253*333d2b36SAndroid Build Coastguard Worker    -webkit-text-size-adjust: 100%;
254*333d2b36SAndroid Build Coastguard Worker    -moz-text-size-adjust: 100%;
255*333d2b36SAndroid Build Coastguard Worker    -ms-text-size-adjust: 100%;
256*333d2b36SAndroid Build Coastguard Worker    text-size-adjust: 100%
257*333d2b36SAndroid Build Coastguard Worker}
258*333d2b36SAndroid Build Coastguard Worker
259*333d2b36SAndroid Build Coastguard Workerhtml {
260*333d2b36SAndroid Build Coastguard Worker    -webkit-box-sizing: border-box;
261*333d2b36SAndroid Build Coastguard Worker    box-sizing: border-box
262*333d2b36SAndroid Build Coastguard Worker}
263*333d2b36SAndroid Build Coastguard Worker
264*333d2b36SAndroid Build Coastguard Worker*,*::before,*::after {
265*333d2b36SAndroid Build Coastguard Worker    -webkit-box-sizing: inherit;
266*333d2b36SAndroid Build Coastguard Worker    box-sizing: inherit
267*333d2b36SAndroid Build Coastguard Worker}
268*333d2b36SAndroid Build Coastguard Worker
269*333d2b36SAndroid Build Coastguard Workerbody,div,dl,dd,form,img,input,figure,menu {
270*333d2b36SAndroid Build Coastguard Worker    margin: 0;
271*333d2b36SAndroid Build Coastguard Worker    padding: 0
272*333d2b36SAndroid Build Coastguard Worker}
273*333d2b36SAndroid Build Coastguard Worker</style>
274*333d2b36SAndroid Build Coastguard Worker{{template "copyBaseUrl"}}
275*333d2b36SAndroid Build Coastguard Worker</head>
276*333d2b36SAndroid Build Coastguard Worker<body>
277*333d2b36SAndroid Build Coastguard Worker<div id="main">
278*333d2b36SAndroid Build Coastguard Worker<H1>Soong Modules Reference</H1>
279*333d2b36SAndroid Build Coastguard WorkerThe latest versions of Android use the Soong build system, which greatly simplifies build
280*333d2b36SAndroid Build Coastguard Workerconfiguration over the previous Make-based system. This site contains the generated reference
281*333d2b36SAndroid Build Coastguard Workerfiles for the Soong build system.
282*333d2b36SAndroid Build Coastguard Worker
283*333d2b36SAndroid Build Coastguard Worker<table class="module_types" summary="Table of Soong module types sorted by package">
284*333d2b36SAndroid Build Coastguard Worker  <thead>
285*333d2b36SAndroid Build Coastguard Worker    <tr>
286*333d2b36SAndroid Build Coastguard Worker      <th style="width:20%">Package</th>
287*333d2b36SAndroid Build Coastguard Worker      <th style="width:80%">Module types</th>
288*333d2b36SAndroid Build Coastguard Worker    </tr>
289*333d2b36SAndroid Build Coastguard Worker  </thead>
290*333d2b36SAndroid Build Coastguard Worker  <tbody>
291*333d2b36SAndroid Build Coastguard Worker    {{range $pkg := .}}
292*333d2b36SAndroid Build Coastguard Worker      <tr>
293*333d2b36SAndroid Build Coastguard Worker        <td>{{.Path}}</td>
294*333d2b36SAndroid Build Coastguard Worker        <td>
295*333d2b36SAndroid Build Coastguard Worker        {{range $i, $mod := .ModuleTypes}}{{if $i}}, {{end}}<a href="{{$pkg.Name}}.html#{{$mod.Name}}">{{$mod.Name}}</a>{{end}}
296*333d2b36SAndroid Build Coastguard Worker        </td>
297*333d2b36SAndroid Build Coastguard Worker      </tr>
298*333d2b36SAndroid Build Coastguard Worker    {{end}}
299*333d2b36SAndroid Build Coastguard Worker  </tbody>
300*333d2b36SAndroid Build Coastguard Worker</table>
301*333d2b36SAndroid Build Coastguard Worker</div>
302*333d2b36SAndroid Build Coastguard Worker</body>
303*333d2b36SAndroid Build Coastguard Worker</html>
304*333d2b36SAndroid Build Coastguard Worker`
305*333d2b36SAndroid Build Coastguard Worker
306*333d2b36SAndroid Build Coastguard Worker	perPackageTemplate = `
307*333d2b36SAndroid Build Coastguard Worker<html>
308*333d2b36SAndroid Build Coastguard Worker<head>
309*333d2b36SAndroid Build Coastguard Worker<title>Build Docs</title>
310*333d2b36SAndroid Build Coastguard Worker<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.2.1/css/bootstrap.min.css">
311*333d2b36SAndroid Build Coastguard Worker<style>
312*333d2b36SAndroid Build Coastguard Worker.accordion,.simple{margin-left:1.5em;text-indent:-1.5em;margin-top:.25em}
313*333d2b36SAndroid Build Coastguard Worker.collapsible{border-width:0 0 0 1;margin-left:.25em;padding-left:.25em;border-style:solid;
314*333d2b36SAndroid Build Coastguard Worker  border-color:grey;display:none;}
315*333d2b36SAndroid Build Coastguard Workerspan.fixed{display: block; float: left; clear: left; width: 1em;}
316*333d2b36SAndroid Build Coastguard Workerul {
317*333d2b36SAndroid Build Coastguard Worker	list-style-type: none;
318*333d2b36SAndroid Build Coastguard Worker  margin: 0;
319*333d2b36SAndroid Build Coastguard Worker  padding: 0;
320*333d2b36SAndroid Build Coastguard Worker  width: 30ch;
321*333d2b36SAndroid Build Coastguard Worker  background-color: #f1f1f1;
322*333d2b36SAndroid Build Coastguard Worker  position: fixed;
323*333d2b36SAndroid Build Coastguard Worker  height: 100%;
324*333d2b36SAndroid Build Coastguard Worker  overflow: auto;
325*333d2b36SAndroid Build Coastguard Worker}
326*333d2b36SAndroid Build Coastguard Workerli a {
327*333d2b36SAndroid Build Coastguard Worker  display: block;
328*333d2b36SAndroid Build Coastguard Worker  color: #000;
329*333d2b36SAndroid Build Coastguard Worker  padding: 8px 16px;
330*333d2b36SAndroid Build Coastguard Worker  text-decoration: none;
331*333d2b36SAndroid Build Coastguard Worker}
332*333d2b36SAndroid Build Coastguard Worker
333*333d2b36SAndroid Build Coastguard Workerli a.active {
334*333d2b36SAndroid Build Coastguard Worker  background-color: #4CAF50;
335*333d2b36SAndroid Build Coastguard Worker  color: white;
336*333d2b36SAndroid Build Coastguard Worker}
337*333d2b36SAndroid Build Coastguard Worker
338*333d2b36SAndroid Build Coastguard Workerli a:hover:not(.active) {
339*333d2b36SAndroid Build Coastguard Worker  background-color: #555;
340*333d2b36SAndroid Build Coastguard Worker  color: white;
341*333d2b36SAndroid Build Coastguard Worker}
342*333d2b36SAndroid Build Coastguard Worker</style>
343*333d2b36SAndroid Build Coastguard Worker{{template "copyBaseUrl"}}
344*333d2b36SAndroid Build Coastguard Worker</head>
345*333d2b36SAndroid Build Coastguard Worker<body>
346*333d2b36SAndroid Build Coastguard Worker{{- /* Fixed sidebar with module types */ -}}
347*333d2b36SAndroid Build Coastguard Worker<ul>
348*333d2b36SAndroid Build Coastguard Worker<li><h3>{{.Name}} package</h3></li>
349*333d2b36SAndroid Build Coastguard Worker{{range $moduleType := .Modules}}<li><a href="{{$.Name}}.html#{{$moduleType.Name}}">{{$moduleType.Name}}</a></li>
350*333d2b36SAndroid Build Coastguard Worker{{end -}}
351*333d2b36SAndroid Build Coastguard Worker</ul>
352*333d2b36SAndroid Build Coastguard Worker{{/* Main panel with H1 section per module type */}}
353*333d2b36SAndroid Build Coastguard Worker<div style="margin-left:30ch;padding:1px 16px;">
354*333d2b36SAndroid Build Coastguard Worker{{range $moduleType := .Modules}}
355*333d2b36SAndroid Build Coastguard Worker	{{setModule $moduleType.Name}}
356*333d2b36SAndroid Build Coastguard Worker	<p>
357*333d2b36SAndroid Build Coastguard Worker  <h2 id="{{$moduleType.Name}}">{{$moduleType.Name}}</h2>
358*333d2b36SAndroid Build Coastguard Worker  {{if $moduleType.Synopsis }}{{$moduleType.Synopsis}}{{else}}<i>Missing synopsis</i>{{end}}
359*333d2b36SAndroid Build Coastguard Worker  {{- /* Comma-separated list of module attributes' links module attributes */ -}}
360*333d2b36SAndroid Build Coastguard Worker	<div class="breadcrumb">
361*333d2b36SAndroid Build Coastguard Worker    {{range $i,$prop := $moduleType.Properties }}
362*333d2b36SAndroid Build Coastguard Worker				{{ if gt $i 0 }},&nbsp;{{end -}}
363*333d2b36SAndroid Build Coastguard Worker				<a href={{$.Name}}.html#{{getModule}}.{{$prop.Name}}>{{$prop.Name}}</a>
364*333d2b36SAndroid Build Coastguard Worker		{{- end -}}
365*333d2b36SAndroid Build Coastguard Worker  </div>
366*333d2b36SAndroid Build Coastguard Worker	{{- /* Property description */ -}}
367*333d2b36SAndroid Build Coastguard Worker	{{- template "properties" $moduleType.Properties -}}
368*333d2b36SAndroid Build Coastguard Worker{{- end -}}
369*333d2b36SAndroid Build Coastguard Worker
370*333d2b36SAndroid Build Coastguard Worker{{define "properties" -}}
371*333d2b36SAndroid Build Coastguard Worker  {{range .}}
372*333d2b36SAndroid Build Coastguard Worker    {{if .Properties -}}
373*333d2b36SAndroid Build Coastguard Worker      <div class="accordion"  id="{{getModule}}.{{.Name}}">
374*333d2b36SAndroid Build Coastguard Worker        <span class="fixed">&#x2295</span><b>{{.Name}}</b>
375*333d2b36SAndroid Build Coastguard Worker        <i>{{.Type}}</i>
376*333d2b36SAndroid Build Coastguard Worker        {{- range .OtherNames -}}, {{.}}{{- end -}}
377*333d2b36SAndroid Build Coastguard Worker      </div>
378*333d2b36SAndroid Build Coastguard Worker      <div class="collapsible">
379*333d2b36SAndroid Build Coastguard Worker        {{- .Text}} {{range .OtherTexts}}{{.}}{{end}}
380*333d2b36SAndroid Build Coastguard Worker        {{template "properties" .Properties -}}
381*333d2b36SAndroid Build Coastguard Worker      </div>
382*333d2b36SAndroid Build Coastguard Worker    {{- else -}}
383*333d2b36SAndroid Build Coastguard Worker      <div class="simple" id="{{getModule}}.{{.Name}}">
384*333d2b36SAndroid Build Coastguard Worker        <span class="fixed">&nbsp;</span><b>{{.Name}} {{range .OtherNames}}, {{.}}{{end -}}</b>
385*333d2b36SAndroid Build Coastguard Worker        <i>{{.Type}}</i>
386*333d2b36SAndroid Build Coastguard Worker        {{- if .Text -}}{{if ne .Text "\n"}}, {{end}}{{.Text}}{{- end -}}
387*333d2b36SAndroid Build Coastguard Worker        {{- with .OtherTexts -}}{{.}}{{- end -}}
388*333d2b36SAndroid Build Coastguard Worker	{{- if .Default -}}<i>Default: {{.Default}}</i>{{- end -}}
389*333d2b36SAndroid Build Coastguard Worker      </div>
390*333d2b36SAndroid Build Coastguard Worker    {{- end}}
391*333d2b36SAndroid Build Coastguard Worker  {{- end -}}
392*333d2b36SAndroid Build Coastguard Worker{{- end -}}
393*333d2b36SAndroid Build Coastguard Worker</div>
394*333d2b36SAndroid Build Coastguard Worker<script>
395*333d2b36SAndroid Build Coastguard Worker  accordions = document.getElementsByClassName('accordion');
396*333d2b36SAndroid Build Coastguard Worker  for (i=0; i < accordions.length; ++i) {
397*333d2b36SAndroid Build Coastguard Worker    accordions[i].addEventListener("click", function() {
398*333d2b36SAndroid Build Coastguard Worker      var panel = this.nextElementSibling;
399*333d2b36SAndroid Build Coastguard Worker      var child = this.firstElementChild;
400*333d2b36SAndroid Build Coastguard Worker      if (panel.style.display === "block") {
401*333d2b36SAndroid Build Coastguard Worker          panel.style.display = "none";
402*333d2b36SAndroid Build Coastguard Worker          child.textContent = '\u2295';
403*333d2b36SAndroid Build Coastguard Worker      } else {
404*333d2b36SAndroid Build Coastguard Worker          panel.style.display = "block";
405*333d2b36SAndroid Build Coastguard Worker          child.textContent = '\u2296';
406*333d2b36SAndroid Build Coastguard Worker      }
407*333d2b36SAndroid Build Coastguard Worker    });
408*333d2b36SAndroid Build Coastguard Worker  }
409*333d2b36SAndroid Build Coastguard Worker</script>
410*333d2b36SAndroid Build Coastguard Worker</body>
411*333d2b36SAndroid Build Coastguard Worker`
412*333d2b36SAndroid Build Coastguard Worker
413*333d2b36SAndroid Build Coastguard Worker	copyBaseUrl = `
414*333d2b36SAndroid Build Coastguard Worker{{define "copyBaseUrl"}}
415*333d2b36SAndroid Build Coastguard Worker<script type="text/javascript">
416*333d2b36SAndroid Build Coastguard Workerwindow.addEventListener('message', (e) => {
417*333d2b36SAndroid Build Coastguard Worker  if (e != null && e.data != null && e.data.type === "SET_BASE" && e.data.base != null) {
418*333d2b36SAndroid Build Coastguard Worker    const existingBase = document.querySelector('base');
419*333d2b36SAndroid Build Coastguard Worker    if (existingBase != null) {
420*333d2b36SAndroid Build Coastguard Worker      existingBase.parentElement.removeChild(existingBase);
421*333d2b36SAndroid Build Coastguard Worker    }
422*333d2b36SAndroid Build Coastguard Worker
423*333d2b36SAndroid Build Coastguard Worker    const base = document.createElement('base');
424*333d2b36SAndroid Build Coastguard Worker    base.setAttribute('href', e.data.base);
425*333d2b36SAndroid Build Coastguard Worker    document.head.appendChild(base);
426*333d2b36SAndroid Build Coastguard Worker  }
427*333d2b36SAndroid Build Coastguard Worker});
428*333d2b36SAndroid Build Coastguard Worker</script>
429*333d2b36SAndroid Build Coastguard Worker{{end}}
430*333d2b36SAndroid Build Coastguard Worker`
431*333d2b36SAndroid Build Coastguard Worker
432*333d2b36SAndroid Build Coastguard Worker	keywordsTemplate = `
433*333d2b36SAndroid Build Coastguard Worker{{range $moduleType := .Modules}}{{$moduleType.Name}}:{{range $property := $moduleType.Properties}}{{$property.Name}},{{end}}
434*333d2b36SAndroid Build Coastguard Worker{{end}}
435*333d2b36SAndroid Build Coastguard Worker`
436*333d2b36SAndroid Build Coastguard Worker)
437