- From: Sebastian Pipping <webmaster@hartwork.org>
- Date: Sat, 08 Sep 2007 21:31:14 +0200
- To: uri@w3.org
Updated version with domainRootMode (see example below) and empty path segment (e.g. abc//def) fix. == Variables == Base - [IN] Base to cut off if possible A - [IN] Absolute URI that we would like relative instead T - [OUT] Transformation result (relative if possible, absolute if necessary) == Example == BASE = http://ex/x/y/z?one A = http://ex/x/r?two === domainRootMode === T = /x/r?two === not domainRootMode === T = ../r?two == Algorithm v0.2 == if (A.scheme != Base.scheme) then T.scheme = A.scheme; T.authority = A.authority; T.path = A.path; T.query = A.query; T.fragment = A.fragment; else undef(T.scheme); if (A.authority != Base.authority) then T.authority = A.authority; T.path = A.path; T.query = A.query; T.fragment = A.fragment; else if domainRootMode then undef(T.authority); T.path = "/" + A.path; T.query = A.query; T.fragment = A.fragment; else undef(last(Base.path)); T.path = ""; while (first(A.path) == first(Base.path)) do A.path++; Base.path++; endwhile; bool pathNaked = true; while defined(first(Base.path)) do Base.path++; T.path += "../"; pathNaked = false; endwhile; while defined(first(A.path)) do if pathNaked then if (first(A.path) contains ":") or (first(A.path) == "") then T.path += "./"; endif; endif; T.path += first(A.path); pathNaked = false; A.path++; if defined(first(A.path)) then T.path += + "/"; endif; endwhile; T.query = A.query; T.fragment = A.fragment; endif; endif; endif; Feedback is highly appreciated. Sebastian
Received on Saturday, 8 September 2007 19:31:21 UTC