File tree Expand file tree Collapse file tree 3 files changed +40
-2
lines changed
Expand file tree Collapse file tree 3 files changed +40
-2
lines changed Original file line number Diff line number Diff line change @@ -38,6 +38,27 @@ def initialize(request, attributes = {})
3838 super ( )
3939 end
4040
41+ # @returns [Path] The original request path, if known.
42+ def request_path
43+ Path [ request . env [ "REQUEST_PATH" ] ]
44+ end
45+
46+ protected def current_base_uri_path
47+ self . current . node . uri_path
48+ end
49+
50+ # Compute the relative path from the curent base uri (e.g. the node being rendered) to the request uri. This path can be used to ensure resources are loaded relative to a given path.
51+ #
52+ # | Relative To | Request Path | Base URI |
53+ # |---------------|------------------------|--------------|
54+ # | "/page" | "/index" | "" |
55+ # | "/blog/entry" | "/blog/2025/05/my-cat" | "../.." |
56+ #
57+ # @returns [String] the base uri for the current page.
58+ def base_uri ( relative_to = self . current_base_uri_path )
59+ Path [ relative_to ] . dirname . shortest_path ( request_path )
60+ end
61+
4162 def [] key
4263 @attributes [ key ]
4364 end
Original file line number Diff line number Diff line change 99 <title>Utopia</title>
1010 <?r end ?>
1111
12- <base href="#{first.node.uri_path }"/>
12+ <base href="#{document.base_uri }"/>
1313 <meta name="viewport" content="width=device-width, initial-scale=1"/>
1414
1515 <link href="https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css" rel="stylesheet" integrity="sha384-wvfXpqpZZVQGK6TAh5PVlGOfQNHSoD2xbE+QkPxCAFlNEevoEH3Sl0sibVcOQVnN" crossorigin="anonymous" />
Original file line number Diff line number Diff line change 44# Copyright, 2017-2025, by Samuel Williams.
55
66require "utopia/content/document"
7+ require "rack/request"
78
89describe Utopia ::Content ::Document do
9- let ( :document ) { subject . new ( nil , { } ) }
10+ let ( :env ) { Hash [ "REQUEST_PATH" => "/index" ] }
11+ let ( :request ) { Rack ::Request . new ( env ) }
12+ let ( :document ) { subject . new ( request , { } ) }
1013
1114 it "should generate valid self-closing markup" do
1215 node = proc do |document , state |
4043
4144 expect { document . render_node ( node ) } . to raise_exception ( Utopia ::Content ::UnbalancedTagError , message : be =~ /tag span/ )
4245 end
46+
47+ it "generates an empty base uri" do
48+ relative_to = Utopia ::Path [ "/page" ]
49+ expect ( document . base_uri ( relative_to ) ) . to be == Utopia ::Path [ "" ]
50+ end
51+
52+ with "nested request path" do
53+ let ( :env ) { Hash [ "REQUEST_PATH" => "/nested/index" ] }
54+
55+ it "generates a relative base uri" do
56+ relative_to = Utopia ::Path [ "/page" ]
57+ expect ( document . base_uri ( relative_to ) ) . to be == Utopia ::Path [ ".." ]
58+ end
59+ end
4360end
You can’t perform that action at this time.
0 commit comments