Jekyll-Potion

api

api 는 영역을 구분하여, API 에 대해 효과적으로 사용자에게 제공합니다.

기본적인 선언은 다음과 같습니다.

복사성공!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
{% api base_url="https://api.host.domain" path="/path" method="get" summary="some api" %}

{% api::description %}
{description_content}
{% endapi::description %}

{% api::parameter name="parameter #n" type="string" category="query" %}
{parameter_content}
{% endapi::parameter %}

{% api::response status="200" description="description" %}
{response_content}
{% endapi::response %}

{% endapi %}
항목 유형 필수여부 설명
base_url string   api 의 기본 URL 정보
path string Y api 의 path 정보
method string Y api 의 method 정보
summary string Y api 의 제목에 해당되는 요약 정보
api::description tag   api 에 대한 기본적인 설명을 기술합니다.
api tag 내 api::로 시작하는 tag 이외의 내용은 무시됩니다.
description_content markdown   api 에 대한 기본적인 설명을 markdown 으로 작성합니다.
api::parameter tag   api 에 필요한 parameter 를 기술로서 복수 개가 허용됩니다.
api tag 내다른 api::로 시작하는 tag 이외의 내용은 무시됩니다.
name string   parameter 의 이름
type string   parameter 의 타입
category enum   parameter 의 유형으로 query, body 중 하나를 선택
parameter_content markdown   parameter 에 대한 설명을 markdown 으로 작성합니다.
api::response tag   api 의 응답으로 복수 개가 허용됩니다.
api tag 내다른 api::로 시작하는 tag 이외의 내용은 무시됩니다.
status string   api 응답의 HTTP status
description string   api 응답의 설명
response_content markdown   api 응답에 대한 설명을 markdown 으로 작성합니다.

api tag 내 api:: 로 시작하는 tag 이외의 다른 내용이 있을 경우 해당 내용은 무시됩니다.

apiproto theme 의 기본 template, stylesheet 는 다음과 같습니다.

이 값은 새로운 theme 작성시 용도에 맞게 변경이 가능합니다.

  • template
  • stylesheet
api.liquid
복사성공!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
<div class="api">
    <div class="header">
        <div class="title">{{ summary }}</div>
    </div>
    <div class="description">
        <div class="description-area">
            <div class="api-description">
                <div class="method"><label class="bold">{{ method | upcase }}</label></div>
                <div class="url">
                    <label>{{ base_url }}</label>
                    <label class="gray">{{ path }}</label>
                </div>
            </div>
            {{ description }}
        </div>
    </div>
    <div class="content">
        <div class="request-categories">
            <div class="large">Parameters</div>
            <div class="content">
                {% if query_parameters %}
                    <div class="category">
                        <div class="title">Query</div>
                        <div class="parameters">
                            {{ query_parameters }}
                        </div>
                    </div>
                {% endif %}
                {% if body_parameters %}
                    <div class="category">
                        <div class="title">Body</div>
                        <div class="parameters">
                            {{ body_parameters }}
                        </div>
                    </div>
                {% endif %}
            </div>
        </div>
        <div class="responses">
            <div class="large">Responses</div>
            <div class="content">
                {{ responses }}
            </div>
        </div>
    </div>
</div>

template 작성 항목

변수명 필수여부 설명
summary Y API 의 제목
method Y API 의 HTTP method
base_url   API 의 기본 url
path Y API 의 path
description   API 에 대한 설명 영역으로 api==description.liquid 로 별도 템플릿으로 구성
query_parameters   API 요청시 사용되는 query parameter 로 api==parameter.liquid 로 별도 템플릿으로 구성
body_parameters   API 요청시 사용되는 body parameter 로 api==parameter.liquid 로 별도 템플릿으로 구성
responses   결과 영역으로 로 api==response.liquid 로 별도 템플릿으로 구성
api==description.liquid
복사성공!
1
2
3
<div class="content gray">
    {{ description }}
</div>

template 작성 항목

변수명 필수여부 설명
description Y API 설명으로 markdown 으로 구성
api==parameter.liquid
복사성공!
1
2
3
4
5
<div class="parameter">
    <div class="name">{{ name }}</div>
    <div class="type">{{ type }}</div>
    <div class="description">{{ description }}</div>
</div>

template 작성 항목

변수명 필수여부 설명
name Y parameter 명
type Y parameter 유형
description Y parameter 의 설명
api==response.liquid
복사성공!
1
2
3
4
5
6
7
8
<div class="response">
    <div class="header">
        <div class="status"><label>{{ status }}</label></div>
        <div class="description gray">{{ description }}</div>
    </div>
    <div class="content">{{ body }}</div>
</div>

template 작성 항목

변수명 필수여부 설명
status   응답에 대한 HTTP Status
description   응답에 대한 설명
body   응답 결과에 대한 기술로서 markdown 이 허용됩니다.
복사성공!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
div.api {
  @extend %box;
  @extend %grid-row;
  margin-block-start: 1em;

  & > div.header {
    & > div.title {
      @extend %title-fixed;
      border-radius: 0;
    }
  }

  & > div.description {
    @extend %gap-grid-row;
    @include border(border-inline);

    & > div.description-area {
      @extend %gap-grid-row;
      @extend %item-width;
      margin: 1em auto;

      & > div.api-description {
        display: flex;

        & > div.method {
          @extend %center-middle;
          width: 10%;

          & > label {
            @include label(white, royalblue, 0.5em);
            padding-inline: 1em;
          }
        }

        & > div.url {
          @extend %left-middle;
          @include border(border-left);
          display: flex;
          padding-inline-start: 1em;
        }
      }

      & > div.content {
        @include border(border-top);
      }
    }
  }

  & > div.content {
    @extend %gap-grid-row;
    @include border(border-inline);
    @include border(border-bottom);
    @extend %shadow;
    border-radius: 0;
    padding-block-end: 1em;

    & > div.request-categories {
      @extend %item-width;
      @extend %gap-grid-row;
      margin-inline: auto;

      & > div.content {
        @extend %gap-grid-row;

        & > div.category {
          @extend %grid-row;

          & > div.title {
            @extend %center-middle;
            @extend %title-s-fixed;
            width: 150px;
          }

          & > div.parameters {
            @extend %content-fixed;

            border-radius: 0 0.5em 0.5em 0.5em;

            & > div.parameter {
              @include border(border-bottom);
              display: flex;
              padding: 0.5em;
              margin-inline: 1em;

              &:last-child {
                border-bottom: none;
              }

              & > div.name {
                flex: auto;
                width: 15%;
              }

              & > div.type {
                flex: auto;
                width: 15%;
              }

              & > div.description {
                flex: auto;
                width: 70%;
              }
            }
          }
        }
      }
    }

    & > div.responses {
      @extend %item-width;
      @extend %gap-grid-row;
      margin-inline: auto;

      & > div.content {
        @extend %gap-grid-row;

        & > div.response {
          @extend %grid-row;

          & > div.header {
            @extend %title-fixed;
            border-block-end: none;
            background-color: white;
            display: flex;

            & > div.status {
              width: 10%;

              & > label {
                @include label(white, slategray, 0.5em);
                padding-inline: 1em;
              }
            }

            & > div.description {
              @include border(border-left);
              padding-inline-start: 1em;
            }
          }

          & > div.content {
            @extend %gap-grid-row;
            @extend %content-fixed;
            padding-block: 1em;
          }
        }
      }
    }
  }
}