Show a graph for words indexed, clean up display.
This commit is contained in:
parent
8215eaa821
commit
85b98b6a25
@ -10,7 +10,7 @@ import (
|
|||||||
"golang.org/x/mod/semver"
|
"golang.org/x/mod/semver"
|
||||||
)
|
)
|
||||||
|
|
||||||
const Tag = "v0.0.35"
|
const Tag = "v0.0.36"
|
||||||
|
|
||||||
type Info struct {
|
type Info struct {
|
||||||
Local struct {
|
Local struct {
|
||||||
|
@ -10,6 +10,10 @@
|
|||||||
<tr><th>Total searches</th><td>{{ .stats.Searches }}</td></tr>
|
<tr><th>Total searches</th><td>{{ .stats.Searches }}</td></tr>
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
|
<h5>Database information</h5>
|
||||||
|
<img src="/graph/bookmarks">
|
||||||
|
<img src="/graph/indexed_words">
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
<div class="large-6 medium-12 cell">
|
<div class="large-6 medium-12 cell">
|
||||||
|
|
||||||
@ -33,6 +37,4 @@
|
|||||||
{{ end }}
|
{{ end }}
|
||||||
{{ end }}
|
{{ end }}
|
||||||
|
|
||||||
<h5>Graph</h5>
|
|
||||||
<img src="/graph">
|
|
||||||
</div>
|
</div>
|
62
web/web.go
62
web/web.go
@ -24,6 +24,7 @@ import (
|
|||||||
"github.com/gin-gonic/gin"
|
"github.com/gin-gonic/gin"
|
||||||
|
|
||||||
"gonum.org/v1/plot"
|
"gonum.org/v1/plot"
|
||||||
|
"gonum.org/v1/plot/font"
|
||||||
"gonum.org/v1/plot/plotter"
|
"gonum.org/v1/plot/plotter"
|
||||||
"gonum.org/v1/plot/vg"
|
"gonum.org/v1/plot/vg"
|
||||||
)
|
)
|
||||||
@ -74,6 +75,12 @@ func (c ColumnInfo) TitleArrow() string {
|
|||||||
// Create creates a new web server instance and sets up routing.
|
// Create creates a new web server instance and sets up routing.
|
||||||
func Create(bmm *db.BookmarkManager, cmm *db.ConfigManager) *Server {
|
func Create(bmm *db.BookmarkManager, cmm *db.ConfigManager) *Server {
|
||||||
|
|
||||||
|
// Set the default font for graphs
|
||||||
|
plot.DefaultFont = font.Font{
|
||||||
|
Typeface: "Liberation",
|
||||||
|
Variant: "Mono",
|
||||||
|
}
|
||||||
|
|
||||||
// setup routes for the static assets (vendor includes)
|
// setup routes for the static assets (vendor includes)
|
||||||
staticFS, err := fs.Sub(staticFiles, "static")
|
staticFS, err := fs.Sub(staticFiles, "static")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -420,7 +427,9 @@ func Create(bmm *db.BookmarkManager, cmm *db.ConfigManager) *Server {
|
|||||||
)
|
)
|
||||||
})
|
})
|
||||||
|
|
||||||
r.GET("/graph", func(c *gin.Context) {
|
r.GET("/graph/:type", func(c *gin.Context) {
|
||||||
|
|
||||||
|
graphType := c.Param("type")
|
||||||
p := plot.New()
|
p := plot.New()
|
||||||
|
|
||||||
dbStats, err := bmm.Stats()
|
dbStats, err := bmm.Stats()
|
||||||
@ -436,29 +445,16 @@ func Create(bmm *db.BookmarkManager, cmm *db.ConfigManager) *Server {
|
|||||||
return sortedKeys[i].Before(sortedKeys[j])
|
return sortedKeys[i].Before(sortedKeys[j])
|
||||||
})
|
})
|
||||||
|
|
||||||
p.Title.Text = "Bookmarks over time"
|
|
||||||
p.X.Label.Text = "Date"
|
|
||||||
p.Y.Label.Text = "Bookmarks"
|
|
||||||
|
|
||||||
xTicks := plot.TimeTicks{Format: "2006-01-02"}
|
xTicks := plot.TimeTicks{Format: "2006-01-02"}
|
||||||
p.X.Tick.Marker = xTicks
|
p.X.Tick.Marker = xTicks
|
||||||
|
|
||||||
pts := make(plotter.XYs, len(sortedKeys))
|
plotPoints(sortedKeys, dbStats, p, graphType)
|
||||||
for i := range sortedKeys {
|
|
||||||
pts[i].X = float64(sortedKeys[i].Unix())
|
|
||||||
pts[i].Y = float64(dbStats.History[sortedKeys[i]].Bookmarks)
|
|
||||||
}
|
|
||||||
|
|
||||||
l, err := plotter.NewLine(pts)
|
writerTo, err := p.WriterTo(vg.Points(640), vg.Points(480), "png")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic("error creating WriterTo: " + err.Error())
|
||||||
}
|
}
|
||||||
p.Add(l)
|
|
||||||
|
|
||||||
writerTo, _ := p.WriterTo(vg.Points(640), vg.Points(480), "png")
|
|
||||||
if err := p.Save(4*vg.Inch, 4*vg.Inch, "points.png"); err != nil {
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
c.Header("Content-Type", "image/png")
|
c.Header("Content-Type", "image/png")
|
||||||
writerTo.WriteTo(c.Writer)
|
writerTo.WriteTo(c.Writer)
|
||||||
|
|
||||||
@ -467,6 +463,38 @@ func Create(bmm *db.BookmarkManager, cmm *db.ConfigManager) *Server {
|
|||||||
return server
|
return server
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func plotPoints(sortedKeys []time.Time, dbStats entity.DBStats, p *plot.Plot, k string) {
|
||||||
|
|
||||||
|
if k == "indexed_words" {
|
||||||
|
p.Title.Text = "Indexed words over time"
|
||||||
|
p.Y.Label.Text = "Words indexed"
|
||||||
|
} else if k == "bookmarks" {
|
||||||
|
p.Title.Text = "Bookmarks over time"
|
||||||
|
p.Y.Label.Text = "Bookmarks"
|
||||||
|
} else {
|
||||||
|
panic("bad k")
|
||||||
|
}
|
||||||
|
p.X.Label.Text = "Date"
|
||||||
|
|
||||||
|
pts := make(plotter.XYs, len(sortedKeys))
|
||||||
|
for i := range sortedKeys {
|
||||||
|
pts[i].X = float64(sortedKeys[i].Unix())
|
||||||
|
if k == "indexed_words" {
|
||||||
|
pts[i].Y = float64(dbStats.History[sortedKeys[i]].IndexedWords)
|
||||||
|
} else if k == "bookmarks" {
|
||||||
|
pts[i].Y = float64(dbStats.History[sortedKeys[i]].Bookmarks)
|
||||||
|
} else {
|
||||||
|
panic("bad key")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
l, err := plotter.NewLine(pts)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
p.Add(l)
|
||||||
|
}
|
||||||
|
|
||||||
// headersByURI sets the headers for some special cases, set a custom long cache time for
|
// headersByURI sets the headers for some special cases, set a custom long cache time for
|
||||||
// static resources.
|
// static resources.
|
||||||
func headersByURI() gin.HandlerFunc {
|
func headersByURI() gin.HandlerFunc {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user