New templating

This commit is contained in:
Karel Bilek 2018-03-09 13:16:39 +01:00
parent 001b7c9f69
commit 5be5e84295
No known key found for this signature in database
GPG Key ID: 7006C66FDB36247C
6 changed files with 175 additions and 178 deletions

View File

@ -1,116 +0,0 @@
package main
import (
"html"
"io/ioutil"
"os/exec"
"strings"
)
type Command struct {
name string
description string
}
type Group struct {
name string
commands []Command
}
func main() {
first := run("help")
split := strings.Split(first, "\n")
groups := make([]Group, 0)
commands := make([]Command, 0)
lastGroupName := ""
for _, line := range split {
if len(line) > 0 {
if strings.HasPrefix(line, "== ") {
if len(commands) != 0 {
g := Group{
name: lastGroupName,
commands: commands,
}
groups = append(groups, g)
commands = make([]Command, 0)
}
lastGroupName = line[3 : len(line)-3]
} else {
name := strings.Split(line, " ")[0]
desc := run("help", name)
desc = html.EscapeString(desc)
comm := Command{
name: name,
description: desc,
}
commands = append(commands, comm)
}
}
}
g := Group{
name: lastGroupName,
commands: commands,
}
groups = append(groups, g)
menuStr := ""
for _, group := range groups {
menuStr += `
<div class="card">
<div class="card-header">
`
menuStr += group.name
menuStr += `
</div>
<div class="card-body">`
for _, command := range group.commands {
menuStr += `
<a href="`
menuStr += command.name
menuStr += `.html">`
menuStr += command.name
menuStr += `</a><br>`
}
menuStr += `
</div>
</div>
<br>`
}
check(ioutil.WriteFile("tmp-menu.inc", []byte(menuStr), 0644))
runBash("cat start.inc index.inc mid.inc tmp-menu.inc end.inc | sed 's/XXX/Main page/' > index.html")
for _, group := range groups {
for _, command := range group.commands {
check(ioutil.WriteFile("tmp.inc", []byte(command.description), 0644))
runBash("cat start.inc tmp.inc mid.inc tmp-menu.inc end.inc | sed 's/XXX/" + command.name + "/' > " + command.name + ".html")
}
}
runBash("rm tmp.inc")
runBash("rm tmp-menu.inc")
}
func check(e error) {
if e != nil {
panic(e)
}
}
func runBash(cmd string) {
check(exec.Command("bash", "-c", cmd).Run())
}
func run(args ...string) string {
out, err := exec.Command("/home/g/dev/bitcoind/bitcoin-0.16.0/bin/bitcoin-cli", args...).CombinedOutput()
if err != nil {
panic(err)
}
return string(out)
}

View File

@ -1,5 +0,0 @@
</div>
</div>
</main> <!-- /container -->
</body>
</html>

20
mid.inc
View File

@ -1,20 +0,0 @@
</pre>
<hr>
<p>
This is a website, created out of frustration with uncomplete and outdated Bitcoin Core RPC documentation online.
</p>
<p>
It was inspired by <a href="http://chainquery.com/bitcoin-api">ChainQuery</a>, which seems to be abandoned. These docs are even simplier, so they can be regenerated by anyone.
</p>
<p>
Made by <a href="https://twitter.com/karel_3d">@karel_3d</a>; license of the docs is MIT (see <a href="https://github.com/bitcoin/bitcoin/">bitcoin repo</a>), license of the scripts and webpage is also MIT ((C) 2018 Karel Bilek) (<a href="https://github.com/bitcoin-rpc/bitcoin-rpc.github.io">github repo</a>)
</p>
<p>
Bitcoin version: 0.16.0.
</p>
<p>
Note that the RPC is from a regtest node (for completeness), so it includes some additional calls that a regular node doesn't have.
</p>
</div>
<div class="col-4 col-lg-3 col-xl-2">

100
script/bitcoin.go Normal file
View File

@ -0,0 +1,100 @@
package main
import (
"html/template"
"io"
"os"
"os/exec"
"strings"
)
type Command struct {
Name string
Description string
}
type Group struct {
Name string
Commands []Command
}
type Document struct {
Command *Command
Groups []Group
}
func main() {
first := run("help")
split := strings.Split(first, "\n")
groups := make([]Group, 0)
commands := make([]Command, 0)
lastGroupName := ""
for _, line := range split {
if len(line) > 0 {
if strings.HasPrefix(line, "== ") {
if len(commands) != 0 {
g := Group{
Name: lastGroupName,
Commands: commands,
}
groups = append(groups, g)
commands = make([]Command, 0)
}
lastGroupName = line[3 : len(line)-3]
} else {
name := strings.Split(line, " ")[0]
desc := run("help", name)
comm := Command{
Name: name,
Description: desc,
}
commands = append(commands, comm)
}
}
}
g := Group{
Name: lastGroupName,
Commands: commands,
}
groups = append(groups, g)
tmpl := template.Must(template.ParseFiles("template.html"))
tmpl.Execute(open("../index.html"), Document{
Command: nil,
Groups: groups,
})
for _, group := range groups {
for _, command := range group.Commands {
tmpl.Execute(open("../"+command.Name+".html"), Document{
Command: &command,
Groups: groups,
})
}
}
}
func check(e error) {
if e != nil {
panic(e)
}
}
func open(path string) io.Writer {
f, err := os.Create(path)
// not closing, program will close sooner
check(err)
return f
}
func run(args ...string) string {
out, err := exec.Command("/home/g/dev/bitcoind/bitcoin-0.16.0/bin/bitcoin-cli", args...).CombinedOutput()
if err != nil {
panic(err)
}
return string(out)
}

75
script/template.html Normal file
View File

@ -0,0 +1,75 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=1200px, shrink-to-fit=yes">
<meta name="description" content="Bitcoin Core RPC Docs{{if .Command}} - {{.Command.Name}}{{end}}">
<meta name="author" content="">
<title>{{if .Command}}{{.Command.Name}} - {{end}}Bitcoin Core RPC Docs</title>
<link href="./bootstrap.min.css" rel="stylesheet">
</head>
<style>
.card-body {
font-size:80%;
padding-top: 0.5em;
}
pre {
word-break: break-word;
white-space: pre-wrap;
}
</style>
<body>
<nav class="navbar navbar-dark bg-dark ">
<a class="navbar-brand" href="/">Bitcoin Core RPC docs</a>
</nav>
<main role="main" class="container-fluid" style="margin-top: 1pc;">
<div class="row">
<div class="col-8 col-lg-9 col-xl-10">
<h1>{{if .Command}}{{.Command.Name}} - {{end}}Bitcoin RPC</h1>
{{if .Command}}
<pre>{{.Command.Description}}</pre>
<hr>
{{end}}
<p>
This is a website, created out of frustration with uncomplete and outdated Bitcoin Core RPC documentation online.
</p>
<p>
It was inspired by <a href="http://chainquery.com/bitcoin-api">ChainQuery</a>, which seems to be abandoned. These docs are even simplier, so they can be regenerated by anyone.
</p>
<p>
Made by <a href="https://twitter.com/karel_3d">@karel_3d</a>; license of the docs is MIT (see <a href="https://github.com/bitcoin/bitcoin/">bitcoin repo</a>), license of the scripts and webpage is also MIT ((C) 2018 Karel Bilek) (<a href="https://github.com/bitcoin-rpc/bitcoin-rpc.github.io">github repo</a>)
</p>
<p>
Bitcoin version: 0.16.0.
</p>
<p>
Note that the RPC is from a regtest node (for completeness), so it includes some additional calls that a regular node doesn't have.
</p>
</div>
<div class="col-4 col-lg-3 col-xl-2">
{{range .Groups}}
<div class="card">
<div class="card-header">
{{.Name}}
</div>
<div class="card-body">
{{range .Commands}}
<a href="{{.Name}}.html">{{.Name}}</a>
<br>
{{end}}
</div>
</div>
<br>
{{end}}
</div>
</div>
</main> <!-- /container -->
</body>
</html>

View File

@ -1,37 +0,0 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=1200px, shrink-to-fit=yes">
<meta name="description" content="Bitcoin Core RPC Docs - XXX">
<meta name="author" content="">
<title>XXX - Bitcoin Core RPC Docs</title>
<!-- Bootstrap core CSS -->
<link href="./bootstrap.min.css" rel="stylesheet">
</head>
<style>
.card-body {
font-size:80%;
padding-top: 0.5em;
}
pre {
word-break: break-word;
white-space: pre-wrap;
}
</style>
<body>
<nav class="navbar navbar-dark bg-dark ">
<a class="navbar-brand" href="/">Bitcoin Core RPC docs</a>
</nav>
<main role="main" class="container-fluid" style="margin-top: 1pc;">
<div class="row">
<div class="col-8 col-lg-9 col-xl-10">
<h1>XXX - Bitcoin RPC</h1>
<pre>