在 WeasyPrint 的公共 API 中,我接受 HTML 输入的文件名或 URL(以及其他类型):
document = HTML(filename='/foo/bar/baz.html')
document = HTML(url='http://example.net/bar/baz.html')
也可以选择不命名参数并让 WeasyPrint 猜测它的类型:
document = HTML(sys.argv[1])
有些情况很简单:如果它/
在 Unix 上以 a 开头,它是一个文件名,如果它以它开头,http://
它可能是一个 URL。但是我们需要一个通用算法来为任何字符串提供答案。
目前我尝试匹配这个正则表达式:^([a-z][a-z0-1.+-]*):
。匹配的字符串以符合RFC 3986 (URI)的有效 URI 方案开头。这在 Unix 上还不错,但在 Windows 上完全失败:C:\foo\bar.html
匹配并被视为 URL。
我可以在正则表达式中更改*
为+
,并且只匹配至少两个字符长的 URI 方案。显然没有比这更短的已知 URI 方案。
还是有更好的标准?也许我应该将“猜测”的 URL 限制为少数方案。更多奇特的情况下仍然可以使用HTML(url=foo)
。
url.startswith(['http:', 'https:', 'ftp:', 'data:'])