utopia 2.13.4 → 2.16.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 (486) hide show
  1. checksums.yaml +4 -4
  2. data/bake/utopia/{yarn.rb → node.rb} +13 -5
  3. data/lib/.DS_Store +0 -0
  4. data/lib/utopia/.DS_Store +0 -0
  5. data/lib/utopia/command.rb +2 -2
  6. data/lib/utopia/command/site.rb +1 -1
  7. data/lib/utopia/content.rb +23 -19
  8. data/lib/utopia/content/.DS_Store +0 -0
  9. data/lib/utopia/content/link.rb +29 -34
  10. data/lib/utopia/content/links.rb +185 -123
  11. data/lib/utopia/content/markup.rb +1 -1
  12. data/lib/utopia/content/node.rb +15 -19
  13. data/lib/utopia/content/response.rb +5 -5
  14. data/lib/utopia/controller.rb +0 -17
  15. data/lib/utopia/controller/.DS_Store +0 -0
  16. data/lib/utopia/controller/base.rb +27 -3
  17. data/lib/utopia/controller/respond.rb +50 -107
  18. data/lib/utopia/extensions/array_split.rb +2 -2
  19. data/lib/utopia/http.rb +3 -3
  20. data/lib/utopia/localization.rb +18 -10
  21. data/lib/utopia/middleware.rb +2 -2
  22. data/lib/utopia/path.rb +40 -36
  23. data/lib/utopia/redirection.rb +0 -2
  24. data/lib/utopia/responder.rb +76 -0
  25. data/lib/utopia/version.rb +1 -1
  26. data/setup/.DS_Store +0 -0
  27. data/setup/server/.DS_Store +0 -0
  28. data/setup/site/.DS_Store +0 -0
  29. data/setup/site/.gitignore +8 -7
  30. data/setup/site/Gemfile +7 -5
  31. data/setup/site/pages/.DS_Store +0 -0
  32. data/setup/site/public/.DS_Store +0 -0
  33. metadata +81 -603
  34. data/.codeclimate.yml +0 -5
  35. data/.gitignore +0 -8
  36. data/.rspec +0 -4
  37. data/.travis.yml +0 -28
  38. data/.yardopts +0 -2
  39. data/Gemfile +0 -28
  40. data/README.md +0 -92
  41. data/Rakefile +0 -33
  42. data/benchmark/call_vs_check.rb +0 -38
  43. data/benchmark/const_vs_hash.rb +0 -35
  44. data/benchmark/hash_vs_openstruct.rb +0 -54
  45. data/benchmark/string_vs_symbol.rb +0 -14
  46. data/benchmark/struct_vs_class.rb +0 -91
  47. data/docs/.nojekyll +0 -0
  48. data/docs/_components/jquery-syntax/base/jquery.syntax.brush.apache.css +0 -6
  49. data/docs/_components/jquery-syntax/base/jquery.syntax.brush.applescript.css +0 -5
  50. data/docs/_components/jquery-syntax/base/jquery.syntax.brush.assembly.css +0 -8
  51. data/docs/_components/jquery-syntax/base/jquery.syntax.brush.bash-script.css +0 -6
  52. data/docs/_components/jquery-syntax/base/jquery.syntax.brush.bash.css +0 -10
  53. data/docs/_components/jquery-syntax/base/jquery.syntax.brush.clang.css +0 -3
  54. data/docs/_components/jquery-syntax/base/jquery.syntax.brush.css.css +0 -14
  55. data/docs/_components/jquery-syntax/base/jquery.syntax.brush.diff.css +0 -16
  56. data/docs/_components/jquery-syntax/base/jquery.syntax.brush.html.css +0 -5
  57. data/docs/_components/jquery-syntax/base/jquery.syntax.brush.ocaml.css +0 -3
  58. data/docs/_components/jquery-syntax/base/jquery.syntax.brush.protobuf.css +0 -2
  59. data/docs/_components/jquery-syntax/base/jquery.syntax.brush.python.css +0 -6
  60. data/docs/_components/jquery-syntax/base/jquery.syntax.brush.ruby.css +0 -2
  61. data/docs/_components/jquery-syntax/base/jquery.syntax.brush.xml.css +0 -18
  62. data/docs/_components/jquery-syntax/base/jquery.syntax.core.css +0 -62
  63. data/docs/_components/jquery-syntax/base/jquery.syntax.editor.css +0 -6
  64. data/docs/_components/jquery-syntax/base/theme.js +0 -1
  65. data/docs/_components/jquery-syntax/bright/jquery.syntax.core.css +0 -27
  66. data/docs/_components/jquery-syntax/bright/theme.js +0 -1
  67. data/docs/_components/jquery-syntax/jquery.syntax.brush.apache.js +0 -41
  68. data/docs/_components/jquery-syntax/jquery.syntax.brush.applescript.js +0 -57
  69. data/docs/_components/jquery-syntax/jquery.syntax.brush.assembly.js +0 -37
  70. data/docs/_components/jquery-syntax/jquery.syntax.brush.bash-script.js +0 -67
  71. data/docs/_components/jquery-syntax/jquery.syntax.brush.bash.js +0 -33
  72. data/docs/_components/jquery-syntax/jquery.syntax.brush.basic.js +0 -51
  73. data/docs/_components/jquery-syntax/jquery.syntax.brush.clang.js +0 -89
  74. data/docs/_components/jquery-syntax/jquery.syntax.brush.csharp.js +0 -47
  75. data/docs/_components/jquery-syntax/jquery.syntax.brush.css.js +0 -80
  76. data/docs/_components/jquery-syntax/jquery.syntax.brush.diff.js +0 -24
  77. data/docs/_components/jquery-syntax/jquery.syntax.brush.go.js +0 -47
  78. data/docs/_components/jquery-syntax/jquery.syntax.brush.haskell.js +0 -45
  79. data/docs/_components/jquery-syntax/jquery.syntax.brush.html.js +0 -66
  80. data/docs/_components/jquery-syntax/jquery.syntax.brush.io.js +0 -45
  81. data/docs/_components/jquery-syntax/jquery.syntax.brush.java.js +0 -45
  82. data/docs/_components/jquery-syntax/jquery.syntax.brush.javascript.js +0 -40
  83. data/docs/_components/jquery-syntax/jquery.syntax.brush.kai.js +0 -29
  84. data/docs/_components/jquery-syntax/jquery.syntax.brush.lisp.js +0 -34
  85. data/docs/_components/jquery-syntax/jquery.syntax.brush.lua.js +0 -44
  86. data/docs/_components/jquery-syntax/jquery.syntax.brush.nginx.js +0 -31
  87. data/docs/_components/jquery-syntax/jquery.syntax.brush.ocaml.js +0 -73
  88. data/docs/_components/jquery-syntax/jquery.syntax.brush.ooc.js +0 -46
  89. data/docs/_components/jquery-syntax/jquery.syntax.brush.pascal.js +0 -51
  90. data/docs/_components/jquery-syntax/jquery.syntax.brush.perl5.js +0 -52
  91. data/docs/_components/jquery-syntax/jquery.syntax.brush.php-script.js +0 -48
  92. data/docs/_components/jquery-syntax/jquery.syntax.brush.php.js +0 -15
  93. data/docs/_components/jquery-syntax/jquery.syntax.brush.plain.js +0 -10
  94. data/docs/_components/jquery-syntax/jquery.syntax.brush.protobuf.js +0 -43
  95. data/docs/_components/jquery-syntax/jquery.syntax.brush.python.js +0 -44
  96. data/docs/_components/jquery-syntax/jquery.syntax.brush.ruby.js +0 -77
  97. data/docs/_components/jquery-syntax/jquery.syntax.brush.scala.js +0 -44
  98. data/docs/_components/jquery-syntax/jquery.syntax.brush.smalltalk.js +0 -29
  99. data/docs/_components/jquery-syntax/jquery.syntax.brush.sql.js +0 -31
  100. data/docs/_components/jquery-syntax/jquery.syntax.brush.super-collider.js +0 -57
  101. data/docs/_components/jquery-syntax/jquery.syntax.brush.swift.js +0 -55
  102. data/docs/_components/jquery-syntax/jquery.syntax.brush.trenni.js +0 -35
  103. data/docs/_components/jquery-syntax/jquery.syntax.brush.xml.js +0 -50
  104. data/docs/_components/jquery-syntax/jquery.syntax.brush.yaml.js +0 -29
  105. data/docs/_components/jquery-syntax/jquery.syntax.cache.js +0 -65
  106. data/docs/_components/jquery-syntax/jquery.syntax.core.js +0 -1098
  107. data/docs/_components/jquery-syntax/jquery.syntax.editor.js +0 -291
  108. data/docs/_components/jquery-syntax/jquery.syntax.js +0 -258
  109. data/docs/_components/jquery-syntax/jquery.syntax.min.js +0 -13
  110. data/docs/_components/jquery-syntax/paper/jquery.syntax.core.css +0 -31
  111. data/docs/_components/jquery-syntax/paper/theme.js +0 -1
  112. data/docs/_components/jquery/core.js +0 -482
  113. data/docs/_components/jquery/jquery.js +0 -10220
  114. data/docs/_components/jquery/jquery.min.js +0 -4
  115. data/docs/_components/jquery/jquery.min.map +0 -1
  116. data/docs/_components/jquery/jquery.slim.js +0 -8107
  117. data/docs/_components/jquery/jquery.slim.min.js +0 -4
  118. data/docs/_components/jquery/jquery.slim.min.map +0 -1
  119. data/docs/_static/icon.png +0 -0
  120. data/docs/_static/site.css +0 -205
  121. data/docs/_static/utopia-background.svg +0 -1
  122. data/docs/_static/utopia.svg +0 -1
  123. data/docs/code/Utopia.html +0 -517
  124. data/docs/code/Utopia/Basename.html +0 -654
  125. data/docs/code/Utopia/Bootstrap.html +0 -538
  126. data/docs/code/Utopia/Command.html +0 -213
  127. data/docs/code/Utopia/Command/Environment.html +0 -321
  128. data/docs/code/Utopia/Command/Server.html +0 -214
  129. data/docs/code/Utopia/Command/Server/Create.html +0 -222
  130. data/docs/code/Utopia/Command/Server/Environment.html +0 -236
  131. data/docs/code/Utopia/Command/Server/Update.html +0 -317
  132. data/docs/code/Utopia/Command/Setup.html +0 -145
  133. data/docs/code/Utopia/Command/Setup/Server.html +0 -298
  134. data/docs/code/Utopia/Command/Setup/Site.html +0 -180
  135. data/docs/code/Utopia/Command/Site.html +0 -285
  136. data/docs/code/Utopia/Command/Site/Create.html +0 -324
  137. data/docs/code/Utopia/Command/Site/Update.html +0 -407
  138. data/docs/code/Utopia/Command/Top.html +0 -279
  139. data/docs/code/Utopia/Content.html +0 -832
  140. data/docs/code/Utopia/Content/Document.html +0 -1822
  141. data/docs/code/Utopia/Content/Document/State.html +0 -1220
  142. data/docs/code/Utopia/Content/Link.html +0 -1286
  143. data/docs/code/Utopia/Content/Links.html +0 -847
  144. data/docs/code/Utopia/Content/MarkupParser.html +0 -881
  145. data/docs/code/Utopia/Content/MarkupParser/ParsedTag.html +0 -422
  146. data/docs/code/Utopia/Content/MarkupParser/UnbalancedTagError.html +0 -615
  147. data/docs/code/Utopia/Content/Namespace.html +0 -485
  148. data/docs/code/Utopia/Content/Node.html +0 -1188
  149. data/docs/code/Utopia/Content/Node/Context.html +0 -938
  150. data/docs/code/Utopia/Content/Response.html +0 -813
  151. data/docs/code/Utopia/Content/SymbolicHash.html +0 -419
  152. data/docs/code/Utopia/Content/Tag.html +0 -399
  153. data/docs/code/Utopia/Content/Tags.html +0 -136
  154. data/docs/code/Utopia/Content/Tags/ContentTag.html +0 -187
  155. data/docs/code/Utopia/Content/Tags/DeferredTag.html +0 -193
  156. data/docs/code/Utopia/Content/Tags/Library.html +0 -333
  157. data/docs/code/Utopia/Content/Tags/NodeTag.html +0 -193
  158. data/docs/code/Utopia/Content/UnbalancedTagError.html +0 -298
  159. data/docs/code/Utopia/ContentLength.html +0 -343
  160. data/docs/code/Utopia/Controller.html +0 -907
  161. data/docs/code/Utopia/Controller/Actions.html +0 -289
  162. data/docs/code/Utopia/Controller/Actions/Action.html +0 -984
  163. data/docs/code/Utopia/Controller/Actions/ClassMethods.html +0 -442
  164. data/docs/code/Utopia/Controller/Base.html +0 -1216
  165. data/docs/code/Utopia/Controller/Respond.html +0 -293
  166. data/docs/code/Utopia/Controller/Respond/ClassMethods.html +0 -236
  167. data/docs/code/Utopia/Controller/Respond/Converter.html +0 -256
  168. data/docs/code/Utopia/Controller/Respond/Converter/Callback.html +0 -484
  169. data/docs/code/Utopia/Controller/Respond/Converter/ToJSON.html +0 -381
  170. data/docs/code/Utopia/Controller/Respond/Passthrough.html +0 -297
  171. data/docs/code/Utopia/Controller/Respond/Responder.html +0 -535
  172. data/docs/code/Utopia/Controller/Rewrite.html +0 -290
  173. data/docs/code/Utopia/Controller/Rewrite/ClassMethods.html +0 -242
  174. data/docs/code/Utopia/Controller/Rewrite/ExtractPrefixRule.html +0 -364
  175. data/docs/code/Utopia/Controller/Rewrite/Rewriter.html +0 -464
  176. data/docs/code/Utopia/Controller/Rewrite/Rule.html +0 -209
  177. data/docs/code/Utopia/Controller/Variables.html +0 -550
  178. data/docs/code/Utopia/Controllers.html +0 -244
  179. data/docs/code/Utopia/Exceptions.html +0 -127
  180. data/docs/code/Utopia/Exceptions/Handler.html +0 -526
  181. data/docs/code/Utopia/Exceptions/Mailer.html +0 -482
  182. data/docs/code/Utopia/Extensions.html +0 -117
  183. data/docs/code/Utopia/Extensions/ArraySplit.html +0 -183
  184. data/docs/code/Utopia/Extensions/DateTimeComparison.html +0 -193
  185. data/docs/code/Utopia/Extensions/TimeDateComparison.html +0 -193
  186. data/docs/code/Utopia/HTTP.html +0 -250
  187. data/docs/code/Utopia/HTTP/Status.html +0 -415
  188. data/docs/code/Utopia/Locale.html +0 -606
  189. data/docs/code/Utopia/Localization.html +0 -1241
  190. data/docs/code/Utopia/Localization/Wrapper.html +0 -459
  191. data/docs/code/Utopia/Logger.html +0 -205
  192. data/docs/code/Utopia/Logger/CompactFormatter.html +0 -335
  193. data/docs/code/Utopia/Path.html +0 -3310
  194. data/docs/code/Utopia/Path/Matcher.html +0 -518
  195. data/docs/code/Utopia/Path/Matcher/MatchData.html +0 -475
  196. data/docs/code/Utopia/Redirection.html +0 -151
  197. data/docs/code/Utopia/Redirection/ClientRedirect.html +0 -717
  198. data/docs/code/Utopia/Redirection/DirectoryIndex.html +0 -298
  199. data/docs/code/Utopia/Redirection/Errors.html +0 -476
  200. data/docs/code/Utopia/Redirection/Moved.html +0 -312
  201. data/docs/code/Utopia/Redirection/RequestFailure.html +0 -226
  202. data/docs/code/Utopia/Redirection/Rewrite.html +0 -296
  203. data/docs/code/Utopia/Session.html +0 -889
  204. data/docs/code/Utopia/Session/LazyHash.html +0 -859
  205. data/docs/code/Utopia/Setup.html +0 -970
  206. data/docs/code/Utopia/Static.html +0 -696
  207. data/docs/code/Utopia/Static/LocalFile.html +0 -1104
  208. data/docs/code/Utopia/Static/MimeTypeLoader.html +0 -541
  209. data/docs/code/Utopia/Static/MimeTypeLoader/ExpansionError.html +0 -124
  210. data/docs/code/Utopia/Tags.html +0 -115
  211. data/docs/code/Utopia/Tags/Environment.html +0 -314
  212. data/docs/code/Utopia/Tags/EnvironmentTag.html +0 -314
  213. data/docs/code/Utopia/Tags/Library.html +0 -340
  214. data/docs/code/_index.html +0 -758
  215. data/docs/code/class_list.html +0 -51
  216. data/docs/code/css/common.css +0 -1
  217. data/docs/code/css/full_list.css +0 -58
  218. data/docs/code/css/style.css +0 -496
  219. data/docs/code/file.README.html +0 -171
  220. data/docs/code/file_list.html +0 -56
  221. data/docs/code/frames.html +0 -17
  222. data/docs/code/index.html +0 -171
  223. data/docs/code/js/app.js +0 -292
  224. data/docs/code/js/full_list.js +0 -216
  225. data/docs/code/js/jquery.js +0 -4
  226. data/docs/code/materials/utopia.png +0 -0
  227. data/docs/code/materials/utopia.svg +0 -1
  228. data/docs/code/method_list.html +0 -3443
  229. data/docs/code/top-level-namespace.html +0 -110
  230. data/docs/index.html +0 -92
  231. data/docs/wiki.html +0 -92
  232. data/docs/wiki/development-environment-setup.html +0 -60
  233. data/docs/wiki/development-environment-setup/index.html +0 -60
  234. data/docs/wiki/edit.html +0 -103
  235. data/docs/wiki/faq/what-is-xnode.html +0 -79
  236. data/docs/wiki/faq/what-is-xnode/index.html +0 -79
  237. data/docs/wiki/javascript.html +0 -153
  238. data/docs/wiki/javascript/index.html +0 -153
  239. data/docs/wiki/middleware/content.html +0 -64
  240. data/docs/wiki/middleware/content/index.html +0 -64
  241. data/docs/wiki/middleware/controller.html +0 -104
  242. data/docs/wiki/middleware/controller/actions.html +0 -117
  243. data/docs/wiki/middleware/controller/actions/index.html +0 -117
  244. data/docs/wiki/middleware/controller/actions/rewrite/index.html +0 -48
  245. data/docs/wiki/middleware/controller/index.html +0 -104
  246. data/docs/wiki/middleware/controller/rewrite.html +0 -111
  247. data/docs/wiki/middleware/controller/rewrite/index.html +0 -111
  248. data/docs/wiki/middleware/localization.html +0 -59
  249. data/docs/wiki/middleware/localization/index.html +0 -59
  250. data/docs/wiki/middleware/redirection.html +0 -61
  251. data/docs/wiki/middleware/redirection/index.html +0 -61
  252. data/docs/wiki/middleware/session.html +0 -71
  253. data/docs/wiki/middleware/session/index.html +0 -71
  254. data/docs/wiki/middleware/static.html +0 -57
  255. data/docs/wiki/middleware/static/index.html +0 -57
  256. data/docs/wiki/server-setup.html +0 -118
  257. data/docs/wiki/server-setup/index.html +0 -118
  258. data/docs/wiki/testing.html +0 -59
  259. data/docs/wiki/testing/index.html +0 -59
  260. data/docs/wiki/updating-utopia.html +0 -108
  261. data/docs/wiki/updating-utopia/index.html +0 -108
  262. data/docs/wiki/your-first-page.html +0 -80
  263. data/docs/wiki/your-first-page/index.html +0 -80
  264. data/documentation/.rspec +0 -4
  265. data/documentation/.yarnrc +0 -1
  266. data/documentation/Gemfile +0 -19
  267. data/documentation/Guardfile +0 -9
  268. data/documentation/Rakefile +0 -9
  269. data/documentation/config.ru +0 -41
  270. data/documentation/config/README.md +0 -7
  271. data/documentation/config/environment.rb +0 -12
  272. data/documentation/lib/readme.txt +0 -1
  273. data/documentation/pages/_editor.xnode +0 -64
  274. data/documentation/pages/_heading.xnode +0 -2
  275. data/documentation/pages/_page.xnode +0 -40
  276. data/documentation/pages/errors/exception.xnode +0 -5
  277. data/documentation/pages/errors/file-not-found.xnode +0 -5
  278. data/documentation/pages/links.yaml +0 -2
  279. data/documentation/pages/wiki/_listing.xnode +0 -32
  280. data/documentation/pages/wiki/_navigation.xnode +0 -15
  281. data/documentation/pages/wiki/content.md +0 -35
  282. data/documentation/pages/wiki/controller.rb +0 -48
  283. data/documentation/pages/wiki/development-environment-setup/content.md +0 -16
  284. data/documentation/pages/wiki/edit.xnode +0 -10
  285. data/documentation/pages/wiki/faq/what-is-xnode/content.md +0 -37
  286. data/documentation/pages/wiki/javascript/content.md +0 -75
  287. data/documentation/pages/wiki/links.yaml +0 -6
  288. data/documentation/pages/wiki/middleware/content/content.md +0 -21
  289. data/documentation/pages/wiki/middleware/controller/actions/content.md +0 -76
  290. data/documentation/pages/wiki/middleware/controller/content.md +0 -62
  291. data/documentation/pages/wiki/middleware/controller/links.yaml +0 -4
  292. data/documentation/pages/wiki/middleware/controller/rewrite/content.md +0 -69
  293. data/documentation/pages/wiki/middleware/localization/content.md +0 -16
  294. data/documentation/pages/wiki/middleware/redirection/content.md +0 -17
  295. data/documentation/pages/wiki/middleware/session/content.md +0 -29
  296. data/documentation/pages/wiki/middleware/static/content.md +0 -13
  297. data/documentation/pages/wiki/server-setup/content.md +0 -52
  298. data/documentation/pages/wiki/show.xnode +0 -12
  299. data/documentation/pages/wiki/testing/content.md +0 -15
  300. data/documentation/pages/wiki/updating-utopia/content.md +0 -63
  301. data/documentation/pages/wiki/your-first-page/content.md +0 -38
  302. data/documentation/public/_components/jquery-syntax/base/jquery.syntax.brush.apache.css +0 -6
  303. data/documentation/public/_components/jquery-syntax/base/jquery.syntax.brush.applescript.css +0 -5
  304. data/documentation/public/_components/jquery-syntax/base/jquery.syntax.brush.assembly.css +0 -8
  305. data/documentation/public/_components/jquery-syntax/base/jquery.syntax.brush.bash-script.css +0 -6
  306. data/documentation/public/_components/jquery-syntax/base/jquery.syntax.brush.bash.css +0 -10
  307. data/documentation/public/_components/jquery-syntax/base/jquery.syntax.brush.clang.css +0 -3
  308. data/documentation/public/_components/jquery-syntax/base/jquery.syntax.brush.css.css +0 -14
  309. data/documentation/public/_components/jquery-syntax/base/jquery.syntax.brush.diff.css +0 -16
  310. data/documentation/public/_components/jquery-syntax/base/jquery.syntax.brush.html.css +0 -5
  311. data/documentation/public/_components/jquery-syntax/base/jquery.syntax.brush.ocaml.css +0 -3
  312. data/documentation/public/_components/jquery-syntax/base/jquery.syntax.brush.protobuf.css +0 -2
  313. data/documentation/public/_components/jquery-syntax/base/jquery.syntax.brush.python.css +0 -6
  314. data/documentation/public/_components/jquery-syntax/base/jquery.syntax.brush.ruby.css +0 -2
  315. data/documentation/public/_components/jquery-syntax/base/jquery.syntax.brush.xml.css +0 -18
  316. data/documentation/public/_components/jquery-syntax/base/jquery.syntax.core.css +0 -62
  317. data/documentation/public/_components/jquery-syntax/base/jquery.syntax.editor.css +0 -6
  318. data/documentation/public/_components/jquery-syntax/base/theme.js +0 -1
  319. data/documentation/public/_components/jquery-syntax/bright/jquery.syntax.core.css +0 -27
  320. data/documentation/public/_components/jquery-syntax/bright/theme.js +0 -1
  321. data/documentation/public/_components/jquery-syntax/jquery.syntax.brush.apache.js +0 -41
  322. data/documentation/public/_components/jquery-syntax/jquery.syntax.brush.applescript.js +0 -57
  323. data/documentation/public/_components/jquery-syntax/jquery.syntax.brush.assembly.js +0 -37
  324. data/documentation/public/_components/jquery-syntax/jquery.syntax.brush.bash-script.js +0 -67
  325. data/documentation/public/_components/jquery-syntax/jquery.syntax.brush.bash.js +0 -33
  326. data/documentation/public/_components/jquery-syntax/jquery.syntax.brush.basic.js +0 -51
  327. data/documentation/public/_components/jquery-syntax/jquery.syntax.brush.clang.js +0 -89
  328. data/documentation/public/_components/jquery-syntax/jquery.syntax.brush.csharp.js +0 -47
  329. data/documentation/public/_components/jquery-syntax/jquery.syntax.brush.css.js +0 -80
  330. data/documentation/public/_components/jquery-syntax/jquery.syntax.brush.diff.js +0 -24
  331. data/documentation/public/_components/jquery-syntax/jquery.syntax.brush.go.js +0 -47
  332. data/documentation/public/_components/jquery-syntax/jquery.syntax.brush.haskell.js +0 -45
  333. data/documentation/public/_components/jquery-syntax/jquery.syntax.brush.html.js +0 -66
  334. data/documentation/public/_components/jquery-syntax/jquery.syntax.brush.io.js +0 -45
  335. data/documentation/public/_components/jquery-syntax/jquery.syntax.brush.java.js +0 -45
  336. data/documentation/public/_components/jquery-syntax/jquery.syntax.brush.javascript.js +0 -40
  337. data/documentation/public/_components/jquery-syntax/jquery.syntax.brush.kai.js +0 -29
  338. data/documentation/public/_components/jquery-syntax/jquery.syntax.brush.lisp.js +0 -34
  339. data/documentation/public/_components/jquery-syntax/jquery.syntax.brush.lua.js +0 -44
  340. data/documentation/public/_components/jquery-syntax/jquery.syntax.brush.nginx.js +0 -31
  341. data/documentation/public/_components/jquery-syntax/jquery.syntax.brush.ocaml.js +0 -73
  342. data/documentation/public/_components/jquery-syntax/jquery.syntax.brush.ooc.js +0 -46
  343. data/documentation/public/_components/jquery-syntax/jquery.syntax.brush.pascal.js +0 -51
  344. data/documentation/public/_components/jquery-syntax/jquery.syntax.brush.perl5.js +0 -52
  345. data/documentation/public/_components/jquery-syntax/jquery.syntax.brush.php-script.js +0 -48
  346. data/documentation/public/_components/jquery-syntax/jquery.syntax.brush.php.js +0 -15
  347. data/documentation/public/_components/jquery-syntax/jquery.syntax.brush.plain.js +0 -10
  348. data/documentation/public/_components/jquery-syntax/jquery.syntax.brush.protobuf.js +0 -43
  349. data/documentation/public/_components/jquery-syntax/jquery.syntax.brush.python.js +0 -44
  350. data/documentation/public/_components/jquery-syntax/jquery.syntax.brush.ruby.js +0 -77
  351. data/documentation/public/_components/jquery-syntax/jquery.syntax.brush.scala.js +0 -44
  352. data/documentation/public/_components/jquery-syntax/jquery.syntax.brush.smalltalk.js +0 -29
  353. data/documentation/public/_components/jquery-syntax/jquery.syntax.brush.sql.js +0 -31
  354. data/documentation/public/_components/jquery-syntax/jquery.syntax.brush.super-collider.js +0 -57
  355. data/documentation/public/_components/jquery-syntax/jquery.syntax.brush.swift.js +0 -55
  356. data/documentation/public/_components/jquery-syntax/jquery.syntax.brush.trenni.js +0 -35
  357. data/documentation/public/_components/jquery-syntax/jquery.syntax.brush.xml.js +0 -50
  358. data/documentation/public/_components/jquery-syntax/jquery.syntax.brush.yaml.js +0 -29
  359. data/documentation/public/_components/jquery-syntax/jquery.syntax.cache.js +0 -65
  360. data/documentation/public/_components/jquery-syntax/jquery.syntax.core.js +0 -1098
  361. data/documentation/public/_components/jquery-syntax/jquery.syntax.editor.js +0 -291
  362. data/documentation/public/_components/jquery-syntax/jquery.syntax.js +0 -258
  363. data/documentation/public/_components/jquery-syntax/jquery.syntax.min.js +0 -13
  364. data/documentation/public/_components/jquery-syntax/paper/jquery.syntax.core.css +0 -31
  365. data/documentation/public/_components/jquery-syntax/paper/theme.js +0 -1
  366. data/documentation/public/_components/jquery/core.js +0 -482
  367. data/documentation/public/_components/jquery/jquery.js +0 -10220
  368. data/documentation/public/_components/jquery/jquery.min.js +0 -4
  369. data/documentation/public/_components/jquery/jquery.min.map +0 -1
  370. data/documentation/public/_components/jquery/jquery.slim.js +0 -8107
  371. data/documentation/public/_components/jquery/jquery.slim.min.js +0 -4
  372. data/documentation/public/_components/jquery/jquery.slim.min.map +0 -1
  373. data/documentation/public/_static +0 -1
  374. data/documentation/public/materials +0 -1
  375. data/documentation/spec/website_context.rb +0 -12
  376. data/documentation/spec/website_spec.rb +0 -16
  377. data/documentation/tasks +0 -1
  378. data/materials/utopia.png +0 -0
  379. data/materials/utopia.svg +0 -1
  380. data/setup/site/.yarnrc +0 -1
  381. data/spec/mock_node.rb +0 -16
  382. data/spec/spec_helper.rb +0 -13
  383. data/spec/utopia/command_spec.rb +0 -164
  384. data/spec/utopia/content/document_spec.rb +0 -60
  385. data/spec/utopia/content/link_spec.rb +0 -47
  386. data/spec/utopia/content/links/foo/index.xnode +0 -0
  387. data/spec/utopia/content/links/foo/links.yaml +0 -2
  388. data/spec/utopia/content/links/foo/test.de.xnode +0 -0
  389. data/spec/utopia/content/links/foo/test.en.xnode +0 -0
  390. data/spec/utopia/content/links/links.yaml +0 -9
  391. data/spec/utopia/content/links/welcome.xnode +0 -0
  392. data/spec/utopia/content/links_spec.rb +0 -101
  393. data/spec/utopia/content/localized/five/index.en.xnode +0 -0
  394. data/spec/utopia/content/localized/four/index.en.xnode +0 -0
  395. data/spec/utopia/content/localized/four/index.zh.xnode +0 -0
  396. data/spec/utopia/content/localized/four/links.yaml +0 -4
  397. data/spec/utopia/content/localized/links.yaml +0 -16
  398. data/spec/utopia/content/localized/one.xnode +0 -0
  399. data/spec/utopia/content/localized/three/index.xnode +0 -0
  400. data/spec/utopia/content/localized/two.en.xnode +0 -0
  401. data/spec/utopia/content/localized/two.zh.xnode +0 -0
  402. data/spec/utopia/content/markup_spec.rb +0 -96
  403. data/spec/utopia/content/namespace_spec.rb +0 -45
  404. data/spec/utopia/content/node/lookup/content.xnode +0 -1
  405. data/spec/utopia/content/node/lookup/index.xnode +0 -1
  406. data/spec/utopia/content/node/ordered/first.xnode +0 -0
  407. data/spec/utopia/content/node/ordered/index.xnode +0 -0
  408. data/spec/utopia/content/node/ordered/links.yaml +0 -4
  409. data/spec/utopia/content/node/ordered/second.xnode +0 -0
  410. data/spec/utopia/content/node/related/foo.en.xnode +0 -0
  411. data/spec/utopia/content/node/related/foo.ja.xnode +0 -0
  412. data/spec/utopia/content/node/related/links.yaml +0 -4
  413. data/spec/utopia/content/node_spec.rb +0 -97
  414. data/spec/utopia/content/response_spec.rb +0 -54
  415. data/spec/utopia/content/tags_spec.rb +0 -82
  416. data/spec/utopia/content_spec.rb +0 -100
  417. data/spec/utopia/content_spec.ru +0 -6
  418. data/spec/utopia/content_spec/_heading.xnode +0 -1
  419. data/spec/utopia/content_spec/content/_show-value.xnode +0 -1
  420. data/spec/utopia/content_spec/content/links.yaml +0 -2
  421. data/spec/utopia/content_spec/content/test-partial.xnode +0 -1
  422. data/spec/utopia/content_spec/index.xnode +0 -1
  423. data/spec/utopia/content_spec/node/index.xnode +0 -1
  424. data/spec/utopia/content_spec/test.xnode +0 -10
  425. data/spec/utopia/controller/actions_spec.rb +0 -62
  426. data/spec/utopia/controller/middleware_spec.rb +0 -88
  427. data/spec/utopia/controller/middleware_spec.ru +0 -6
  428. data/spec/utopia/controller/middleware_spec/controller/controller.rb +0 -27
  429. data/spec/utopia/controller/middleware_spec/controller/index.xnode +0 -1
  430. data/spec/utopia/controller/middleware_spec/controller/nested/controller.rb +0 -7
  431. data/spec/utopia/controller/middleware_spec/empty/controller.rb +0 -0
  432. data/spec/utopia/controller/middleware_spec/redirect/controller.rb +0 -12
  433. data/spec/utopia/controller/middleware_spec/redirect/test/controller.rb +0 -9
  434. data/spec/utopia/controller/respond_spec.rb +0 -174
  435. data/spec/utopia/controller/respond_spec.ru +0 -12
  436. data/spec/utopia/controller/respond_spec/api/controller.rb +0 -28
  437. data/spec/utopia/controller/respond_spec/errors/controller.rb +0 -14
  438. data/spec/utopia/controller/respond_spec/errors/file-not-found.xnode +0 -8
  439. data/spec/utopia/controller/respond_spec/html/controller.rb +0 -11
  440. data/spec/utopia/controller/respond_spec/rewrite/controller.rb +0 -13
  441. data/spec/utopia/controller/rewrite_spec.rb +0 -80
  442. data/spec/utopia/controller/sequence_spec.rb +0 -135
  443. data/spec/utopia/controller/variables_spec.rb +0 -59
  444. data/spec/utopia/controller/websocket_spec.rb +0 -68
  445. data/spec/utopia/controller/websocket_spec.ru +0 -5
  446. data/spec/utopia/controller/websocket_spec/server/controller.rb +0 -11
  447. data/spec/utopia/exceptions/handler_spec.rb +0 -47
  448. data/spec/utopia/exceptions/handler_spec.ru +0 -8
  449. data/spec/utopia/exceptions/handler_spec/controller.rb +0 -19
  450. data/spec/utopia/exceptions/mailer_spec.rb +0 -43
  451. data/spec/utopia/exceptions/mailer_spec.ru +0 -10
  452. data/spec/utopia/extensions_spec.rb +0 -73
  453. data/spec/utopia/http/status_spec.rb +0 -44
  454. data/spec/utopia/locale_spec.rb +0 -58
  455. data/spec/utopia/localization_spec.rb +0 -92
  456. data/spec/utopia/localization_spec.ru +0 -15
  457. data/spec/utopia/localization_spec/controller.rb +0 -21
  458. data/spec/utopia/localization_spec/localized.de.txt +0 -1
  459. data/spec/utopia/localization_spec/localized.en.txt +0 -1
  460. data/spec/utopia/localization_spec/localized.ja.txt +0 -1
  461. data/spec/utopia/localization_spec/test.txt +0 -1
  462. data/spec/utopia/middleware_spec.rb +0 -31
  463. data/spec/utopia/path/matcher_spec.rb +0 -66
  464. data/spec/utopia/path_spec.rb +0 -162
  465. data/spec/utopia/performance_spec.rb +0 -92
  466. data/spec/utopia/performance_spec/cache/head/readme.txt +0 -1
  467. data/spec/utopia/performance_spec/cache/meta/readme.txt +0 -1
  468. data/spec/utopia/performance_spec/config.ru +0 -35
  469. data/spec/utopia/performance_spec/lib/readme.txt +0 -1
  470. data/spec/utopia/performance_spec/pages/_heading.xnode +0 -2
  471. data/spec/utopia/performance_spec/pages/_page.xnode +0 -26
  472. data/spec/utopia/performance_spec/pages/api/controller.rb +0 -8
  473. data/spec/utopia/performance_spec/pages/errors/exception.xnode +0 -5
  474. data/spec/utopia/performance_spec/pages/errors/file-not-found.xnode +0 -5
  475. data/spec/utopia/performance_spec/pages/links.yaml +0 -2
  476. data/spec/utopia/performance_spec/pages/welcome/index.xnode +0 -17
  477. data/spec/utopia/rack_helper.rb +0 -32
  478. data/spec/utopia/redirection_spec.rb +0 -77
  479. data/spec/utopia/redirection_spec.ru +0 -27
  480. data/spec/utopia/session_spec.rb +0 -189
  481. data/spec/utopia/session_spec.ru +0 -24
  482. data/spec/utopia/setup_spec.rb +0 -56
  483. data/spec/utopia/static_spec.rb +0 -49
  484. data/spec/utopia/static_spec.ru +0 -5
  485. data/spec/utopia/static_spec/test.txt +0 -1
  486. data/utopia.gemspec +0 -52
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: beeeb47e2ec3c52b5258fa2ff7396fd5c167bb1761faad3915715e241f33d597
4
- data.tar.gz: 68258e5bb228fec22f03e345096b07d7e817dfc5e9ff77474c97561a5c671808
3
+ metadata.gz: 8f7a327d1848543592fbdf7a17fa1f45893852cff6ff763ddfdb08c9cb64ad80
4
+ data.tar.gz: 0bcf595720fb09061dfb130e9ca3fc68f6ac071b279e661b9a76a186736fec42
5
5
  SHA512:
