Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Allow dict to create nested structures #6497

Closed
bep opened this issue Nov 11, 2019 · 12 comments · Fixed by #6500
Closed

Allow dict to create nested structures #6497

bep opened this issue Nov 11, 2019 · 12 comments · Fixed by #6500
Assignees
Labels
Milestone

Comments

@bep
Copy link
Member

@bep bep commented Nov 11, 2019

I'm working on documentation for the revised "markdown etc." and thought I would save some time by code generation. Which would be exellent had it not been for Hugo's limited map support.

What I would want is something ala:

{{ $configSection := index $.Site.Data.docs.config $sections }}
{{ $config := dict $sections $configSection }}

The $sections above is a string slice and would make sure that I could present the docs on the correct level in a "copy pastable" friendly version.

@bep bep added the Enhancement label Nov 11, 2019
@bep bep added this to the v0.60 milestone Nov 11, 2019
@bep bep self-assigned this Nov 11, 2019
@bep

This comment has been minimized.

Copy link
Member Author

@bep bep commented Nov 11, 2019

@regisphilibert

This comment has been minimized.

Copy link

@regisphilibert regisphilibert commented Nov 11, 2019

The $sections above is a string slice

Not sure to understand but it seems we're using parsed data as key. Could we also do:

{{ $config := dict "greeting.french" "bonjour" }}
@bep

This comment has been minimized.

Copy link
Member Author

@bep bep commented Nov 11, 2019

Your construct is very ambiguous. Assuming that "." is always used as a separator will not work.

I may have another idea, though. Will be back in a minute ...

@bep

This comment has been minimized.

Copy link
Member Author

@bep bep commented Nov 11, 2019

If we allow a map to be passed in as the (optional) first argument, we could do something ala:

{{ $config := dict "config" dict }}
{{ $config = $config | dict "markup" dict }}
@regisphilibert

This comment has been minimized.

Copy link

@regisphilibert regisphilibert commented Nov 11, 2019

Not sure to follow all those dicts... What would be the data structure of$config in the end? Also pipe argument order always confuses me, but wouldn't$config end up being the last argument of your piped dict on the second line, or am I unpiping it wrong?

{{ $config := dict "config" dict }}
{{ $config = dict "markup" dict $config }}
@bep

This comment has been minimized.

Copy link
Member Author

@bep bep commented Nov 11, 2019

My example was slightly wrong:

{{  $config := dict }}
{{ $root := dict "config" $config }}
{{ $config = $config | dict "markup" dict }}

Which I guess I with the current Hugo could write as:

{{  $config := dict "markup" dict }}
{{ $root := dict "config" $config }}

But that is not possible to do in a loop.

I guess it boils down to this line:

{{ $config = $config | dict "markup" "value" }}

Which, when thinking about it, could be rewritten as:

{{ $config = $config | merge (dict "markup" "value" )}}

OK, I'll try to implement the docs changes with the above and see if that works.

@bep

This comment has been minimized.

Copy link
Member Author

@bep bep commented Nov 11, 2019

OK; so I managed to get my code toggle shortcode change working with this construct:

DELETED

Not particularly simple ... I suspect that my initial suggestion (first comment) was the most sensible one, but I will let this one linger ....

@regisphilibert

This comment has been minimized.

Copy link

@regisphilibert regisphilibert commented Nov 11, 2019

I use merge a lot for building dynamic maps within loops, but I found it takes a toll on build time. Scratch.SetInMap is way faster.

As an aside: If you're interested in improving overall Hugo handling of data, I'd love to dig up this old thing: #5604

@bep

This comment has been minimized.

Copy link
Member Author

@bep bep commented Nov 11, 2019

If you're interested in improving overall Hugo handling of data

Interested maybe, time, no.

@bep bep modified the milestones: v0.60, v0.61 Nov 11, 2019
@bep

This comment has been minimized.

Copy link
Member Author

@bep bep commented Nov 11, 2019

So, I deleted my "suggested approach" above -- I just couldn't get it right. I'm a little bit tired, but it shows that it's much harder than it should.

I have a patch ready that allows string slices as keys in dict, which makes the above construct much simpler:

{{ $sections := (split . ".") }}
{{ $configSection := index $.Site.Data.docs.config $sections }}
{{ $code = dict $sections $configSection  }}
@regisphilibert

This comment has been minimized.

Copy link

@regisphilibert regisphilibert commented Nov 11, 2019

I'm guessing here because not sure what the value of . or $.Site.Data.docs.config is, but first arg is a slice of strings representing keys and second is a slice of whatever representing values.

Pending they both have an equal numbers of item, key/value pairs are created by "paralelling" the two slices?

bep added a commit to bep/hugo that referenced this issue Nov 11, 2019
@regisphilibert

This comment has been minimized.

Copy link

@regisphilibert regisphilibert commented Nov 11, 2019

Scratch the above, I understood by reading #6500

bep added a commit to bep/hugo that referenced this issue Nov 11, 2019
@bep bep closed this in #6500 Nov 11, 2019
bep added a commit that referenced this issue Nov 11, 2019
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
2 participants
You can’t perform that action at this time.