Move "rest" library under "draft/..." since it is more an experiment rather than a real REST library
This commit is contained in:
@@ -0,0 +1,184 @@
|
||||
note
|
||||
description: "Summary description for {HTML_PAGE}."
|
||||
date: "$Date$"
|
||||
revision: "$Revision$"
|
||||
|
||||
class
|
||||
HTML_PAGE
|
||||
|
||||
inherit
|
||||
HTML_UTILITIES
|
||||
|
||||
create
|
||||
make
|
||||
|
||||
feature {NONE} -- Initialization
|
||||
|
||||
make (a_title: like title)
|
||||
do
|
||||
create {ARRAYED_LIST [like html_attributes.item]} html_attributes.make (0)
|
||||
create head.make (a_title)
|
||||
create {ARRAYED_LIST [like body_attributes.item]} body_attributes.make (0)
|
||||
create body.make_empty
|
||||
initialize
|
||||
end
|
||||
|
||||
initialize
|
||||
-- Initialize
|
||||
do
|
||||
create headers.make
|
||||
end
|
||||
|
||||
feature -- Access
|
||||
|
||||
headers: WSF_HEADER
|
||||
|
||||
feature -- Recycle
|
||||
|
||||
recycle
|
||||
do
|
||||
html_attributes.wipe_out
|
||||
headers.recycle
|
||||
head.recycle
|
||||
body_attributes.wipe_out
|
||||
body.wipe_out
|
||||
internal_header_string := Void
|
||||
internal_message_string := Void
|
||||
end
|
||||
|
||||
feature -- Access
|
||||
|
||||
html_attributes: LIST [TUPLE [name: STRING; value: STRING]]
|
||||
|
||||
head: HTML_PAGE_HEAD
|
||||
|
||||
body_attributes: LIST [TUPLE [name: STRING; value: STRING]]
|
||||
|
||||
body: STRING
|
||||
|
||||
feature -- Query
|
||||
|
||||
title: detachable STRING
|
||||
do
|
||||
Result := head.title
|
||||
end
|
||||
|
||||
add_html_ttribute (a: like html_attributes.item)
|
||||
do
|
||||
html_attributes.force (a)
|
||||
end
|
||||
|
||||
add_body_attribute (a: like body_attributes.item)
|
||||
do
|
||||
body_attributes.force (a)
|
||||
end
|
||||
|
||||
set_body (s: like body)
|
||||
-- Set `body' to `s'
|
||||
do
|
||||
body := s
|
||||
end
|
||||
|
||||
feature -- Element change
|
||||
|
||||
set_title (t: like title)
|
||||
do
|
||||
head.title := t
|
||||
end
|
||||
|
||||
feature -- Output
|
||||
|
||||
compute
|
||||
-- Compute the string output
|
||||
local
|
||||
s, t: STRING
|
||||
do
|
||||
--| HTML beginning
|
||||
create s.make (128)
|
||||
s.append_string ("<html")
|
||||
s.append_string (attributes_to_string (html_attributes))
|
||||
s.append_string (">%N")
|
||||
|
||||
--| Head
|
||||
head.compute --| Be sure to have a fresh string
|
||||
t := head.string
|
||||
if not t.is_empty then
|
||||
s.append_string (t)
|
||||
s.append_character ('%N')
|
||||
end
|
||||
|
||||
--| Body
|
||||
s.append_string ("<body")
|
||||
s.append_string (attributes_to_string (body_attributes))
|
||||
s.append_string (">%N")
|
||||
s.append_string (body)
|
||||
s.append_string ("</body>")
|
||||
|
||||
--| End
|
||||
s.append_string ("</html>")
|
||||
|
||||
--| Http headers
|
||||
headers.put_content_length (s.count)
|
||||
internal_header_string := headers.string
|
||||
internal_message_string := s
|
||||
end
|
||||
|
||||
header_string: STRING
|
||||
local
|
||||
o: like internal_header_string
|
||||
do
|
||||
o := internal_header_string
|
||||
if o = Void then
|
||||
compute
|
||||
o := internal_header_string
|
||||
if o = Void then
|
||||
check output_computed: False end
|
||||
create o.make_empty
|
||||
end
|
||||
end
|
||||
Result := o
|
||||
end
|
||||
|
||||
message_string: STRING
|
||||
local
|
||||
o: like internal_message_string
|
||||
do
|
||||
o := internal_message_string
|
||||
if o = Void then
|
||||
compute
|
||||
o := internal_message_string
|
||||
if o = Void then
|
||||
check output_computed: False end
|
||||
create o.make_empty
|
||||
end
|
||||
end
|
||||
Result := o
|
||||
end
|
||||
|
||||
send (buf: WSF_RESPONSE)
|
||||
do
|
||||
buf.set_status_code (200)
|
||||
buf.write_headers_string (header_string)
|
||||
buf.write_string (message_string)
|
||||
end
|
||||
|
||||
feature {NONE} -- Implementation: output
|
||||
|
||||
internal_header_string: detachable like header_string
|
||||
|
||||
internal_message_string: detachable like message_string
|
||||
|
||||
invariant
|
||||
header_attached: headers /= Void
|
||||
|
||||
;note
|
||||
copyright: "Copyright (c) 1984-2011, Eiffel Software and others"
|
||||
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
|
||||
source: "[
|
||||
Eiffel Software
|
||||
5949 Hollister Ave., Goleta, CA 93117 USA
|
||||
Telephone 805-685-1006, Fax 805-685-6869
|
||||
Website http://www.eiffel.com
|
||||
Customer support http://support.eiffel.com
|
||||
]"
|
||||
end
|
||||
@@ -0,0 +1,111 @@
|
||||
note
|
||||
description: "Summary description for {HTML_PAGE_HEAD}."
|
||||
author: ""
|
||||
date: "$Date$"
|
||||
revision: "$Revision$"
|
||||
|
||||
class
|
||||
HTML_PAGE_HEAD
|
||||
|
||||
inherit
|
||||
HTML_UTILITIES
|
||||
|
||||
create
|
||||
make
|
||||
|
||||
feature {NONE} -- Initialization
|
||||
|
||||
make (a_title: like title)
|
||||
do
|
||||
initialize
|
||||
title := a_title
|
||||
end
|
||||
|
||||
initialize
|
||||
do
|
||||
create text.make_empty
|
||||
create {ARRAYED_LIST [like attributes.item]} attributes.make (0)
|
||||
end
|
||||
|
||||
feature -- Recycle
|
||||
|
||||
recycle
|
||||
do
|
||||
attributes.wipe_out
|
||||
title := Void
|
||||
text.wipe_out
|
||||
internal_string := Void
|
||||
end
|
||||
|
||||
feature -- Access
|
||||
|
||||
attributes: LIST [TUPLE [name: STRING; value: STRING]]
|
||||
|
||||
title: detachable STRING assign set_title
|
||||
|
||||
text: STRING
|
||||
|
||||
feature -- Element change
|
||||
|
||||
set_title (t: like title)
|
||||
do
|
||||
title := t
|
||||
end
|
||||
|
||||
feature -- Output
|
||||
|
||||
compute
|
||||
-- Compute the string output
|
||||
local
|
||||
s: STRING
|
||||
do
|
||||
create s.make_empty
|
||||
if attached title as t then
|
||||
s.append_string ("<title>" + t + "</title>%N")
|
||||
end
|
||||
if text.count > 0 then
|
||||
s.append_string (text)
|
||||
s.append_character ('%N')
|
||||
end
|
||||
if s.count > 0 then
|
||||
internal_string := "<head" + attributes_to_string (attributes) + ">%N" + s + "</head>"
|
||||
else
|
||||
internal_string := s
|
||||
end
|
||||
end
|
||||
|
||||
string: STRING
|
||||
--
|
||||
local
|
||||
o: like internal_string
|
||||
do
|
||||
o := internal_string
|
||||
if o = Void then
|
||||
compute
|
||||
o := internal_string
|
||||
if o = Void then
|
||||
check output_computed: False end
|
||||
create o.make_empty
|
||||
end
|
||||
end
|
||||
Result := o
|
||||
end
|
||||
|
||||
feature {NONE} -- Implementation: output
|
||||
|
||||
internal_string: detachable like string
|
||||
|
||||
invariant
|
||||
text_attached: text /= Void
|
||||
|
||||
note
|
||||
copyright: "Copyright (c) 1984-2011, Eiffel Software and others"
|
||||
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
|
||||
source: "[
|
||||
Eiffel Software
|
||||
5949 Hollister Ave., Goleta, CA 93117 USA
|
||||
Telephone 805-685-1006, Fax 805-685-6869
|
||||
Website http://www.eiffel.com
|
||||
Customer support http://support.eiffel.com
|
||||
]"
|
||||
end
|
||||
@@ -0,0 +1,90 @@
|
||||
note
|
||||
description: "Summary description for {HTML_UTILITIES}."
|
||||
date: "$Date$"
|
||||
revision: "$Revision$"
|
||||
|
||||
class
|
||||
HTML_UTILITIES
|
||||
|
||||
feature -- Encoding
|
||||
|
||||
html_special_chars_encoded_string (s: STRING): STRING
|
||||
local
|
||||
c: CHARACTER
|
||||
i,n: INTEGER
|
||||
do
|
||||
from
|
||||
i := 1
|
||||
n := s.count
|
||||
create Result.make (n + 10)
|
||||
until
|
||||
i > n
|
||||
loop
|
||||
c := s[i]
|
||||
inspect c
|
||||
when '&' then
|
||||
Result.append_string ("&")
|
||||
when '%"' then
|
||||
Result.append_string (""")
|
||||
when '%'' then
|
||||
Result.append_string ("'")
|
||||
when '<' then
|
||||
Result.append_string ("<")
|
||||
when '>' then
|
||||
Result.append_string (">")
|
||||
else
|
||||
Result.extend (c)
|
||||
end
|
||||
i := i + 1
|
||||
end
|
||||
end
|
||||
|
||||
feature -- Helpers
|
||||
|
||||
strings_to_string (lst: LIST [STRING]; sep: STRING): STRING
|
||||
do
|
||||
create Result.make_empty
|
||||
if lst.count > 0 then
|
||||
from
|
||||
lst.start
|
||||
until
|
||||
lst.after
|
||||
loop
|
||||
Result.append_string (lst.item)
|
||||
Result.append_string (sep)
|
||||
lst.forth
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
attributes_to_string (atts: LIST [TUPLE [name: STRING; value: STRING]]): STRING
|
||||
do
|
||||
create Result.make_empty
|
||||
if atts.count > 0 then
|
||||
from
|
||||
atts.start
|
||||
until
|
||||
atts.after
|
||||
loop
|
||||
Result.append_character (' ')
|
||||
Result.append_string (atts.item.name)
|
||||
Result.append_character ('=')
|
||||
Result.append_character ('%"')
|
||||
Result.append_string (html_special_chars_encoded_string (atts.item.value))
|
||||
Result.append_character ('%"')
|
||||
atts.forth
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
note
|
||||
copyright: "Copyright (c) 1984-2011, Eiffel Software and others"
|
||||
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
|
||||
source: "[
|
||||
Eiffel Software
|
||||
5949 Hollister Ave., Goleta, CA 93117 USA
|
||||
Telephone 805-685-1006, Fax 805-685-6869
|
||||
Website http://www.eiffel.com
|
||||
Customer support http://support.eiffel.com
|
||||
]"
|
||||
end
|
||||
@@ -0,0 +1,321 @@
|
||||
note
|
||||
description: "Summary description for {REST_API_DOCUMENTATION}."
|
||||
author: ""
|
||||
date: "$Date$"
|
||||
revision: "$Revision$"
|
||||
|
||||
class
|
||||
REST_API_DOCUMENTATION [C -> REST_REQUEST_HANDLER_CONTEXT]
|
||||
|
||||
inherit
|
||||
REST_REQUEST_HANDLER [C]
|
||||
|
||||
create
|
||||
make
|
||||
|
||||
feature {NONE} -- Initialization
|
||||
|
||||
make (a_router: like router; a_base_doc_url: like base_doc_url)
|
||||
do
|
||||
router := a_router
|
||||
base_doc_url := a_base_doc_url
|
||||
description := "Technical documention for the API"
|
||||
end
|
||||
|
||||
feature {NONE} -- Access: Implementation
|
||||
|
||||
router: REST_REQUEST_ROUTER [REST_REQUEST_HANDLER [C], C]
|
||||
|
||||
base_doc_url: READABLE_STRING_8
|
||||
|
||||
feature -- Access
|
||||
|
||||
authentication_required (req: WSF_REQUEST): BOOLEAN
|
||||
do
|
||||
end
|
||||
|
||||
feature -- Execution
|
||||
|
||||
execute_application (ctx: C; req: WSF_REQUEST; res: WSF_RESPONSE)
|
||||
local
|
||||
rep: like new_html_page
|
||||
s: STRING
|
||||
rq: detachable REST_REQUEST_HANDLER [C]
|
||||
rq_resource: detachable READABLE_STRING_GENERAL
|
||||
-- l_dft_format_name: detachable STRING
|
||||
hdl_cursor: like router.new_cursor
|
||||
do
|
||||
rep := new_html_page
|
||||
rep.headers.put_content_type_text_html
|
||||
create s.make_empty
|
||||
|
||||
if
|
||||
attached {WSF_STRING} ctx.path_parameter ("resource") as l_resource_value and then
|
||||
attached l_resource_value.string as l_resource
|
||||
then
|
||||
from
|
||||
hdl_cursor := router.new_cursor
|
||||
until
|
||||
hdl_cursor.after or rq /= Void
|
||||
loop
|
||||
if hdl_cursor.item.resource.same_string_general (l_resource) then
|
||||
rq := hdl_cursor.item.handler
|
||||
rq_resource := l_resource
|
||||
end
|
||||
hdl_cursor.forth
|
||||
end
|
||||
end
|
||||
-- if a_args /= Void and then not a_args.is_empty then
|
||||
-- rq := router.handler_by_path (a_args)
|
||||
-- if rq = Void then
|
||||
-- rq := handler_manager.smart_handler_by_path (a_args)
|
||||
---- if attached {REST_REQUEST_GROUP_HANDLER} rq as grp then
|
||||
---- rq := grp.handlers.handler_by_path (a_args)
|
||||
---- end
|
||||
-- end
|
||||
-- if
|
||||
-- rq /= Void and then
|
||||
-- attached rq.path_information (a_args) as l_info
|
||||
-- then
|
||||
-- l_dft_format_name := l_info.format
|
||||
-- end
|
||||
-- end
|
||||
|
||||
|
||||
if rq /= Void and then rq_resource /= Void then
|
||||
rep.set_big_title ("API: Technical documentation for ["+ rq_resource.as_string_8 +"]")
|
||||
|
||||
s.append_string ("<div class=%"api%">")
|
||||
s.append_string ("<h2 class=%"api-name%" >")
|
||||
|
||||
s.append_string ("<a href=%"" + base_doc_url + "%">.. Show all features ..</a>")
|
||||
s.append_string ("</h2></div>%N")
|
||||
|
||||
process_request_handler_doc (rq, rq_resource.as_string_8, s, ctx, req, res, Void)
|
||||
else
|
||||
rep.set_big_title ("API: Technical documentation")
|
||||
|
||||
from
|
||||
hdl_cursor := router.new_cursor
|
||||
until
|
||||
hdl_cursor.after
|
||||
loop
|
||||
if attached hdl_cursor.item as l_item then
|
||||
rq := l_item.handler
|
||||
rep.add_shortcut (l_item.resource)
|
||||
s.append ("<a name=%"" + rep.last_added_shortcut + "%"/>")
|
||||
process_request_handler_doc (rq, l_item.resource, s, ctx, req, res, Void)
|
||||
hdl_cursor.forth
|
||||
end
|
||||
end
|
||||
end
|
||||
rep.set_body (s)
|
||||
rep.send (res)
|
||||
rep.recycle
|
||||
end
|
||||
|
||||
process_request_handler_doc (rq: REST_REQUEST_HANDLER [C]; a_resource: STRING; buf: STRING; ctx: C; req: WSF_REQUEST; res: WSF_RESPONSE; a_dft_format: detachable STRING)
|
||||
local
|
||||
l_dft_format_name: detachable STRING
|
||||
s: STRING
|
||||
l_uri_tpl: URI_TEMPLATE
|
||||
do
|
||||
s := buf
|
||||
|
||||
if a_dft_format /= Void then
|
||||
if rq.supported_format_names.has (a_dft_format) then
|
||||
l_dft_format_name := a_dft_format
|
||||
end
|
||||
end
|
||||
|
||||
s.append_string ("<div class=%"api%">")
|
||||
s.append_string ("<h2 class=%"api-name%" ><a href=%""+ url (req, base_doc_url, a_resource, False) +"%">"+ a_resource +"</a></h2>")
|
||||
s.append_string ("<div class=%"inner%">")
|
||||
-- if rq.hidden (req) then
|
||||
-- s.append_string ("<div class=%"api-description%">This feature is hidden</div>%N")
|
||||
-- else
|
||||
if attached rq.description as desc then
|
||||
s.append_string ("<div class=%"api-description%">" + desc + "</div>")
|
||||
end
|
||||
-- if attached {REST_REQUEST_GROUP_HANDLER} rq as grp then
|
||||
-- s.append_string ("<div class=%"api-format%">Handler: <strong>")
|
||||
-- if attached grp.handlers.new_cursor as l_handlers_cursor then
|
||||
-- from
|
||||
|
||||
-- until
|
||||
-- l_handlers_cursor.after
|
||||
-- loop
|
||||
-- s.append_string (" ")
|
||||
-- s.append_string ("<a class=%"api-handler%" href=%"")
|
||||
-- s.append_string (url (ctx, l_handlers_cursor.item.path, False))
|
||||
-- s.append_string ("%">"+ l_handlers_cursor.item.path +"</a>")
|
||||
-- l_handlers_cursor.forth
|
||||
-- end
|
||||
-- end
|
||||
-- s.append_string ("</strong></div>")
|
||||
-- end
|
||||
if attached rq.supported_format_names as l_formats and then not l_formats.is_empty then
|
||||
s.append_string ("<div class=%"api-format%">Supported formats: <strong>")
|
||||
if attached l_formats.new_cursor as l_formats_cursor then
|
||||
from
|
||||
|
||||
until
|
||||
l_formats_cursor.after
|
||||
loop
|
||||
s.append_string (" ")
|
||||
s.append_string ("<a class=%"api-name api-format")
|
||||
if l_formats_cursor.item ~ l_dft_format_name then
|
||||
s.append_string (" selected")
|
||||
end
|
||||
s.append_string ("%" href=%"" + url (req, base_doc_url, a_resource, False) + "." + l_formats_cursor.item + "%">"+ l_formats_cursor.item +"</a>")
|
||||
l_formats_cursor.forth
|
||||
end
|
||||
end
|
||||
s.append_string ("</strong></div>")
|
||||
end
|
||||
if attached rq.supported_request_method_names as l_methods and then not l_methods.is_empty then
|
||||
s.append_string ("<div class=%"api-method%">Supported request methods: <strong>")
|
||||
if attached l_methods.new_cursor as l_methods_cursor then
|
||||
from
|
||||
|
||||
until
|
||||
l_methods_cursor.after
|
||||
loop
|
||||
s.append_string (" ")
|
||||
s.append_string (l_methods_cursor.item)
|
||||
l_methods_cursor.forth
|
||||
end
|
||||
end
|
||||
s.append_string ("</strong></div>")
|
||||
end
|
||||
s.append_string ("<div class=%"api-auth%">Authentication required: <strong>" + rq.authentication_required (req).out + "</strong></div>")
|
||||
if attached {REST_REQUEST_URI_TEMPLATE_ROUTER_I [REST_REQUEST_HANDLER [REST_REQUEST_URI_TEMPLATE_HANDLER_CONTEXT], REST_REQUEST_URI_TEMPLATE_HANDLER_CONTEXT]} router as l_uri_template_router then
|
||||
create l_uri_tpl.make (a_resource)
|
||||
if attached l_uri_tpl.query_variable_names as l_query_variable_names and then not l_query_variable_names.is_empty then
|
||||
s.append_string ("<div class=%"api-uri-template%">Query parameters: ")
|
||||
-- s.append_string (rq.path)
|
||||
from
|
||||
l_query_variable_names.start
|
||||
until
|
||||
l_query_variable_names.after
|
||||
loop
|
||||
if l_query_variable_names.isfirst then
|
||||
s.append_string ("?")
|
||||
else
|
||||
s.append_string ("&")
|
||||
end
|
||||
if attached l_query_variable_names.item as l_query_param then
|
||||
s.append_string ("<strong>" + l_query_param + "</strong>")
|
||||
s.append_string ("=<em>" + l_query_param + "</em>")
|
||||
end
|
||||
l_query_variable_names.forth
|
||||
end
|
||||
s.append_string ("</div>%N")
|
||||
end
|
||||
if attached l_uri_tpl.path_variable_names as l_path_variable_names and then not l_path_variable_names.is_empty then
|
||||
s.append_string ("<div class=%"api-uri-template%">Path Segment parameters: ")
|
||||
-- s.append_string (rq.path)
|
||||
from
|
||||
l_path_variable_names.start
|
||||
until
|
||||
l_path_variable_names.after
|
||||
loop
|
||||
if attached l_path_variable_names.item as l_seg_param then
|
||||
s.append_string ("<em>{" + l_seg_param + "}</em>")
|
||||
end
|
||||
l_path_variable_names.forth
|
||||
end
|
||||
s.append_string ("</div>%N")
|
||||
end
|
||||
|
||||
end
|
||||
-- if attached rq._parameters as l_uri_params and then not l_uri_params.is_empty then
|
||||
-- s.append_string ("<div class=%"api-uri-template%">URI Template: ")
|
||||
-- s.append_string (rq.path)
|
||||
-- if attached l_uri_params.new_cursor as l_uri_params_cursor then
|
||||
-- from
|
||||
|
||||
-- until
|
||||
-- l_uri_params_cursor.after
|
||||
-- loop
|
||||
-- if attached l_uri_params_cursor.item as l_uri_param then
|
||||
-- s.append_string ("/<strong>" + l_uri_param.name + "</strong>")
|
||||
-- s.append_string ("/<em>{" + l_uri_param.name + "}</em>")
|
||||
-- end
|
||||
-- l_uri_params_cursor.forth
|
||||
-- end
|
||||
-- end
|
||||
-- s.append_string ("</div>%N")
|
||||
-- end
|
||||
-- if attached rq.parameters as l_params and then not l_params.is_empty then
|
||||
-- s.append_string ("<div class=%"api-params%">Parameters: ")
|
||||
|
||||
-- --| show form only if we have a default format
|
||||
-- if l_dft_format_name = Void then
|
||||
-- s.append_string ("<span class=%"note%">to test the parameter(s), please first select a supported format.</span>%N")
|
||||
-- else
|
||||
-- if rq.method_post_supported then
|
||||
-- s.append_string ("<form id=%""+ rq.path +"%" method=%"POST%" action=%"" + ctx.script_url (rq.path) + "." + l_dft_format_name + "%">%N")
|
||||
-- else
|
||||
-- s.append_string ("<form id=%""+ rq.path +"%" method=%"GET%" action=%"" + ctx.script_url (rq.path) + "." + l_dft_format_name + "%">%N")
|
||||
-- end
|
||||
-- end
|
||||
-- s.append_string ("<ul>")
|
||||
-- if attached l_params.new_cursor as l_params_cursor then
|
||||
-- from
|
||||
|
||||
-- until
|
||||
-- l_params_cursor.after
|
||||
-- loop
|
||||
-- if attached l_params_cursor.item as l_param then
|
||||
-- s.append_string ("<li><strong>" + l_param.name + "</strong>")
|
||||
-- if l_param.optional then
|
||||
-- s.append_string (" <em>(Optional)</em>")
|
||||
-- end
|
||||
-- if attached l_param.description as l_param_desc then
|
||||
-- s.append_string (": <em>" + l_param_desc + "</em>")
|
||||
-- end
|
||||
-- if l_dft_format_name /= Void then
|
||||
-- s.append (" <input name=%"" + l_param.name + "%" type=%"text%" />")
|
||||
-- end
|
||||
-- s.append_string ("</li>")
|
||||
-- end
|
||||
-- l_params_cursor.forth
|
||||
-- end
|
||||
-- end
|
||||
|
||||
-- if l_dft_format_name /= Void then
|
||||
-- s.append_string ("<input type=%"submit%" value=%"Test "+ rq.path + "." + l_dft_format_name + "%"/>")
|
||||
-- s.append_string ("</form>")
|
||||
-- end
|
||||
-- s.append_string ("</ul></div>")
|
||||
-- else
|
||||
-- if l_dft_format_name /= Void then
|
||||
-- s.append_string ("<a class=%"api-name%" href=%"" + ctx.script_url (a_resource + "." + l_dft_format_name) + "%">Test "+ a_resource + "." + l_dft_format_name + "</a>")
|
||||
-- else
|
||||
-- s.append_string ("<a class=%"api-name%" href=%"" + ctx.script_url (a_resource) + "%">Test "+ a_resource +"</a>")
|
||||
-- end
|
||||
-- end
|
||||
s.append_string ("</div>%N")
|
||||
-- end
|
||||
s.append_string ("</div>%N") -- inner
|
||||
end
|
||||
|
||||
feature -- Access
|
||||
|
||||
new_html_page: REST_API_DOCUMENTATION_HTML_PAGE
|
||||
do
|
||||
create Result.make ("API Documentation")
|
||||
end
|
||||
|
||||
note
|
||||
copyright: "Copyright (c) 1984-2011, Eiffel Software and others"
|
||||
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
|
||||
source: "[
|
||||
Eiffel Software
|
||||
5949 Hollister Ave., Goleta, CA 93117 USA
|
||||
Telephone 805-685-1006, Fax 805-685-6869
|
||||
Website http://www.eiffel.com
|
||||
Customer support http://support.eiffel.com
|
||||
]"
|
||||
end
|
||||
@@ -0,0 +1,124 @@
|
||||
note
|
||||
description: "Summary description for {REST_API_DOCUMENTATION_HTML_PAGE}."
|
||||
author: ""
|
||||
date: "$Date$"
|
||||
revision: "$Revision$"
|
||||
|
||||
class
|
||||
REST_API_DOCUMENTATION_HTML_PAGE
|
||||
|
||||
inherit
|
||||
HTML_PAGE
|
||||
redefine
|
||||
head,
|
||||
initialize,
|
||||
recycle,
|
||||
compute
|
||||
end
|
||||
|
||||
create
|
||||
make
|
||||
|
||||
feature {NONE} -- Initialization
|
||||
|
||||
initialize
|
||||
do
|
||||
Precursor
|
||||
create {LINKED_LIST [like shortcuts.item]} shortcuts.make
|
||||
end
|
||||
|
||||
feature -- Recyle
|
||||
|
||||
recycle
|
||||
do
|
||||
Precursor
|
||||
shortcuts.wipe_out
|
||||
end
|
||||
|
||||
feature -- Access
|
||||
|
||||
head: REST_API_DOCUMENTATION_HTML_PAGE_HEAD
|
||||
|
||||
big_title: detachable STRING
|
||||
|
||||
shortcuts: LIST [TUPLE [name: STRING; anchor: STRING]]
|
||||
|
||||
add_shortcut (s: STRING)
|
||||
local
|
||||
t: STRING
|
||||
do
|
||||
t := s.string
|
||||
t.replace_substring_all ("/", "-")
|
||||
shortcuts.force ([s,t])
|
||||
end
|
||||
|
||||
last_added_shortcut: STRING
|
||||
do
|
||||
if shortcuts.count > 0 and then attached shortcuts.last as sht then
|
||||
Result := sht.anchor
|
||||
else
|
||||
create Result.make_empty
|
||||
end
|
||||
end
|
||||
|
||||
shortcuts_to_html: detachable STRING
|
||||
do
|
||||
if not shortcuts.is_empty then
|
||||
from
|
||||
create Result.make_from_string ("<strong>Shortcuts:</strong> | ")
|
||||
shortcuts.start
|
||||
until
|
||||
shortcuts.after
|
||||
loop
|
||||
Result.append_string ("<a href=%"#"+ shortcuts.item.anchor +"%">"+ shortcuts.item.name +"</a> | ")
|
||||
shortcuts.forth
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
feature -- Element change
|
||||
|
||||
set_big_title (t: like big_title)
|
||||
do
|
||||
big_title := t
|
||||
end
|
||||
|
||||
feature -- Basic operation
|
||||
|
||||
compute
|
||||
local
|
||||
l_old_body: STRING
|
||||
sh, bt: detachable STRING
|
||||
do
|
||||
sh := shortcuts_to_html
|
||||
bt := big_title
|
||||
if sh /= Void or bt /= Void then
|
||||
l_old_body := body
|
||||
if bt /= Void then
|
||||
bt := "<h1>" + bt + "</h2>%N"
|
||||
if sh /= Void then
|
||||
body := bt + sh + l_old_body
|
||||
else
|
||||
body := bt + l_old_body
|
||||
end
|
||||
elseif sh /= Void then
|
||||
body := sh + l_old_body
|
||||
end
|
||||
Precursor
|
||||
body := l_old_body
|
||||
else
|
||||
Precursor
|
||||
end
|
||||
end
|
||||
|
||||
;note
|
||||
copyright: "Copyright (c) 1984-2011, Eiffel Software and others"
|
||||
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
|
||||
source: "[
|
||||
Eiffel Software
|
||||
5949 Hollister Ave., Goleta, CA 93117 USA
|
||||
Telephone 805-685-1006, Fax 805-685-6869
|
||||
Website http://www.eiffel.com
|
||||
Customer support http://support.eiffel.com
|
||||
]"
|
||||
end
|
||||
@@ -0,0 +1,75 @@
|
||||
note
|
||||
description: "Summary description for {REST_API_DOCUMENTATION_HTML_PAGE_HEAD}."
|
||||
author: ""
|
||||
date: "$Date$"
|
||||
revision: "$Revision$"
|
||||
|
||||
class
|
||||
REST_API_DOCUMENTATION_HTML_PAGE_HEAD
|
||||
|
||||
inherit
|
||||
HTML_PAGE_HEAD
|
||||
redefine
|
||||
initialize,
|
||||
compute
|
||||
end
|
||||
|
||||
create
|
||||
make
|
||||
|
||||
feature {NONE} -- Initialization
|
||||
|
||||
initialize
|
||||
do
|
||||
Precursor
|
||||
style := "[
|
||||
body {margin: 0px;}
|
||||
a { text-decoration: none; }
|
||||
h1 { padding: 10px; border: solid 2px #000; background-color: #009; color: #fff;}
|
||||
div.api { padding: 5px; margin-bottom: 10px;}
|
||||
div.api .api-description { padding: 5px 5px 5px 0px; font-style: italic; color: #090;}
|
||||
div.api div.inner { padding-left: 40px;}
|
||||
div.api h2>a { color: #009; text-decoration: none;}
|
||||
div.api a.api-format { color: #009; text-decoration: none;}
|
||||
div.api a.api-format.selected { padding: 0 4px 0 4px; color: #009; text-decoration: none; border: solid 1px #99c; background-color: #eeeeff;}
|
||||
div.api>h2 { margin: 2px; padding: 2px 2px 2px 10px; display: inline-block; border: dotted 1px #cce; width: 100%; color: #009; background-color: #E7F3F8; text-decoration: none; font-weight: bold; font-size: 120%;}
|
||||
div.api span.note { font-style: italic;}
|
||||
]"
|
||||
end
|
||||
|
||||
feature {REST_API_DOCUMENTATION_HTML_PAGE} -- Access
|
||||
|
||||
style: STRING
|
||||
|
||||
feature -- Output
|
||||
|
||||
compute
|
||||
-- Compute the string output
|
||||
local
|
||||
s: detachable STRING
|
||||
p: INTEGER
|
||||
do
|
||||
Precursor
|
||||
s := internal_string
|
||||
if s /= Void then
|
||||
p := s.substring_index ("</head>", 1)
|
||||
if p > 0 then
|
||||
s.insert_string ("<style>%N" + style + "%N</style>%N", p)
|
||||
else
|
||||
s.append_string ("<style>%N" + style + "%N</style>%N")
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
note
|
||||
copyright: "Copyright (c) 1984-2011, Eiffel Software and others"
|
||||
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
|
||||
source: "[
|
||||
Eiffel Software
|
||||
5949 Hollister Ave., Goleta, CA 93117 USA
|
||||
Telephone 805-685-1006, Fax 805-685-6869
|
||||
Website http://www.eiffel.com
|
||||
Customer support http://support.eiffel.com
|
||||
]"
|
||||
end
|
||||
Reference in New Issue
Block a user