6
- metadata.gz: 37e3652f89e446163d61e8ccae12bf03931015dc54434ddc0739f751a509284877cec276331e8b74e9114965055b861ae65cac78da89ad9086da2aace75f0f96
7
- data.tar.gz: a610c073b28e50fdc717c3194d3135b3dba8f8dda50fb0b0696e472e91a6633a2af19b1ac7538b5d069d8b88448b18a1f4750a82e86f819d2112499223493226
6
+ metadata.gz: 6a246d50f6dd455582454f62e49c313c1e9c851094febfc20929d4ead609532c7b8e9673ab05c4ed037994960ece9e3a59c9de364b2074d0845fe2c50aaa298b
7
+ data.tar.gz: 906526e65a9c040d781ac7544cec1425556bb78614e89c0a63ae39d2b805a25a1ede314d78c17830a2348adf094bb5be1b2a748792742d477421377f06c5d1f6
@@ -5,12 +5,20 @@ def update
5
5
  require 'fileutils'
6
6
  require 'utopia/path'
7
7
 
8
- yarn_package_root = Pathname.new(context.root) + "lib/components"
9
- yarn_install_root = Pathname.new(context.root) + "public/_components"
8
+ root = Pathname.new(context.root)
9
+ package_root = root + "node_modules"
10
10
 
11
- yarn_package_root.children.select(&:directory?).collect(&:basename).each do |package_directory|
12
- install_path = yarn_install_root + package_directory
13
- package_path = yarn_package_root + package_directory
11
+ # This is a legacy path:
12
+ unless package_root.directory?
13
+ package_root = root + "lib/components"
14
+ end
15
+
16
+ install_root = root + "public/_components"
17
+
18
+ package_root.children.select(&:directory?).collect(&:basename).each do |package_directory|
19
+ install_path = install_root + package_directory
20
+ package_path = package_root + package_directory
21
+
14
22
  dist_path = package_path + 'dist'
15
23
 
16
24
  FileUtils::Verbose.rm_rf(install_path)
Binary file
Binary file
@@ -28,8 +28,8 @@ require_relative 'command/environment'
28
28
 
29
29
  module Utopia
30
30
  module Command
31
- def self.call(*args)
32
- Top.call(*args)
31
+ def self.call(*arguments)
32
+ Top.call(*arguments)
33
33
  end
34
34
 
35
35
  # The top level utopia command.
@@ -33,7 +33,7 @@ module Utopia
33
33
  # Local site setup commands.
34
34
  class Site < Samovar::Command
35
35
  # Configuration files which should be installed/updated:
36
- CONFIGURATION_FILES = ['.yarnrc', '.gitignore', 'config.ru', 'config/environment.rb', 'falcon.rb', 'Gemfile', 'Guardfile', 'bake.rb', 'spec/spec_helper.rb', 'spec/website_context.rb', 'spec/website_spec.rb']
36
+ CONFIGURATION_FILES = ['.gitignore', 'config.ru', 'config/environment.rb', 'falcon.rb', 'Gemfile', 'Guardfile', 'bake.rb', 'spec/spec_helper.rb', 'spec/website_context.rb', 'spec/website_spec.rb']
37
37
 
