mirror of
https://github.com/gohugoio/hugo.git
synced 2025-04-29 07:00:31 +03:00
parent
2efc1a64c3
commit
ce06bdb16a
6 changed files with 14 additions and 15 deletions
|
@ -35,8 +35,8 @@ The above prints `Hello Hugo`.
|
||||||
|
|
||||||
Unmarshal with CSV as input has some options you can set:
|
Unmarshal with CSV as input has some options you can set:
|
||||||
|
|
||||||
comma
|
delimiter
|
||||||
: The delmiter used, default is `,`
|
: The delimiter used, default is `,`
|
||||||
|
|
||||||
comment
|
comment
|
||||||
: The comment character ued in the CSV. If set, lines beginning with the comment character without preceding whitespace are ignored.:
|
: The comment character ued in the CSV. If set, lines beginning with the comment character without preceding whitespace are ignored.:
|
||||||
|
|
|
@ -343,12 +343,11 @@ Publish 2: {{ $cssPublish2.Permalink }}
|
||||||
b.WithTemplates("home.html", `
|
b.WithTemplates("home.html", `
|
||||||
{{ $toml := "slogan = \"Hugo Rocks!\"" | resources.FromString "slogan.toml" | transform.Unmarshal }}
|
{{ $toml := "slogan = \"Hugo Rocks!\"" | resources.FromString "slogan.toml" | transform.Unmarshal }}
|
||||||
{{ $csv1 := "\"Hugo Rocks\",\"Hugo is Fast!\"" | resources.FromString "slogans.csv" | transform.Unmarshal }}
|
{{ $csv1 := "\"Hugo Rocks\",\"Hugo is Fast!\"" | resources.FromString "slogans.csv" | transform.Unmarshal }}
|
||||||
{{ $csv2 := "a;b;c" | transform.Unmarshal (dict "comma" ";") }}
|
{{ $csv2 := "a;b;c" | transform.Unmarshal (dict "delimiter" ";") }}
|
||||||
|
|
||||||
Slogan: {{ $toml.slogan }}
|
Slogan: {{ $toml.slogan }}
|
||||||
CSV1: {{ $csv1 }} {{ len (index $csv1 0) }}
|
CSV1: {{ $csv1 }} {{ len (index $csv1 0) }}
|
||||||
CSV2: {{ $csv2 }}
|
CSV2: {{ $csv2 }}
|
||||||
|
|
||||||
`)
|
`)
|
||||||
}, func(b *sitesBuilder) {
|
}, func(b *sitesBuilder) {
|
||||||
b.AssertFileContent("public/index.html",
|
b.AssertFileContent("public/index.html",
|
||||||
|
|
|
@ -31,8 +31,8 @@ import (
|
||||||
|
|
||||||
// Decoder provides some configuration options for the decoders.
|
// Decoder provides some configuration options for the decoders.
|
||||||
type Decoder struct {
|
type Decoder struct {
|
||||||
// Comma is the field delimiter used in the CSV decoder. It defaults to ','.
|
// Delimiter is the field delimiter used in the CSV decoder. It defaults to ','.
|
||||||
Comma rune
|
Delimiter rune
|
||||||
|
|
||||||
// Comment, if not 0, is the comment character ued in the CSV decoder. Lines beginning with the
|
// Comment, if not 0, is the comment character ued in the CSV decoder. Lines beginning with the
|
||||||
// Comment character without preceding whitespace are ignored.
|
// Comment character without preceding whitespace are ignored.
|
||||||
|
@ -41,7 +41,7 @@ type Decoder struct {
|
||||||
|
|
||||||
// Default is a Decoder in its default configuration.
|
// Default is a Decoder in its default configuration.
|
||||||
var Default = Decoder{
|
var Default = Decoder{
|
||||||
Comma: ',',
|
Delimiter: ',',
|
||||||
}
|
}
|
||||||
|
|
||||||
// UnmarshalToMap will unmarshall data in format f into a new map. This is
|
// UnmarshalToMap will unmarshall data in format f into a new map. This is
|
||||||
|
@ -156,7 +156,7 @@ func (d Decoder) unmarshal(data []byte, f Format, v interface{}) error {
|
||||||
|
|
||||||
func (d Decoder) unmarshalCSV(data []byte, v interface{}) error {
|
func (d Decoder) unmarshalCSV(data []byte, v interface{}) error {
|
||||||
r := csv.NewReader(bytes.NewReader(data))
|
r := csv.NewReader(bytes.NewReader(data))
|
||||||
r.Comma = d.Comma
|
r.Comma = d.Delimiter
|
||||||
r.Comment = d.Comment
|
r.Comment = d.Comment
|
||||||
|
|
||||||
records, err := r.ReadAll()
|
records, err := r.ReadAll()
|
||||||
|
|
|
@ -92,7 +92,7 @@ func FormatFromFrontMatterType(typ pageparser.ItemType) Format {
|
||||||
// in the given string.
|
// in the given string.
|
||||||
// It return an empty string if no format could be detected.
|
// It return an empty string if no format could be detected.
|
||||||
func (d Decoder) FormatFromContentString(data string) Format {
|
func (d Decoder) FormatFromContentString(data string) Format {
|
||||||
csvIdx := strings.IndexRune(data, d.Comma)
|
csvIdx := strings.IndexRune(data, d.Delimiter)
|
||||||
jsonIdx := strings.Index(data, "{")
|
jsonIdx := strings.Index(data, "{")
|
||||||
yamlIdx := strings.Index(data, ":")
|
yamlIdx := strings.Index(data, ":")
|
||||||
tomlIdx := strings.Index(data, "=")
|
tomlIdx := strings.Index(data, "=")
|
||||||
|
|
|
@ -116,12 +116,12 @@ func decodeDecoder(m map[string]interface{}) (metadecoders.Decoder, error) {
|
||||||
// mapstructure does not support string to rune conversion, so do that manually.
|
// mapstructure does not support string to rune conversion, so do that manually.
|
||||||
// See https://github.com/mitchellh/mapstructure/issues/151
|
// See https://github.com/mitchellh/mapstructure/issues/151
|
||||||
for k, v := range m {
|
for k, v := range m {
|
||||||
if strings.EqualFold(k, "Comma") {
|
if strings.EqualFold(k, "Delimiter") {
|
||||||
r, err := stringToRune(v)
|
r, err := stringToRune(v)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return opts, err
|
return opts, err
|
||||||
}
|
}
|
||||||
opts.Comma = r
|
opts.Delimiter = r
|
||||||
delete(m, k)
|
delete(m, k)
|
||||||
|
|
||||||
} else if strings.EqualFold(k, "Comment") {
|
} else if strings.EqualFold(k, "Comment") {
|
||||||
|
|
|
@ -118,7 +118,7 @@ func TestUnmarshal(t *testing.T) {
|
||||||
assert.Equal(5, len(first))
|
assert.Equal(5, len(first))
|
||||||
assert.Equal("Ford", first[1])
|
assert.Equal("Ford", first[1])
|
||||||
}},
|
}},
|
||||||
{testContentResource{key: "r1", content: `a;b;c`, mime: media.CSVType}, map[string]interface{}{"comma": ";"}, func(r [][]string) {
|
{testContentResource{key: "r1", content: `a;b;c`, mime: media.CSVType}, map[string]interface{}{"delimiter": ";"}, func(r [][]string) {
|
||||||
assert.Equal(r, [][]string{[]string{"a", "b", "c"}})
|
assert.Equal(r, [][]string{[]string{"a", "b", "c"}})
|
||||||
|
|
||||||
}},
|
}},
|
||||||
|
@ -126,13 +126,13 @@ func TestUnmarshal(t *testing.T) {
|
||||||
assert.Equal(r, [][]string{[]string{"a", "b", "c"}})
|
assert.Equal(r, [][]string{[]string{"a", "b", "c"}})
|
||||||
|
|
||||||
}},
|
}},
|
||||||
{"a;b;c", map[string]interface{}{"comma": ";"}, func(r [][]string) {
|
{"a;b;c", map[string]interface{}{"delimiter": ";"}, func(r [][]string) {
|
||||||
assert.Equal(r, [][]string{[]string{"a", "b", "c"}})
|
assert.Equal(r, [][]string{[]string{"a", "b", "c"}})
|
||||||
|
|
||||||
}},
|
}},
|
||||||
{testContentResource{key: "r1", content: `
|
{testContentResource{key: "r1", content: `
|
||||||
% This is a comment
|
% This is a comment
|
||||||
a;b;c`, mime: media.CSVType}, map[string]interface{}{"CommA": ";", "Comment": "%"}, func(r [][]string) {
|
a;b;c`, mime: media.CSVType}, map[string]interface{}{"DElimiter": ";", "Comment": "%"}, func(r [][]string) {
|
||||||
assert.Equal(r, [][]string{[]string{"a", "b", "c"}})
|
assert.Equal(r, [][]string{[]string{"a", "b", "c"}})
|
||||||
|
|
||||||
}},
|
}},
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue