105 lines
2.2 KiB
Go
105 lines
2.2 KiB
Go
package mmark
|
|
|
|
import (
|
|
"bytes"
|
|
"time"
|
|
|
|
"github.com/BurntSushi/toml"
|
|
)
|
|
|
|
const (
|
|
// Sentinal for not set.
|
|
piNotSet = "__mmark_toml_pi_not_set"
|
|
|
|
DefaultIpr = "trust200902"
|
|
DefaultArea = "Internet"
|
|
)
|
|
|
|
type author struct {
|
|
Initials string
|
|
Surname string
|
|
Fullname string
|
|
Organization string
|
|
OrganizationAbbrev string `toml:"abbrev"`
|
|
Role string
|
|
Ascii string
|
|
Address address
|
|
}
|
|
|
|
type address struct {
|
|
Phone string
|
|
Email string
|
|
Uri string
|
|
Postal addressPostal
|
|
}
|
|
|
|
type addressPostal struct {
|
|
Street string
|
|
City string
|
|
Code string
|
|
Country string
|
|
Region string
|
|
PostalLine []string
|
|
|
|
// Plurals when these need to be specified multiple times.
|
|
Streets []string
|
|
Cities []string
|
|
Codes []string
|
|
Countries []string
|
|
Regions []string
|
|
}
|
|
|
|
// PIs the processing instructions.
|
|
var PIs = []string{"toc", "symrefs", "sortrefs", "compact", "subcompact", "private", "topblock", "header", "footer", "comments"}
|
|
|
|
type pi struct {
|
|
Toc string
|
|
Symrefs string
|
|
Sortrefs string
|
|
Compact string
|
|
Subcompact string
|
|
Private string
|
|
Topblock string
|
|
Comments string // Typeset cref's in the text.
|
|
Header string // Top-Left header, usually Internet-Draft.
|
|
Footer string // Bottom-Center footer, usually Expires ...
|
|
}
|
|
|
|
type title struct {
|
|
Title string
|
|
Abbrev string
|
|
|
|
DocName string
|
|
Ipr string
|
|
Category string
|
|
Number int // RFC number
|
|
Obsoletes []int
|
|
Updates []int
|
|
PI pi // Processing Instructions
|
|
SubmissionType string
|
|
|
|
Date time.Time
|
|
Area string
|
|
Workgroup string
|
|
Keyword []string
|
|
Author []author
|
|
}
|
|
|
|
func (p *parser) titleBlockTOML(out *bytes.Buffer, data []byte) title {
|
|
data = bytes.TrimPrefix(data, []byte("%"))
|
|
data = bytes.Replace(data, []byte("\n%"), []byte("\n"), -1)
|
|
|
|
// Set some sentinels and defaults.
|
|
var block title
|
|
block.PI.Header = piNotSet
|
|
block.PI.Footer = piNotSet
|
|
block.Area = DefaultArea
|
|
block.Ipr = DefaultIpr
|
|
block.Date = time.Now()
|
|
|
|
if _, err := toml.Decode(string(data), &block); err != nil {
|
|
printf(p, "error in TOML titleblock: %s", err.Error())
|
|
return block // never an error when encoding markdown
|
|
}
|
|
return block
|
|
}
|