38
38
  # Directories that should exist:
39
39
  DIRECTORIES = ["config", "lib", "pages", "public", "tasks", "spec"]
@@ -59,7 +59,7 @@ module Utopia
59
59
  # The core namespace for utopia specific functionality:
60
60
  @namespaces[UTOPIA_NAMESPACE] ||= Tags
61
61
  end
62
-
62
+
63
63
  def freeze
64
64
  return self if frozen?
65
65
 
@@ -72,6 +72,7 @@ module Utopia
72
72
 
73
73
  attr :root
74
74
 
75
+ # TODO we should remove this method and expose `@links` directly.
75
76
  def links(path, **options)
76
77
  @links.index(path, **options)
77
78
  end
@@ -91,20 +92,23 @@ module Utopia
91
92
  end
92
93
  end
93
94
 
94
- # The request_path is an absolute uri path, e.g. /foo/bar. If an xnode file exists on disk for this exact path, it is instantiated, otherwise nil.
95
- def lookup_node(request_path)
96
- name = request_path.last
97
- name_xnode = name.to_s + XNODE_EXTENSION
98
-
99
- node_path = File.join(@root, request_path.dirname.components, name_xnode)
100
-
101
- if File.exist? node_path
102
- return Node.new(self, request_path.dirname + name, request_path, node_path)
95
+ # @param path [Path] the request_path is an absolute uri path, e.g. `/foo/bar`. If an xnode file exists on disk for this exact path, it is instantiated, otherwise nil.
96
+ def lookup_node(path, locale = nil)
97
+ resolve_link(
98
+ @links.for(path, locale)
99
+ )
100
+ end
101
+
102
+ def resolve_link(link)
103
+ if path = link&.path
104
+ full_path = File.join(@root, path.dirname, link.key + XNODE_EXTENSION)
105
+
106
+ if File.exist?(full_path)
107
+ return Node.new(self, path, path, full_path)
108
+ end
103
109
  end
