Add rules for glossary, make CSS nicer
This commit is contained in:
parent
4fd6f2d35b
commit
58ddb252fa
5 changed files with 114 additions and 48 deletions
15
README.md
15
README.md
|
@ -1,12 +1,19 @@
|
|||
# htmlroc
|
||||
|
||||
Converts MLP:CCG rule files from text (thanks Hithroc!) to HTML!
|
||||
Converts MLP:CCG rule files from text to HTML!
|
||||
|
||||
## Installation
|
||||
|
||||
### Requirements
|
||||
|
||||
- Go 1.12+
|
||||
- The text rules from Hithroc's site:
|
||||
https://horse.cards/rules/latest.txt
|
||||
|
||||
### Running htmlroc
|
||||
|
||||
1. Clone project locally and `cd` to it
|
||||
2. Download `rules.txt` from Hithroc's site and place it inside the project's folder:
|
||||
https://horse.cards/rules/latest.txt
|
||||
2. Place the text rules inside the project's folder as `rules.txt`
|
||||
3. Run this command:
|
||||
```
|
||||
go run .
|
||||
|
@ -17,4 +24,4 @@ Alternately, you can compile with `go install` and use the command line flags to
|
|||
## Thanks to
|
||||
|
||||
- [Hithroc](https://hithroc.org/) for maitaining text versions of the rules
|
||||
- [CommentaryIsMagic](http://www.commentaryismagic.com/) for maitaining the rules
|
||||
- [CommentaryIsMagic](http://www.commentaryismagic.com/) for maitaining the official rules
|
||||
|
|
31
main.go
31
main.go
|
@ -31,14 +31,11 @@ type TemplateRule struct {
|
|||
Depth int
|
||||
}
|
||||
|
||||
var funmap = template.FuncMap{
|
||||
"toCredits": tplToCredits,
|
||||
"htmlify": tplHtmlify,
|
||||
}
|
||||
|
||||
// HTMLrocCredits is the credit string to append to the other credits
|
||||
const HTMLrocCredits = "Converted to HTML using <a href=\"https://git.fromouter.space/mcg/htmlroc\">htmlroc</a>"
|
||||
|
||||
var tpl *template.Template
|
||||
|
||||
func main() {
|
||||
// Command line flags
|
||||
txtfile := flag.String("in", "rules.txt", "Path to rules.txt file")
|
||||
|
@ -47,7 +44,8 @@ func main() {
|
|||
flag.Parse()
|
||||
|
||||
// Read template file
|
||||
tpl, err := template.New(*tplfile).Funcs(funmap).ParseFiles(*tplfile)
|
||||
var err error
|
||||
tpl, err = template.New(*tplfile).Funcs(funmap).ParseFiles(*tplfile)
|
||||
checkErr(err, "Could not load template file \"%s\"", *tplfile)
|
||||
|
||||
tpldata := TemplateData{}
|
||||
|
@ -116,7 +114,7 @@ func main() {
|
|||
// Create new section
|
||||
currentSection = &TemplateSection{
|
||||
ID: parts[0],
|
||||
Title: parts[1],
|
||||
Title: strings.TrimSpace(parts[1]),
|
||||
Rules: []TemplateRule{},
|
||||
Extra: false,
|
||||
}
|
||||
|
@ -166,21 +164,4 @@ func checkErr(err error, fmtstr string, args ...interface{}) {
|
|||
fmt.Fprintln(os.Stderr, err.Error())
|
||||
os.Exit(1)
|
||||
}
|
||||
}
|
||||
|
||||
func tplToCredits(str string) template.HTML {
|
||||
// Make first line an heading
|
||||
idx := strings.IndexRune(str, '\n')
|
||||
if idx > 0 {
|
||||
str = "<h1>" + str[:idx] + "</h1><p>" + str[idx+1:]
|
||||
}
|
||||
// Wrap other lines in <p> tags
|
||||
str = strings.ReplaceAll(str, "\n", "</p><p>") + "</p>"
|
||||
return template.HTML(str)
|
||||
}
|
||||
|
||||
func tplHtmlify(str string) template.HTML {
|
||||
// Replace newlines with <br />
|
||||
str = strings.ReplaceAll(str, "\n", "<br />")
|
||||
return template.HTML(str)
|
||||
}
|
||||
}
|
48
style.css
48
style.css
|
@ -1,46 +1,56 @@
|
|||
@import url('https://fonts.googleapis.com/css?family=Roboto:300,400&display=swap');
|
||||
@import url("https://fonts.googleapis.com/css?family=Roboto:300,400,700&display=swap");
|
||||
|
||||
body {
|
||||
font-family: 'Roboto', sans-serif;
|
||||
font-weight: 300;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
font-size: 11pt;
|
||||
font-family: "Roboto", sans-serif;
|
||||
font-weight: 300;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
font-size: 11pt;
|
||||
line-height: 150%;
|
||||
}
|
||||
|
||||
main {
|
||||
flex: 1;
|
||||
max-width: 60em;
|
||||
flex: 1;
|
||||
max-width: 60em;
|
||||
}
|
||||
|
||||
h1,
|
||||
h2 {
|
||||
color: #4b5b69;
|
||||
font-weight: 400;
|
||||
color: #4b5b69;
|
||||
font-weight: 400;
|
||||
}
|
||||
|
||||
p {
|
||||
margin: 0;
|
||||
padding: 2pt 0;
|
||||
margin: 0;
|
||||
padding: 2pt 0;
|
||||
}
|
||||
|
||||
ul {
|
||||
padding-left: 10pt;
|
||||
padding-left: 10pt;
|
||||
}
|
||||
|
||||
li {
|
||||
margin: 10pt 0;
|
||||
list-style-type: none;
|
||||
margin: 10pt 0;
|
||||
list-style-type: none;
|
||||
}
|
||||
|
||||
.depth-2 {
|
||||
padding-left: 20pt;
|
||||
padding-left: 20pt;
|
||||
}
|
||||
|
||||
.depth-4 {
|
||||
padding-left: 40pt;
|
||||
padding-left: 40pt;
|
||||
}
|
||||
|
||||
.depth-6 {
|
||||
padding-left: 60pt;
|
||||
}
|
||||
padding-left: 60pt;
|
||||
}
|
||||
|
||||
.glossary dt {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.glossary dd {
|
||||
margin-inline-start: 10pt;
|
||||
margin-bottom: 1rem;
|
||||
}
|
||||
|
|
59
template.go
Normal file
59
template.go
Normal file
|
@ -0,0 +1,59 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"html/template"
|
||||
"strings"
|
||||
)
|
||||
|
||||
var funmap = template.FuncMap{
|
||||
"toCredits": tplToCredits,
|
||||
"htmlify": tplHtmlify,
|
||||
"toGlossary": tplToGlossary,
|
||||
}
|
||||
|
||||
func tplToCredits(str string) template.HTML {
|
||||
// Make first line an heading
|
||||
idx := strings.IndexRune(str, '\n')
|
||||
if idx > 0 {
|
||||
str = "<h1>" + str[:idx] + "</h1><p>" + str[idx+1:]
|
||||
}
|
||||
// Wrap other lines in <p> tags
|
||||
str = strings.ReplaceAll(str, "\n", "</p><p>") + "</p>"
|
||||
return template.HTML(str)
|
||||
}
|
||||
|
||||
func tplHtmlify(str string) template.HTML {
|
||||
// Replace newlines with <br />
|
||||
str = strings.ReplaceAll(str, "\n", "<br />")
|
||||
return template.HTML(str)
|
||||
}
|
||||
|
||||
type glossaryEntry struct {
|
||||
Keyword string
|
||||
Definition string
|
||||
}
|
||||
|
||||
func tplToGlossary(str string) (glob []glossaryEntry) {
|
||||
lines := strings.Split(str, "\n")
|
||||
for _, line := range lines {
|
||||
// Skip empty lines
|
||||
line = strings.TrimSpace(line)
|
||||
if len(line) < 1 {
|
||||
continue
|
||||
}
|
||||
|
||||
// Find delimiter
|
||||
delim := strings.IndexRune(line, ':')
|
||||
if delim < 0 {
|
||||
// No delim? Add to last entry
|
||||
glob[len(glob)-1].Definition += line
|
||||
continue
|
||||
}
|
||||
|
||||
glob = append(glob, glossaryEntry{
|
||||
Keyword: line[:delim],
|
||||
Definition: strings.TrimSpace(line[delim+1:]),
|
||||
})
|
||||
}
|
||||
return
|
||||
}
|
|
@ -15,7 +15,16 @@
|
|||
{{ range .Sections }}
|
||||
<h2 id="{{ .ID }}">{{ .ID }}. {{ .Title }}</h2>
|
||||
{{ if .Extra }}
|
||||
{{ if (eq .Title "Glossary")}}
|
||||
<dl class="glossary">
|
||||
{{ range (toGlossary .Text) }}
|
||||
<dt>{{ .Keyword }}</dt>
|
||||
<dd>{{ .Definition }}</dd>
|
||||
{{ end }}
|
||||
</dl>
|
||||
{{ else }}
|
||||
{{ .Text | htmlify }}
|
||||
{{ end }}
|
||||
{{ else }}
|
||||
<ul>
|
||||
{{ range .Rules }}
|
||||
|
|
Loading…
Reference in a new issue