runo 0.2.1 → 0.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (151) hide show
  1. data/README.rdoc +1 -118
  2. data/bin/runo +4 -29
  3. data/lib/dummy.rb +0 -0
  4. metadata +12 -278
  5. data/lib/_error.rb +0 -14
  6. data/lib/_field.rb +0 -260
  7. data/lib/_i18n.rb +0 -144
  8. data/lib/_parser.rb +0 -256
  9. data/lib/_path.rb +0 -86
  10. data/lib/_storage/_storage.rb +0 -215
  11. data/lib/_storage/file.rb +0 -201
  12. data/lib/_storage/sequel.rb +0 -174
  13. data/lib/_storage/temp.rb +0 -73
  14. data/lib/_widget/action_create.rb +0 -23
  15. data/lib/_widget/action_login.rb +0 -22
  16. data/lib/_widget/action_signup.rb +0 -16
  17. data/lib/_widget/action_update.rb +0 -16
  18. data/lib/_widget/crumb.rb +0 -24
  19. data/lib/_widget/done.rb +0 -16
  20. data/lib/_widget/login.rb +0 -25
  21. data/lib/_widget/me.rb +0 -31
  22. data/lib/_widget/message.rb +0 -51
  23. data/lib/_widget/navi.rb +0 -88
  24. data/lib/_widget/submit.rb +0 -49
  25. data/lib/_widget/view_ym.rb +0 -77
  26. data/lib/_workflow/_workflow.rb +0 -89
  27. data/lib/_workflow/attachment.rb +0 -50
  28. data/lib/_workflow/blog.rb +0 -28
  29. data/lib/_workflow/contact.rb +0 -23
  30. data/lib/_workflow/forum.rb +0 -26
  31. data/lib/_workflow/register.rb +0 -39
  32. data/lib/meta/_meta.rb +0 -20
  33. data/lib/meta/group.rb +0 -19
  34. data/lib/meta/id.rb +0 -59
  35. data/lib/meta/owner.rb +0 -21
  36. data/lib/meta/timestamp.rb +0 -118
  37. data/lib/runo.rb +0 -396
  38. data/lib/scalar/checkbox.rb +0 -68
  39. data/lib/scalar/file.rb +0 -144
  40. data/lib/scalar/img.rb +0 -112
  41. data/lib/scalar/password.rb +0 -58
  42. data/lib/scalar/radio.rb +0 -47
  43. data/lib/scalar/select.rb +0 -47
  44. data/lib/scalar/text.rb +0 -38
  45. data/lib/scalar/textarea.rb +0 -35
  46. data/lib/scalar/textarea_pre.rb +0 -14
  47. data/lib/scalar/textarea_wiki.rb +0 -173
  48. data/lib/set/_set.rb +0 -196
  49. data/lib/set/dynamic.rb +0 -177
  50. data/lib/set/static.rb +0 -102
  51. data/lib/set/static_folder.rb +0 -96
  52. data/locale/en/index.po +0 -242
  53. data/locale/index.pot +0 -243
  54. data/locale/ja/index.po +0 -242
  55. data/locale/lazy_parser.rb +0 -54
  56. data/skel/config.ru +0 -27
  57. data/skel/skin/_users/00000000_frank-avatar.jpg +0 -0
  58. data/skel/skin/_users/00000000_frank-avatar_small.jpg +0 -0
  59. data/skel/skin/_users/00000000_frank.yaml +0 -12
  60. data/skel/skin/_users/00000000_root-avatar.jpg +0 -0
  61. data/skel/skin/_users/00000000_root-avatar_small.jpg +0 -0
  62. data/skel/skin/_users/00000000_root.yaml +0 -11
  63. data/skel/skin/_users/css/users.css +0 -21
  64. data/skel/skin/_users/css/users.less +0 -25
  65. data/skel/skin/_users/done.html +0 -42
  66. data/skel/skin/_users/index.html +0 -46
  67. data/skel/skin/_users/index.yaml +0 -3
  68. data/skel/skin/_users/summary.html +0 -40
  69. data/skel/skin/css/base.css +0 -93
  70. data/skel/skin/css/base.less +0 -139
  71. data/skel/skin/css/coax.css +0 -199
  72. data/skel/skin/css/coax.less +0 -244
  73. data/skel/skin/examples/blog/20091214_0001.yaml +0 -8
  74. data/skel/skin/examples/blog/20100630_0001.yaml +0 -8
  75. data/skel/skin/examples/blog/20100630_0002.yaml +0 -14
  76. data/skel/skin/examples/blog/20100701_0001.yaml +0 -8
  77. data/skel/skin/examples/blog/20100701_0002-a-20100701_0001-f.jpg +0 -0
  78. data/skel/skin/examples/blog/20100701_0002-a-20100701_0001-f_small.jpg +0 -0
  79. data/skel/skin/examples/blog/20100701_0002.yaml +0 -19
  80. data/skel/skin/examples/blog/frank/20100701_0001.yaml +0 -10
  81. data/skel/skin/examples/blog/frank/index.yaml +0 -4
  82. data/skel/skin/examples/blog/index.html +0 -51
  83. data/skel/skin/examples/blog/rss.xml +0 -18
  84. data/skel/skin/examples/contact/20100701_0001-file.txt +0 -1
  85. data/skel/skin/examples/contact/20100701_0001.yaml +0 -15
  86. data/skel/skin/examples/contact/20100701_0002.yaml +0 -8
  87. data/skel/skin/examples/contact/20100701_0003.yaml +0 -9
  88. data/skel/skin/examples/contact/index.html +0 -47
  89. data/skel/skin/examples/contact/js/contact.js +0 -13
  90. data/skel/skin/examples/contact/summary.html +0 -54
  91. data/skel/skin/examples/forum/20100701_0001.yaml +0 -41
  92. data/skel/skin/examples/forum/20100701_0002.yaml +0 -25
  93. data/skel/skin/examples/forum/index.html +0 -68
  94. data/skel/skin/examples/forum/summary.html +0 -47
  95. data/skel/skin/examples/index.html +0 -73
  96. data/skel/skin/index.html +0 -39
  97. data/skel/skin/js/base.js +0 -50
  98. data/t/locale/de/index.po +0 -19
  99. data/t/locale/en-GB/index.po +0 -25
  100. data/t/locale/ja/index.po +0 -30
  101. data/t/skin/_users/00000000_test.yaml +0 -3
  102. data/t/skin/_users/index.html +0 -13
  103. data/t/skin/foo/20091120_0001.yaml +0 -7
  104. data/t/skin/foo/bar/20091120_0001.yaml +0 -5
  105. data/t/skin/foo/bar/index.yaml +0 -5
  106. data/t/skin/foo/baz/css/baz.css +0 -1
  107. data/t/skin/foo/css/foo.css +0 -1
  108. data/t/skin/foo/index.html +0 -14
  109. data/t/skin/foo/index.yaml +0 -7
  110. data/t/skin/foo/not_css/foo.css +0 -1
  111. data/t/skin/foo/qux/index.html +0 -8
  112. data/t/skin/foo/qux/moo/index.html +0 -6
  113. data/t/skin/foo/sub-20100306_0001.yaml +0 -3
  114. data/t/skin/index.yaml +0 -3
  115. data/t/skin/t_attachment/index.html +0 -13
  116. data/t/skin/t_contact/done.html +0 -6
  117. data/t/skin/t_contact/index.html +0 -9
  118. data/t/skin/t_file/index.html +0 -16
  119. data/t/skin/t_img/index.html +0 -14
  120. data/t/skin/t_img/test.jpg +0 -0
  121. data/t/skin/t_select/index.html +0 -9
  122. data/t/skin/t_store/index.html +0 -9
  123. data/t/skin/t_summary/20100326_0001.yaml +0 -3
  124. data/t/skin/t_summary/create.html +0 -9
  125. data/t/skin/t_summary/index.html +0 -9
  126. data/t/skin/t_summary/summary.html +0 -9
  127. data/t/t.rb +0 -27
  128. data/t/test_checkbox.rb +0 -273
  129. data/t/test_field.rb +0 -330
  130. data/t/test_file.rb +0 -900
  131. data/t/test_id.rb +0 -215
  132. data/t/test_img.rb +0 -328
  133. data/t/test_meta.rb +0 -57
  134. data/t/test_parser.rb +0 -1516
  135. data/t/test_password.rb +0 -188
  136. data/t/test_radio.rb +0 -226
  137. data/t/test_role.rb +0 -249
  138. data/t/test_runo.rb +0 -768
  139. data/t/test_runo_call.rb +0 -1281
  140. data/t/test_runo_i18n.rb +0 -325
  141. data/t/test_select.rb +0 -182
  142. data/t/test_set_complex.rb +0 -527
  143. data/t/test_set_dynamic.rb +0 -1504
  144. data/t/test_set_folder.rb +0 -515
  145. data/t/test_set_permit.rb +0 -246
  146. data/t/test_set_static.rb +0 -468
  147. data/t/test_storage.rb +0 -915
  148. data/t/test_text.rb +0 -125
  149. data/t/test_textarea.rb +0 -138
  150. data/t/test_timestamp.rb +0 -473
  151. data/t/test_workflow.rb +0 -367