104
-
105
- return nil
106
110
  end
107
-
111
+
108
112
  def call(env)
109
113
  request = Rack::Request.new(env)
110
114
  path = Path.create(request.path_info)
@@ -112,17 +116,17 @@ module Utopia
112
116
  # Check if the request is to a non-specific index. This only works for requests with a given name:
113
117
  basename = path.basename
114
118
  directory_path = File.join(@root, path.dirname.components, basename)
115
-
119
+
116
120
  # If the request for /foo/bar is actually a directory, rewrite it to /foo/bar/index:
117
121
  if File.directory? directory_path
118
122
  index_path = [basename, INDEX]
119
123
 
120
124
  return [307, {HTTP::LOCATION => path.dirname.join(index_path).to_s}, []]
121
125
  end
122
-
126
+
123
127
  locale = env[Localization::CURRENT_LOCALE_KEY]
124
128
  if link = @links.for(path, locale)
125
- if link.path and node = lookup_node(link.path)
129
+ if node = resolve_link(link)
126
130
  attributes = request.env.fetch(VARIABLES_KEY, {}).to_hash
127
131
 
128
132
  return node.process!(request, attributes)
@@ -153,14 +157,14 @@ module Utopia
153
157
 
154
158
  while components.any?
155
159
  tag_path = File.join(@root, components, name_path)
