// undraftContent: if the content is a draft, change its draft status to // 'false' and set the date to time.Now(). If the draft status is already // 'false', don't do anything. func undraftContent(p parser.Page) (bytes.Buffer, error) { var buff bytes.Buffer // get the metadata; easiest way to see if it's a draft meta, err := p.Metadata() if err != nil { return buff, err } // since the metadata was obtainable, we can also get the key/value separator for // Front Matter fm := p.FrontMatter() if fm == nil { err := fmt.Errorf("Front Matter was found, nothing was finalized") return buff, err } var isDraft, gotDate bool var date string L: for k, v := range meta.(map[string]interface{}) { switch k { case "draft": if !v.(bool) { return buff, fmt.Errorf("not a Draft: nothing was done") } isDraft = true if gotDate { break L } case "date": date = v.(string) // capture the value to make replacement easier gotDate = true if isDraft { break L } } } // if draft wasn't found in FrontMatter, it isn't a draft. if !isDraft { return buff, fmt.Errorf("not a Draft: nothing was done") } // get the front matter as bytes and split it into lines var lineEnding []byte fmLines := bytes.Split(fm, []byte("\n")) if len(fmLines) == 1 { // if the result is only 1 element, try to split on dos line endings fmLines = bytes.Split(fm, []byte("\r\n")) if len(fmLines) == 1 { return buff, fmt.Errorf("unable to split FrontMatter into lines") } lineEnding = append(lineEnding, []byte("\r\n")...) } else { lineEnding = append(lineEnding, []byte("\n")...) } // Write the front matter lines to the buffer, replacing as necessary for _, v := range fmLines { pos := bytes.Index(v, []byte("draft")) if pos != -1 { v = bytes.Replace(v, []byte("true"), []byte("false"), 1) goto write } pos = bytes.Index(v, []byte("date")) if pos != -1 { // if date field wasn't found, add it v = bytes.Replace(v, []byte(date), []byte(time.Now().Format(time.RFC3339)), 1) } write: buff.Write(v) buff.Write(lineEnding) } // append the actual content buff.Write([]byte(p.Content())) return buff, nil }