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 {