156
-
160
+
157
161
  if File.exist? tag_path
158
162
  return Node.new(self, Path[components] + name, parent_path + name, tag_path)
159
163
  end
160
-
164
+
161
165
  if String === name_path
162
166
  tag_path = File.join(@root, components, '_' + name_path)
163
-
167
+
164
168
  if File.exist? tag_path
165
169
  return Node.new(self, Path[components] + name, parent_path + name, tag_path)
166
170
  end
@@ -30,60 +30,55 @@ require_relative '../locale'
30
30
 
31
31
  module Utopia
32
32
  class Content
33
- INDEX = 'index'.freeze
34
-
35
33
  # Represents a link to some content with associated metadata.
36
34
  class Link
37
- def initialize(kind, path, info = nil)
38
- path = Path.create(path)
39
-
40
- @info = info || {}
35
+ # @param kind [Symbol] the kind of link.
36
+ def initialize(kind, name, locale, path, info, title = nil)
41
37
  @kind = kind
42
-
43
- case @kind
44
- when :file
45
- @name, @locale = path.last.split('.', 2)
46
- @path = path
47
- when :directory
48
- @name = path.basename
49
-
50
- if @name == INDEX
51
- @name = path.dirname.basename
52
- end
53
-
54
- @locale = path.extension
55
- @path = path
56
- when :virtual
57
- @name, @locale = path.to_s.split('.', 2)
58
- @path = @info[:path] ? Path.create(@info[:path]) : nil
38
+ @name = name
39
+ @locale = locale
40
+ @path = Path.create(path)
41
+ @info = info || {}
42
+ @title = Trenni::Strings.to_title(title || name)
43
+ end
44
+
45
+ def key
46
+ if locale
47
+ "#{@path.last}.#{@locale}"
59
48
  else
60
- raise ArgumentError.new("Unknown link kind #{@kind} with path #{path}")
49
+ @path.last
61
50
  end
62
-
63
- @title = Trenni::Strings.to_title(@name)
64
51
  end
65
-
52
+
66
53
  def href
67
54
  @href ||= @info.fetch(:uri) do
68
55
  (@path.dirname + @path.basename).to_s if @path
69
56
  end
70
57
  end
71
-
58
+
72
59
  # Look up from the `links.yaml` metadata with a given symbolic key.
73
60
  def [] key
74
61
  @info[key]
75
62
  end
76
-
63
+
77
64
  attr :kind
78
65
  attr :name
79
66
  attr :path
80
67
  attr :info
81
68
  attr :locale
82
-
69
+
83
70
  def href?
84
71
  !!href
85
72
  end
