utopia 2.13.4 → 2.16.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/bake/utopia/{yarn.rb → node.rb} +13 -5
- data/lib/.DS_Store +0 -0
- data/lib/utopia/.DS_Store +0 -0
- data/lib/utopia/command.rb +2 -2
- data/lib/utopia/command/site.rb +1 -1
- data/lib/utopia/content.rb +23 -19
- data/lib/utopia/content/.DS_Store +0 -0
- data/lib/utopia/content/link.rb +29 -34
- data/lib/utopia/content/links.rb +185 -123
- data/lib/utopia/content/markup.rb +1 -1
- data/lib/utopia/content/node.rb +15 -19
- data/lib/utopia/content/response.rb +5 -5
- data/lib/utopia/controller.rb +0 -17
- data/lib/utopia/controller/.DS_Store +0 -0
- data/lib/utopia/controller/base.rb +27 -3
- data/lib/utopia/controller/respond.rb +50 -107
- data/lib/utopia/extensions/array_split.rb +2 -2
- data/lib/utopia/http.rb +3 -3
- data/lib/utopia/localization.rb +18 -10
- data/lib/utopia/middleware.rb +2 -2
- data/lib/utopia/path.rb +40 -36
- data/lib/utopia/redirection.rb +0 -2
- data/lib/utopia/responder.rb +76 -0
- data/lib/utopia/version.rb +1 -1
- data/setup/.DS_Store +0 -0
- data/setup/server/.DS_Store +0 -0
- data/setup/site/.DS_Store +0 -0
- data/setup/site/.gitignore +8 -7
- data/setup/site/Gemfile +7 -5
- data/setup/site/pages/.DS_Store +0 -0
- data/setup/site/public/.DS_Store +0 -0
- metadata +81 -603
- data/.codeclimate.yml +0 -5
- data/.gitignore +0 -8
- data/.rspec +0 -4
- data/.travis.yml +0 -28
- data/.yardopts +0 -2
- data/Gemfile +0 -28
- data/README.md +0 -92
- data/Rakefile +0 -33
- data/benchmark/call_vs_check.rb +0 -38
- data/benchmark/const_vs_hash.rb +0 -35
- data/benchmark/hash_vs_openstruct.rb +0 -54
- data/benchmark/string_vs_symbol.rb +0 -14
- data/benchmark/struct_vs_class.rb +0 -91
- data/docs/.nojekyll +0 -0
- data/docs/_components/jquery-syntax/base/jquery.syntax.brush.apache.css +0 -6
- data/docs/_components/jquery-syntax/base/jquery.syntax.brush.applescript.css +0 -5
- data/docs/_components/jquery-syntax/base/jquery.syntax.brush.assembly.css +0 -8
- data/docs/_components/jquery-syntax/base/jquery.syntax.brush.bash-script.css +0 -6
- data/docs/_components/jquery-syntax/base/jquery.syntax.brush.bash.css +0 -10
- data/docs/_components/jquery-syntax/base/jquery.syntax.brush.clang.css +0 -3
- data/docs/_components/jquery-syntax/base/jquery.syntax.brush.css.css +0 -14
- data/docs/_components/jquery-syntax/base/jquery.syntax.brush.diff.css +0 -16
- data/docs/_components/jquery-syntax/base/jquery.syntax.brush.html.css +0 -5
- data/docs/_components/jquery-syntax/base/jquery.syntax.brush.ocaml.css +0 -3
- data/docs/_components/jquery-syntax/base/jquery.syntax.brush.protobuf.css +0 -2
- data/docs/_components/jquery-syntax/base/jquery.syntax.brush.python.css +0 -6
- data/docs/_components/jquery-syntax/base/jquery.syntax.brush.ruby.css +0 -2
- data/docs/_components/jquery-syntax/base/jquery.syntax.brush.xml.css +0 -18
- data/docs/_components/jquery-syntax/base/jquery.syntax.core.css +0 -62
- data/docs/_components/jquery-syntax/base/jquery.syntax.editor.css +0 -6
- data/docs/_components/jquery-syntax/base/theme.js +0 -1
- data/docs/_components/jquery-syntax/bright/jquery.syntax.core.css +0 -27
- data/docs/_components/jquery-syntax/bright/theme.js +0 -1
- data/docs/_components/jquery-syntax/jquery.syntax.brush.apache.js +0 -41
- data/docs/_components/jquery-syntax/jquery.syntax.brush.applescript.js +0 -57
- data/docs/_components/jquery-syntax/jquery.syntax.brush.assembly.js +0 -37
- data/docs/_components/jquery-syntax/jquery.syntax.brush.bash-script.js +0 -67
- data/docs/_components/jquery-syntax/jquery.syntax.brush.bash.js +0 -33
- data/docs/_components/jquery-syntax/jquery.syntax.brush.basic.js +0 -51
- data/docs/_components/jquery-syntax/jquery.syntax.brush.clang.js +0 -89
- data/docs/_components/jquery-syntax/jquery.syntax.brush.csharp.js +0 -47
- data/docs/_components/jquery-syntax/jquery.syntax.brush.css.js +0 -80
- data/docs/_components/jquery-syntax/jquery.syntax.brush.diff.js +0 -24
- data/docs/_components/jquery-syntax/jquery.syntax.brush.go.js +0 -47
- data/docs/_components/jquery-syntax/jquery.syntax.brush.haskell.js +0 -45
- data/docs/_components/jquery-syntax/jquery.syntax.brush.html.js +0 -66
- data/docs/_components/jquery-syntax/jquery.syntax.brush.io.js +0 -45
- data/docs/_components/jquery-syntax/jquery.syntax.brush.java.js +0 -45
- data/docs/_components/jquery-syntax/jquery.syntax.brush.javascript.js +0 -40
- data/docs/_components/jquery-syntax/jquery.syntax.brush.kai.js +0 -29
- data/docs/_components/jquery-syntax/jquery.syntax.brush.lisp.js +0 -34
- data/docs/_components/jquery-syntax/jquery.syntax.brush.lua.js +0 -44
- data/docs/_components/jquery-syntax/jquery.syntax.brush.nginx.js +0 -31
- data/docs/_components/jquery-syntax/jquery.syntax.brush.ocaml.js +0 -73
- data/docs/_components/jquery-syntax/jquery.syntax.brush.ooc.js +0 -46
- data/docs/_components/jquery-syntax/jquery.syntax.brush.pascal.js +0 -51
- data/docs/_components/jquery-syntax/jquery.syntax.brush.perl5.js +0 -52
- data/docs/_components/jquery-syntax/jquery.syntax.brush.php-script.js +0 -48
- data/docs/_components/jquery-syntax/jquery.syntax.brush.php.js +0 -15
- data/docs/_components/jquery-syntax/jquery.syntax.brush.plain.js +0 -10
- data/docs/_components/jquery-syntax/jquery.syntax.brush.protobuf.js +0 -43
- data/docs/_components/jquery-syntax/jquery.syntax.brush.python.js +0 -44
- data/docs/_components/jquery-syntax/jquery.syntax.brush.ruby.js +0 -77
- data/docs/_components/jquery-syntax/jquery.syntax.brush.scala.js +0 -44
- data/docs/_components/jquery-syntax/jquery.syntax.brush.smalltalk.js +0 -29
- data/docs/_components/jquery-syntax/jquery.syntax.brush.sql.js +0 -31
- data/docs/_components/jquery-syntax/jquery.syntax.brush.super-collider.js +0 -57
- data/docs/_components/jquery-syntax/jquery.syntax.brush.swift.js +0 -55
- data/docs/_components/jquery-syntax/jquery.syntax.brush.trenni.js +0 -35
- data/docs/_components/jquery-syntax/jquery.syntax.brush.xml.js +0 -50
- data/docs/_components/jquery-syntax/jquery.syntax.brush.yaml.js +0 -29
- data/docs/_components/jquery-syntax/jquery.syntax.cache.js +0 -65
- data/docs/_components/jquery-syntax/jquery.syntax.core.js +0 -1098
- data/docs/_components/jquery-syntax/jquery.syntax.editor.js +0 -291
- data/docs/_components/jquery-syntax/jquery.syntax.js +0 -258
- data/docs/_components/jquery-syntax/jquery.syntax.min.js +0 -13
- data/docs/_components/jquery-syntax/paper/jquery.syntax.core.css +0 -31
- data/docs/_components/jquery-syntax/paper/theme.js +0 -1
- data/docs/_components/jquery/core.js +0 -482
- data/docs/_components/jquery/jquery.js +0 -10220
- data/docs/_components/jquery/jquery.min.js +0 -4
- data/docs/_components/jquery/jquery.min.map +0 -1
- data/docs/_components/jquery/jquery.slim.js +0 -8107
- data/docs/_components/jquery/jquery.slim.min.js +0 -4
- data/docs/_components/jquery/jquery.slim.min.map +0 -1
- data/docs/_static/icon.png +0 -0
- data/docs/_static/site.css +0 -205
- data/docs/_static/utopia-background.svg +0 -1
- data/docs/_static/utopia.svg +0 -1
- data/docs/code/Utopia.html +0 -517
- data/docs/code/Utopia/Basename.html +0 -654
- data/docs/code/Utopia/Bootstrap.html +0 -538
- data/docs/code/Utopia/Command.html +0 -213
- data/docs/code/Utopia/Command/Environment.html +0 -321
- data/docs/code/Utopia/Command/Server.html +0 -214
- data/docs/code/Utopia/Command/Server/Create.html +0 -222
- data/docs/code/Utopia/Command/Server/Environment.html +0 -236
- data/docs/code/Utopia/Command/Server/Update.html +0 -317
- data/docs/code/Utopia/Command/Setup.html +0 -145
- data/docs/code/Utopia/Command/Setup/Server.html +0 -298
- data/docs/code/Utopia/Command/Setup/Site.html +0 -180
- data/docs/code/Utopia/Command/Site.html +0 -285
- data/docs/code/Utopia/Command/Site/Create.html +0 -324
- data/docs/code/Utopia/Command/Site/Update.html +0 -407
- data/docs/code/Utopia/Command/Top.html +0 -279
- data/docs/code/Utopia/Content.html +0 -832
- data/docs/code/Utopia/Content/Document.html +0 -1822
- data/docs/code/Utopia/Content/Document/State.html +0 -1220
- data/docs/code/Utopia/Content/Link.html +0 -1286
- data/docs/code/Utopia/Content/Links.html +0 -847
- data/docs/code/Utopia/Content/MarkupParser.html +0 -881
- data/docs/code/Utopia/Content/MarkupParser/ParsedTag.html +0 -422
- data/docs/code/Utopia/Content/MarkupParser/UnbalancedTagError.html +0 -615
- data/docs/code/Utopia/Content/Namespace.html +0 -485
- data/docs/code/Utopia/Content/Node.html +0 -1188
- data/docs/code/Utopia/Content/Node/Context.html +0 -938
- data/docs/code/Utopia/Content/Response.html +0 -813
- data/docs/code/Utopia/Content/SymbolicHash.html +0 -419
- data/docs/code/Utopia/Content/Tag.html +0 -399
- data/docs/code/Utopia/Content/Tags.html +0 -136
- data/docs/code/Utopia/Content/Tags/ContentTag.html +0 -187
- data/docs/code/Utopia/Content/Tags/DeferredTag.html +0 -193
- data/docs/code/Utopia/Content/Tags/Library.html +0 -333
- data/docs/code/Utopia/Content/Tags/NodeTag.html +0 -193
- data/docs/code/Utopia/Content/UnbalancedTagError.html +0 -298
- data/docs/code/Utopia/ContentLength.html +0 -343
- data/docs/code/Utopia/Controller.html +0 -907
- data/docs/code/Utopia/Controller/Actions.html +0 -289
- data/docs/code/Utopia/Controller/Actions/Action.html +0 -984
- data/docs/code/Utopia/Controller/Actions/ClassMethods.html +0 -442
- data/docs/code/Utopia/Controller/Base.html +0 -1216
- data/docs/code/Utopia/Controller/Respond.html +0 -293
- data/docs/code/Utopia/Controller/Respond/ClassMethods.html +0 -236
- data/docs/code/Utopia/Controller/Respond/Converter.html +0 -256
- data/docs/code/Utopia/Controller/Respond/Converter/Callback.html +0 -484
- data/docs/code/Utopia/Controller/Respond/Converter/ToJSON.html +0 -381
- data/docs/code/Utopia/Controller/Respond/Passthrough.html +0 -297
- data/docs/code/Utopia/Controller/Respond/Responder.html +0 -535
- data/docs/code/Utopia/Controller/Rewrite.html +0 -290
- data/docs/code/Utopia/Controller/Rewrite/ClassMethods.html +0 -242
- data/docs/code/Utopia/Controller/Rewrite/ExtractPrefixRule.html +0 -364
- data/docs/code/Utopia/Controller/Rewrite/Rewriter.html +0 -464
- data/docs/code/Utopia/Controller/Rewrite/Rule.html +0 -209
- data/docs/code/Utopia/Controller/Variables.html +0 -550
- data/docs/code/Utopia/Controllers.html +0 -244
- data/docs/code/Utopia/Exceptions.html +0 -127
- data/docs/code/Utopia/Exceptions/Handler.html +0 -526
- data/docs/code/Utopia/Exceptions/Mailer.html +0 -482
- data/docs/code/Utopia/Extensions.html +0 -117
- data/docs/code/Utopia/Extensions/ArraySplit.html +0 -183
- data/docs/code/Utopia/Extensions/DateTimeComparison.html +0 -193
- data/docs/code/Utopia/Extensions/TimeDateComparison.html +0 -193
- data/docs/code/Utopia/HTTP.html +0 -250
- data/docs/code/Utopia/HTTP/Status.html +0 -415
- data/docs/code/Utopia/Locale.html +0 -606
- data/docs/code/Utopia/Localization.html +0 -1241
- data/docs/code/Utopia/Localization/Wrapper.html +0 -459
- data/docs/code/Utopia/Logger.html +0 -205
- data/docs/code/Utopia/Logger/CompactFormatter.html +0 -335
- data/docs/code/Utopia/Path.html +0 -3310
- data/docs/code/Utopia/Path/Matcher.html +0 -518
- data/docs/code/Utopia/Path/Matcher/MatchData.html +0 -475
- data/docs/code/Utopia/Redirection.html +0 -151
- data/docs/code/Utopia/Redirection/ClientRedirect.html +0 -717
- data/docs/code/Utopia/Redirection/DirectoryIndex.html +0 -298
- data/docs/code/Utopia/Redirection/Errors.html +0 -476
- data/docs/code/Utopia/Redirection/Moved.html +0 -312
- data/docs/code/Utopia/Redirection/RequestFailure.html +0 -226
- data/docs/code/Utopia/Redirection/Rewrite.html +0 -296
- data/docs/code/Utopia/Session.html +0 -889
- data/docs/code/Utopia/Session/LazyHash.html +0 -859
- data/docs/code/Utopia/Setup.html +0 -970
- data/docs/code/Utopia/Static.html +0 -696
- data/docs/code/Utopia/Static/LocalFile.html +0 -1104
- data/docs/code/Utopia/Static/MimeTypeLoader.html +0 -541
- data/docs/code/Utopia/Static/MimeTypeLoader/ExpansionError.html +0 -124
- data/docs/code/Utopia/Tags.html +0 -115
- data/docs/code/Utopia/Tags/Environment.html +0 -314
- data/docs/code/Utopia/Tags/EnvironmentTag.html +0 -314
- data/docs/code/Utopia/Tags/Library.html +0 -340
- data/docs/code/_index.html +0 -758
- data/docs/code/class_list.html +0 -51
- data/docs/code/css/common.css +0 -1
- data/docs/code/css/full_list.css +0 -58
- data/docs/code/css/style.css +0 -496
- data/docs/code/file.README.html +0 -171
- data/docs/code/file_list.html +0 -56
- data/docs/code/frames.html +0 -17
- data/docs/code/index.html +0 -171
- data/docs/code/js/app.js +0 -292
- data/docs/code/js/full_list.js +0 -216
- data/docs/code/js/jquery.js +0 -4
- data/docs/code/materials/utopia.png +0 -0
- data/docs/code/materials/utopia.svg +0 -1
- data/docs/code/method_list.html +0 -3443
- data/docs/code/top-level-namespace.html +0 -110
- data/docs/index.html +0 -92
- data/docs/wiki.html +0 -92
- data/docs/wiki/development-environment-setup.html +0 -60
- data/docs/wiki/development-environment-setup/index.html +0 -60
- data/docs/wiki/edit.html +0 -103
- data/docs/wiki/faq/what-is-xnode.html +0 -79
- data/docs/wiki/faq/what-is-xnode/index.html +0 -79
- data/docs/wiki/javascript.html +0 -153
- data/docs/wiki/javascript/index.html +0 -153
- data/docs/wiki/middleware/content.html +0 -64
- data/docs/wiki/middleware/content/index.html +0 -64
- data/docs/wiki/middleware/controller.html +0 -104
- data/docs/wiki/middleware/controller/actions.html +0 -117
- data/docs/wiki/middleware/controller/actions/index.html +0 -117
- data/docs/wiki/middleware/controller/actions/rewrite/index.html +0 -48
- data/docs/wiki/middleware/controller/index.html +0 -104
- data/docs/wiki/middleware/controller/rewrite.html +0 -111
- data/docs/wiki/middleware/controller/rewrite/index.html +0 -111
- data/docs/wiki/middleware/localization.html +0 -59
- data/docs/wiki/middleware/localization/index.html +0 -59
- data/docs/wiki/middleware/redirection.html +0 -61
- data/docs/wiki/middleware/redirection/index.html +0 -61
- data/docs/wiki/middleware/session.html +0 -71
- data/docs/wiki/middleware/session/index.html +0 -71
- data/docs/wiki/middleware/static.html +0 -57
- data/docs/wiki/middleware/static/index.html +0 -57
- data/docs/wiki/server-setup.html +0 -118
- data/docs/wiki/server-setup/index.html +0 -118
- data/docs/wiki/testing.html +0 -59
- data/docs/wiki/testing/index.html +0 -59
- data/docs/wiki/updating-utopia.html +0 -108
- data/docs/wiki/updating-utopia/index.html +0 -108
- data/docs/wiki/your-first-page.html +0 -80
- data/docs/wiki/your-first-page/index.html +0 -80
- data/documentation/.rspec +0 -4
- data/documentation/.yarnrc +0 -1
- data/documentation/Gemfile +0 -19
- data/documentation/Guardfile +0 -9
- data/documentation/Rakefile +0 -9
- data/documentation/config.ru +0 -41
- data/documentation/config/README.md +0 -7
- data/documentation/config/environment.rb +0 -12
- data/documentation/lib/readme.txt +0 -1
- data/documentation/pages/_editor.xnode +0 -64
- data/documentation/pages/_heading.xnode +0 -2
- data/documentation/pages/_page.xnode +0 -40
- data/documentation/pages/errors/exception.xnode +0 -5
- data/documentation/pages/errors/file-not-found.xnode +0 -5
- data/documentation/pages/links.yaml +0 -2
- data/documentation/pages/wiki/_listing.xnode +0 -32
- data/documentation/pages/wiki/_navigation.xnode +0 -15
- data/documentation/pages/wiki/content.md +0 -35
- data/documentation/pages/wiki/controller.rb +0 -48
- data/documentation/pages/wiki/development-environment-setup/content.md +0 -16
- data/documentation/pages/wiki/edit.xnode +0 -10
- data/documentation/pages/wiki/faq/what-is-xnode/content.md +0 -37
- data/documentation/pages/wiki/javascript/content.md +0 -75
- data/documentation/pages/wiki/links.yaml +0 -6
- data/documentation/pages/wiki/middleware/content/content.md +0 -21
- data/documentation/pages/wiki/middleware/controller/actions/content.md +0 -76
- data/documentation/pages/wiki/middleware/controller/content.md +0 -62
- data/documentation/pages/wiki/middleware/controller/links.yaml +0 -4
- data/documentation/pages/wiki/middleware/controller/rewrite/content.md +0 -69
- data/documentation/pages/wiki/middleware/localization/content.md +0 -16
- data/documentation/pages/wiki/middleware/redirection/content.md +0 -17
- data/documentation/pages/wiki/middleware/session/content.md +0 -29
- data/documentation/pages/wiki/middleware/static/content.md +0 -13
- data/documentation/pages/wiki/server-setup/content.md +0 -52
- data/documentation/pages/wiki/show.xnode +0 -12
- data/documentation/pages/wiki/testing/content.md +0 -15
- data/documentation/pages/wiki/updating-utopia/content.md +0 -63
- data/documentation/pages/wiki/your-first-page/content.md +0 -38
- data/documentation/public/_components/jquery-syntax/base/jquery.syntax.brush.apache.css +0 -6
- data/documentation/public/_components/jquery-syntax/base/jquery.syntax.brush.applescript.css +0 -5
- data/documentation/public/_components/jquery-syntax/base/jquery.syntax.brush.assembly.css +0 -8
- data/documentation/public/_components/jquery-syntax/base/jquery.syntax.brush.bash-script.css +0 -6
- data/documentation/public/_components/jquery-syntax/base/jquery.syntax.brush.bash.css +0 -10
- data/documentation/public/_components/jquery-syntax/base/jquery.syntax.brush.clang.css +0 -3
- data/documentation/public/_components/jquery-syntax/base/jquery.syntax.brush.css.css +0 -14
- data/documentation/public/_components/jquery-syntax/base/jquery.syntax.brush.diff.css +0 -16
- data/documentation/public/_components/jquery-syntax/base/jquery.syntax.brush.html.css +0 -5
- data/documentation/public/_components/jquery-syntax/base/jquery.syntax.brush.ocaml.css +0 -3
- data/documentation/public/_components/jquery-syntax/base/jquery.syntax.brush.protobuf.css +0 -2
- data/documentation/public/_components/jquery-syntax/base/jquery.syntax.brush.python.css +0 -6
- data/documentation/public/_components/jquery-syntax/base/jquery.syntax.brush.ruby.css +0 -2
- data/documentation/public/_components/jquery-syntax/base/jquery.syntax.brush.xml.css +0 -18
- data/documentation/public/_components/jquery-syntax/base/jquery.syntax.core.css +0 -62
- data/documentation/public/_components/jquery-syntax/base/jquery.syntax.editor.css +0 -6
- data/documentation/public/_components/jquery-syntax/base/theme.js +0 -1
- data/documentation/public/_components/jquery-syntax/bright/jquery.syntax.core.css +0 -27
- data/documentation/public/_components/jquery-syntax/bright/theme.js +0 -1
- data/documentation/public/_components/jquery-syntax/jquery.syntax.brush.apache.js +0 -41
- data/documentation/public/_components/jquery-syntax/jquery.syntax.brush.applescript.js +0 -57
- data/documentation/public/_components/jquery-syntax/jquery.syntax.brush.assembly.js +0 -37
- data/documentation/public/_components/jquery-syntax/jquery.syntax.brush.bash-script.js +0 -67
- data/documentation/public/_components/jquery-syntax/jquery.syntax.brush.bash.js +0 -33
- data/documentation/public/_components/jquery-syntax/jquery.syntax.brush.basic.js +0 -51
- data/documentation/public/_components/jquery-syntax/jquery.syntax.brush.clang.js +0 -89
- data/documentation/public/_components/jquery-syntax/jquery.syntax.brush.csharp.js +0 -47
- data/documentation/public/_components/jquery-syntax/jquery.syntax.brush.css.js +0 -80
- data/documentation/public/_components/jquery-syntax/jquery.syntax.brush.diff.js +0 -24
- data/documentation/public/_components/jquery-syntax/jquery.syntax.brush.go.js +0 -47
- data/documentation/public/_components/jquery-syntax/jquery.syntax.brush.haskell.js +0 -45
- data/documentation/public/_components/jquery-syntax/jquery.syntax.brush.html.js +0 -66
- data/documentation/public/_components/jquery-syntax/jquery.syntax.brush.io.js +0 -45
- data/documentation/public/_components/jquery-syntax/jquery.syntax.brush.java.js +0 -45
- data/documentation/public/_components/jquery-syntax/jquery.syntax.brush.javascript.js +0 -40
- data/documentation/public/_components/jquery-syntax/jquery.syntax.brush.kai.js +0 -29
- data/documentation/public/_components/jquery-syntax/jquery.syntax.brush.lisp.js +0 -34
- data/documentation/public/_components/jquery-syntax/jquery.syntax.brush.lua.js +0 -44
- data/documentation/public/_components/jquery-syntax/jquery.syntax.brush.nginx.js +0 -31
- data/documentation/public/_components/jquery-syntax/jquery.syntax.brush.ocaml.js +0 -73
- data/documentation/public/_components/jquery-syntax/jquery.syntax.brush.ooc.js +0 -46
- data/documentation/public/_components/jquery-syntax/jquery.syntax.brush.pascal.js +0 -51
- data/documentation/public/_components/jquery-syntax/jquery.syntax.brush.perl5.js +0 -52
- data/documentation/public/_components/jquery-syntax/jquery.syntax.brush.php-script.js +0 -48
- data/documentation/public/_components/jquery-syntax/jquery.syntax.brush.php.js +0 -15
- data/documentation/public/_components/jquery-syntax/jquery.syntax.brush.plain.js +0 -10
- data/documentation/public/_components/jquery-syntax/jquery.syntax.brush.protobuf.js +0 -43
- data/documentation/public/_components/jquery-syntax/jquery.syntax.brush.python.js +0 -44
- data/documentation/public/_components/jquery-syntax/jquery.syntax.brush.ruby.js +0 -77
- data/documentation/public/_components/jquery-syntax/jquery.syntax.brush.scala.js +0 -44
- data/documentation/public/_components/jquery-syntax/jquery.syntax.brush.smalltalk.js +0 -29
- data/documentation/public/_components/jquery-syntax/jquery.syntax.brush.sql.js +0 -31
- data/documentation/public/_components/jquery-syntax/jquery.syntax.brush.super-collider.js +0 -57
- data/documentation/public/_components/jquery-syntax/jquery.syntax.brush.swift.js +0 -55
- data/documentation/public/_components/jquery-syntax/jquery.syntax.brush.trenni.js +0 -35
- data/documentation/public/_components/jquery-syntax/jquery.syntax.brush.xml.js +0 -50
- data/documentation/public/_components/jquery-syntax/jquery.syntax.brush.yaml.js +0 -29
- data/documentation/public/_components/jquery-syntax/jquery.syntax.cache.js +0 -65
- data/documentation/public/_components/jquery-syntax/jquery.syntax.core.js +0 -1098
- data/documentation/public/_components/jquery-syntax/jquery.syntax.editor.js +0 -291
- data/documentation/public/_components/jquery-syntax/jquery.syntax.js +0 -258
- data/documentation/public/_components/jquery-syntax/jquery.syntax.min.js +0 -13
- data/documentation/public/_components/jquery-syntax/paper/jquery.syntax.core.css +0 -31
- data/documentation/public/_components/jquery-syntax/paper/theme.js +0 -1
- data/documentation/public/_components/jquery/core.js +0 -482
- data/documentation/public/_components/jquery/jquery.js +0 -10220
- data/documentation/public/_components/jquery/jquery.min.js +0 -4
- data/documentation/public/_components/jquery/jquery.min.map +0 -1
- data/documentation/public/_components/jquery/jquery.slim.js +0 -8107
- data/documentation/public/_components/jquery/jquery.slim.min.js +0 -4
- data/documentation/public/_components/jquery/jquery.slim.min.map +0 -1
- data/documentation/public/_static +0 -1
- data/documentation/public/materials +0 -1
- data/documentation/spec/website_context.rb +0 -12
- data/documentation/spec/website_spec.rb +0 -16
- data/documentation/tasks +0 -1
- data/materials/utopia.png +0 -0
- data/materials/utopia.svg +0 -1
- data/setup/site/.yarnrc +0 -1
- data/spec/mock_node.rb +0 -16
- data/spec/spec_helper.rb +0 -13
- data/spec/utopia/command_spec.rb +0 -164
- data/spec/utopia/content/document_spec.rb +0 -60
- data/spec/utopia/content/link_spec.rb +0 -47
- data/spec/utopia/content/links/foo/index.xnode +0 -0
- data/spec/utopia/content/links/foo/links.yaml +0 -2
- data/spec/utopia/content/links/foo/test.de.xnode +0 -0
- data/spec/utopia/content/links/foo/test.en.xnode +0 -0
- data/spec/utopia/content/links/links.yaml +0 -9
- data/spec/utopia/content/links/welcome.xnode +0 -0
- data/spec/utopia/content/links_spec.rb +0 -101
- data/spec/utopia/content/localized/five/index.en.xnode +0 -0
- data/spec/utopia/content/localized/four/index.en.xnode +0 -0
- data/spec/utopia/content/localized/four/index.zh.xnode +0 -0
- data/spec/utopia/content/localized/four/links.yaml +0 -4
- data/spec/utopia/content/localized/links.yaml +0 -16
- data/spec/utopia/content/localized/one.xnode +0 -0
- data/spec/utopia/content/localized/three/index.xnode +0 -0
- data/spec/utopia/content/localized/two.en.xnode +0 -0
- data/spec/utopia/content/localized/two.zh.xnode +0 -0
- data/spec/utopia/content/markup_spec.rb +0 -96
- data/spec/utopia/content/namespace_spec.rb +0 -45
- data/spec/utopia/content/node/lookup/content.xnode +0 -1
- data/spec/utopia/content/node/lookup/index.xnode +0 -1
- data/spec/utopia/content/node/ordered/first.xnode +0 -0
- data/spec/utopia/content/node/ordered/index.xnode +0 -0
- data/spec/utopia/content/node/ordered/links.yaml +0 -4
- data/spec/utopia/content/node/ordered/second.xnode +0 -0
- data/spec/utopia/content/node/related/foo.en.xnode +0 -0
- data/spec/utopia/content/node/related/foo.ja.xnode +0 -0
- data/spec/utopia/content/node/related/links.yaml +0 -4
- data/spec/utopia/content/node_spec.rb +0 -97
- data/spec/utopia/content/response_spec.rb +0 -54
- data/spec/utopia/content/tags_spec.rb +0 -82
- data/spec/utopia/content_spec.rb +0 -100
- data/spec/utopia/content_spec.ru +0 -6
- data/spec/utopia/content_spec/_heading.xnode +0 -1
- data/spec/utopia/content_spec/content/_show-value.xnode +0 -1
- data/spec/utopia/content_spec/content/links.yaml +0 -2
- data/spec/utopia/content_spec/content/test-partial.xnode +0 -1
- data/spec/utopia/content_spec/index.xnode +0 -1
- data/spec/utopia/content_spec/node/index.xnode +0 -1
- data/spec/utopia/content_spec/test.xnode +0 -10
- data/spec/utopia/controller/actions_spec.rb +0 -62
- data/spec/utopia/controller/middleware_spec.rb +0 -88
- data/spec/utopia/controller/middleware_spec.ru +0 -6
- data/spec/utopia/controller/middleware_spec/controller/controller.rb +0 -27
- data/spec/utopia/controller/middleware_spec/controller/index.xnode +0 -1
- data/spec/utopia/controller/middleware_spec/controller/nested/controller.rb +0 -7
- data/spec/utopia/controller/middleware_spec/empty/controller.rb +0 -0
- data/spec/utopia/controller/middleware_spec/redirect/controller.rb +0 -12
- data/spec/utopia/controller/middleware_spec/redirect/test/controller.rb +0 -9
- data/spec/utopia/controller/respond_spec.rb +0 -174
- data/spec/utopia/controller/respond_spec.ru +0 -12
- data/spec/utopia/controller/respond_spec/api/controller.rb +0 -28
- data/spec/utopia/controller/respond_spec/errors/controller.rb +0 -14
- data/spec/utopia/controller/respond_spec/errors/file-not-found.xnode +0 -8
- data/spec/utopia/controller/respond_spec/html/controller.rb +0 -11
- data/spec/utopia/controller/respond_spec/rewrite/controller.rb +0 -13
- data/spec/utopia/controller/rewrite_spec.rb +0 -80
- data/spec/utopia/controller/sequence_spec.rb +0 -135
- data/spec/utopia/controller/variables_spec.rb +0 -59
- data/spec/utopia/controller/websocket_spec.rb +0 -68
- data/spec/utopia/controller/websocket_spec.ru +0 -5
- data/spec/utopia/controller/websocket_spec/server/controller.rb +0 -11
- data/spec/utopia/exceptions/handler_spec.rb +0 -47
- data/spec/utopia/exceptions/handler_spec.ru +0 -8
- data/spec/utopia/exceptions/handler_spec/controller.rb +0 -19
- data/spec/utopia/exceptions/mailer_spec.rb +0 -43
- data/spec/utopia/exceptions/mailer_spec.ru +0 -10
- data/spec/utopia/extensions_spec.rb +0 -73
- data/spec/utopia/http/status_spec.rb +0 -44
- data/spec/utopia/locale_spec.rb +0 -58
- data/spec/utopia/localization_spec.rb +0 -92
- data/spec/utopia/localization_spec.ru +0 -15
- data/spec/utopia/localization_spec/controller.rb +0 -21
- data/spec/utopia/localization_spec/localized.de.txt +0 -1
- data/spec/utopia/localization_spec/localized.en.txt +0 -1
- data/spec/utopia/localization_spec/localized.ja.txt +0 -1
- data/spec/utopia/localization_spec/test.txt +0 -1
- data/spec/utopia/middleware_spec.rb +0 -31
- data/spec/utopia/path/matcher_spec.rb +0 -66
- data/spec/utopia/path_spec.rb +0 -162
- data/spec/utopia/performance_spec.rb +0 -92
- data/spec/utopia/performance_spec/cache/head/readme.txt +0 -1
- data/spec/utopia/performance_spec/cache/meta/readme.txt +0 -1
- data/spec/utopia/performance_spec/config.ru +0 -35
- data/spec/utopia/performance_spec/lib/readme.txt +0 -1
- data/spec/utopia/performance_spec/pages/_heading.xnode +0 -2
- data/spec/utopia/performance_spec/pages/_page.xnode +0 -26
- data/spec/utopia/performance_spec/pages/api/controller.rb +0 -8
- data/spec/utopia/performance_spec/pages/errors/exception.xnode +0 -5
- data/spec/utopia/performance_spec/pages/errors/file-not-found.xnode +0 -5
- data/spec/utopia/performance_spec/pages/links.yaml +0 -2
- data/spec/utopia/performance_spec/pages/welcome/index.xnode +0 -17
- data/spec/utopia/rack_helper.rb +0 -32
- data/spec/utopia/redirection_spec.rb +0 -77
- data/spec/utopia/redirection_spec.ru +0 -27
- data/spec/utopia/session_spec.rb +0 -189
- data/spec/utopia/session_spec.ru +0 -24
- data/spec/utopia/setup_spec.rb +0 -56
- data/spec/utopia/static_spec.rb +0 -49
- data/spec/utopia/static_spec.ru +0 -5
- data/spec/utopia/static_spec/test.txt +0 -1
- data/utopia.gemspec +0 -52
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8f7a327d1848543592fbdf7a17fa1f45893852cff6ff763ddfdb08c9cb64ad80
|
4
|
+
data.tar.gz: 0bcf595720fb09061dfb130e9ca3fc68f6ac071b279e661b9a76a186736fec42
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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
|
-
|
9
|
-
|
8
|
+
root = Pathname.new(context.root)
|
9
|
+
package_root = root + "node_modules"
|
10
10
|
|
11
|
-
|
12
|
-
|
13
|
-
|
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)
|
data/lib/.DS_Store
ADDED
Binary file
|
Binary file
|
data/lib/utopia/command.rb
CHANGED
data/lib/utopia/command/site.rb
CHANGED
@@ -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 = ['.
|
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"]
|
data/lib/utopia/content.rb
CHANGED
@@ -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
|
-
#
|
95
|
-
def lookup_node(
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
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
|
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
|
Binary file
|
data/lib/utopia/content/link.rb
CHANGED
@@ -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
|
-
|
38
|
-
|
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
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
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
|
-
|
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
|
data/lib/utopia/content/links.rb
CHANGED
@@ -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'
|
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
|
-
|
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
|
-
@
|
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
|
54
|
-
|
55
|
-
links.lookup(path.last, locale)
|
62
|
+
links(path.dirname).lookup(path.last, locale)
|
56
63
|
end
|
57
64
|
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
:
|
65
|
-
|
66
|
-
|
67
|
-
|
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
|
-
|
76
|
+
if ignore.any?
|
77
|
+
ordered.reject!{|link| ignore.include?(link.kind)}
|
78
|
+
end
|
71
79
|
|
72
|
-
#
|
73
|
-
if
|
74
|
-
ordered.reject!{|link| link.info[
|
80
|
+
# Filter links by display key:
|
81
|
+
if display
|
82
|
+
ordered.reject!{|link| link.info[display] == false}
|
75
83
|
end
|
76
84
|
|
77
|
-
#
|
78
|
-
if 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
|
-
|
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
|
-
#
|
98
|
-
if
|
106
|
+
# Order by sort key:
|
107
|
+
if sort
|
99
108
|
# Sort by sort_key, otherwise by title.
|
100
|
-
ordered.sort_by!{|link| [link[
|
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
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
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
|
-
|
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 =
|
165
|
+
@named = {}
|
130
166
|
|
131
|
-
if File.directory?
|
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
|
-
|
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
|
165
|
-
Dir.entries(path).
|
214
|
+
def entries(path)
|
215
|
+
Dir.entries(path).reject{|entry| entry.match(/^[\._]/)}
|
166
216
|
end
|
167
217
|
|
168
|
-
|
169
|
-
|
170
|
-
|
218
|
+
# @param name [String] the name of the directory.
|
219
|
+
def load_directory(name, metadata, &block)
|
220
|
+
defaults = metadata.delete(name) || {}
|
171
221
|
|
172
|
-
|
222
|
+
links = @links.links(@top + name).indices
|
173
223
|
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
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
|
190
|
-
|
191
|
-
|
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
|
-
|
195
|
-
|
196
|
-
|
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
|
201
|
-
|
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
|
205
|
-
|
206
|
-
metadata = @metadata.dup
|
273
|
+
def load_virtuals(metadata)
|
274
|
+
virtuals = {}
|
207
275
|
|
208
|
-
#
|
209
|
-
|
210
|
-
|
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
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
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
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
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
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
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
|
-
|
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
|
241
|
-
|
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
|