You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
80 lines
2.4 KiB
HTML
80 lines
2.4 KiB
HTML
{{/*
|
|
|
|
Resolves the `$ref` JSON schema keyword, by recursively replacing
|
|
it with the object it points to, given:
|
|
|
|
* `schema`: the schema where the references should be resolved
|
|
* `path`: the path of the file containing the schema
|
|
|
|
This template uses [`Scratch`](https://gohugo.io/functions/scratch/)
|
|
rather than a normal `dict` because with `dict` you can't replace key values:
|
|
https://discourse.gohugo.io/t/how-can-i-add-set-and-delete-keys-in-a-dictionary/29661
|
|
|
|
*/}}
|
|
|
|
{{ $schema := .schema }}
|
|
{{ $path := .path}}
|
|
|
|
{{ $ret := $schema }}
|
|
|
|
{{ if reflect.IsMap $schema }}
|
|
|
|
{{ $scratch := newScratch }}
|
|
{{ $scratch.Set "result_map" dict }}
|
|
|
|
{{ $ref_value := index $schema "$ref"}}
|
|
{{ if $ref_value }}
|
|
{{ $uri := urls.Parse $path }}
|
|
{{ $ref_uri := urls.Parse $ref_value }}
|
|
{{ $full_uri := $uri.ResolveReference $ref_uri }}
|
|
|
|
{{ $full_path := strings.TrimPrefix "/" $full_uri.Path }}
|
|
{{/*
|
|
Apparently Hugo doesn't give us a nice way to split the extension off a filename.
|
|
*/}}
|
|
{{ $without_ext := replaceRE "\\.[^\\.]*$" "" $full_path }}
|
|
{{ $pieces := split $without_ext "/" }}
|
|
|
|
{{ $ref := index site.Data $pieces }}
|
|
|
|
{{/* If there is a fragment, follow the JSON Pointer */}}
|
|
{{ if $full_uri.Fragment }}
|
|
{{ $fragment := strings.TrimPrefix "/" $full_uri.Fragment }}
|
|
{{ $pieces := split $fragment "/" }}
|
|
{{ $ref = index $ref $pieces }}
|
|
{{ end }}
|
|
|
|
{{ $new_path := (path.Split $full_path).Dir}}
|
|
{{ $result_map := partial "json-schema/resolve-refs" (dict "schema" $ref "path" $new_path)}}
|
|
{{ if $result_map}}
|
|
{{ $scratch.Set "result_map" $result_map }}
|
|
{{ end }}
|
|
{{ end }}
|
|
|
|
|
|
{{ range $key, $value := $schema }}
|
|
{{ if ne $key "$ref" }}
|
|
{{ $resolved := partial "json-schema/resolve-refs" (dict "schema" $value "path" $path) }}
|
|
{{ $scratch.SetInMap "result_map" $key $resolved }}
|
|
{{ end }}
|
|
{{ end }}
|
|
|
|
{{ $ret = $scratch.Get "result_map" }}
|
|
|
|
{{ end }}
|
|
|
|
{{ if reflect.IsSlice $schema }}
|
|
|
|
{{ $result_slice := slice }}
|
|
|
|
{{ range $schema }}
|
|
{{ $resolved := partial "json-schema/resolve-refs" (dict "schema" . "path" $path) }}
|
|
{{ $result_slice = $result_slice | append $resolved }}
|
|
{{ end }}
|
|
|
|
{{ $ret = $result_slice }}
|
|
|
|
{{ end }}
|
|
|
|
{{ return $ret }}
|