В публичном API WeasyPrints я принимаю имена файлов (среди других типов) для входов HTML. Любое имя файла, которое работает со встроенным open()
, должно работать, но мне нужно преобразовать его в URL-адрес в схеме file://
, который позже будет передан в urllib.urlopen()
.
(Все внутри формы URL. Мне нужно иметь "базовый URL" для документов, чтобы разрешать относительные ссылки на URL с помощью urlparse.urljoin()
.)
urllib.pathname2url - это начало:
Преобразуйте путь пути из локального синтаксиса для пути к форме, используемой в компоненте пути URL. Это не дает полный URL. Возвращаемое значение уже будет указано с помощью функции quote().
Акцент мой, но мне нужен полный URL. Пока это работает:
def path2url(path):
"""Return file:// URL from a filename."""
path = os.path.abspath(path)
if isinstance(path, unicode):
path = path.encode('utf8')
return 'file:' + urlparse.pathname2url(path)
UTF-8, по-видимому, рекомендуется RFC 3987 (IRI). Но в этом случае (URL-адрес предназначен для urllib, в конце концов), возможно, мне следует использовать sys.getfilesystemencoding()?
Однако, основываясь на литературе, я должен добавить не только file:
, но и file://
... за исключением случаев, когда я не должен: В Windows результаты от nturl2path.pathname2url()
уже начинается с трех косых черт.
Итак, вопрос: есть ли лучший способ сделать это и сделать его кросс-платформенным?