Skip to content

Instantly share code, notes, and snippets.

@gsora
Created March 4, 2020 17:10
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save gsora/5c3ae3082d32166d96f03e4323cc7a74 to your computer and use it in GitHub Desktop.
Save gsora/5c3ae3082d32166d96f03e4323cc7a74 to your computer and use it in GitHub Desktop.
Markdown preprocessor with variable replacement
package main
import (
"errors"
"fmt"
"io/ioutil"
"log"
"os"
"regexp"
"strings"
)
const (
pBeginning string = "#vardownBegin"
pEnd string = "#vardownEnd"
pattern = "(?P<name>.+) = (?P<value>.+)"
)
var r = regexp.MustCompile(pattern)
func main() {
if len(os.Args) < 2 {
log.Fatal("missing file path")
}
data, err := ioutil.ReadFile(os.Args[1])
if err != nil {
log.Fatal(err)
}
ss, err := parseVardown(string(data))
if err != nil {
log.Fatal(err)
}
replacer := strings.NewReplacer(ss...)
fmt.Println(replacer.Replace(string(data)))
}
func parseVardown(s string) ([]string, error) {
var ret []string
foundBeginning := false
foundEnd := false
for _, statement := range strings.Split(s, "\n") {
if statement == pBeginning {
foundBeginning = true
continue
}
if statement == pEnd {
foundEnd = true
break
}
ret = append(ret, parseStatement(s).replacer()...)
}
if !foundBeginning && !foundEnd {
return nil, nil
}
if !(foundBeginning && foundEnd) {
return nil, errors.New("invalid vardown preamble declaration")
}
return ret, nil
}
type statement struct {
name string
value string
}
func (s statement) replacer() []string {
return []string{
"$" + s.name,
s.value,
}
}
func parseStatement(s string) statement {
if !r.MatchString(s) {
return statement{}
}
m := findNamedMatches(r, s)
return statement{
name: m["name"],
value: m["value"],
}
}
func findNamedMatches(regex *regexp.Regexp, str string) map[string]string {
match := regex.FindStringSubmatch(str)
results := map[string]string{}
for i, name := range match {
results[regex.SubexpNames()[i]] = name
}
return results
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment