ebooklib icon indicating copy to clipboard operation
ebooklib copied to clipboard

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

Open twilight-flower opened this issue 2 years ago • 3 comments

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.

twilight-flower avatar Jul 02 '23 15:07 twilight-flower

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

c1924959470 avatar Jul 02 '23 15:07 c1924959470

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

clach04 avatar Jul 29 '23 15:07 clach04

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.

aerkalov avatar Jul 30 '23 20:07 aerkalov