utopia 2.13.4 → 2.14.0

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 (353) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/development.yml +62 -0
  3. data/README.md +3 -5
  4. data/bake/utopia/yarn.rb +4 -2
  5. data/docs/_components/jquery-litebox/jquery.litebox.css +23 -0
  6. data/docs/_components/jquery-litebox/jquery.litebox.gallery.css +48 -0
  7. data/docs/_components/jquery-litebox/jquery.litebox.js +30 -0
  8. data/docs/_components/jquery-syntax/base/jquery.syntax.brush.apache.css +6 -0
  9. data/docs/_components/jquery-syntax/base/jquery.syntax.brush.bash.css +4 -10
  10. data/docs/_components/jquery-syntax/base/jquery.syntax.brush.clang.css +5 -2
  11. data/docs/_components/jquery-syntax/base/jquery.syntax.brush.diff.css +8 -8
  12. data/docs/_components/jquery-syntax/base/jquery.syntax.brush.ruby.css +1 -1
  13. data/docs/_components/jquery-syntax/base/jquery.syntax.core.css +43 -47
  14. data/docs/_components/jquery-syntax/jquery.syntax.brush.apache.js +3 -41
  15. data/docs/_components/jquery-syntax/jquery.syntax.brush.applescript.js +5 -57
  16. data/docs/_components/jquery-syntax/jquery.syntax.brush.assembly.js +3 -37
  17. data/docs/_components/jquery-syntax/jquery.syntax.brush.bash-script.js +4 -67
  18. data/docs/_components/jquery-syntax/jquery.syntax.brush.bash.js +2 -33
  19. data/docs/_components/jquery-syntax/jquery.syntax.brush.basic.js +5 -51
  20. data/docs/_components/jquery-syntax/jquery.syntax.brush.clang.js +5 -89
  21. data/docs/_components/jquery-syntax/jquery.syntax.brush.csharp.js +4 -47
  22. data/docs/_components/jquery-syntax/jquery.syntax.brush.css.js +5 -80
  23. data/docs/_components/jquery-syntax/jquery.syntax.brush.diff.js +2 -24
  24. data/docs/_components/jquery-syntax/jquery.syntax.brush.go.js +3 -47
  25. data/docs/_components/jquery-syntax/jquery.syntax.brush.haskell.js +3 -45
  26. data/docs/_components/jquery-syntax/jquery.syntax.brush.html.js +4 -66
  27. data/docs/_components/jquery-syntax/jquery.syntax.brush.io.js +3 -45
  28. data/docs/_components/jquery-syntax/jquery.syntax.brush.java.js +4 -45
  29. data/docs/_components/jquery-syntax/jquery.syntax.brush.javascript.js +3 -40
  30. data/docs/_components/jquery-syntax/jquery.syntax.brush.kai.js +2 -29
  31. data/docs/_components/jquery-syntax/jquery.syntax.brush.lisp.js +2 -34
  32. data/docs/_components/jquery-syntax/jquery.syntax.brush.lua.js +3 -44
  33. data/docs/_components/jquery-syntax/jquery.syntax.brush.nginx.js +2 -31
  34. data/docs/_components/jquery-syntax/jquery.syntax.brush.ocaml.js +4 -73
  35. data/docs/_components/jquery-syntax/jquery.syntax.brush.ooc.js +4 -46
  36. data/docs/_components/jquery-syntax/jquery.syntax.brush.pascal.js +4 -51
  37. data/docs/_components/jquery-syntax/jquery.syntax.brush.perl5.js +3 -52
  38. data/docs/_components/jquery-syntax/jquery.syntax.brush.php-script.js +4 -48
  39. data/docs/_components/jquery-syntax/jquery.syntax.brush.php.js +2 -15
  40. data/docs/_components/jquery-syntax/jquery.syntax.brush.plain.js +2 -10
  41. data/docs/_components/jquery-syntax/jquery.syntax.brush.protobuf.js +3 -43
  42. data/docs/_components/jquery-syntax/jquery.syntax.brush.python.js +5 -44
  43. data/docs/_components/jquery-syntax/jquery.syntax.brush.ruby.js +5 -77
  44. data/docs/_components/jquery-syntax/jquery.syntax.brush.scala.js +4 -44
  45. data/docs/_components/jquery-syntax/jquery.syntax.brush.smalltalk.js +2 -29
  46. data/docs/_components/jquery-syntax/jquery.syntax.brush.sql.js +4 -31
  47. data/docs/_components/jquery-syntax/jquery.syntax.brush.super-collider.js +3 -57
  48. data/docs/_components/jquery-syntax/jquery.syntax.brush.swift.js +3 -55
  49. data/docs/_components/jquery-syntax/jquery.syntax.brush.trenni.js +2 -35
  50. data/docs/_components/jquery-syntax/jquery.syntax.brush.xml.js +4 -50
  51. data/docs/_components/jquery-syntax/jquery.syntax.brush.yaml.js +2 -29
  52. data/docs/_components/jquery-syntax/jquery.syntax.cache.js +7 -65
  53. data/docs/_components/jquery-syntax/jquery.syntax.core.js +34 -1098
  54. data/docs/_components/jquery-syntax/jquery.syntax.editor.js +11 -291
  55. data/docs/_components/jquery-syntax/jquery.syntax.js +8 -258
  56. data/docs/_components/jquery/jquery.js +1678 -1026
  57. data/docs/_components/jquery/jquery.min.js +2 -4
  58. data/docs/_components/jquery/jquery.min.map +1 -1
  59. data/docs/_components/jquery/jquery.slim.js +1602 -932
  60. data/docs/_components/jquery/jquery.slim.min.js +2 -4
  61. data/docs/_components/jquery/jquery.slim.min.map +1 -1
  62. data/docs/_static/icon.png +0 -0
  63. data/docs/_static/site.css +100 -114
  64. data/docs/{wiki/development-environment-setup.html → development-environment-setup/index.html} +9 -15
  65. data/docs/{wiki/faq/what-is-xnode.html → faq/what-is-xnode/index.html} +9 -15
  66. data/docs/index.html +25 -31
  67. data/docs/javascript/index.html +108 -0
  68. data/docs/{wiki/middleware/content.html → middleware/content/index.html} +9 -15
  69. data/docs/{wiki/middleware/controller/actions.html → middleware/controller/actions/index.html} +11 -17
  70. data/docs/{wiki/middleware/controller.html → middleware/controller/index.html} +9 -15
  71. data/docs/{wiki/middleware/controller/rewrite.html → middleware/controller/rewrite/index.html} +9 -15
  72. data/docs/{wiki/middleware/localization.html → middleware/localization/index.html} +9 -15
  73. data/docs/{wiki/middleware/redirection.html → middleware/redirection/index.html} +9 -15
  74. data/docs/{wiki/middleware/session.html → middleware/session/index.html} +9 -15
  75. data/docs/{wiki/middleware/static.html → middleware/static/index.html} +9 -15
  76. data/docs/{wiki/server-setup.html → server-setup/index.html} +11 -42
  77. data/docs/{wiki/testing.html → testing/index.html} +10 -16
  78. data/docs/{wiki/updating-utopia.html → updating-utopia/index.html} +9 -15
  79. data/docs/{wiki/your-first-page.html → your-first-page/index.html} +11 -17
  80. data/lib/utopia/content.rb +23 -19
  81. data/lib/utopia/content/link.rb +29 -34
  82. data/lib/utopia/content/links.rb +185 -123
  83. data/lib/utopia/content/node.rb +13 -17
  84. data/lib/utopia/content/response.rb +2 -2
  85. data/lib/utopia/localization.rb +18 -10
  86. data/lib/utopia/path.rb +36 -32
  87. data/lib/utopia/version.rb +1 -1
  88. data/setup/site/Gemfile +7 -5
  89. data/spec/utopia/command_spec.rb +1 -1
  90. data/spec/utopia/content/links/bar/index.xnode +0 -0
  91. data/spec/utopia/content/links/bar/parent/child/index.en.xnode +0 -0
  92. data/spec/utopia/content/links/bar/parent/child/index.ja.xnode +0 -0
  93. data/spec/utopia/content/links/bar/parent/links.yaml +2 -0
  94. data/spec/utopia/content/links/index.xnode +0 -0
  95. data/spec/utopia/content/links/links.yaml +10 -1
  96. data/spec/utopia/content/links/redirect/links.yaml +2 -0
  97. data/spec/utopia/content/links_spec.rb +160 -43
  98. data/spec/utopia/content/localized/links.yaml +2 -5
  99. data/spec/utopia/content/node_spec.rb +1 -1
  100. data/spec/utopia/path_spec.rb +50 -5
  101. data/wiki/Gemfile +9 -0
  102. data/wiki/config.ru +7 -0
  103. data/{documentation/pages/wiki/development-environment-setup/content.md → wiki/pages/development-environment-setup/index.md} +0 -0
  104. data/wiki/pages/faq/links.yaml +2 -0
  105. data/{documentation/pages/wiki/faq/what-is-xnode/content.md → wiki/pages/faq/what-is-xnode/index.md} +1 -1
  106. data/wiki/pages/faq/what-is-xnode/links.yaml +2 -0
  107. data/{documentation/pages/wiki/content.md → wiki/pages/index.md} +2 -2
  108. data/{documentation/pages/wiki/javascript/content.md → wiki/pages/javascript/index.md} +15 -13
  109. data/wiki/pages/javascript/links.yaml +2 -0
  110. data/wiki/pages/links.yaml +2 -0
  111. data/{documentation/pages/wiki/middleware/content/content.md → wiki/pages/middleware/content/index.md} +0 -0
  112. data/{documentation/pages/wiki/middleware/controller/actions/content.md → wiki/pages/middleware/controller/actions/index.md} +2 -2
  113. data/{documentation/pages/wiki/middleware/controller/content.md → wiki/pages/middleware/controller/index.md} +0 -0
  114. data/{documentation/pages/wiki → wiki/pages}/middleware/controller/links.yaml +0 -0
  115. data/{documentation/pages/wiki/middleware/controller/rewrite/content.md → wiki/pages/middleware/controller/rewrite/index.md} +0 -0
  116. data/{documentation/pages/wiki/middleware/localization/content.md → wiki/pages/middleware/localization/index.md} +0 -0
  117. data/{documentation/pages/wiki/middleware/redirection/content.md → wiki/pages/middleware/redirection/index.md} +0 -0
  118. data/{documentation/pages/wiki/middleware/session/content.md → wiki/pages/middleware/session/index.md} +0 -0
  119. data/{documentation/pages/wiki/middleware/static/content.md → wiki/pages/middleware/static/index.md} +0 -0
  120. data/{documentation/pages/wiki/server-setup/content.md → wiki/pages/server-setup/index.md} +0 -0
  121. data/{documentation/pages/wiki/testing/content.md → wiki/pages/testing/index.md} +0 -0
  122. data/{documentation/pages/wiki/updating-utopia/content.md → wiki/pages/updating-utopia/index.md} +0 -0
  123. data/{documentation/pages/wiki/your-first-page/content.md → wiki/pages/your-first-page/index.md} +2 -2
  124. metadata +56 -263
  125. data/.travis.yml +0 -28
  126. data/Rakefile +0 -33
  127. data/docs/_components/jquery/core.js +0 -482
  128. data/docs/_static/utopia-background.svg +0 -1
  129. data/docs/_static/utopia.svg +0 -1
  130. data/docs/code/Utopia.html +0 -517
  131. data/docs/code/Utopia/Basename.html +0 -654
  132. data/docs/code/Utopia/Bootstrap.html +0 -538
  133. data/docs/code/Utopia/Command.html +0 -213
  134. data/docs/code/Utopia/Command/Environment.html +0 -321
  135. data/docs/code/Utopia/Command/Server.html +0 -214
  136. data/docs/code/Utopia/Command/Server/Create.html +0 -222
  137. data/docs/code/Utopia/Command/Server/Environment.html +0 -236
  138. data/docs/code/Utopia/Command/Server/Update.html +0 -317
  139. data/docs/code/Utopia/Command/Setup.html +0 -145
  140. data/docs/code/Utopia/Command/Setup/Server.html +0 -298
  141. data/docs/code/Utopia/Command/Setup/Site.html +0 -180
  142. data/docs/code/Utopia/Command/Site.html +0 -285
  143. data/docs/code/Utopia/Command/Site/Create.html +0 -324
  144. data/docs/code/Utopia/Command/Site/Update.html +0 -407
  145. data/docs/code/Utopia/Command/Top.html +0 -279
  146. data/docs/code/Utopia/Content.html +0 -832
  147. data/docs/code/Utopia/Content/Document.html +0 -1822
  148. data/docs/code/Utopia/Content/Document/State.html +0 -1220
  149. data/docs/code/Utopia/Content/Link.html +0 -1286
  150. data/docs/code/Utopia/Content/Links.html +0 -847
  151. data/docs/code/Utopia/Content/MarkupParser.html +0 -881
  152. data/docs/code/Utopia/Content/MarkupParser/ParsedTag.html +0 -422
  153. data/docs/code/Utopia/Content/MarkupParser/UnbalancedTagError.html +0 -615
  154. data/docs/code/Utopia/Content/Namespace.html +0 -485
  155. data/docs/code/Utopia/Content/Node.html +0 -1188
  156. data/docs/code/Utopia/Content/Node/Context.html +0 -938
  157. data/docs/code/Utopia/Content/Response.html +0 -813
  158. data/docs/code/Utopia/Content/SymbolicHash.html +0 -419
  159. data/docs/code/Utopia/Content/Tag.html +0 -399
  160. data/docs/code/Utopia/Content/Tags.html +0 -136
  161. data/docs/code/Utopia/Content/Tags/ContentTag.html +0 -187
  162. data/docs/code/Utopia/Content/Tags/DeferredTag.html +0 -193
  163. data/docs/code/Utopia/Content/Tags/Library.html +0 -333
  164. data/docs/code/Utopia/Content/Tags/NodeTag.html +0 -193
  165. data/docs/code/Utopia/Content/UnbalancedTagError.html +0 -298
  166. data/docs/code/Utopia/ContentLength.html +0 -343
  167. data/docs/code/Utopia/Controller.html +0 -907
  168. data/docs/code/Utopia/Controller/Actions.html +0 -289
  169. data/docs/code/Utopia/Controller/Actions/Action.html +0 -984
  170. data/docs/code/Utopia/Controller/Actions/ClassMethods.html +0 -442
  171. data/docs/code/Utopia/Controller/Base.html +0 -1216
  172. data/docs/code/Utopia/Controller/Respond.html +0 -293
  173. data/docs/code/Utopia/Controller/Respond/ClassMethods.html +0 -236
  174. data/docs/code/Utopia/Controller/Respond/Converter.html +0 -256
  175. data/docs/code/Utopia/Controller/Respond/Converter/Callback.html +0 -484
  176. data/docs/code/Utopia/Controller/Respond/Converter/ToJSON.html +0 -381
  177. data/docs/code/Utopia/Controller/Respond/Passthrough.html +0 -297
  178. data/docs/code/Utopia/Controller/Respond/Responder.html +0 -535
  179. data/docs/code/Utopia/Controller/Rewrite.html +0 -290
  180. data/docs/code/Utopia/Controller/Rewrite/ClassMethods.html +0 -242
  181. data/docs/code/Utopia/Controller/Rewrite/ExtractPrefixRule.html +0 -364
  182. data/docs/code/Utopia/Controller/Rewrite/Rewriter.html +0 -464
  183. data/docs/code/Utopia/Controller/Rewrite/Rule.html +0 -209
  184. data/docs/code/Utopia/Controller/Variables.html +0 -550
  185. data/docs/code/Utopia/Controllers.html +0 -244
  186. data/docs/code/Utopia/Exceptions.html +0 -127
  187. data/docs/code/Utopia/Exceptions/Handler.html +0 -526
  188. data/docs/code/Utopia/Exceptions/Mailer.html +0 -482
  189. data/docs/code/Utopia/Extensions.html +0 -117
  190. data/docs/code/Utopia/Extensions/ArraySplit.html +0 -183
  191. data/docs/code/Utopia/Extensions/DateTimeComparison.html +0 -193
  192. data/docs/code/Utopia/Extensions/TimeDateComparison.html +0 -193
  193. data/docs/code/Utopia/HTTP.html +0 -250
  194. data/docs/code/Utopia/HTTP/Status.html +0 -415
  195. data/docs/code/Utopia/Locale.html +0 -606
  196. data/docs/code/Utopia/Localization.html +0 -1241
  197. data/docs/code/Utopia/Localization/Wrapper.html +0 -459
  198. data/docs/code/Utopia/Logger.html +0 -205
  199. data/docs/code/Utopia/Logger/CompactFormatter.html +0 -335
  200. data/docs/code/Utopia/Path.html +0 -3310
  201. data/docs/code/Utopia/Path/Matcher.html +0 -518
  202. data/docs/code/Utopia/Path/Matcher/MatchData.html +0 -475
  203. data/docs/code/Utopia/Redirection.html +0 -151
  204. data/docs/code/Utopia/Redirection/ClientRedirect.html +0 -717
  205. data/docs/code/Utopia/Redirection/DirectoryIndex.html +0 -298
  206. data/docs/code/Utopia/Redirection/Errors.html +0 -476
  207. data/docs/code/Utopia/Redirection/Moved.html +0 -312
  208. data/docs/code/Utopia/Redirection/RequestFailure.html +0 -226
  209. data/docs/code/Utopia/Redirection/Rewrite.html +0 -296
  210. data/docs/code/Utopia/Session.html +0 -889
  211. data/docs/code/Utopia/Session/LazyHash.html +0 -859
  212. data/docs/code/Utopia/Setup.html +0 -970
  213. data/docs/code/Utopia/Static.html +0 -696
  214. data/docs/code/Utopia/Static/LocalFile.html +0 -1104
  215. data/docs/code/Utopia/Static/MimeTypeLoader.html +0 -541
  216. data/docs/code/Utopia/Static/MimeTypeLoader/ExpansionError.html +0 -124
  217. data/docs/code/Utopia/Tags.html +0 -115
  218. data/docs/code/Utopia/Tags/Environment.html +0 -314
  219. data/docs/code/Utopia/Tags/EnvironmentTag.html +0 -314
  220. data/docs/code/Utopia/Tags/Library.html +0 -340
  221. data/docs/code/_index.html +0 -758
  222. data/docs/code/class_list.html +0 -51
  223. data/docs/code/css/common.css +0 -1
  224. data/docs/code/css/full_list.css +0 -58
  225. data/docs/code/css/style.css +0 -496
  226. data/docs/code/file.README.html +0 -171
  227. data/docs/code/file_list.html +0 -56
  228. data/docs/code/frames.html +0 -17
  229. data/docs/code/index.html +0 -171
  230. data/docs/code/js/app.js +0 -292
  231. data/docs/code/js/full_list.js +0 -216
  232. data/docs/code/js/jquery.js +0 -4
  233. data/docs/code/materials/utopia.png +0 -0
  234. data/docs/code/materials/utopia.svg +0 -1
  235. data/docs/code/method_list.html +0 -3443
  236. data/docs/code/top-level-namespace.html +0 -110
  237. data/docs/wiki.html +0 -92
  238. data/docs/wiki/development-environment-setup/index.html +0 -60
  239. data/docs/wiki/edit.html +0 -103
  240. data/docs/wiki/faq/what-is-xnode/index.html +0 -79
  241. data/docs/wiki/javascript.html +0 -153
  242. data/docs/wiki/javascript/index.html +0 -153
  243. data/docs/wiki/middleware/content/index.html +0 -64
  244. data/docs/wiki/middleware/controller/actions/index.html +0 -117
  245. data/docs/wiki/middleware/controller/actions/rewrite/index.html +0 -48
  246. data/docs/wiki/middleware/controller/index.html +0 -104
  247. data/docs/wiki/middleware/controller/rewrite/index.html +0 -111
  248. data/docs/wiki/middleware/localization/index.html +0 -59
  249. data/docs/wiki/middleware/redirection/index.html +0 -61
  250. data/docs/wiki/middleware/session/index.html +0 -71
  251. data/docs/wiki/middleware/static/index.html +0 -57
  252. data/docs/wiki/server-setup/index.html +0 -118
  253. data/docs/wiki/testing/index.html +0 -59
  254. data/docs/wiki/updating-utopia/index.html +0 -108
  255. data/docs/wiki/your-first-page/index.html +0 -80
  256. data/documentation/.rspec +0 -4
  257. data/documentation/.yarnrc +0 -1
  258. data/documentation/Gemfile +0 -19
  259. data/documentation/Guardfile +0 -9
  260. data/documentation/Rakefile +0 -9
  261. data/documentation/config.ru +0 -41
  262. data/documentation/config/README.md +0 -7
  263. data/documentation/config/environment.rb +0 -12
  264. data/documentation/lib/readme.txt +0 -1
  265. data/documentation/pages/_editor.xnode +0 -64
  266. data/documentation/pages/_heading.xnode +0 -2
  267. data/documentation/pages/_page.xnode +0 -40
  268. data/documentation/pages/errors/exception.xnode +0 -5
  269. data/documentation/pages/errors/file-not-found.xnode +0 -5
  270. data/documentation/pages/links.yaml +0 -2
  271. data/documentation/pages/wiki/_listing.xnode +0 -32
  272. data/documentation/pages/wiki/_navigation.xnode +0 -15
  273. data/documentation/pages/wiki/controller.rb +0 -48
  274. data/documentation/pages/wiki/edit.xnode +0 -10
  275. data/documentation/pages/wiki/links.yaml +0 -6
  276. data/documentation/pages/wiki/show.xnode +0 -12
  277. data/documentation/public/_components/jquery-syntax/base/jquery.syntax.brush.apache.css +0 -6
  278. data/documentation/public/_components/jquery-syntax/base/jquery.syntax.brush.applescript.css +0 -5
  279. data/documentation/public/_components/jquery-syntax/base/jquery.syntax.brush.assembly.css +0 -8
  280. data/documentation/public/_components/jquery-syntax/base/jquery.syntax.brush.bash-script.css +0 -6
  281. data/documentation/public/_components/jquery-syntax/base/jquery.syntax.brush.bash.css +0 -10
  282. data/documentation/public/_components/jquery-syntax/base/jquery.syntax.brush.clang.css +0 -3
  283. data/documentation/public/_components/jquery-syntax/base/jquery.syntax.brush.css.css +0 -14
  284. data/documentation/public/_components/jquery-syntax/base/jquery.syntax.brush.diff.css +0 -16
  285. data/documentation/public/_components/jquery-syntax/base/jquery.syntax.brush.html.css +0 -5
  286. data/documentation/public/_components/jquery-syntax/base/jquery.syntax.brush.ocaml.css +0 -3
  287. data/documentation/public/_components/jquery-syntax/base/jquery.syntax.brush.protobuf.css +0 -2
  288. data/documentation/public/_components/jquery-syntax/base/jquery.syntax.brush.python.css +0 -6
  289. data/documentation/public/_components/jquery-syntax/base/jquery.syntax.brush.ruby.css +0 -2
  290. data/documentation/public/_components/jquery-syntax/base/jquery.syntax.brush.xml.css +0 -18
  291. data/documentation/public/_components/jquery-syntax/base/jquery.syntax.core.css +0 -62
  292. data/documentation/public/_components/jquery-syntax/base/jquery.syntax.editor.css +0 -6
  293. data/documentation/public/_components/jquery-syntax/base/theme.js +0 -1
  294. data/documentation/public/_components/jquery-syntax/bright/jquery.syntax.core.css +0 -27
  295. data/documentation/public/_components/jquery-syntax/bright/theme.js +0 -1
  296. data/documentation/public/_components/jquery-syntax/jquery.syntax.brush.apache.js +0 -41
  297. data/documentation/public/_components/jquery-syntax/jquery.syntax.brush.applescript.js +0 -57
  298. data/documentation/public/_components/jquery-syntax/jquery.syntax.brush.assembly.js +0 -37
  299. data/documentation/public/_components/jquery-syntax/jquery.syntax.brush.bash-script.js +0 -67
  300. data/documentation/public/_components/jquery-syntax/jquery.syntax.brush.bash.js +0 -33
  301. data/documentation/public/_components/jquery-syntax/jquery.syntax.brush.basic.js +0 -51
  302. data/documentation/public/_components/jquery-syntax/jquery.syntax.brush.clang.js +0 -89
  303. data/documentation/public/_components/jquery-syntax/jquery.syntax.brush.csharp.js +0 -47
  304. data/documentation/public/_components/jquery-syntax/jquery.syntax.brush.css.js +0 -80
  305. data/documentation/public/_components/jquery-syntax/jquery.syntax.brush.diff.js +0 -24
  306. data/documentation/public/_components/jquery-syntax/jquery.syntax.brush.go.js +0 -47
  307. data/documentation/public/_components/jquery-syntax/jquery.syntax.brush.haskell.js +0 -45
  308. data/documentation/public/_components/jquery-syntax/jquery.syntax.brush.html.js +0 -66
  309. data/documentation/public/_components/jquery-syntax/jquery.syntax.brush.io.js +0 -45
  310. data/documentation/public/_components/jquery-syntax/jquery.syntax.brush.java.js +0 -45
  311. data/documentation/public/_components/jquery-syntax/jquery.syntax.brush.javascript.js +0 -40
  312. data/documentation/public/_components/jquery-syntax/jquery.syntax.brush.kai.js +0 -29
  313. data/documentation/public/_components/jquery-syntax/jquery.syntax.brush.lisp.js +0 -34
  314. data/documentation/public/_components/jquery-syntax/jquery.syntax.brush.lua.js +0 -44
  315. data/documentation/public/_components/jquery-syntax/jquery.syntax.brush.nginx.js +0 -31
  316. data/documentation/public/_components/jquery-syntax/jquery.syntax.brush.ocaml.js +0 -73
  317. data/documentation/public/_components/jquery-syntax/jquery.syntax.brush.ooc.js +0 -46
  318. data/documentation/public/_components/jquery-syntax/jquery.syntax.brush.pascal.js +0 -51
  319. data/documentation/public/_components/jquery-syntax/jquery.syntax.brush.perl5.js +0 -52
  320. data/documentation/public/_components/jquery-syntax/jquery.syntax.brush.php-script.js +0 -48
  321. data/documentation/public/_components/jquery-syntax/jquery.syntax.brush.php.js +0 -15
  322. data/documentation/public/_components/jquery-syntax/jquery.syntax.brush.plain.js +0 -10
  323. data/documentation/public/_components/jquery-syntax/jquery.syntax.brush.protobuf.js +0 -43
  324. data/documentation/public/_components/jquery-syntax/jquery.syntax.brush.python.js +0 -44
  325. data/documentation/public/_components/jquery-syntax/jquery.syntax.brush.ruby.js +0 -77
  326. data/documentation/public/_components/jquery-syntax/jquery.syntax.brush.scala.js +0 -44
  327. data/documentation/public/_components/jquery-syntax/jquery.syntax.brush.smalltalk.js +0 -29
  328. data/documentation/public/_components/jquery-syntax/jquery.syntax.brush.sql.js +0 -31
  329. data/documentation/public/_components/jquery-syntax/jquery.syntax.brush.super-collider.js +0 -57
  330. data/documentation/public/_components/jquery-syntax/jquery.syntax.brush.swift.js +0 -55
  331. data/documentation/public/_components/jquery-syntax/jquery.syntax.brush.trenni.js +0 -35
  332. data/documentation/public/_components/jquery-syntax/jquery.syntax.brush.xml.js +0 -50
  333. data/documentation/public/_components/jquery-syntax/jquery.syntax.brush.yaml.js +0 -29
  334. data/documentation/public/_components/jquery-syntax/jquery.syntax.cache.js +0 -65
  335. data/documentation/public/_components/jquery-syntax/jquery.syntax.core.js +0 -1098
  336. data/documentation/public/_components/jquery-syntax/jquery.syntax.editor.js +0 -291
  337. data/documentation/public/_components/jquery-syntax/jquery.syntax.js +0 -258
  338. data/documentation/public/_components/jquery-syntax/jquery.syntax.min.js +0 -13
  339. data/documentation/public/_components/jquery-syntax/paper/jquery.syntax.core.css +0 -31
  340. data/documentation/public/_components/jquery-syntax/paper/theme.js +0 -1
  341. data/documentation/public/_components/jquery/core.js +0 -482
  342. data/documentation/public/_components/jquery/jquery.js +0 -10220
  343. data/documentation/public/_components/jquery/jquery.min.js +0 -4
  344. data/documentation/public/_components/jquery/jquery.min.map +0 -1
  345. data/documentation/public/_components/jquery/jquery.slim.js +0 -8107
  346. data/documentation/public/_components/jquery/jquery.slim.min.js +0 -4
  347. data/documentation/public/_components/jquery/jquery.slim.min.map +0 -1
  348. data/documentation/public/_static +0 -1
  349. data/documentation/public/materials +0 -1
  350. data/documentation/spec/website_context.rb +0 -12
  351. data/documentation/spec/website_spec.rb +0 -16
  352. data/documentation/tasks +0 -1
  353. data/spec/utopia/content/link_spec.rb +0 -47
@@ -39,7 +39,7 @@ module Utopia
39
39
  self.content_type = "text/html; charset=utf-8"
40
40
  end
41
41
 
42
- attr :status
42
+ attr_accessor :status
43
43
  attr :headers
44
44
  attr :body
45
45
 
@@ -68,7 +68,7 @@ module Utopia
68
68
  @headers[EXPIRES] = (Time.now + duration).httpdate
69
69
  end
70
70
  end
71
-
71
+
72
72
  # Specify the content type of the response data.
73
73
  def content_type= value
74
74
  @headers[CONTENT_TYPE] = value
@@ -35,6 +35,10 @@ module Utopia
35
35
  @env[LOCALIZATION_KEY]
36
36
  end
37
37
 
38
+ def localized?
39
+ localization != nil
40
+ end
41
+
38
42
  # Returns the current locale or nil if not localized.
39
43
  def current_locale
40
44
  @env[CURRENT_LOCALE_KEY]
@@ -49,6 +53,10 @@ module Utopia
49
53
  def all_locales
50
54
  localization && localization.all_locales || []
51
55
  end
56
+
57
+ def localized_path(path, locale)
58
+ "/#{locale}#{path}"
59
+ end
52
60
  end
53
61
 
54
62
  def self.[] request
@@ -66,15 +74,19 @@ module Utopia
66
74
  # @param default_locales [String] The locales to try in order if none is provided.
67
75
  # @param hosts [Hash<Pattern, String>] Specify a mapping of the HTTP_HOST header to a given locale.
68
76
  # @param ignore [Array<Pattern>] A list of patterns matched against PATH_INFO which will not be localized.
69
- def initialize(app, locales:, default_locale: nil, default_locales: nil, hosts: {}, ignore: [], **options)
77
+ def initialize(app, locales:, default_locale: nil, default_locales: nil, hosts: {}, ignore: [])
70
78
  @app = app
71
79
 
72
80
  @all_locales = HTTP::Accept::Languages::Locales.new(locales)
73
81
 
74
82
  # Locales here are represented as an array of strings, e.g. ['en', 'ja', 'cn', 'de'] and are used in order if no locale is specified by the user.
75
83
  unless @default_locales = default_locales
76
- # We append nil, i.e. no localization.
77
- @default_locales = @all_locales.names + [nil]
84
+ if default_locale
85
+ @default_locales = [default_locale, nil]
86
+ else
87
+ # We append nil, i.e. no localization.
88
+ @default_locales = @all_locales.names + [nil]
89
+ end
78
90
  end
79
91
 
80
92
  @default_locale = default_locale || @default_locales.first
@@ -87,6 +99,8 @@ module Utopia
87
99
  @hosts = hosts
