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
@@ -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
@@ -33,28 +33,24 @@ module Utopia
33
33
  class Node
34
34
  def initialize(controller, uri_path, request_path, file_path)
35
35
  @controller = controller
36
-
36
+
37
37
  @uri_path = uri_path
38
38
  @request_path = request_path
39
39
  @file_path = file_path
40
40
  end
41
-
41
+
42
42
  attr :request_path
43
43
  attr :uri_path
44
44
  attr :file_path
45
-
45
+
46
46
  def name
47
47
  @uri_path.basename
48
48
  end
49
-
50
- def link
51
- return Link.new(:file, uri_path)
52
- end
53
-
49
+
54
50
  def lookup_node(path)
55
51
  @controller.lookup_node(parent_path + Path[path])
56
52
  end
57
-
53
+
58
54
  def local_path(path = '.', base = nil)
59
55
  path = Path[path]
60
56
 
@@ -78,7 +74,7 @@ module Utopia
78
74
  def parent_path
79
75
  @uri_path.dirname
80
76
  end
81
-
77
+
82
78
  def links(path = '.', **options, &block)
83
79
  path = uri_path.dirname + Path[path]
84
80
 
@@ -90,11 +86,11 @@ module Utopia
90
86
  links
91
87
  end
92
88
  end
93
-
89
+
94
90
  def related_links
95
- @controller.links(@uri_path.dirname, :name => @uri_path.basename, :indices => true)
91
+ @controller.links(@uri_path.dirname, name: @uri_path.basename, indices: true)
96
92
  end
97
-
93
+
98
94
  def siblings_path
99
95
  if @uri_path.basename == INDEX
100
96
  @uri_path.dirname(2)
@@ -102,7 +98,7 @@ module Utopia
102
98
  @uri_path.dirname
103
99
  end
104
100
  end
105
-
101
+
106
102
  def sibling_links(**options)
107
103
  return @controller.links(siblings_path, **options)
108
104
  end
@@ -129,7 +125,7 @@ module Utopia
129
125
  def process!(request, attributes = {})
130
126
  Document.render(self, request, attributes).to_a
131
127
  end
132
-
128
+
133
129
  # This is a special context in which a limited set of well defined methods are exposed in the content view.
134
130
  Context = Struct.new(:document, :state) do
135
131
  def partial(*args, &block)
@@ -173,11 +169,11 @@ module Utopia
173
169
  def content
174
170
  document.content
175
171
  end
176
-
172
+
177
173
  def parent
178
174
  document.parent
179
175
  end
180
-
176
+
181
177
  def first
182
178
  document.first
183
179
  end