// createMetadata generates Metadata for a new page based upon the metadata // found in an archetype. func createMetadata(archetype parser.Page, name string) (map[string]interface{}, error) { archMetadata, err := archetype.Metadata() if err != nil { return nil, err } metadata, err := cast.ToStringMapE(archMetadata) if err != nil { return nil, err } for k := range metadata { switch strings.ToLower(k) { case "date": metadata[k] = time.Now() case "title": metadata[k] = helpers.MakeTitle(helpers.Filename(name)) } } caseimatch := func(m map[string]interface{}, key string) bool { for k := range m { if strings.ToLower(k) == strings.ToLower(key) { return true } } return false } if metadata == nil { metadata = make(map[string]interface{}) } if !caseimatch(metadata, "date") { metadata["date"] = time.Now() } if !caseimatch(metadata, "title") { metadata["title"] = helpers.MakeTitle(helpers.Filename(name)) } if x := parser.FormatSanitize(viper.GetString("metaDataFormat")); x == "json" || x == "yaml" || x == "toml" { metadata["date"] = time.Now().Format(time.RFC3339) } return metadata, nil }
// 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 }