88
100
 
89
101
  @ignore = ignore || options[:nonlocalized]
102
+
103
+ @methods = methods
90
104
  end
91
105
 
92
106
  def freeze
@@ -166,13 +180,7 @@ module Utopia
166
180
  return []
167
181
  end
168
182
 
169
- SAFE_METHODS = ['GET', 'HEAD']
170
-
171
183
  def localized?(env)
172
- # Only SAFE_METHODS can be localized:
173
- request_method = env[Rack::REQUEST_METHOD]
174
- return false unless SAFE_METHODS.include?(request_method)
175
-
176
184
  # Ignore requests which match the ignored paths:
177
185
  path_info = env[Rack::PATH_INFO]
178
186
  return false if @ignore.any? { |pattern| path_info[pattern] != nil }
@@ -206,7 +214,7 @@ module Utopia
206
214
 
207
215
  # We have a non-localized request, but there might be a localized resource. We return the best localization possible:
208
216
  preferred_locales(env) do |localized_env|
209
- # puts "Trying locale: #{env[CURRENT_LOCALE_KEY]}: #{env[Rack::PATH_INFO]}..."
217
+ # puts "Trying locale: #{localized_env[CURRENT_LOCALE_KEY]}: #{localized_env[Rack::PATH_INFO]}..."
210
218
 
