func preparePagePNTestPages(t *testing.T) Pages { var pages Pages for _, s := range pagePNTestSources { p, err := NewPage(s.path) if err != nil { t.Fatalf("failed to prepare test page %s", s.path) } p.Weight = s.weight p.Date = cast.ToTime(s.date) p.PublishDate = cast.ToTime(s.date) pages = append(pages, p) } return pages }
func preparePNInSectionTestPages(t *testing.T) *Site { site := new(Site) for _, s := range sectionPNTestSources { p, err := NewPage(s.path) if err != nil { t.Fatalf("failed to prepare test page %s", s.path) } p.Weight, p.Date, p.PublishDate = s.weight, cast.ToTime(s.date), cast.ToTime(s.date) site.Pages = append(site.Pages, p) } site.assembleTaxonomies() site.assembleSections() return site }
func preparePageGroupTestPages(t *testing.T) Pages { var pages Pages for _, s := range pageGroupTestSources { p, err := NewPage(filepath.FromSlash(s.path)) if err != nil { t.Fatalf("failed to prepare test page %s", s.path) } p.Weight = s.weight p.Date = cast.ToTime(s.date) p.PublishDate = cast.ToTime(s.date) p.Params["custom_param"] = s.param p.Params["custom_date"] = cast.ToTime(s.date) pages = append(pages, p) } return pages }
func (v *Viper) Get(key string) interface{} { lcaseKey := strings.ToLower(key) val := v.find(lcaseKey) if val == nil { return nil } valType := val if v.typeByDefValue { // TODO(bep) this branch isn't covered by a single test. path := strings.Split(lcaseKey, v.keyDelim) defVal := v.searchMap(v.defaults, path) if defVal != nil { valType = defVal } } switch valType.(type) { case bool: return cast.ToBool(val) case string: return cast.ToString(val) case int64, int32, int16, int8, int: return cast.ToInt(val) case float64, float32: return cast.ToFloat64(val) case time.Time: return cast.ToTime(val) case time.Duration: return cast.ToDuration(val) case []string: return cast.ToStringSlice(val) } return val }
// Get can retrieve any value given the key to use // Get returns an interface. For a specific value use one of the Get____ methods. func (c RawConfig) Get(key string) interface{} { path := strings.Split(key, keyDelim) val := c.find(strings.ToLower(key)) if val == nil { source := c.find(path[0]) if source == nil { return nil } if reflect.TypeOf(source).Kind() == reflect.Map { val = c.searchMap(cast.ToStringMap(source), path[1:]) } } switch val.(type) { case bool: return cast.ToBool(val) case string: return cast.ToString(val) case int64, int32, int16, int8, int: return cast.ToInt(val) case float64, float32: return cast.ToFloat64(val) case time.Time: return cast.ToTime(val) case time.Duration: return cast.ToDuration(val) case []string: return val } return val }
func (v *Viper) Get(key string) interface{} { key = strings.ToLower(key) val := v.find(key) if val == nil { return nil } switch val.(type) { case bool: return cast.ToBool(val) case string: return cast.ToString(val) case int64, int32, int16, int8, int: return cast.ToInt(val) case float64, float32: return cast.ToFloat64(val) case time.Time: return cast.ToTime(val) case time.Duration: return cast.ToDuration(val) case []string: return val } return val }
// Get returns an interface.. // Must be typecast or used by something that will typecast func (manager *Config) Get(key string) interface{} { jww.TRACE.Println("Looking for", key) v := manager.Find(key) if v == nil { return nil } jww.TRACE.Println("Found value", v) switch v.(type) { case bool: return cast.ToBool(v) case string: return cast.ToString(v) case int64, int32, int16, int8, int: return cast.ToInt(v) case float64, float32: return cast.ToFloat64(v) case time.Time: return cast.ToTime(v) case []string: return v } return v }
func (p *Page) getParam(key string, stringToLower bool) interface{} { v := p.Params[strings.ToLower(key)] if v == nil { return nil } switch v.(type) { case bool: return cast.ToBool(v) case string: if stringToLower { return strings.ToLower(cast.ToString(v)) } return cast.ToString(v) case int64, int32, int16, int8, int: return cast.ToInt(v) case float64, float32: return cast.ToFloat64(v) case time.Time: return cast.ToTime(v) case []string: if stringToLower { return helpers.SliceToLower(v.([]string)) } return v.([]string) case map[string]interface{}: // JSON and TOML return v case map[interface{}]interface{}: // YAML return v } jww.ERROR.Printf("GetParam(\"%s\"): Unknown type %s\n", key, reflect.TypeOf(v)) return nil }
func prepareWeightedPagesPrevNext(t *testing.T) WeightedPages { w := WeightedPages{} for _, s := range pagePNTestSources { p, err := NewPage(s.path) if err != nil { t.Fatalf("failed to prepare test page %s", s.path) } p.Weight = s.weight p.Date = cast.ToTime(s.date) p.PublishDate = cast.ToTime(s.date) w = append(w, WeightedPage{p.Weight, p}) } w.Sort() return w }
func (v *Viper) Get(key string) interface{} { path := strings.Split(key, v.keyDelim) var val interface{} lcaseKey := strings.ToLower(key) source := v.find(path[0]) if source != nil { if reflect.TypeOf(source).Kind() == reflect.Map { val = v.searchMap(cast.ToStringMap(source), path[1:]) } } if val == nil { val = v.find(lcaseKey) } if val == nil { return nil } var valType interface{} if !v.typeByDefValue { valType = val } else { defVal, defExists := v.defaults[lcaseKey] if defExists { valType = defVal } else { valType = val } } switch valType.(type) { case bool: return cast.ToBool(val) case string: return cast.ToString(val) case int64, int32, int16, int8, int: return cast.ToInt(val) case float64, float32: return cast.ToFloat64(val) case time.Time: return cast.ToTime(val) case time.Duration: return cast.ToDuration(val) case []string: return cast.ToStringSlice(val) } return val }
func handleFlatValues(content interface{}, parent *frontmatter, name string) *frontmatter { c := new(frontmatter) c.Parent = parent switch reflect.ValueOf(content).Kind() { case reflect.Bool: c.Type = "boolean" case reflect.Int, reflect.Float32, reflect.Float64: c.Type = "number" default: c.Type = "string" } c.Content = content switch strings.ToLower(name) { case "description": c.HTMLType = "textarea" case "date", "publishdate": c.HTMLType = "datetime" c.Content = cast.ToTime(content) default: c.HTMLType = "text" } if parent.Type == "array" { c.Name = parent.Name + "[]" c.Title = content.(string) } else if parent.Type == "object" { c.Title = name c.Name = parent.Name + "[" + name + "]" if parent.Name == mainName { c.Name = name } } else { log.Panic("Parent type not allowed in handleFlatValues.") } return c }
//get Config value by key func (c *Config) Get(key string) interface{} { val := c.get(key) switch val.(type) { case bool: return cast.ToBool(val) case string: return cast.ToString(val) case int64, int32, int16, int8, int: return cast.ToInt(val) case float64, float32: return cast.ToFloat64(val) case time.Time: return cast.ToTime(val) case time.Duration: return cast.ToDuration(val) case []string: return val } return val }
func (s *SiteInfo) GetParam(key string) interface{} { v := s.Params[strings.ToLower(key)] if v == nil { return nil } switch v.(type) { case bool: return cast.ToBool(v) case string: return cast.ToString(v) case int64, int32, int16, int8, int: return cast.ToInt(v) case float64, float32: return cast.ToFloat64(v) case time.Time: return cast.ToTime(v) case []string: return v } return nil }
func (page *Page) GetParam(key string) interface{} { v := page.Params[strings.ToLower(key)] if v == nil { return nil } switch v.(type) { case bool: return cast.ToBool(v) case string: return strings.ToLower(cast.ToString(v)) case int64, int32, int16, int8, int: return cast.ToInt(v) case float64, float32: return cast.ToFloat64(v) case time.Time: return cast.ToTime(v) case []string: return sliceToLower(v.([]string)) } return nil }
// Get returns an interface.. // Must be typecast or used by something that will typecast func Get(key string) interface{} { key = strings.ToLower(key) v := find(key) if v == nil { return nil } switch v.(type) { case bool: return cast.ToBool(v) case string: return cast.ToString(v) case int64, int32, int16, int8, int: return cast.ToInt(v) case float64, float32: return cast.ToFloat64(v) case time.Time: return cast.ToTime(v) case []string: return v } return v }
func (c *Config) GetTime(key string) time.Time { return cast.ToTime(c.get(key)) }
func (v *Viper) Get(key string) interface{} { path := strings.Split(key, v.keyDelim) lcaseKey := strings.ToLower(key) val := v.find(lcaseKey) if val == nil { source := v.find(strings.ToLower(path[0])) if source != nil { if reflect.TypeOf(source).Kind() == reflect.Map { val = v.searchMap(cast.ToStringMap(source), path[1:]) } } } // if no other value is returned and a flag does exist for the value, // get the flag's value even if the flag's value has not changed if val == nil { if flag, exists := v.pflags[lcaseKey]; exists { jww.TRACE.Println(key, "get pflag default", val) switch flag.ValueType() { case "int", "int8", "int16", "int32", "int64": val = cast.ToInt(flag.ValueString()) case "bool": val = cast.ToBool(flag.ValueString()) default: val = flag.ValueString() } } } if val == nil { return nil } var valType interface{} if !v.typeByDefValue { valType = val } else { defVal, defExists := v.defaults[lcaseKey] if defExists { valType = defVal } else { valType = val } } switch valType.(type) { case bool: return cast.ToBool(val) case string: return cast.ToString(val) case int64, int32, int16, int8, int: return cast.ToInt(val) case float64, float32: return cast.ToFloat64(val) case time.Time: return cast.ToTime(val) case time.Duration: return cast.ToDuration(val) case []string: return cast.ToStringSlice(val) } return val }
func (v *Viper) GetTime(key string) time.Time { return cast.ToTime(v.Get(key)) }
func (page *Page) update(f interface{}) error { if f == nil { return fmt.Errorf("no metadata found") } m := f.(map[string]interface{}) for k, v := range m { loki := strings.ToLower(k) switch loki { case "title": page.Title = cast.ToString(v) case "linktitle": page.linkTitle = cast.ToString(v) case "description": page.Description = cast.ToString(v) case "slug": page.Slug = helpers.Urlize(cast.ToString(v)) case "url": if url := cast.ToString(v); strings.HasPrefix(url, "http://") || strings.HasPrefix(url, "https://") { return fmt.Errorf("Only relative urls are supported, %v provided", url) } page.Url = helpers.Urlize(cast.ToString(v)) case "type": page.contentType = cast.ToString(v) case "keywords": page.Keywords = cast.ToStringSlice(v) case "date", "pubdate": page.Date = cast.ToTime(v) case "draft": page.Draft = cast.ToBool(v) case "layout": page.layout = cast.ToString(v) case "markup": page.Markup = cast.ToString(v) case "weight": page.Weight = cast.ToInt(v) case "aliases": page.Aliases = cast.ToStringSlice(v) for _, alias := range page.Aliases { if strings.HasPrefix(alias, "http://") || strings.HasPrefix(alias, "https://") { return fmt.Errorf("Only relative aliases are supported, %v provided", alias) } } case "status": page.Status = cast.ToString(v) case "sitemap": page.Sitemap = parseSitemap(cast.ToStringMap(v)) default: // If not one of the explicit values, store in Params switch vv := v.(type) { case bool: page.Params[loki] = vv case string: page.Params[loki] = vv case int64, int32, int16, int8, int: page.Params[loki] = vv case float64, float32: page.Params[loki] = vv case time.Time: page.Params[loki] = vv default: // handle array of strings as well switch vvv := vv.(type) { case []interface{}: var a = make([]string, len(vvv)) for i, u := range vvv { a[i] = cast.ToString(u) } page.Params[loki] = a default: page.Params[loki] = vv } } } } return nil }
func GetTime(key string) time.Time { return cast.ToTime(Get(key)) }
func parseCompleteFile(r *http.Request, c *config.Config, rawFile map[string]interface{}, filename string) ([]byte, int, error) { // The main content of the file mainContent := rawFile["content"].(string) mainContent = "\n\n" + strings.TrimSpace(mainContent) + "\n" // Removes the main content from the rest of the frontmatter delete(rawFile, "content") // Schedule the post if r.Header.Get("X-Schedule") == "true" { t := cast.ToTime(rawFile["date"].(string)) scheduler := cron.New() scheduler.AddFunc(t.In(time.Now().Location()).Format("05 04 15 02 01 *"), func() { // Set draft to false rawFile["draft"] = false // Converts the frontmatter in JSON jsonFrontmatter, err := json.Marshal(rawFile) if err != nil { return } // Indents the json frontMatterBuffer := new(bytes.Buffer) json.Indent(frontMatterBuffer, jsonFrontmatter, "", " ") // Generates the final file f := new(bytes.Buffer) f.Write(frontMatterBuffer.Bytes()) f.Write([]byte(mainContent)) file := f.Bytes() // Write the file if err = ioutil.WriteFile(filename, file, 0666); err != nil { return } utils.Run(c) }) scheduler.Start() } // Converts the frontmatter in JSON jsonFrontmatter, err := json.Marshal(rawFile) if err != nil { return []byte{}, http.StatusInternalServerError, err } // Indents the json frontMatterBuffer := new(bytes.Buffer) json.Indent(frontMatterBuffer, jsonFrontmatter, "", " ") // Generates the final file f := new(bytes.Buffer) f.Write(frontMatterBuffer.Bytes()) f.Write([]byte(mainContent)) return f.Bytes(), http.StatusOK, nil }
func (manager *Config) GetTime(key string) time.Time { return cast.ToTime(manager.Get(key)) }