86
-
73
+
74
+ def index?
75
+ @kind == :index
76
+ end
77
+
78
+ def virtual?
79
+ @kind == :virtual
80
+ end
81
+
87
82
  def relative_href(base = nil)
88
83
  if base and href.start_with? '/'
89
84
  Path.shortest_path(href, base)
@@ -91,11 +86,11 @@ module Utopia
91
86
  href
92
87
  end
93
88
  end
94
-
89
+
95
90
  def title
96
91
  @info.fetch(:title, @title)
97
92
  end
98
-
93
+
99
94
  def to_anchor(base: nil, content: self.title, builder: nil, **attributes)
100
95
  attributes[:class] ||= 'link'
101
96
 
@@ -124,7 +119,7 @@ module Utopia
124
119
  def eql? other
125
120
  self.class.eql?(other.class) and kind.eql?(other.kind) and name.eql?(other.name) and path.eql?(other.path) and info.eql?(other.info)
126
121
  end
127
-
122
+
128
123
  def == other
129
124
  other and kind == other.kind and name == other.name and path == other.path
130
125
  end
@@ -27,7 +27,8 @@ require 'concurrent/map'
27
27
  module Utopia
28
28
  class Content
29
29
  # The file extension for markup nodes on disk.
30
- XNODE_EXTENSION = '.xnode'.freeze
30
+ XNODE_EXTENSION = '.xnode'
31
+ INDEX = "index"
31
32
 
32
33
  class Links
33
34
  def self.for(root, path, locale = nil)
@@ -40,47 +41,55 @@ module Utopia
40
41
  self.new(root).index(path, **options)
41
42
  end
42
43
 
43
- XNODE_FILTER = /^(.+)#{Regexp.escape XNODE_EXTENSION}$/
44
- INDEX_XNODE_FILTER = /^(index(\..+)*)#{Regexp.escape XNODE_EXTENSION}$/
45
-
46
- def initialize(root)
44
+ def initialize(root, extension: XNODE_EXTENSION)
47
45
  @root = root
48
46
 
49
- @cache = Concurrent::Map.new
47
+ @extension = extension
48
+ @file_filter = /\A(?<key>(?<name>[^.]+)(\.(?<locale>.+))?)#{Regexp.escape extension}\Z/
49
+ @index_filter = /\A(?<key>(?<name>index)(\.(?<locale>.+))?)#{Regexp.escape extension}\Z/
50
+
51
+ @metadata_cache = Concurrent::Map.new
52
+ @links_cache = Concurrent::Map.new
50
53
  end
51
54
 
55
+ attr :extension
56
+ attr :file_filter
57
+ attr :index_filter
58
+
59
+ # Resolve a link for the specified path, which must be a path to a specific link.
60
+ # for(Path["/index"])
52
61
  def for(path, locale = nil)
53
- links = Resolved.new(self, path.dirname)
54
-
55
- links.lookup(path.last, locale)
62
+ links(path.dirname).lookup(path.last, locale)
56
63
  end
57
64
 
58
- DEFAULT_INDEX_OPTIONS = {
59
- :directories => true,
60
- :files => true,
61
- :virtuals => true,
62
- :indices => false,
63
- :sort => :order,
64
- :display => :display,
65
- }
66
-
67
- def index(path, **options)
68
- options = DEFAULT_INDEX_OPTIONS.merge(options)
65
+ # Give an index of all links that can be reached from the given path.
66
+ def index(path, name: nil, locale: nil, display: :display, sort: :order, sort_default: 0, directories: true, files: true, virtuals: true, indices: false)
67
+ ordered = links(path).ordered.dup
68
+
69
+ # Ignore specific kinds of links:
70
+ ignore = []
71
+ ignore << :directory unless directories
72
+ ignore << :file unless files
73
+ ignore << :virtual unless virtuals
74
+ ignore << :index unless indices
69
75
 
70
- ordered = Resolved.new(self, path, options).ordered
76
+ if ignore.any?
77
+ ordered.reject!{|link| ignore.include?(link.kind)}
78
+ end
71
79
 
72
- # This option filters a link based on the display parameter.
73
- if display_key = options[:display]
74
- ordered.reject!{|link| link.info[display_key] == false}
80
+ # Filter links by display key:
81
+ if display
82
+ ordered.reject!{|link| link.info[display] == false}
75
83
  end
76
84
 
77
- # Named:
78
- if name = options[:name]
85
+ # Filter links by name:
86
+ if name
79
87
  # We use pattern === name, which matches either the whole string, or matches a regexp.
80
88
  ordered.select!{|link| name === link.name}
81
89
  end
82
90
 
83
- if locale = options[:locale]
91
+ # Filter by locale:
92
+ if locale
84
93
  locales = {}
85
94
 
86
95
  ordered.each do |link|
@@ -94,10 +103,10 @@ module Utopia
94
103
  ordered = locales.values
95
104
  end
96
105
 
97
- # Sort:
98
- if sort_key = options[:sort]
106
+ # Order by sort key:
107
+ if sort
99
108
  # Sort by sort_key, otherwise by title.
100
- ordered.sort_by!{|link| [link[sort_key] || options[:sort_default] || 0, link.title]}
109
+ ordered.sort_by!{|link| [link[sort] || sort_default, link.title]}
101
110
  end
102
111
 
103
112
  return ordered
@@ -105,38 +114,65 @@ module Utopia
105
114
 
106
115
  attr :root
107
116
 
108
- # Represents a list of {Link} instances relating to the structure of the content. They are formed from the `links.yaml` file and the actual directory structure on disk.
109
- class Resolved
110
- DEFAULT_OPTIONS = {
111
- :directories => true,
112
- :files => true,
113
- :virtuals => true,
114
- :indices => true,
115
- }
117
+ def metadata(path)
118
+ @metadata_cache.fetch_or_store(path.to_s) do
119
+ load_metadata(path)
120
+ end
121
+ end
122
+
123
+ def links(path)
124
+ @links_cache.fetch_or_store(path.to_s) do
125
+ load_links(path)
126
+ end
127
+ end
128
+
129
+ private
130
+
131
+ def symbolize_keys(map)
132
+ # Second level attributes should be symbolic:
133
+ map.each do |key, info|
134
+ map[key] = info.each_with_object({}) { |(k,v),result| result[k.to_sym] = v }
135
+ end
116
136
 
117
- def initialize(links, top = Path.root, options = DEFAULT_OPTIONS)
137
+ return map
138
+ end
139
+
140
+ LINKS_YAML = "links.yaml"
141
+
142
+ def load_metadata(path)
143
+ yaml_path = File.join(path, LINKS_YAML)
144
+
145
+ if File.exist?(yaml_path) && data = YAML::load_file(yaml_path)
146
+ return symbolize_keys(data)
147
+ else
148
+ return {}
149
+ end
150
+ end
151
+
152
+ # Represents a list of {Link} instances relating to the structure of the content. They are formed from the `links.yaml` file and the actual directory structure on disk.
153
+ class Resolver
154
+ def initialize(links, top = Path.root)
118
155
  raise ArgumentError.new("top path must be absolute") unless top.absolute?
119
156
 
120
157
  @links = links
121
158
 
122
159
  @top = top
123
- @options = options
124
160
 
125
161
  # top.components.first == '', but this isn't a problem here.
126
162
  @path = File.join(links.root, top.components)
127
163
 
128
164
  @ordered = []
129
- @named = Hash.new{|h,k| h[k] = []}
165
+ @named = {}
130
166
 
131
- if File.directory? @path
167
+ if File.directory?(@path)
132
168
  @metadata = links.metadata(@path)
133
169
 
134
170
  load_links(@metadata.dup) do |link|
135
171
  @ordered << link
136
- @named[link.name] << link
172
+ (@named[link.name] ||= []) << link
137
173
  end
138
174
  else
139
- @metadata = {}
175
+ @metadata = nil
140
176
  end
141
177
  end
142
178
 
@@ -144,6 +180,10 @@ module Utopia
144
180
  attr :ordered
145
181
  attr :named
146
182
 
183
+ def indices
184
+ return @ordered.select{|link| link.index?}
185
+ end
186
+
147
187
  def each(locale)
148
188
  return to_enum(:each, locale) unless block_given?
149
189
 
@@ -155,115 +195,137 @@ module Utopia
155
195
  def lookup(name, locale = nil)
156
196
  # This allows generic links to serve any locale requested.
157
197
  if links = @named[name]
158
- links.find{|link| link.locale == locale} || links.find{|link| link.locale == nil}
198
+ generic_link = nil
199
+
200
+ links.each do |link|
201
+ if link.locale == locale
202
+ return link
203
+ elsif link.locale.nil?
204
+ generic_link = link
205
+ end
206
+ end
207
+
208
+ return generic_link
159
209
  end
160
210
  end
161
211
 
162
212
  private
163
213
 
164
- def indices(path, &block)
165
- Dir.entries(path).select{|filename| filename.match(INDEX_XNODE_FILTER)}
214
+ def entries(path)
215
+ Dir.entries(path).reject{|entry| entry.match(/^[\._]/)}
166
216
  end
167
217
 
168
- def load_indices(name, path, metadata)
169
- directory_metadata = metadata.delete(name) || {}
170
- indices_metadata = @links.metadata(path)
218
+ # @param name [String] the name of the directory.
219
+ def load_directory(name, metadata, &block)
220
+ defaults = metadata.delete(name) || {}
171
221
 
172
- indices_count = 0
222
+ links = @links.links(@top + name).indices
173
223
 
174
- indices(path).each do |filename|
175
- index_name = File.basename(filename, XNODE_EXTENSION)
176
- # Values in indices_metadata will override values in directory_metadata:
177
- index_metadata = directory_metadata.merge(indices_metadata[index_name] || {})
178
-
179
- directory_link = Link.new(:directory, @top + [name, index_name], index_metadata)
180
-
181
- # Merge metadata from foo.en into foo/index.en
182
- if directory_link.locale
183
- localized_key = "#{directory_link.name}.#{directory_link.locale}"
184
- if localized_metadata = metadata.delete(localized_key)
185
- directory_link.info.update(localized_metadata)
186
- end
224
+ links.each do |link|
225
+ # We extract the metadata according to the localized link:
226
+ if info = metadata.delete("#{name}.#{link.locale}")
227
+ info = info.merge(link.info)
228
+ else
229
+ info = link.info
187
230
  end
188
231
 
189
- yield directory_link
190
-
191
- indices_count += 1
232
+ yield Link.new(:directory, name, link.locale, link.path, defaults.merge(info))
233
+ end
234
+ end
235
+
236
+ def load_index(name, locale, info)
237
+ info ||= {}
238
+
239
+ if locale and defaults = @metadata[name]
240
+ info = defaults.merge(info)
192
241
  end
193
242
 
194
- if indices_count == 0
195
- # Specify a nil uri if no index could be found for the directory:
196
- yield Link.new(:directory, top + [name], {:uri => nil}.merge(directory_metadata))
243
+ path = @top + name
244
+
245
+ yield Link.new(:index, name, locale, path, info, path[-2])
246
+ end
247
+
248
+ def load_default_index(name = INDEX, info = {})
249
+ path = @top + name
250
+
251
+ if info
252
+ info = {uri: nil}.merge(info)
253
+ else
254
+ info = {uri: nil}
197
255
  end
256
+
257
+ # Specify a nil uri if no index could be found for the directory:
258
+ yield Link.new(:index, name, nil, @top, info, path[-2])
198
259
  end
199
260
 
200
- def entries(path)
201
- Dir.entries(path).reject{|filename| filename.match(/^[\._]/)}
261
+ def load_file(name, locale, info)
262
+ info ||= {}
263
+
264
+ if locale and defaults = @metadata[name]
265
+ info = defaults.merge(info)
266
+ end
267
+
268
+ path = @top + name
269
+
270
+ yield Link.new(:file, name, locale, path, info)
202
271
  end
203
272
 
204
- def load_links(metadata, &block)
205
- # Load all metadata for a given path:
206
- metadata = @metadata.dup
273
+ def load_virtuals(metadata)
274
+ virtuals = {}
207
275
 
208
- # Check all entries in the given directory:
209
- entries(@path).each do |filename|
210
- path = File.join(@path, filename)
276
+ # After processing all directory entries, we are left with virtual links:
277
+ metadata.each do |key, info|
278
+ name, locale = key.split('.', 2)
279
+ localized = (virtuals[name] ||= {})
280
+ localized[locale] = info
281
+ end
282
+
283
+ virtuals.each do |name, localized|
284
+ defaults = localized[nil]
211
285
 
212
- # There are two types of filelinks based links:
213
- # 1/ Named files, e.g. foo.xnode, name=foo
214
- # 2/ Directories, e.g. bar/index.xnode, name=bar
215
- if File.directory?(path) and @options[:directories]
216
- load_indices(filename, path, metadata, &block)
217
- elsif filename.match(INDEX_XNODE_FILTER) and @options[:indices] == false
218
- metadata.delete($1) # We don't include indices in the list of pages.
219
- elsif filename.match(XNODE_FILTER) and @options[:files]
220
- yield Link.new(:file, @top + $1, metadata.delete($1))
286
+ localized.each do |locale, info|
287
+ info = defaults&.merge(info) || info
288
+ path = info[:path]
289
+
290
+ yield Link.new(:virtual, name, locale, path, info)
221
291
  end
222
292
  end
293
+ end
294
+
295
+ def load_links(metadata, &block)
296
+ index_loaded = false
223
297
 
224
- if @options[:virtuals]
225
- # After processing all directory entries, we are left with virtual entries in the metadata:
226
- metadata.each do |name, info|
227
- virtual_link = Link.new(:virtual, name, info)
298
+ # Check all entries in the given directory:
299
+ entries(@path).each do |entry|
300
+ path = File.join(@path, entry)
301
+
302
+ # There are serveral types of file based links:
303
+
304
+ # 1. Directories, e.g. bar/ (name=bar)
305
+ if File.directory?(path)
306
+ load_directory(entry, metadata, &block)
228
307
 
229
- # Given a virtual named such as "welcome.cn", merge it with metadata from "welcome" if it exists:
230
- if virtual_metadata = @metadata[virtual_link.name]
231
- virtual_link.info.update(virtual_metadata)
232
- end
308
+ # 2. Index files, e.g. index.xnode, name=parent
309
+ elsif match = entry.match(@links.index_filter)
310
+ load_index(match[:name], match[:locale], metadata.delete(match[:key]), &block)
311
+ index_loaded = true
233
312
 
234
- yield virtual_link
313
+ # 3. Named files, e.g. foo.xnode, name=foo
314
+ elsif match = entry.match(@links.file_filter)
315
+ load_file(match[:name], match[:locale], metadata.delete(match[:key]), &block)
235
316
  end
236
317
  end
318
+
319
+ unless index_loaded
320
+ load_default_index(INDEX, metadata.delete(INDEX), &block)
321
+ end
322
+
323
+ load_virtuals(metadata, &block)
237
324
  end
238
325
  end
239
326
 
240
- def metadata(path)
241
- @cache.fetch_or_store(path.to_s) do
242
- load(path).freeze
243
- end
244
- end
245
-
246
- private
247
-
248
- def symbolize_keys(hash)
249
- # Second level attributes should be symbolic:
250
- hash.each do |key, info|
251
- hash[key] = info.each_with_object({}) { |(k,v),result| result[k.to_sym] = v }
252
- end
253
-
254
- return hash
255
- end
256
-
257
- LINKS_YAML = "links.yaml"
258
-
259
- def load(path)
260
- yaml_path = File.join(path, LINKS_YAML)
261
-
262
- if File.exist?(yaml_path) && data = YAML::load_file(yaml_path)
263
- return symbolize_keys(data)
264
- else
265
- return {}
266
- end
327
+ def load_links(path)
328
+ Resolver.new(self, Path.create(path))
267
329
  end
268
330
  end
269
331
  end