211
219
  response = @app.call(localized_env)
212
220
 
@@ -30,9 +30,9 @@ module Utopia
30
30
  def initialize(components = [])
31
31
  @components = components
32
32
  end
33
-
33
+
34
34
  attr_accessor :components
35
-
35
+
36
36
  def freeze
37
37
  @components.freeze
38
38
 
@@ -65,22 +65,22 @@ module Utopia
65
65
 
66
66
  return self.create([".."] * up + path.components[i..-1])
67
67
  end
68
-
68
+
69
69
  def shortest_path(root)
70
70
  self.class.shortest_path(self, root)
71
71
  end
72
-
72
+
73
73
  # Converts '+' into whitespace and hex encoded characters into their equivalent characters.
74
74
  def self.unescape(string)
75
75
  string.tr('+', ' ').gsub(/((?:%[0-9a-fA-F]{2})+)/n) {
76
76
  [$1.delete('%')].pack('H*')
77
77
  }
78
78
  end
79
-
79
+
80
80
  def self.[] path
81
81
  self.create(path)
82
82
  end
83
-
83
+
84
84
  def self.split(path)
85
85
  case path
86
86
  when Path
@@ -115,15 +115,17 @@ module Utopia
115
115
  return self.new(path)
116
116
  when String
117
117
  return self.new(unescape(path).split(SEPARATOR, -1))
