chappe
Version:
Developer Docs builder. Write guides in Markdown and references in API Blueprint. Comes with a built-in search engine.
275 lines (204 loc) • 10.2 kB
text/jade
//- chappe
//-
//- Copyright 2021, Crisp IM SAS
//- Author: Valerian Saliou <valerian@valeriansaliou.name>
mixin references-blueprint-group(content, meta, baseline)
.parts
- var id = "";
if meta.title
- id = METHODS.slug(meta.title.content);
each entry in content
if entry.element === "resource"
+references-blueprint-group-title(entry.meta, meta, id)
each part in entry.content
if part.element === "transition"
+references-blueprint-part(part.content, part.meta, part.attributes, reference.examples, baseline)
mixin references-blueprint-group-title(meta, origin_meta, origin_id)
if meta.title
- var id = METHODS.slug(meta.title.content);
if origin_id
- id = (origin_id + "-" + id);
h1.group.font-sans-bold(
id="#{id}"
)
a.group-anchor.title-group-anchor(
href="\##{id}"
)
span.title-anchor
|
if origin_meta && origin_meta.title
span.group-origin.font-sans-regular
|
mixin references-blueprint-introduction(content)
.introduction.markdown
!= METHODS.marked(content)
mixin references-blueprint-part(content, meta, attrs, examples, baseline)
- var id = (meta.title ? METHODS.slug(meta.title.content) : "");
- var http_method = ((examples[id] || {}).method || "none");
.part(
class="part--method-#{http_method}"
)
.specification
if meta.title
h2.request-title.font-sans-bold(
id="#{id}"
)
a.request-title-anchor.title-anchor(
href="\##{id}"
)
|
+references-blueprint-part-specification(id, content, meta, attrs, baseline, http_method)
+references-blueprint-part-examples(id, examples, baseline)
mixin references-blueprint-part-specification(id, content, meta, attrs, baseline, http_method)
- var data_source = ((["head", "get"].includes(http_method) === true) ? "response" : "request");
.request-specification
.request-target
.request-target-method.font-sans-semibold
|
.request-target-url.copy.copy-button
span.request-target-path.copy-value.font-code-regular
|
span.request-target-copy
.request-format
//- Collapse deeper for data coming from response (due to nesting in 'data')
- var collapse_depth = ((data_source === "response") ? 1 : 0);
each entry in content
if entry.element === "copy"
.markdown
!= METHODS.marked(entry.content)
if attrs.hrefVariables && attrs.hrefVariables.content
.request-format-title.font-sans-bold
|
+references-blueprint-request-format-keys(id, http_method, 0, attrs.hrefVariables.content, collapse_depth, false)
if attrs.data && attrs.data.content && attrs.data.content.content
.request-format-title.font-sans-bold
|
+references-blueprint-request-format-keys(id, http_method, 0, attrs.data.content.content, collapse_depth, true)
mixin references-blueprint-part-examples(id, examples, baseline)
- var example = (examples[id] || null);
if example
.examples
.examples-wrap
ul.examples-details
li.examples-detail
span.examples-detail-label
span.badge.badge--white.font-sans-semibold
|
span.examples-detail-value
|
each part in example.url.parts
span(
class="examples-detail-#{part.type}"
)
| #{part.value}
if example.tiers.length > 0
li.examples-detail
span.examples-detail-label
span.badge.badge--white.font-sans-semibold
|
span.examples-detail-value
each tier in example.tiers
span.badge.badge--special-value
|
if example.scopes.length > 0
li.examples-detail
span.examples-detail-label
span.badge.badge--white.font-sans-semibold
|
span.examples-detail-value
each scope in example.scopes
span.badge.badge--special-value
|
if example.flows
- var flow_keys = Object.keys(example.flows);
if flow_keys.length > 0
- var first_flow = example.flows[flow_keys[0]];
- var request_options = flow_keys.map(function(key) { return [key, example.flows[key].request.name] });
- var response_options = first_flow.responses.map(function(response, index) { return [("" + index), response.name] });
+code("HTTP", example.flows, request_options, response_options)
mixin references-blueprint-request-format-keys(id, http_method, depth, content, collapse_depth, with_children)
//- Generate keys tree from API Blueprint 'data' object
.request-format-keys(
data-depth="#{depth}"
)
each data_level in content
if data_level.element === "member"
- var key = {};
//- Push main data
- key.key = data_level.content.key.content;
- key.type = data_level.content.value.element;
//- Parse label?
if data_level.meta && data_level.meta.description
- key.label = data_level.meta.description.content;
//- Begin array content type?
if data_level.content.value.element === "array" && data_level.content.value.content
- key.type += ("[" + ((data_level.content.value.content[0] || {}).element || ""));
//- Parse enumeration members?
- var enumeration_attributes = data_level.content.value.attributes;
if data_level.content.value.element === "array" && data_level.content.value.content
//- Flatten enumeration members from array (only for array[enum[*]])
- enumeration_attributes = (data_level.content.value.content[0] || {}).attributes;
if enumeration_attributes && enumeration_attributes.enumerations && enumeration_attributes.enumerations.content && enumeration_attributes.enumerations.content.length > 0
- key.type += ("[" + enumeration_attributes.enumerations.content[0].element + "]");
//- Append all enumeration member values to label (using Markdown)
- var members = "";
each enumeration in enumeration_attributes.enumerations.content
if enumeration.content
- members += ("* `" + enumeration.content + "`\n");
if members
- key.label = ((key.label || "") + "\n\n**" + $_.REFERENCES.BLUEPRINT.SPECIFICATION.REQUEST_FORMAT_MEMBERS + "**\n" + members.trim());
//- End array content type?
if data_level.content.value.element === "array" && data_level.content.value.content
- key.type += "]";
//- Parse required and optional attributes?
if data_level.attributes && data_level.attributes.typeAttributes && data_level.attributes.typeAttributes.content
each type_attribute in data_level.attributes.typeAttributes.content
if !key.attribute
- key.attribute = type_attribute.content;
//- Parse children? (if children parsing is enabled)
if with_children === true && data_level.content.value.content
//- Unwind array? (first item only for array[object])
if data_level.content.value.element === "array"
- key.children = (data_level.content.value.content[0] || {}).content;
else
- key.children = data_level.content.value.content;
.request-format-key
+references-blueprint-request-format-parts(key.key, key.type, key.label, key.attribute)
if key.children && key.children.length > 0
if with_children === true && depth >= collapse_depth
+references-blueprint-request-format-toggle(id, http_method, key.key, key.children.length, depth)
+references-blueprint-request-format-keys(id, http_method, (depth + 1), key.children, collapse_depth, with_children)
mixin references-blueprint-request-format-parts(key_name, type, label, attribute)
.request-format-parts
.request-format-head
.request-format-path.font-sans-semibold
|
.request-format-type
|
case attribute
when "required"
span.request-format-required.font-sans-semibold
|
when "optional"
span.request-format-optional
|
if label
.request-format-label.markdown
!= METHODS.marked(label)
mixin references-blueprint-request-format-toggle(id, http_method, key_name, children_count, depth)
- var toggle_parts = [http_method, id, ("z" + depth), key_name];
- var toggle_id = ("toggle_" + toggle_parts.join("-").toLowerCase());
input.request-format-toggle-checkbox(
type="checkbox",
id="#{toggle_id}",
name="#{toggle_id}"
)
label.request-format-toggle-button.button.button--small(
for="#{toggle_id}"
)
span.request-format-toggle-label.request-format-toggle-label--show
|
span.request-format-toggle-label.request-format-toggle-label--hide
|
span.request-format-toggle-count.font-sans-semibold
|