devcenter 0.0.1

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 (192) hide show
  1. data/.gitignore +18 -0
  2. data/Gemfile +8 -0
  3. data/LICENSE.txt +22 -0
  4. data/README.md +39 -0
  5. data/Rakefile +2 -0
  6. data/bin/devcenter +7 -0
  7. data/devcenter.gemspec +30 -0
  8. data/lib/devcenter.rb +6 -0
  9. data/lib/devcenter/cli.rb +45 -0
  10. data/lib/devcenter/coderay_extensions.rb +70 -0
  11. data/lib/devcenter/commands.rb +4 -0
  12. data/lib/devcenter/commands/base.rb +47 -0
  13. data/lib/devcenter/commands/open.rb +34 -0
  14. data/lib/devcenter/commands/preview.rb +28 -0
  15. data/lib/devcenter/commands/pull.rb +37 -0
  16. data/lib/devcenter/helpers.rb +41 -0
  17. data/lib/devcenter/layout.html +299 -0
  18. data/lib/devcenter/md_parser.rb +87 -0
  19. data/lib/devcenter/previewer.rb +36 -0
  20. data/lib/devcenter/previewer/assets/images/public/article-icon-large.png +0 -0
  21. data/lib/devcenter/previewer/assets/images/public/article-icon.png +0 -0
  22. data/lib/devcenter/previewer/assets/images/public/aside_accordion_indicator_default.png +0 -0
  23. data/lib/devcenter/previewer/assets/images/public/aside_accordion_indicator_open.png +0 -0
  24. data/lib/devcenter/previewer/assets/images/public/body_bg.png +0 -0
  25. data/lib/devcenter/previewer/assets/images/public/callout_bg.png +0 -0
  26. data/lib/devcenter/previewer/assets/images/public/feed-icon-sprite.png +0 -0
  27. data/lib/devcenter/previewer/assets/images/public/heroku-header-logo-mobile.png +0 -0
  28. data/lib/devcenter/previewer/assets/images/public/heroku-header-logo.png +0 -0
  29. data/lib/devcenter/previewer/assets/images/public/heroku-logo.png +0 -0
  30. data/lib/devcenter/previewer/assets/images/public/icon_sprite_16.png +0 -0
  31. data/lib/devcenter/previewer/assets/images/public/index_li_bullet.png +0 -0
  32. data/lib/devcenter/previewer/assets/images/public/intro_bg.png +0 -0
  33. data/lib/devcenter/previewer/assets/images/public/jive_discussion_arrow.png +0 -0
  34. data/lib/devcenter/previewer/assets/images/public/jive_discussion_glyph.png +0 -0
  35. data/lib/devcenter/previewer/assets/images/public/line.png +0 -0
  36. data/lib/devcenter/previewer/assets/images/public/pre_code_background.png +0 -0
  37. data/lib/devcenter/previewer/assets/images/public/search-icon.png +0 -0
  38. data/lib/devcenter/previewer/assets/images/public/search_glyph.png +0 -0
  39. data/lib/devcenter/previewer/assets/images/public/search_return.png +0 -0
  40. data/lib/devcenter/previewer/assets/images/public/tag-icon-large.png +0 -0
  41. data/lib/devcenter/previewer/assets/images/public/toc-icon.png +0 -0
  42. data/lib/devcenter/previewer/assets/public.css +2125 -0
  43. data/lib/devcenter/previewer/assets/public/article-icon-large.png +0 -0
  44. data/lib/devcenter/previewer/assets/public/article-icon.png +0 -0
  45. data/lib/devcenter/previewer/assets/public/aside_accordion_indicator_default.png +0 -0
  46. data/lib/devcenter/previewer/assets/public/aside_accordion_indicator_open.png +0 -0
  47. data/lib/devcenter/previewer/assets/public/body_bg.png +0 -0
  48. data/lib/devcenter/previewer/assets/public/callout_bg.png +0 -0
  49. data/lib/devcenter/previewer/assets/public/feed-icon-sprite.png +0 -0
  50. data/lib/devcenter/previewer/assets/public/heroku-header-logo-mobile.png +0 -0
  51. data/lib/devcenter/previewer/assets/public/heroku-header-logo.png +0 -0
  52. data/lib/devcenter/previewer/assets/public/heroku-logo.png +0 -0
  53. data/lib/devcenter/previewer/assets/public/icon_sprite_16.png +0 -0
  54. data/lib/devcenter/previewer/assets/public/index_li_bullet.png +0 -0
  55. data/lib/devcenter/previewer/assets/public/intro_bg.png +0 -0
  56. data/lib/devcenter/previewer/assets/public/jive_discussion_arrow.png +0 -0
  57. data/lib/devcenter/previewer/assets/public/jive_discussion_glyph.png +0 -0
  58. data/lib/devcenter/previewer/assets/public/line.png +0 -0
  59. data/lib/devcenter/previewer/assets/public/pre_code_background.png +0 -0
  60. data/lib/devcenter/previewer/assets/public/public.css +2125 -0
  61. data/lib/devcenter/previewer/assets/public/search-icon.png +0 -0
  62. data/lib/devcenter/previewer/assets/public/search_glyph.png +0 -0
  63. data/lib/devcenter/previewer/assets/public/search_return.png +0 -0
  64. data/lib/devcenter/previewer/assets/public/tag-icon-large.png +0 -0
  65. data/lib/devcenter/previewer/assets/public/toc-icon.png +0 -0
  66. data/lib/devcenter/previewer/file_listener.rb +23 -0
  67. data/lib/devcenter/previewer/views/article.erb +345 -0
  68. data/lib/devcenter/previewer/web_app.rb +53 -0
  69. data/lib/devcenter/previewer/web_server.rb +29 -0
  70. data/lib/devcenter/version.rb +3 -0
  71. data/vendor/sinatra/.gitignore +6 -0
  72. data/vendor/sinatra/.travis.yml +16 -0
  73. data/vendor/sinatra/.yardopts +4 -0
  74. data/vendor/sinatra/AUTHORS +61 -0
  75. data/vendor/sinatra/Gemfile +91 -0
  76. data/vendor/sinatra/LICENSE +22 -0
  77. data/vendor/sinatra/README.de.rdoc +2116 -0
  78. data/vendor/sinatra/README.es.rdoc +2106 -0
  79. data/vendor/sinatra/README.fr.rdoc +2133 -0
  80. data/vendor/sinatra/README.hu.rdoc +608 -0
  81. data/vendor/sinatra/README.jp.rdoc +1056 -0
  82. data/vendor/sinatra/README.ko.rdoc +1932 -0
  83. data/vendor/sinatra/README.pt-br.rdoc +778 -0
  84. data/vendor/sinatra/README.pt-pt.rdoc +647 -0
  85. data/vendor/sinatra/README.rdoc +2049 -0
  86. data/vendor/sinatra/README.ru.rdoc +2033 -0
  87. data/vendor/sinatra/README.zh.rdoc +1816 -0
  88. data/vendor/sinatra/Rakefile +182 -0
  89. data/vendor/sinatra/examples/chat.rb +61 -0
  90. data/vendor/sinatra/examples/simple.rb +3 -0
  91. data/vendor/sinatra/examples/stream.ru +26 -0
  92. data/vendor/sinatra/lib/sinatra.rb +5 -0
  93. data/vendor/sinatra/lib/sinatra/base.rb +1820 -0
  94. data/vendor/sinatra/lib/sinatra/images/404.png +0 -0
  95. data/vendor/sinatra/lib/sinatra/images/500.png +0 -0
  96. data/vendor/sinatra/lib/sinatra/main.rb +30 -0
  97. data/vendor/sinatra/lib/sinatra/showexceptions.rb +345 -0
  98. data/vendor/sinatra/lib/sinatra/version.rb +3 -0
  99. data/vendor/sinatra/sinatra.gemspec +18 -0
  100. data/vendor/sinatra/test/base_test.rb +172 -0
  101. data/vendor/sinatra/test/builder_test.rb +91 -0
  102. data/vendor/sinatra/test/coffee_test.rb +90 -0
  103. data/vendor/sinatra/test/compile_test.rb +139 -0
  104. data/vendor/sinatra/test/contest.rb +98 -0
  105. data/vendor/sinatra/test/creole_test.rb +65 -0
  106. data/vendor/sinatra/test/delegator_test.rb +160 -0
  107. data/vendor/sinatra/test/encoding_test.rb +20 -0
  108. data/vendor/sinatra/test/erb_test.rb +98 -0
  109. data/vendor/sinatra/test/extensions_test.rb +98 -0
  110. data/vendor/sinatra/test/filter_test.rb +437 -0
  111. data/vendor/sinatra/test/haml_test.rb +91 -0
  112. data/vendor/sinatra/test/helper.rb +123 -0
  113. data/vendor/sinatra/test/helpers_test.rb +1768 -0
  114. data/vendor/sinatra/test/integration/app.rb +62 -0
  115. data/vendor/sinatra/test/integration_helper.rb +222 -0
  116. data/vendor/sinatra/test/integration_test.rb +87 -0
  117. data/vendor/sinatra/test/less_test.rb +69 -0
  118. data/vendor/sinatra/test/liquid_test.rb +59 -0
  119. data/vendor/sinatra/test/mapped_error_test.rb +305 -0
  120. data/vendor/sinatra/test/markaby_test.rb +80 -0
  121. data/vendor/sinatra/test/markdown_test.rb +82 -0
  122. data/vendor/sinatra/test/middleware_test.rb +68 -0
  123. data/vendor/sinatra/test/nokogiri_test.rb +67 -0
  124. data/vendor/sinatra/test/public/favicon.ico +0 -0
  125. data/vendor/sinatra/test/rabl_test.rb +89 -0
  126. data/vendor/sinatra/test/rack_test.rb +45 -0
  127. data/vendor/sinatra/test/radius_test.rb +59 -0
  128. data/vendor/sinatra/test/rdoc_test.rb +66 -0
  129. data/vendor/sinatra/test/readme_test.rb +120 -0
  130. data/vendor/sinatra/test/request_test.rb +45 -0
  131. data/vendor/sinatra/test/response_test.rb +64 -0
  132. data/vendor/sinatra/test/result_test.rb +76 -0
  133. data/vendor/sinatra/test/route_added_hook_test.rb +59 -0
  134. data/vendor/sinatra/test/routing_test.rb +1175 -0
  135. data/vendor/sinatra/test/sass_test.rb +116 -0
  136. data/vendor/sinatra/test/scss_test.rb +89 -0
  137. data/vendor/sinatra/test/server_test.rb +48 -0
  138. data/vendor/sinatra/test/settings_test.rb +561 -0
  139. data/vendor/sinatra/test/sinatra_test.rb +12 -0
  140. data/vendor/sinatra/test/slim_test.rb +84 -0
  141. data/vendor/sinatra/test/static_test.rb +219 -0
  142. data/vendor/sinatra/test/streaming_test.rb +149 -0
  143. data/vendor/sinatra/test/templates_test.rb +333 -0
  144. data/vendor/sinatra/test/textile_test.rb +65 -0
  145. data/vendor/sinatra/test/views/a/in_a.str +1 -0
  146. data/vendor/sinatra/test/views/ascii.erb +2 -0
  147. data/vendor/sinatra/test/views/b/in_b.str +1 -0
  148. data/vendor/sinatra/test/views/calc.html.erb +1 -0
  149. data/vendor/sinatra/test/views/error.builder +3 -0
  150. data/vendor/sinatra/test/views/error.erb +3 -0
  151. data/vendor/sinatra/test/views/error.haml +3 -0
  152. data/vendor/sinatra/test/views/error.sass +2 -0
  153. data/vendor/sinatra/test/views/explicitly_nested.str +1 -0
  154. data/vendor/sinatra/test/views/foo/hello.test +1 -0
  155. data/vendor/sinatra/test/views/hello.builder +1 -0
  156. data/vendor/sinatra/test/views/hello.coffee +1 -0
  157. data/vendor/sinatra/test/views/hello.creole +1 -0
  158. data/vendor/sinatra/test/views/hello.erb +1 -0
  159. data/vendor/sinatra/test/views/hello.haml +1 -0
  160. data/vendor/sinatra/test/views/hello.less +5 -0
  161. data/vendor/sinatra/test/views/hello.liquid +1 -0
  162. data/vendor/sinatra/test/views/hello.mab +1 -0
  163. data/vendor/sinatra/test/views/hello.md +1 -0
  164. data/vendor/sinatra/test/views/hello.nokogiri +1 -0
  165. data/vendor/sinatra/test/views/hello.rabl +2 -0
  166. data/vendor/sinatra/test/views/hello.radius +1 -0
  167. data/vendor/sinatra/test/views/hello.rdoc +1 -0
  168. data/vendor/sinatra/test/views/hello.sass +2 -0
  169. data/vendor/sinatra/test/views/hello.scss +3 -0
  170. data/vendor/sinatra/test/views/hello.slim +1 -0
  171. data/vendor/sinatra/test/views/hello.str +1 -0
  172. data/vendor/sinatra/test/views/hello.test +1 -0
  173. data/vendor/sinatra/test/views/hello.textile +1 -0
  174. data/vendor/sinatra/test/views/hello.wlang +1 -0
  175. data/vendor/sinatra/test/views/hello.yajl +1 -0
  176. data/vendor/sinatra/test/views/layout2.builder +3 -0
  177. data/vendor/sinatra/test/views/layout2.erb +2 -0
  178. data/vendor/sinatra/test/views/layout2.haml +2 -0
  179. data/vendor/sinatra/test/views/layout2.liquid +2 -0
  180. data/vendor/sinatra/test/views/layout2.mab +2 -0
  181. data/vendor/sinatra/test/views/layout2.nokogiri +3 -0
  182. data/vendor/sinatra/test/views/layout2.rabl +3 -0
  183. data/vendor/sinatra/test/views/layout2.radius +2 -0
  184. data/vendor/sinatra/test/views/layout2.slim +3 -0
  185. data/vendor/sinatra/test/views/layout2.str +2 -0
  186. data/vendor/sinatra/test/views/layout2.test +1 -0
  187. data/vendor/sinatra/test/views/layout2.wlang +2 -0
  188. data/vendor/sinatra/test/views/nested.str +1 -0
  189. data/vendor/sinatra/test/views/utf8.erb +2 -0
  190. data/vendor/sinatra/test/wlang_test.rb +70 -0
  191. data/vendor/sinatra/test/yajl_test.rb +86 -0
  192. metadata +414 -0