118
+ when nil
119
+ return nil
118
120
  else
119
121
  return self.new([path])
120
122
  end
121
123
  end
122
-
124
+
123
125
  def replace(other_path)
124
126
  @components = other_path.components.dup
125
127
  end
126
-
128
+
127
129
  def include?(*args)
128
130
  @components.include?(*args)
129
131
  end
@@ -131,7 +133,7 @@ module Utopia
131
133
  def directory?
132
134
  return @components.last == ''
133
135
  end
134
-
136
+
135
137
  def to_directory
136
138
  if directory?
137
139
  return self
@@ -139,15 +141,15 @@ module Utopia
139
141
  return join([''])
140
142
  end
141
143
  end
142
-
144
+
143
145
  def relative?
144
146
  @components.first != ''
145
147
  end
146
-
148
+
147
149
  def absolute?
148
150
  @components.first == ''
149
151
  end
150
-
152
+
151
153
  def to_absolute
152
154
  if absolute?
153
155
  return self
@@ -155,11 +157,11 @@ module Utopia
155
157
  return self.class.new([''] + @components)
156
158
  end
157
159
  end
158
-
160
+
159
161
  def to_relative!
160
162
  @components.shift if relative?
161
163
  end
162
-
164
+
163
165
  def to_str
164
166
  if @components == ['']
165
167
  SEPARATOR
@@ -167,21 +169,21 @@ module Utopia
167
169
  @components.join(SEPARATOR)
168
170
  end
169
171
  end
170
-
172
+
171
173
  alias to_s to_str
172
174
 
173
175
  def to_a
174
176
  @components
175
177
  end
176
-
178
+
177
179
  def join(other)
178
180
  self.class.new(@components + other).simplify
179
181
  end
180
-
182
+
181
183
  def expand(root)
182
184
  root + self
183
185
  end
184
-
186
+
185
187
  def +(other)
186
188
  if other.kind_of? Path
187
189
  if other.absolute?
@@ -197,11 +199,11 @@ module Utopia
197
199
  return join([other.to_s])
198
200
  end
199
201
  end
200
-
202
+
201
203
  def with_prefix(*args)
202
204
  self.class.create(*args) + self
203
205
  end
204
-
206
+
205
207
  # Computes the difference of the path.
206
208
  # /a/b/c - /a/b -> c
207
209
  # a/b/c - a/b -> c
@@ -216,10 +218,10 @@ module Utopia
216
218
 
217
219
  return self.class.new(@components[i,@components.size])
218
220
  end
219
-
221
+
220
222
  def simplify
221
223
  result = absolute? ? [''] : []
222
-
224
+
223
225
  @components.each do |bit|
224
226
  if bit == ".."
225
227
  result.pop
@@ -227,18 +229,20 @@ module Utopia
227
229
  result << bit
228
230
  end
229
231
  end
230
-
232
+
231
233
  result << '' if directory?
232
234
 
233
235
  return self.class.new(result)
234
236
  end
235
-
237
+
238
+ # @return [String] the last path component without any file extension.
236
239
  def basename
