Stable APIs for Go. https://go.code.as
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

145 lines
3.6 KiB

  1. package main
  2. import (
  3. "fmt"
  4. "html/template"
  5. "log"
  6. "net/http"
  7. "os"
  8. "sort"
  9. )
  10. const tmplStrPackage = `<!DOCTYPE html>
  11. <html >
  12. <head>
  13. <meta charset="utf-8">
  14. <title>{{.Repo.PkgPath}}</title>
  15. <link href='http://fonts.googleapis.com/css?family=Ubuntu+Mono|Ubuntu' rel='stylesheet' type='text/css'>
  16. <link href="//netdna.bootstrapcdn.com/font-awesome/4.0.3/css/font-awesome.css" rel="stylesheet">
  17. <link rel="stylesheet" href="//netdna.bootstrapcdn.com/bootstrap/3.1.1/css/bootstrap.min.css">
  18. <style>
  19. @media (min-width: 1200px) {
  20. .container {
  21. width: 970px;
  22. }
  23. }
  24. body {
  25. font-family: 'Ubuntu', sans-serif;
  26. }
  27. pre {
  28. font-family: 'Ubuntu Mono', sans-serif;
  29. }
  30. .main {
  31. padding-top: 20px;
  32. }
  33. .getting-started {
  34. font-size: 1.3em;
  35. }
  36. .versions {
  37. font-size: 1.3em;
  38. }
  39. .versions div {
  40. padding-top: 5px;
  41. }
  42. .versions a {
  43. font-weight: bold;
  44. }
  45. .versions a.current {
  46. color: black;
  47. font-decoration: none;
  48. }
  49. </style>
  50. </head>
  51. <body>
  52. <div class="container" >
  53. <div class="row" >
  54. <div class="col-sm-12" >
  55. <div class="page-header">
  56. <h1>{{.Repo.PkgPath}}</h1>
  57. </div>
  58. </div>
  59. </div>
  60. <div class="row" >
  61. <div class="col-sm-8" >
  62. <a class="btn btn-lg btn-info" href="{{.Repo.HubRoot}}/tree/{{.FullVersion.String}}" ><i class="fa fa-github"></i> Source Code</a>
  63. <a class="btn btn-lg btn-info" href="http://godoc.org/{{.Repo.PkgPath}}" ><i class="fa fa-info-circle"></i> API Documentation</a>
  64. </div>
  65. <div class="col-sm-4" >
  66. </div>
  67. </div>
  68. <div class="row main" >
  69. <div class="col-sm-8 info" >
  70. <div class="getting-started" >
  71. <h2>Getting started</h2>
  72. To get the package, execute:
  73. <pre>go get {{.Repo.PkgPath}}</pre>
  74. To import this package, add the following line to your code:
  75. <pre>import "{{.Repo.PkgPath}}"</pre>
  76. </div>
  77. </div>
  78. <div class="col-sm-4 versions" >
  79. <h2>Versions</h2>
  80. {{ range .LatestVersions }}
  81. <div>
  82. <a href='//{{$.Repo.PkgBase}}.v{{.Major}}' {{if eq .Major $.Repo.Version.Major}}class="current"{{end}} >v{{.Major}}</a>
  83. &rarr;
  84. <span class="label label-default">{{.String}}</span>
  85. </div>
  86. {{ end }}
  87. </div>
  88. </div>
  89. </div>
  90. <!--<script src="//ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js"></script>-->
  91. <!--<script src="//netdna.bootstrapcdn.com/bootstrap/3.1.1/js/bootstrap.min.js"></script>-->
  92. </body>
  93. </html>`
  94. var tmplPackage *template.Template
  95. func init() {
  96. var err error
  97. tmplPackage, err = template.New("page").Parse(tmplStrPackage)
  98. if err != nil {
  99. fmt.Printf("fatal: parsing template failed: %s\n", err)
  100. os.Exit(1)
  101. }
  102. }
  103. type dataPackage struct {
  104. Repo *Repo // repo object
  105. LatestVersions VersionList // versionlist containing only the latest version for each major
  106. FullVersion Version // full version that the requeste version resolves to
  107. }
  108. func renderInterface(resp http.ResponseWriter, req *http.Request, repo *Repo) {
  109. data := &dataPackage{
  110. Repo: repo,
  111. }
  112. latestVersionsMap := make(map[int]Version)
  113. for _, v := range repo.Versions {
  114. v2, exists := latestVersionsMap[v.Major]
  115. if !exists || v2.Less(v) {
  116. latestVersionsMap[v.Major] = v
  117. }
  118. }
  119. data.FullVersion = latestVersionsMap[repo.Version.Major]
  120. data.LatestVersions = make(VersionList, 0, len(latestVersionsMap))
  121. for _, v := range latestVersionsMap {
  122. data.LatestVersions = append(data.LatestVersions, v)
  123. }
  124. sort.Sort(sort.Reverse(data.LatestVersions))
  125. err := tmplPackage.Execute(resp, data)
  126. if err != nil {
  127. log.Printf("error executing tmplPackage: %s\n", err)
  128. }
  129. }