@@ -1,47 +0,0 @@
1
- <?xml version="1.0" encoding="utf-8"?>
2
- <!DOCTYPE html
3
- PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
4
- "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
5
- <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
6
-
7
- <head>
8
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
9
- <title>@(label)</title>
10
- <link rel="stylesheet" href="/css/base.css" type="text/css" media="screen" />
11
- <link rel="stylesheet" href="/css/coax.css" type="text/css" media="screen" />
12
- </head>
13
-
14
- <body>
15
- <div id="container">
16
- <div id="header">
17
- <h1><a href=".">@(label)</a></h1>
18
- $(.crumb)
19
- </div>
20
-
21
- <div id="center" class="column">
22
- <table id="main" class="app-contact summary" style="border: 1px solid black;">
23
- <tr>
24
- <th>Subject</th>
25
- <th>Author</th>
26
- <th>Posted at</th>
27
- </tr>
28
- <tr class="model">
29
- <td>$(subject)</td>
30
- <td>$(_owner)</td>
31
- <td>$(_timestamp)</td>
32
- </tr>
33
- </table>
34
- </div>
35
-
36
- <div id="right" class="column">
37
- $(.action_signup)
38
- $(.me)
39
- $(main.action_create)
40
- $(main.view_ym)
41
- </div>
42
-
43
- <div id="footer"></div>
44
- </div>
45
- </body>
46
-
47
- </html>
@@ -1,73 +0,0 @@
1
- <?xml version="1.0" encoding="utf-8"?>
2
- <!DOCTYPE html
3
- PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
4
- "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
5
- <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="_(en)" lang="_(en)">
6
-
7
- <head>
8
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
9
- <meta name="runo-label" content="Examples" />
10
- <title>@(label)</title>
11
- <link rel="stylesheet" href="/css/base.css" type="text/css" media="screen" />
12
- <link rel="stylesheet" href="/css/coax.css" type="text/css" media="screen" />
13
- </head>
14
-
15
- <body>
16
- <div id="container">
17
- <div id="header">
18
- <h1><a href=".">@(label)</a></h1>
19
- $(.crumb)
20
- </div>
21
-
22
- <div id="center" class="column">
23
- <h2>@(label)</h2>
24
- <p>
25
- This directory contains some sample apps to show you how good Runo works.
26
- When you don't need them any more, you can just remove skin/examples/ directory and they will be gone.
27
- </p>
28
- <p>
29
- You may have to login to try some features of the apps. By default, there are two users.
30
- The first user is "root", the admin of the whole Runo app.
31
- The second user is "frank", who has no special privilege.
32
- Their initial passwords are same as their names (e.g. "root" for root, "frank" for frank).
33
- And of course, you can create your own account at <a href="../_users/create.html">here</a>.
34
- </p>
35
- <p>
36
- The data are stored in plain YAML files under data/examples/ by default. You can store the data on any RDB by fiddling config.ru.
37
- </p>
38
- <dl>
39
- <dt><a href="./blog/">Blog</a></dt>
40
- <dd>
41
- The admin (root) can post / update / delete entries and everybody can read them.
42
- Typical features such as monthly archives or syndication by RSS are provided.
43
- You have to login as "root" to post new articles.
44
- </dd>
45
- <dt><a href="./blog/frank/">Frank's Blog</a></dt>
46
- <dd>
47
- This is an example of inheritance.
48
- By simply making an empty sub-directory (blog/frank/), all HTMLs are inherited from the upper directory (blog/).
49
- Then, blog/frank/index.yaml overrides the label ("Frank's Blog") and the admin (frank).
50
- </dd>
51
- <dt><a href="./contact/">Contact Form</a></dt>
52
- <dd>
53
- This is an "everybody -> admin" type app.
54
- Everybody other than root can post this form and only root can see the posted result.
55
- The index.html is a good sample of various items such like radio, select, checkbox etc.
56
- </dd>
57
- <dt><a href="./forum/">Forum</a></dt>
58
- <dd>
59
- This is an example of a nested model.
60
- The app will have many posts, and each post will have many comments.
61
- Everybody who logged in can create a new post, or reply to a existing post.
62
- </dd>
63
- </dl>
64
- </div>
65
-
66
- <div id="right" class="column">
67
- </div>
68
-
69
- <div id="footer"></div>
70
- </div>
71
- </body>
72
-
73
- </html>
@@ -1,39 +0,0 @@
1
- <?xml version="1.0" encoding="utf-8"?>
2
- <!DOCTYPE html
3
- PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
4
- "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
5
- <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="_(en)" lang="_(en)">
6
-
7
- <head>
8
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
9
- <meta name="runo-label" content="Home" />
10
- <title>_(It works!)</title>
11
- <link rel="stylesheet" href="/css/base.css" type="text/css" media="screen" />
12
- <link rel="stylesheet" href="/css/coax.css" type="text/css" media="screen" />
13
- <script type="text/javascript" src="http://code.jquery.com/jquery-1.4.2.min.js"></script>
14
- <script type="text/javascript" src="/js/base.js"></script>
15
- </head>
16
-
17
- <body>
18
- <div id="container">
19
- <div id="header">
20
- <h1><a href=".">_(It works!)</a></h1>
21
- $(.crumb)
22
- </div>
23
-
24
- <div id="center" class="column">
25
- <h2>_(Welcome!)</h2>
26
- <p>
27
- This is your homepage of the Runo app.<br />
28
- You can play with <a href="./examples/">the examples</a> before making your first Runo app.
29
- </p>
30
- </div>
31
-
32
- <div id="right" class="column">
33
- </div>
34
-
35
- <div id="footer"></div>
36
- </div>
37
- </body>
38
-
39
- </html>
@@ -1,50 +0,0 @@
1
- $(document).ready(function() {
2
- $('span.error').hover(
3
- function(){
4
- $('.error_message', this).fadeIn(150);
5
- },
6
- function(){
7
- if ($(this).is(':not(.focused)')) $('.error_message', this).fadeOut(50);
8
- }
9
- );
10
-
11
- $(':input', $('span.error')).focus(
12
- function(){
13
- var d = $(this).closest('span.error');
14
- d.addClass('focused');
15
- $('.error_message', d).fadeIn(150);
16
- }
17
- ).blur(
18
- function(){
19
- var d = $(this).closest('span.error');
20
- d.removeClass('focused');
21
- $('.error_message', d).fadeOut(50);
22
- }
23
- ).change(
24
- function(){
25
- var d = $(this).closest('span.error');
26
- d.removeClass('error');
27
- d.removeClass('focused');
28
- $('.error_message', d).hide();
29
- }
30
- );
31
-
32
- $('.error_message').hide().css({
33
- 'color': 'white',
34
- 'background': 'red',
35
- 'opacity': '0.9',
36
- 'position': 'absolute',
37
- 'margin-left': '0',
38
- 'margin-top': '2px',
39
- 'padding': '.3em 1em .3em 1em',
40
- '-moz-border-radius': '.3em',
41
- '-webkit-border-radius': '.3em'
42
- });
43
-
44
- if ($('span.error').length > 0) {
45
- $(':input:enabled:first', $('span.error:first')).focus().select();
46
- }
47
- else {
48
- $(':input:enabled:first').focus().select();
49
- }
50
- });
@@ -1,19 +0,0 @@
1
- # just a test.
2
- # Copyright (C) 2010 Akira FUNAI
3
- # This file is distributed under the same license as the PACKAGE package.
4
- # FIRST AUTHOR Akira FUNAI, 2010.
5
- #
6
-
7
- "Project-Id-Version: 0.01\n"
8
- "POT-Creation-Date: 2010-05-06 15:11+0900\n"
9
- "PO-Revision-Date: 2010-05-06 15:11+0900\n"
10
- "Last-Translator: Akira FUNAI <akira@funai.com>\n"
11
- "Language-Team: none <nobody@example.com>\n"
12
- "MIME-Version: 1.0\n"
13
- "Content-Type: text/plain; charset=UTF-8\n"
14
- "Content-Transfer-Encoding: 8bit\n"
15
- "Plural-Forms: nplurals=2; plural=n != 1;\n"
16
-
17
- #: t.rb:1234
18
- msgid "malformed input."
19
- msgstr "Fehlerhafte Eingabe."
@@ -1,25 +0,0 @@
1
- # just a test.
2
- # Copyright (C) 2010 Akira FUNAI
3
- # This file is distributed under the same license as the PACKAGE package.
4
- # FIRST AUTHOR Akira FUNAI, 2010.
5
- #
6
-
7
- "Project-Id-Version: 0.01\n"
8
- "POT-Creation-Date: 2010-05-06 15:11+0900\n"
9
- "PO-Revision-Date: 2010-05-06 15:11+0900\n"
10
- "Last-Translator: Akira FUNAI <akira@funai.com>\n"
11
- "Language-Team: none <nobody@example.com>\n"
12
- "MIME-Version: 1.0\n"
13
- "Content-Type: text/plain; charset=UTF-8\n"
14
- "Content-Transfer-Encoding: 8bit\n"
15
- "Plural-Forms: nplurals=2; plural=n != 1;\n"
16
-
17
- #: t.rb:1234
18
- msgid "color"
19
- msgstr "colour"
20
-
21
- #: t.rb:2345
22
- msgid "one color"
23
- msgid_plural "%{n} colors"
24
- msgstr[0] "one colour"
25
- msgstr[1] "%{n} colours"
@@ -1,30 +0,0 @@
1
- # just a test.
2
- # Copyright (C) 2010 Akira FUNAI
3
- # This file is distributed under the same license as the PACKAGE package.
4
- # FIRST AUTHOR Akira FUNAI, 2010.
5
- #
6
-
7
- "Project-Id-Version: 0.01\n"
8
- "POT-Creation-Date: 2010-05-06 15:11+0900\n"
9
- "PO-Revision-Date: 2010-05-06 15:11+0900\n"
10
- "Last-Translator: Akira FUNAI <akira@funai.com>\n"
11
- "Language-Team: none <nobody@example.com>\n"
12
- "MIME-Version: 1.0\n"
13
- "Content-Type: text/plain; charset=UTF-8\n"
14
- "Content-Transfer-Encoding: 8bit\n"
15
- "Plural-Forms: nplurals=1; plural=0;\n"
16
-
17
- #: t.rb:1234
18
- msgid "color"
19
- msgstr "色"
20
- # msgstr "mmm"
21
-
22
- #: t.rb:2234
23
- #, fuzzy
24
- msgid "sound"
25
- msgstr "音"
26
-
27
- #: t.rb:2345
28
- msgid "one color"
29
- msgid_plural "%{n} colors"
30
- msgstr[0] "%{n}色"
@@ -1,3 +0,0 @@
1
- ---
2
- _id: test
3
- password: ulrR7VSYJHTs6
@@ -1,13 +0,0 @@
1
- <html>
2
- <head><title>@(label)</title></head>
3
- <body>
4
- <h1>@(label)</h1>
5
- <dl id="main" class="app-blog">
6
- <dt>id: $(_id = meta-id 32 1..32)</dt>
7
- <dd>
8
- password: $(password = password 12)
9
- avatar: $(avatar = img 72*72 0...320000)
10
- </dd>
11
- </dl>
12
- </body>
13
- </html>
@@ -1,7 +0,0 @@
1
- _owner: frank
2
- name: FZ
3
- comment: oops.
4
- replies:
5
- 20091201_0001:
6
- _owner: carl
7
- reply: foo.
@@ -1,5 +0,0 @@
1
- ---
2
- _owner: carl
3
- replies:
4
- 20091208_0001:
5
- reply: wow.
@@ -1,5 +0,0 @@
1
- ---
2
- label: 'Bar Folder'
3
- group:
4
- - carl
5
- - don
@@ -1 +0,0 @@
1
- #moo {}
@@ -1 +0,0 @@
1
- #foo {bar: baz;}
@@ -1,14 +0,0 @@
1
- <html>
2
- <head><title>@(label)</title></head>
3
- <body>
4
- <h1>@(label)</h1>
5
- <ul id="main" class="app-blog">
6
- <li>
7
- $(name = text 32 1..32 :'foo'): $(comment = text 64 1..64 :'bar!')
8
- <ul id="files" class="app-attachment"><li>$(file=text)</li></ul>
9
- <ul id="replies" class="app-blog"><li>$(reply=text)</li></ul>
10
- </li>
11
- </ul>
12
- <ul id="sub" class="app-blog"><li>$(article=text)</li></ul>
13
- </body>
14
- </html>
@@ -1,7 +0,0 @@
1
- ---
2
- label: 'Foo Folder'
3
- admin: frank
4
- group:
5
- - roy
6
- - jim
7
-
@@ -1 +0,0 @@
1
- #foo {bar: baz;}
@@ -1,8 +0,0 @@
1
- <html>
2
- <head><title>@(label)</title></head>
3
- <body>
4
- <h1>@(label)</h1>
5
- <ul id="abc" class="app-blog"><li></li></ul>
6
- <ul id="sub" class="app-blog"><li></li></ul>
7
- </body>
8
- </html>
@@ -1,6 +0,0 @@
1
- <html>
2
- <head><title>@(label)</title></head>
3
- <body>
4
- <p>moo!</p>
5
- </body>
6
- </html>
@@ -1,3 +0,0 @@
1
- ---
2
- _owner: root
3
- article: qux
@@ -1,3 +0,0 @@
1
- ---
2
- label: 'Root'
3
-
@@ -1,13 +0,0 @@
1
- <html>
2
- <head><title>@(label)</title></head>
3
- <body>
4
- <h1>@(label)</h1>
5
- <ul id="main" class="app-blog">
6
- <li title="tArticle, tArticles">
7
- $(comment=text)
8
- <ul id="files" class="app-attachment"><li>$(file=text 1..16)</li></ul>
9
- <ul id="replies" class="app-blog"><li>$(reply=text)</li></ul>
10
- </li>
11
- </ul>
12
- </body>
13
- </html>
@@ -1,6 +0,0 @@
1
- <html>
2
- <head><title>@(label)</title></head>
3
- <body>
4
- <p>thank you!</p>
5
- </body>
6
- </html>
@@ -1,9 +0,0 @@
1
- <html>
2
- <head><title>@(label)</title></head>
3
- <body>
4
- <h1>@(label)</h1>
5
- <ul id="main" class="app-contact">
6
- <li>$(name = text 32 1..32 :'foo'): $(comment = text 64 1..64 :'bar!')</li>
7
- </ul>
8
- </body>
9
- </html>
@@ -1,16 +0,0 @@
1
- <html>
2
- <head><title>@(label)</title></head>
3
- <body>
4
- <h1>@(label)</h1>
5
- <ul id="main" class="app-blog">
6
- <li>
7
- $(_timestamp = meta-timestamp can_edit)
8
- $(foo = file 0..50)
9
- $(bar = file 0..50)
10
- <ul id="baz" class="app-attachment">
11
- $(qux = file 1..50)
12
- </ul>
13
- </li>
14
- </ul>
15
- </body>
16
- </html>