237
240
  basename, _ = @components.last.split('.', 2)
238
241
 
239
242
  return basename || ''
240
243
  end
241
244
 
245
+ # @return [String] the last path component's file extension.
242
246
  def extension
243
247
  _, extension = @components.last.split('.', 2)
244
248
 
@@ -247,14 +251,14 @@ module Utopia
247
251
 
248
252
  def dirname(count = 1)
249
253
  path = self.class.new(@components[0...-count])
250
-
254
+
251
255
  return absolute? ? path.to_absolute : path
252
256
  end
253
-
254
- def to_local_path(separator = File::SEPARATOR)
257
+
258
+ def local_path(separator = File::SEPARATOR)
255
259
  @components.join(separator)
256
260
  end
257
-
261
+
258
262
  def descend(&block)
259
263
  return to_enum(:descend) unless block_given?
260
264
 
@@ -278,7 +282,7 @@ module Utopia
278
282
  components.pop
279
283
  end
280
284
  end
281
-
285
+
282
286
  def split(at)
283
287
  if at.kind_of? String
284
288
  at = @components.index(at)
@@ -290,15 +294,15 @@ module Utopia
290
294
  return nil
291
295
  end
292
296
  end
293
-
297
+
294
298
  def dup
295
299
  return Path.new(components.dup)
296
300
  end
297
-
301
+
298
302
  def <=> other
299
303
  @components <=> other.components
300
304
  end
301
-
305
+
302
306
  def eql? other
303
307
  self.class.eql?(other.class) and @components.eql?(other.components)
304
308
  end
@@ -21,5 +21,5 @@
21
21
  # THE SOFTWARE.
22
22
 
23
23
  module Utopia
24
- VERSION = "2.13.4"
24
+ VERSION = "2.14.0"
25
25
  end
@@ -2,15 +2,17 @@
2
2
 
3
3
  source 'https://rubygems.org'
4
4
 
5
- gem 'utopia', '~> $UTOPIA_VERSION'
6
- # gem 'utopia-gallery'
7
- # gem 'utopia-analytics'
5
+ group :preload do
6
+ gem 'utopia', '~> $UTOPIA_VERSION'
7
+ # gem 'utopia-gallery'
8
+ # gem 'utopia-analytics'
9
+
10
+ gem 'variant'
11
+ end
8
12
 
9
13
  gem 'rake'
10
14
  gem 'bake'
11
- gem 'variant'
12
15
  gem 'bundler'
13
-
14
16
  gem 'rack-test'
15
17
 
16
18
  group :development do
@@ -34,7 +34,7 @@ RSpec.describe "utopia command" do
34
34
 
35
35
  before(:all) do
36
36
  # We need to build a package to test deployment:
37
- system("rake", "build") or abort("Could not build package for setup spec!")
37
+ system("bundle", "exec", "bake", "bundler:build") or abort("Could not build package for setup spec!")
38
38
  end
39
39
 
40
40
  around(:each) do |example|
@@ -0,0 +1,2 @@
1
+ index:
2
+ title: "Parent?"
File without changes
@@ -2,8 +2,17 @@ welcome:
2
2
  order: 1
3
3
  title: "Welcome"
4
4
  uri: "/welcome"
5
+
5
6
  index:
6
7
  order: 0
8
+ title: "Home"
9
+
7
10
  # This metadata also gets merged with foo/links.yml#index
8
11
  foo:
9
- order: 2
12
+ order: 2
13
+
14
+ bar:
15
+ order: 3
16
+
17
+ redirect:
18
+ order: 4
@@ -0,0 +1,2 @@
1
+ index:
2
+ uri: https://www.codeotaku.com
@@ -27,75 +27,192 @@ RSpec.describe Utopia::Content::Links do
27
27
  let(:root) {File.expand_path("links", __dir__)}
28
28
  subject {described_class.new(root)}
29
29
 
30
- describe 'INDEX_XNODE_FILTER' do
31
- subject{Utopia::Content::Links::INDEX_XNODE_FILTER}
32
-
30
+ describe '#index_filter' do
33
31
  it "should match index" do
34
- expect("index.xnode").to match(subject)
32
+ expect("index.xnode").to match(subject.index_filter)
35
33
  end
36
34
 
37
35
  it "should not match invalid index" do
38
- expect("old-index.xnode").to_not match(subject)
36
+ expect("old-index.xnode").to_not match(subject.index_filter)
39
37
  end
40
38
  end
41
39
 
42
- it "should not match partial strings" do
43
- links = subject.index(Utopia::Path.create("/"), name: "come")
40
+ context 'matching name' do
41
+ it "can match named link" do
42
+ links = subject.index("/", name: "welcome")
43
+
44
+ expect(links.size).to be == 1
45
+ expect(links[0].name).to be == "welcome"
46
+ end
44
47
 
45
- expect(links).to be_empty
48
+ it "doesn't match partial names" do
49
+ links = subject.index("/", name: "come")
50
+
51
+ expect(links).to be_empty
52
+ end
46
53
  end
47
54
 
48
- it "should give a list of links" do
49
- links = subject.index(Utopia::Path.create("/"))
50
-
51
- expect(links.size).to be == 3
52
-
53
- expect(links[0].kind).to be == :virtual
54
- expect(links[0].href).to be == nil
55
-
56
- expect(links[1].title).to be == "Welcome"
57
- expect(links[1].to_href).to be == '<a class="link" href="/welcome">Welcome</a>'
58
- expect(links[1].kind).to be == :file
59
- expect(links[1].href).to be == "/welcome"
60
- expect(links[1].name).to be == 'welcome'
61
-
62
- expect(links[2].title).to be == 'Foo Bar'
63
- expect(links[2].kind).to be == :directory
64
- expect(links[2].href).to be == "/foo/index"
65
- expect(links[2].name).to be == 'foo'
66
-
67
- expect(links[1]).to be_eql links[1]
68
- expect(links[0]).to_not be_eql links[1]
55
+ context 'with name filter' do
56
+ it "should filter links by name" do
57
+ links = subject.index("/", name: /foo/)
58
+
59
+ expect(links.size).to be == 1
60
+ end
69
61
  end
70
62
 