@@ -0,0 +1,299 @@
1
+ <!DOCTYPE html>
2
+ <html class="no-js" dir="ltr" lang="en">
3
+ <head>
4
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
5
+ <!-- <meta http-equiv="refresh" content="2"> -->
6
+ <title><!-- article-title --></title>
7
+ <meta charset="utf-8">
8
+ <meta name="viewport" content="width=device-width, initial-scale=0.5">
9
+ <meta content="IE=edge,chrome=1" http-equiv="X-UA-Compatible">
10
+ <meta content="authenticity_token" name="csrf-param">
11
+ <!-- <link href="https://devcenter.heroku.com/assets/public.css" media="screen" rel="stylesheet" type="text/css"> -->
12
+ <!--[if IE 6]>
13
+ <link href="https://universal-ie6-css.googlecode.com/files/ie6.0.3.css" media="screen" rel="stylesheet" type="text/css" />
14
+ <![endif]-->
15
+ </head>
16
+ <body>
17
+ <div id="heroku-header">
18
+ <div id="heroku-header-hgroup">
19
+ <h1><a href="https://heroku.com">Heroku</a></h1>
20
+ </div>
21
+ <div id="heroku-header-nav">
22
+ <ul>
23
+ <li><a href="https://heroku.com/how/">How It Works</a></li>
24
+ <li><a href="https://heroku.com/pricing/">Pricing</a></li>
25
+ <li class="last"><a href="https://addons.heroku.com/">Add-ons</a></li>
26
+ </ul>
27
+ <ul class="group" id="heroku-header-aid">
28
+ <li><a href="https://devcenter.heroku.com/">Dev Center</a></li>
29
+ <li class="last"><a href="https://help.heroku.com">Help</a></li>
30
+ </ul>
31
+ <ul class="last group" id="heroku-header-my-heroku">
32
+ <li class="last"><a href="/auth/login?back_to=%2Farticles%2Fcedar">Login</a></li>
33
+ </ul>
34
+ </div>
35
+
36
+ <div id="heroku-header-quicknav">
37
+ <select><optgroup label="About">
38
+ <option value="https://heroku.com/how/">How It Works</option>
39
+ <option value="https://heroku.com/pricing/">Pricing</option>
40
+ <option value="https://addons.heroku.com/">Add-ons</option>
41
+ </optgroup>
42
+ <optgroup label="Support">
43
+ <option selected value="https://devcenter.heroku.com/">Dev Center</option>
44
+ <option value="https://help.heroku.com">Help</option>
45
+ </optgroup>
46
+ <optgroup label="My Heroku"><option value="/auth/logout?back_to=%2Farticles%2Fcedar">Login</option></optgroup></select><a href="#" onclick="return false;">Dev Center</a>
47
+ </div>
48
+ </div>
49
+ <script type="text/javascript">
50
+ </script><div id="sheet">
51
+ <div class="wrapper">
52
+ <div class="pie-clearfix" id="article">
53
+ <aside id="sidebar">
54
+ <select id="quicknav" class="nocontent"><option value="/">Home</option>
55
+ <optgroup label="Overview">
56
+ <option value="/categories/getting-started">
57
+ Getting Started
58
+ </option>
59
+ <option value="/categories/platform-architecture">
60
+ Platform Architecture
61
+ </option>
62
+ <option value="/categories/application-architecture">
63
+ Application Architecture
64
+ </option>
65
+ </optgroup>
66
+ <optgroup label="Reference">
67
+ <option value="/categories/platform-features" selected>
68
+ Platform Features
69
+ </option>
70
+ <option value="/categories/language-support">
71
+ Languages
72
+ </option>
73
+ <option value="/categories/command-line">
74
+ Command Line
75
+ </option>
76
+ <option value="/categories/collaboration">
77
+ Collaboration
78
+ </option>
79
+ <option value="/categories/deployment">
80
+ Deployment
81
+ </option>
82
+ <option value="/categories/troubleshooting">
83
+ Troubleshooting
84
+ </option>
85
+ <option value="/categories/devcenter">
86
+ Dev Center
87
+ </option>
88
+ <option value="/categories/aspen-bamboo">
89
+ Bamboo
90
+ </option>
91
+ <option value="/categories/labs">
92
+ Heroku Labs
93
+ </option>
94
+ <option value="/categories/buildpacks">
95
+ Buildpacks
96
+ </option>
97
+ <option value="/changelog">
98
+ Changelog
99
+ </option>
100
+ </optgroup>
101
+ <optgroup label="Languages">
102
+ <option value="/categories/ruby">
103
+ Ruby
104
+ </option>
105
+ <option value="/categories/java">
106
+ Java
107
+ </option>
108
+ <option value="/categories/python">
109
+ Python
110
+ </option>
111
+ <option value="/categories/clojure">
112
+ Clojure
113
+ </option>
114
+ <option value="/categories/scala">
115
+ Scala
116
+ </option>
117
+ <option value="/categories/nodejs">
118
+ Node.js
119
+ </option>
120
+ </optgroup>
121
+ <optgroup label="Tutorials">
122
+ <option value="/categories/features">
123
+ Adding Features
124
+ </option>
125
+ <option value="/categories/facebook">
126
+ Facebook
127
+ </option>
128
+ <option value="/categories/mobile">
129
+ Mobile
130
+ </option>
131
+ <option value="/categories/database">
132
+ Database
133
+ </option>
134
+ </optgroup>
135
+ <optgroup label="Accounts &amp; Billing">
136
+ <option value="/categories/billing">
137
+ Accounts &amp; Billing
138
+ </option>
139
+ <option value="/categories/support">
140
+ Support
141
+ </option>
142
+ </optgroup>
143
+ <optgroup label="Add-ons">
144
+ <option value="/categories/heroku-postgres">
145
+ Heroku Postgres
146
+ </option>
147
+ <option value="/categories/addon-overview">
148
+ Overview
149
+ </option>
150
+ <option value="/categories/add-on-documentation">
151
+ All Add-ons
152
+ </option>
153
+ </optgroup></select><ul id="nav" class="nocontent">
154
+ <li class="category-group">
155
+ <a class="category" href="#">Overview</a>
156
+
157
+ <ul class="tags" style="display:none;">
158
+ <li>
159
+ <a href="/categories/getting-started">Getting Started</a>
160
+ </li>
161
+ <li>
162
+ <a href="/categories/platform-architecture">Platform Architecture</a>
163
+ </li>
164
+ <li>
165
+ <a href="/categories/application-architecture">Application Architecture</a>
166
+ </li>
167
+ </ul>
168
+ </li>
169
+ <li class="category-group">
170
+ <a class="category" href="#">Reference</a>
171
+
172
+ <ul class="tags" style="display:block;">
173
+ <li class="active">
174
+ <a href="/categories/platform-features">Platform Features</a>
175
+ </li>
176
+ <li>
177
+ <a href="/categories/language-support">Languages</a>
178
+ </li>
179
+ <li>
180
+ <a href="/categories/command-line">Command Line</a>
181
+ </li>
182
+ <li>
183
+ <a href="/categories/collaboration">Collaboration</a>
184
+ </li>
185
+ <li>
186
+ <a href="/categories/deployment">Deployment</a>
187
+ </li>
188
+ <li>
189
+ <a href="/categories/troubleshooting">Troubleshooting</a>
190
+ </li>
191
+ <li>
192
+ <a href="/categories/devcenter">Dev Center</a>
193
+ </li>
194
+ <li>
195
+ <a href="/categories/aspen-bamboo">Bamboo</a>
196
+ </li>
197
+ <li>
198
+ <a href="/categories/labs">Heroku Labs</a>
199
+ </li>
200
+ <li>
201
+ <a href="/categories/buildpacks">Buildpacks</a>
202
+ </li>
203
+ <li>
204
+ <a href="/changelog">Changelog</a>
205
+ </li>
206
+ </ul>
207
+ </li>
208
+ <li class="category-group">
209
+ <a class="category" href="#">Languages</a>
210
+
211
+ <ul class="tags" style="display:none;">
212
+ <li>
213
+ <a href="/categories/ruby">Ruby</a>
214
+ </li>
215
+ <li>
216
+ <a href="/categories/java">Java</a>
217
+ </li>
218
+ <li>
219
+ <a href="/categories/python">Python</a>
220
+ </li>
221
+ <li>
222
+ <a href="/categories/clojure">Clojure</a>
223
+ </li>
224
+ <li>
225
+ <a href="/categories/scala">Scala</a>
226
+ </li>
227
+ <li>
228
+ <a href="/categories/nodejs">Node.js</a>
229
+ </li>
230
+ </ul>
231
+ </li>
232
+ <li class="category-group">
233
+ <a class="category" href="#">Tutorials</a>
234
+
235
+ <ul class="tags" style="display:none;">
236
+ <li>
237
+ <a href="/categories/features">Adding Features</a>
238
+ </li>
239
+ <li>
240
+ <a href="/categories/facebook">Facebook</a>
241
+ </li>
242
+ <li>
243
+ <a href="/categories/mobile">Mobile</a>
244
+ </li>
245
+ <li>
246
+ <a href="/categories/database">Database</a>
247
+ </li>
248
+ </ul>
249
+ </li>
250
+ <li class="category-group">
251
+ <a class="category" href="#">Accounts &amp; Billing</a>
252
+
253
+ <ul class="tags" style="display:none;">
254
+ <li>
255
+ <a href="/categories/billing">Accounts &amp; Billing</a>
256
+ </li>
257
+ <li>
258
+ <a href="/categories/support">Support</a>
259
+ </li>
260
+ </ul>
261
+ </li>
262
+ <li class="category-group">
263
+ <a class="category" href="#">Add-ons</a>
264
+
265
+ <ul class="tags" style="display:none;">
266
+ <li>
267
+ <a href="/categories/heroku-postgres">Heroku Postgres</a>
268
+ </li>
269
+ <li>
270
+ <a href="/categories/addon-overview">Overview</a>
271
+ </li>
272
+ <li>
273
+ <a href="/categories/add-on-documentation">All Add-ons</a>
274
+ </li>
275
+ </ul>
276
+ </li>
277
+ </ul></aside><section id="main"><div id="admin-tabs"></div>
278
+
279
+
280
+
281
+ <article><hgroup><h1><!-- article-title --></h1>
282
+
283
+
284
+
285
+ <p class="meta">
286
+ Local edition.
287
+ </p>
288
+
289
+ </hgroup>
290
+
291
+ <!-- article-html -->
292
+
293
+ </article>
294
+ </section>
295
+ </div>
296
+
297
+
298
+ </body>
299
+ </html>
@@ -0,0 +1,87 @@
1
+ # encoding: utf-8
2
+ require 'maruku'
3
+ require 'nokogiri'
4
+ require 'coderay'
5
+
6
+ module Devcenter::MdParser
7
+ class InvalidMarkdownError < Exception; end
8
+ class InvalidRawHTMLError < Exception; end
9
+
10
+ def self.highlight(html)
11
+ element = "pre>code"
12
+ pattern = /\A\s*:::(\w+)\s*\n/i
13
+
14
+ doc = Nokogiri::HTML(html, nil, 'UTF-8')
15
+ nodes = doc.search(element)
16
+ nodes.each do |node|
17
+ s = node.inner_html || "[++where is the code?++]"
18
+ highlighted = to_coderay(s, pattern)
19
+ node.parent.swap(highlighted)
20
+ end
21
+ doc.to_html
22
+ end
23
+
24
+ def self.unescape_html(string)
25
+ string.to_s.gsub(/&#x000A;/i, "\n").gsub("&lt;", '<').gsub("&gt;", '>').gsub("&amp;", '&')
26
+ end
27
+
28
+ def self.to_coderay(string, pattern)
29
+ lang = 'unknown'
30
+ refs = pattern.match(string) # extract language name
31
+ if refs
32
+ lang = refs[1]
33
+ str = unescape_html(string.sub(pattern, ""))
34
+ "<pre class='CodeRay'>#{::CodeRay.encoder(:html).encode str, lang}</pre>"
35
+ else
36
+ "<pre class='CodeRay'>#{string}</pre>"
37
+ end
38
+ end
39
+
40
+ def self.to_html(markdown)
41
+ html = Maruku.new(markdown, :on_error => :raise).to_html
42
+ verify_raw_html(html)
43
+ html = underscores_to_dashes_in_subheader_anchors(html)
44
+ highlight(html)
45
+ rescue InvalidRawHTMLError => e
46
+ raise InvalidMarkdownError, e.message
47
+ rescue => e
48
+ raise InvalidMarkdownError, parse_maruku_error(e.message)
49
+ end
50
+
51
+ def self.underscores_to_dashes_in_subheader_anchors(html)
52
+ doc = Nokogiri::HTML::DocumentFragment.parse(html)
53
+ doc.css("h2,h3,h4,h5,h6").each do |node|
54
+ if node.attributes['id'] && node.attributes['id'].value
55
+ node.attributes['id'].value = node.attributes['id'].value.gsub(/_+/,'-')
56
+ end
57
+ end
58
+ doc.to_html
59
+ end
60
+
61
+ def self.valid_markdown?(markdown)
62
+ return true, to_html(markdown)
63
+ rescue InvalidMarkdownError => e
64
+ return false, e.message
65
+ end
66
+
67
+ def self.verify_raw_html(html)
68
+ raise(InvalidRawHTMLError, parse_raw_html_error(html)) if invalid_raw_html?(html)
69
+ end
70
+
71
+ def self.invalid_raw_html?(html)
72
+ html.to_s.include?('markdown-html-error')
73
+ end
74
+
75
+ def self.parse_maruku_error(error_message)
76
+ lines = error_message.to_s.split("\n")
77
+ return lines unless lines.size > 1
78
+ msg = lines[4].gsub(/\A\|(\s)+|EOF\Z/,'').strip
79
+ code = lines[6].gsub(/\A\|(\s)+|EOF\Z/,'').strip
80
+ "#{msg} in \"#{code}\""
81
+ end
82
+
83
+ def self.parse_raw_html_error(html)
84
+ broken_html = html.match(/REXML could not parse this XML\/HTML\:(.+)<\/pre>/m)[1].strip rescue nil
85
+ broken_html.blank? ? "Contains broken raw HTML." : "This raw HTML is invalid: #{CGI.unescapeHTML(broken_html)}"
86
+ end
87
+ end
@@ -0,0 +1,36 @@
1
+ # encoding: utf-8
2
+ require_relative 'previewer/web_app'
3
+ require_relative 'previewer/web_server'
4
+ require_relative 'md_parser'
5
+ require_relative 'previewer/file_listener'
6
+
7
+ module Devcenter::Previewer
8
+
9
+ extend self
10
+
11
+ def preview(slug, md_path, host, port)
12
+ server = WebServer.new(host, port, WebApp, true)
13
+ file_listener_callback = Proc.new do |modified, added, removed|
14
+ WebApp.send_server_event
15
+ end
16
+
17
+ listener = FileListener.new(md_path, file_listener_callback)
18
+
19
+ [:INT, :TERM].each do |signal|
20
+ trap(signal) do
21
+ listener.stop
22
+ server.stop
23
+ say "\nPreview finished."
24
+ exit
25
+ end
26
+ end
27
+ listener.start
28
+ url = "http://#{host}:#{port}/#{slug}"
29
+ say "\nLive preview for #{slug} available in #{url}"
30
+ say "It will refresh when you save #{md_path}"
31
+ say "Press Ctrl+C to exit...\n"
32
+ Launchy.open(url)
33
+ server.start
34
+ end
35
+
36
+ end