Index: lib/tdom.tcl ================================================================== --- lib/tdom.tcl +++ lib/tdom.tcl @@ -946,10 +946,17 @@ } set absolutURI [uri::resolve $base $systemId] array set uriData [uri::split $absolutURI] switch $uriData(scheme) { file { + if {$::tcl_platform(platform) eq "windows"} { + # Strip leading / for drive based paths + if {[string match /?:* $uriData(path)]} { + set uriData(path) [string range $uriData(path) 1 end] + } + } + # FIXME - path should be URL-decoded return [list string $absolutURI [xmlReadFile $uriData(path)]] } default { error "can only handle file URI's" } @@ -962,22 +969,27 @@ # # A simple convenience proc which returns an absolute URL for a given # filename. # #---------------------------------------------------------------------------- - proc tdom::baseURL {path} { - switch [file pathtype $path] { - "relative" { - return "file://[pwd]/$path" - } - default { - if {[string index $path 0] ne "/"} { - return "file:///$path" - } else { - return "file://$path" - } + # FIXME - path components need to be URL-encoded + + # Note [file join] will return path as is if it is already absolute. + # Also on Windows, it will change \ -> /. This is necessary because + # file URIs must always use /, never \. + set path [file join [pwd] $path] + + if {$::tcl_platform(platform) ne "windows"} { + return "file://$path" + } else { + if {[string match //* $path]} { + # UNC path + return "file:$path" + } else { + # Drive based path + return "file:///$path" } } } namespace eval ::tDOM { Index: tests/dom.test ================================================================== --- tests/dom.test +++ tests/dom.test @@ -1052,11 +1052,11 @@ set doc [dom parse -useForeignDTD 0 {}] $doc delete } {} test dom-4.2 {-useForeignDTD 1 with document with internal subset} {need_uri} { - set baseURI file://[file join [pwd] [file dir [info script]] dom.test] + set baseURI [tdom::baseURL [file join [pwd] [file dir [info script]] dom.test]] set ::tdom::useForeignDTD "data/domCmd1.dtd" set doc [dom parse \ -useForeignDTD 1 \ -baseurl $baseURI \ -externalentitycommand ::tdom::extRefHandler { @@ -1069,11 +1069,11 @@ $doc delete set result } {toThat} test dom-4.3 {-useForeignDTD 1 with document with internal subset} {need_uri} { - set baseURI file://[file join [pwd] [file dir [info script]] dom.test] + set baseURI [tdom::baseURL [file join [pwd] [file dir [info script]] dom.test]] set ::tdom::useForeignDTD "data/domCmd1.dtd" set doc [dom parse \ -useForeignDTD 1 \ -baseurl $baseURI \ -externalentitycommand ::tdom::extRefHandler { @@ -1087,11 +1087,11 @@ $doc delete set result } {toThis toThat} test dom-4.4 {-useForeignDTD 1 with document without document declaration} {need_uri} { - set baseURI file://[file join [pwd] [file dir [info script]] dom.test] + set baseURI [tdom::baseURL [file join [pwd] [file dir [info script]] dom.test]] set ::tdom::useForeignDTD "data/domCmd1.dtd" set doc [dom parse \ -useForeignDTD 1 \ -baseurl $baseURI \ -externalentitycommand ::tdom::extRefHandler ] @@ -1100,11 +1100,11 @@ $doc delete set result } {toThis} test dom-4.5 {-useForeignDTD 1 does not overwrite a given external subset} {need_uri} { - set baseURI file://[file join [pwd] [file dir [info script]] dom.test] + set baseURI [tdom::baseURL [file join [pwd] [file dir [info script]] dom.test]] set ::tdom::useForeignDTD "data/domCmd1.dtd" set doc [dom parse \ -useForeignDTD 1 \ -baseurl $baseURI \ -externalentitycommand ::tdom::extRefHandler { @@ -1120,11 +1120,11 @@ set result [catch {set doc [dom parse -useForeignDTD foo ]} errMsg] lappend result $errMsg } {1 {expected boolean value but got "foo"}} test dom-5.1 {document with external subset} {need_uri} { - set baseURI file://[file join [pwd] [file dir [info script]] dom.test] + set baseURI [tdom::baseURL [file join [pwd] [file dir [info script]] dom.test]] set doc [dom parse \ -baseurl $baseURI \ -externalentitycommand ::tdom::extRefHandler { }] Index: tests/domNode.test ================================================================== --- tests/domNode.test +++ tests/domNode.test @@ -3022,11 +3022,11 @@ test domNode-34.1 {getBaseURI} {need_uri} { makeFile domNode-34.1-e1.xml [file join [file dir [info script]] data] makeFile domNode-34.1-e2.xml [file join [file dir [info script]] data] - set baseURI file://[file join [pwd] [file dir [info script]] dom.test] + set baseURI [tdom::baseURL [file join [pwd] [file dir [info script]] dom.test]] set doc [dom parse \ -baseurl $baseURI \ -externalentitycommand ::tdom::extRefHandler { @@ -3054,11 +3054,11 @@ test domNode-34.2 {getBaseURI} {need_uri} { makeFile domNode-34.1-e1.xml [file join [file dir [info script]] data] makeFile domNode-34.1-e2.xml [file join [file dir [info script]] data] - set baseURI file://[file join [pwd] [file dir [info script]] dom.test] + set baseURI [tdom::baseURL [file join [pwd] [file dir [info script]] dom.test]] set doc [dom parse \ -baseurl $baseURI \ -externalentitycommand ::tdom::extRefHandler {