37 lines
633 B
Go
37 lines
633 B
Go
package main
|
|
|
|
import (
|
|
"net/url"
|
|
"path/filepath"
|
|
"strings"
|
|
"unicode"
|
|
)
|
|
|
|
func uriToPath(uri string) string {
|
|
switch {
|
|
case strings.HasPrefix(uri, "file:///"):
|
|
uri = uri[len("file://"):]
|
|
case strings.HasPrefix(uri, "file://"):
|
|
uri = uri[len("file:/"):]
|
|
}
|
|
|
|
if path, err := url.PathUnescape(uri); err == nil {
|
|
uri = path
|
|
}
|
|
|
|
if isWindowsDriveURIPath(uri) {
|
|
uri = strings.ToUpper(string(uri[1])) + uri[2:]
|
|
}
|
|
|
|
return filepath.FromSlash(uri)
|
|
}
|
|
|
|
func isWindowsDriveURIPath(uri string) bool {
|
|
//nolint:gomnd
|
|
if len(uri) < 4 {
|
|
return false
|
|
}
|
|
|
|
return uri[0] == '/' && unicode.IsLetter(rune(uri[1])) && uri[2] == ':'
|
|
}
|