WeasyPrintのパブリックAPIでは、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はRFC3987(IRI)で推奨されているようです。しかし、この場合(URLは最終的にurllibを意味します)、おそらくsys.getfilesystemencoding()を使用する必要がありますか?
ただし、文献に基づいて、私は単に追加する必要はありません...私file:
がfile://
すべきでない場合を除いて:Windowsでは、結果はnturl2path.pathname2url()
すでに3つのスラッシュで始まります。
したがって、問題は、これを実行してクロスプラットフォームにするためのより良い方法はありますか?