123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154 |
- package spec
- import (
- "net/url"
- "os"
- "path"
- "path/filepath"
- "strings"
- )
- func absPath(in string) string {
-
-
- if in == "" {
- in = "."
- }
- anchored, err := filepath.Abs(in)
- if err != nil {
- specLogger.Printf("warning: could not resolve current working directory: %v", err)
- return in
- }
- pth := strings.ReplaceAll(strings.ToLower(anchored), `\`, `/`)
- if !strings.HasPrefix(pth, "/") {
- pth = "/" + pth
- }
- return path.Clean(pth)
- }
- func repairURI(in string) (*url.URL, string) {
- const prefix = fileScheme + "://"
- if !strings.HasPrefix(in, prefix) {
-
- u, _ := parseURL("")
- return u, ""
- }
-
- u, _ := parseURL(strings.TrimPrefix(in, prefix))
- debugLog("repaired URI: original: %q, repaired: %q", in, u.String())
- return u, u.String()
- }
- func fixWindowsURI(u *url.URL, in string) {
- drive := filepath.VolumeName(in)
- if len(drive) > 0 {
- if len(u.Scheme) == 1 && strings.EqualFold(u.Scheme, drive[:1]) {
- u.Scheme = fileScheme
- u.Host = ""
- u.Path = strings.Join([]string{drive, u.Opaque, u.Path}, `/`)
- } else if u.Host == "" && strings.HasPrefix(u.Path, drive) {
-
- u.Scheme = fileScheme
-
- i := len(drive) - 1
- for i >= 0 && !os.IsPathSeparator(drive[i]) {
- i--
- }
- host := drive[:i]
- u.Path = strings.TrimPrefix(u.Path, host)
- u.Host = strings.TrimPrefix(host, `\\`)
- }
- u.Opaque = ""
- u.Path = strings.ReplaceAll(strings.ToLower(u.Path), `\`, `/`)
-
- if !strings.HasPrefix(u.Path, "/") {
- u.Path = "/" + u.Path
- }
- u.Path = path.Clean(u.Path)
- return
- }
- if u.Scheme == fileScheme {
-
-
-
-
-
-
-
-
-
-
- if (!path.IsAbs(u.Path) && !filepath.IsAbs(u.Path)) || (strings.HasPrefix(u.Path, `/.`) && strings.Contains(u.Path, `\`)) {
-
- u.Path, _ = filepath.Abs(strings.TrimLeft(u.Path, `/`))
- if !strings.HasPrefix(u.Path, "/") {
- u.Path = "/" + u.Path
- }
- }
- u.Path = strings.ToLower(u.Path)
- }
-
-
-
-
-
-
-
- u.Path = path.Clean(strings.ReplaceAll(u.Path, `\`, `/`))
- }
|