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

Update HTML templates to link to object definitions #1724

Merged
merged 9 commits into from Feb 28, 2024
46 changes: 15 additions & 31 deletions layouts/partials/json-schema/resolve-additional-types.html
@@ -1,5 +1,4 @@
{{/*

/*
Finds and returns all objects, including nested ones, given a dict containing:
* `schema`: a JSON schema object
* `anchor_base`: a prefix to add to the HTML anchors generated for each object. If nil, no anchors are generated.
Expand All @@ -19,28 +18,23 @@
* anchor: a string suitable for using as an html anchor for this object (if `anchor_base` was set, and the object has a title)

Note that the returned array contains only unique objects.

*/}}
*/

{{ $this_object := .schema }}
{{ $anchor_base := .anchor_base }}
{{ $all_objects := slice }}
{{ $name := .name | default $this_object.title | default "<untitled object>" }}

{{ if eq $this_object.type "object" }}
{{/* give this object an anchor, if it has a name */}}
/* Give this object an anchor, if it has a name */
{{ if (and $anchor_base $this_object.title) }}
{{ $this_object = merge $this_object (dict "anchor" (printf "%s_%s" $anchor_base (anchorize $this_object.title))) }}
{{ end }}

{{/*
Add the object we were passed into the $all_objects array
*/}}
/* Add the object we were passed into the $all_objects array */
{{ $all_objects = $all_objects | append $this_object }}

{{/*
Add any nested objects referenced in this object's `additionalProperties`
*/}}
/* Add any nested objects referenced in this object's `additionalProperties` */
{{ if $this_object.additionalProperties }}
{{ if reflect.IsMap $this_object.additionalProperties }}
{{ $all_objects = partial "get-additional-objects" (dict
Expand All @@ -52,9 +46,7 @@
{{ end }}
{{ end }}

{{/*
Add any nested objects referenced in this object's `patternProperties`
*/}}
/* Add any nested objects referenced in this object's `patternProperties` */
{{ if $this_object.patternProperties }}
{{ range $pattern, $object := $this_object.patternProperties}}
{{ $all_objects = partial "get-additional-objects" (dict
Expand All @@ -66,9 +58,7 @@
{{ end }}
{{ end }}

{{/*
Add any nested objects referenced in this object's `properties`
*/}}
/* Add any nested objects referenced in this object's `properties` */
{{ range $key, $property := $this_object.properties}}
{{ $all_objects = partial "get-additional-objects" (dict
"this_object" $property
Expand All @@ -77,13 +67,10 @@
"name" (printf "%s.%s" $name $key)
) }}
{{ end }}

{{ end }}

{{ if eq $this_object.type "array" }}
{{/*
Add any nested objects referenced in this object's `items`
*/}}
/* Add any nested objects referenced in this object's `items` */
{{ if $this_object.items.anyOf }}
{{ range $idx, $item := $this_object.items.anyOf }}
{{ $all_objects = partial "get-additional-objects" (dict
Expand All @@ -105,10 +92,10 @@
{{ end }}
{{ end }}

{{/*
/*
Handle object schemas using the `oneOf` keyword
(https://json-schema.org/understanding-json-schema/reference/combining.html#oneof)
*/}}
*/
{{ if $this_object.oneOf }}
{{ range $idx, $item := $this_object.oneOf }}
{{ $all_objects = partial "get-additional-objects" (dict
Expand All @@ -123,11 +110,11 @@
{{ return uniq $all_objects }}


{{/*
/*
This actually makes the recursive call and adds the returned objects to the array
*/}}
*/
{{ define "partials/get-additional-objects" }}
{{/* .name is the name of the object for logging purposes */}}
/* .name is the name of the object for logging purposes */
{{ $name := .name }}

{{ $all_objects := .all_objects }}
Expand All @@ -142,20 +129,17 @@
{{ $this_object := partial "json-schema/resolve-allof" .this_object }}

{{ $more_objects := partial "json-schema/resolve-additional-types" (dict "schema" $this_object "anchor_base" .anchor_base "name" $name) }}
{{/*
As far as I know we don't have something like Array.concat(), so add them one at a time
*/}}
Comment on lines -145 to -147
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I removed this comment, since I found it misleading. We do have something like Array.concat -- it's called append, which does concatenate arrays if you pass an array as its parameter. However, it's not very useful here, because we want to call clean-object on each item before adding it to $all_objects.

{{ range $more_objects}}
{{ $all_objects = $all_objects | append (partial "clean-object" .) }}
{{ end }}
{{ return $all_objects }}
{{ end }}

{{/*
/*
Only copy the bits of the object that we actually care about.
This is needed for uniqify to work - otherwise objects that are the same
but with (for example) different examples will be considered different.
*/}}
*/
{{ define "partials/clean-object" }}
{{ return (dict "title" .title "properties" .properties "required" .required "enum" .enum "anchor" .anchor) }}
{{ end }}