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 }}, {{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">⊕</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"> </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