aerkalov / ebooklib

Python E-book library for handling books in EPUB2/EPUB3 format -
https://ebooklib.readthedocs.io/
GNU Affero General Public License v3.0
1.5k stars 233 forks source link

Slashes in TOC file paths are converted to backslashes in EpubNav (on Windows) #284

Open twilight-flower opened 1 year ago

twilight-flower commented 1 year ago

On my Windows machine—I imagine the same wouldn't happen on Linux-likes, although I haven't tested to confirm—the EpubNav's file paths contain backslashes in place of any forward slashes that might have been present in the file paths.

So, for example, if I run the following bit of code:

from ebooklib import epub
book = epub.EpubBook()
item = epub.EpubHtml(uid="chapter", file_name="text/content.xhtml", media_type="application/xhtml+xml", content="""<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"><head><title>Sample</title></head><body><p>Sample paragraph.</p></body></html>""")
book.add_item(item)
book.toc = [item]
book.add_item(epub.EpubNcx())
book.add_item(epub.EpubNav())
book.spine = ["nav", "chapter"]
epub.write_epub("sample.epub", book)

...the output EPUB file's nav.xhtml's link to the chapter will be this:

<li>
  <a href="text\content.xhtml">Sample</a>
</li>

...which you'll note features a backslash, unlike the originally-specified file path and unlike the (correct) rendition within the same file's toc.ncx:

<navPoint id="chapter">
  <navLabel>
    <text>Sample</text>
  </navLabel>
  <content src="text/content.xhtml"/>
</navPoint>

This is a problem, because the EPUB specification explicitly forbids backslashes in file paths and any readers exposed to files with navs generated in this fashion will as such potentially throw errors over the invalid paths.

c1924959470 commented 1 year ago

   您好!您的来信我已接受,我会尽快回复您。

clach04 commented 1 year ago

https://github.com/aerkalov/ebooklib/pull/267 may fix this

aerkalov commented 1 year ago

I have deployed the changes to the master branch. Tested it with a sample file on windows and seems to be working. Will check some other PR and see when to do proper release.

For now just download source and install locally from master until the release is here.