71
- it "should filter links by name" do
72
- links = subject.index(Utopia::Path.create("/"), name: /foo/)
73
-
74
- expect(links.size).to be == 1
63
+ context 'without locale' do
64
+ it "should index all links" do
65
+ links = subject.index("/foo")
66
+ expect(links.size).to be == 2
67
+
68
+ expect(links[0].name).to be == "test"
69
+ expect(links[0].locale).to be == "de"
70
+
71
+ expect(links[1].name).to be == "test"
72
+ expect(links[1].locale).to be == "en"
73
+ end
75
74
  end
76
75
 
77
- it "should select localized links" do
78
- # Select both test links
79
- links = subject.index(Utopia::Path.create("/foo"))
80
- expect(links.size).to be == 2
81
-
82
- links = subject.index(Utopia::Path.create("/foo"), locale: 'en')
83
- expect(links.size).to be == 1
76
+ context 'with locale' do
77
+ it "should select localized links" do
78
+ links = subject.index("/foo", locale: 'en')
79
+ expect(links.size).to be == 1
80
+
81
+ expect(links[0].name).to be == "test"
82
+ expect(links[0].locale).to be == "en"
83
+ end
84
84
  end
85
85
 
86
- context 'localized links' do
86
+ context 'with localized links' do
87
87
  let(:root) {File.expand_path("localized", __dir__)}
88
88
 
89
89
  it "should read correct link order for en" do
90
- links = subject.index(Utopia::Path.create("/"), locale: 'en')
90
+ links = subject.index("/", locale: 'en')
91
91
 
92
92
  expect(links.collect(&:title)).to be == ['One', 'Two', 'Three', 'Four', 'Five']
93
93
  end
94
94
 
95
95
  it "should read correct link order for zh" do
96
- links = subject.index(Utopia::Path.create("/"), locale: 'zh')
96
+ links = subject.index("/", locale: 'zh')
97
97
 
98
98
  expect(links.collect(&:title)).to be == ['One', 'Two', 'Three', '四']
99
99
  end
100
100
  end
101
+
102
+ describe '#index' do
103
+ it "should give a list of links" do
104
+ links = subject.index("/")
105
+
106
+ expect(links.size).to be == 4
107
+
108
+ expect(links[0].title).to be == "Welcome"
109
+ expect(links[0].kind).to be == :file
110
+ expect(links[0].name).to be == 'welcome'
111
+ expect(links[0].locale).to be_nil
112
+ expect(links[0].path).to be == ['', 'welcome']
113
+ expect(links[0].href).to be == "/welcome"
114
+ expect(links[0].to_href).to be == '<a class="link" href="/welcome">Welcome</a>'
115
+
116
+ expect(links[1].title).to be == 'Foo Bar'
117
+ expect(links[1].kind).to be == :directory
118
+ expect(links[1].name).to be == 'foo'
119
+ expect(links[1].locale).to be_nil
120
+ expect(links[1].path).to be == ['', 'foo', 'index']
121
+ expect(links[1].href).to be == "/foo/index"
122
+
123
+ expect(links[2].title).to be == 'Bar'
124
+ expect(links[2].kind).to be == :directory
125
+ expect(links[2].name).to be == 'bar'
126
+ expect(links[2].locale).to be_nil
127
+ expect(links[2].path).to be == ['', 'bar', 'index']
128
+ expect(links[2].href).to be == "/bar/index"
129
+
130
+ expect(links[3].title).to be == 'Redirect'
131
+ expect(links[3].kind).to be == :directory
132
+ expect(links[3].name).to be == 'redirect'
133
+ expect(links[3].locale).to be_nil
134
+ expect(links[3].path).to be == ['', 'redirect']
135
+ expect(links[3].href).to be == "https://www.codeotaku.com"
136
+
137
+ expect(links[1]).to be_eql links[1]
138
+ expect(links[0]).to_not be_eql links[1]
139
+ end
140
+
141
+ it "can list directories" do
142
+ links = subject.index("/bar")
143
+
144
+ expect(links.size).to be == 1
145
+
146
+ expect(links[0].title).to be == "Parent?"
147
+ expect(links[0].kind).to be == :directory
148
+ expect(links[0].name).to be == "parent"
149
+ expect(links[0].locale).to be_nil
150
+ expect(links[0].path).to be == ['', 'bar', 'parent']
151
+ end
152
+
153
+ it "can list directories with multiple localized indexes" do
154
+ links = subject.index("/bar/parent").sort_by(&:locale)
155
+
156
+ expect(links.size).to be == 2
157
+
158
+ expect(links[0].title).to be == "Child"
159
+ expect(links[0].kind).to be == :directory
160
+ expect(links[0].name).to be == "child"
161
+ expect(links[0].locale).to be == 'en'
162
+ expect(links[0].path).to be == ['', 'bar', 'parent', 'child', 'index']
163
+
164
+ expect(links[1].title).to be == "Child"
165
+ expect(links[1].kind).to be == :directory
166
+ expect(links[1].name).to be == "child"
167
+ expect(links[1].locale).to be == 'ja'
168
+ expect(links[1].path).to be == ['', 'bar', 'parent', 'child', 'index']
169
+ end
170
+
171
+ it "can get title of /index" do
172
+ links = subject.index("/", indices: true, name: "index")
173
+
174
+ expect(links.size).to be 1
175
+
176
+ link = links.first
177
+
178
+ expect(link.title).to be == "Home"
179
+ end
180
+
181
+ it "can get title of /foo/index" do
182
+ links = subject.index("/foo", indices: true, name: "index")
183
+
184
+ expect(links.size).to be 1
185
+
186
+ link = links.first
187
+
188
+ expect(link.title).to be == "Foo Bar"
189
+ end
190
+
191
+ it "can get title of /bar/index" do
192
+ links = subject.index("/bar", indices: true, name: "index")
193
+
194
+ expect(links.size).to be 1
195
+
196
+ link = links.first
197
+
198
+ expect(link.title).to be == "Bar"
199
+ end
200
+ end
201
+
202
+ describe '#for' do
203
+ it "can get title of /index" do
204
+ link = subject.for(Utopia::Path["/index"])
205
+ expect(link.title).to be == "Home"
206
+ end
207
+
208
+ it "can get title of /foo/index" do
209
+ link = subject.for(Utopia::Path["/foo/index"])
210
+ expect(link.title).to be == "Foo Bar"
211
+ end
212
+
213
+ it "can get title of /bar/index" do
214
+ link = subject.for(Utopia::Path["/bar/index"])
215
+ expect(link.title).to be == "Bar"
216
+ end
217
+ end
101
218
  end