![]() |
#1 |
Wizard
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Posts: 1,804
Karma: 8700631
Join Date: Mar 2013
Location: Rosario - Santa Fe - Argentina
Device: Kindle 4 NT
|
An issue with the .opf
I'm thinking to replace in my epub3 the JS program "Hyphenator" by the also JS program "Hyphenopoly". But I'm running into a problem: Hyphenopoly uses .wasm files as language patterns, which I include in Sigil's Misc folder. Hyphenopoly works fine, but when I open the epubs that contain it with Sigil, I get the following warning message:
Warning: the OPF contains missing or unrecognized media types... Of course, in the .opf, the .wasm files have the media type 'application/wasm' that causes the warning. Is there a way to suppress that message? By the way, epubcheck also gives the same warning; by chance, are .wasm files prohibited files? |
![]() |
![]() |
![]() |
#2 | |
Sigil Developer
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Posts: 8,816
Karma: 6000000
Join Date: Nov 2009
Device: many
|
They are not recognized media file types according to the epub 3.3 spec. You may be able to "hide" them in the METAINF folder but not sure. WebAssembly files do not run with every browser.
Since they are binary data files that are only opened by javascript, perhaps including their data directly into the js file might be best for that. According to a web search you can do that by encoding the Wasm binary as a base64 string and then decoding it within the JavaScript code. The epub 3.4 spec is currently working on this, and may add support for webassembly .wasm files. Hard to follow but I found this: https://w3c.github.io/pm-wg/minutes/...2-27.html#d6c2 The epub 3.4 spec is the one that is proposing allowing pure html as well. It will be a few months before it gets approved one way or the other. Here is a quote from the draft epub 3.4 spec: Quote:
Once whatever form of epub 3.4 spec gets finally approved, then a future version of Sigil will add them to its recognized media types list. But it may take awhile until epubcheck allows them. That also means most publishers will not currently allow them. Last edited by KevinH; 07-20-2025 at 12:46 PM. |
|
![]() |
![]() |
![]() |
#3 | |
Wizard
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Posts: 1,804
Karma: 8700631
Join Date: Mar 2013
Location: Rosario - Santa Fe - Argentina
Device: Kindle 4 NT
|
Quote:
So, until "media type 'application/wasm'" is approved, placing the .wasm files in META-INF works. By the way, except for IE, practically all browser supports .wasm: https://caniuse.com/wasm Last edited by RbnJrg; 07-27-2025 at 01:08 PM. |
|
![]() |
![]() |
![]() |
#4 |
Sigil Developer
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Posts: 8,816
Karma: 6000000
Join Date: Nov 2009
Device: many
|
Understand that Qt's QtWebEngine is just lately based on Chrome 138 and that is the first support for Android as well. So this support is quite recent and may not work with Qt 5 or Qt 6 up to 6.6 or 6.7.
I am glad to hear that hiding them in METAINF works for you. Do you still include them in the manifest itself with the href pointing into METAINF under a different media-type or just not mention they are there at all in the OPF? Last edited by KevinH; 07-27-2025 at 02:57 PM. |
![]() |
![]() |
![]() |
#5 | |
Wizard
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Posts: 1,804
Karma: 8700631
Join Date: Mar 2013
Location: Rosario - Santa Fe - Argentina
Device: Kindle 4 NT
|
Quote:
By the way, under Sigil Hyphenopoly doesn't work (it has issues with the fetch api) but it works fine with ereaders. |
|
![]() |
![]() |
![]() |
#6 |
Sigil Developer
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Posts: 8,816
Karma: 6000000
Join Date: Nov 2009
Device: many
|
I think there is a QtWebEngineURl Scheme setting that enables the fetch api. If the fetch is foreign though you would have to enable the remote access in Sigil Preferences too.
Is that js opening any Windows, as I think that is disabled as well? What scheme does the url passed to fetch() use? Is it a private scheme or http or https? Can you please post a very simple epub test case with it and I will see if I can get things to work on Sigil too by changing the QWebEngineProfile, QWebEngineSettings, and/or our Sigil url scheme handler settings settings that Sigil uses. Last edited by KevinH; 07-27-2025 at 07:31 PM. |
![]() |
![]() |
![]() |
#7 | |
Wizard
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Posts: 1,804
Karma: 8700631
Join Date: Mar 2013
Location: Rosario - Santa Fe - Argentina
Device: Kindle 4 NT
|
Quote:
I attach an epub with the javascript files of Hyphenopoly and a .wasm (in this case, is the pattern for spanish but for a test it can be used without issues). If you open the attached epub with the Sigil's plugins Readium and Epub JSReader you'll see that the epub is hyphened. With the inspector you can watch that Sigil can't find/load the pattern (.wasm) file in line 179 of Hyphenopoly_Loader.js and also can't find/load Hyphenopoly.js in line 232. The loader first test if there is native support for hyphenation; if is supported, it does nothing; otherwise, it loads the language pattern and the hyphenation engine (Hyphenopoly.js). |
|
![]() |
![]() |
![]() |
#8 |
Sigil Developer
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Posts: 8,816
Karma: 6000000
Join Date: Nov 2009
Device: many
|
Hmm, this is going to be a bit harder to debug than I thought. It seems on my MacOS machine with the latest build of Sigil master, the hyphenation works so Hyphenopoly is never loaded. The Inspector shows that no wasm files were loaded because none were needed (no error message shown in Network activitiy nor the js console.
Is there an easy way to force it to load the wasm file and force run Hyphenopoly? Last edited by KevinH; 07-28-2025 at 09:47 AM. |
![]() |
![]() |
![]() |
#9 |
Sigil Developer
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Posts: 8,816
Karma: 6000000
Join Date: Nov 2009
Device: many
|
Okay I figured out how to force load Hyphenopoly using the following and disabling hyphenation in the css:
Code:
<script type="text/javascript"> Hyphenopoly.config({ require: { "es": "FORCEHYPHENOPOLY" } }); </script> That gets me to here: (Debug info from Sigil's URLInterceptor.cpp and URLSchemeHandler.cpp) Code:
Debug: URLInterceptor Debug: method: "GET" Debug: 1st party url: QUrl("sigil:///Users/kbhend/Library/Application Support/sigil-ebook/sigil/workspace/Sigil-PAbpkt/OEBPS/Text/Section0001.xhtml") Debug: request url: QUrl("sigil:///Users/kbhend/Library/Application Support/sigil-ebook/sigil/workspace/Sigil-PAbpkt/OEBPS/Misc/patterns/es.wasm") Debug: navtype: 0 Debug: restype: 13 Debug: ActiveWindow: MainWindow(0x7f8828226c00, name="MainWindow") Debug: In URLSchemeHandler with url: QUrl("sigil:///Users/kbhend/Library/Application Support/sigil-ebook/sigil/workspace/Sigil-PAbpkt/OEBPS/Misc/patterns/es.wasm") Debug: In URLSchemeHandler with method: "GET" Debug: In URLSchemeHandler with initiator: QUrl("sigil:") Debug: URLSchemeHandler will fail request because no local file found: QUrl("sigil:///Users/kbhend/Library/Application Support/sigil-ebook/sigil/workspace/Sigil-PAbpkt/OEBPS/Misc/patterns/es.wasm") Debug: URLSchemeHandler failed request for: QUrl("sigil:///Users/kbhend/Library/Application Support/sigil-ebook/sigil/workspace/Sigil-PAbpkt/OEBPS/Misc/patterns/es.wasm") QUrl("sigil:///Users/kbhend/Library/Application Support/sigil-ebook/sigil/workspace/Sigil-PAbpkt/OEBPS/Misc/patterns/es.wasm") instead it is looking right beside the other js files. Where in your javascript loader do you tell it where to find the .wasm files? Someplace there should be a "../../../META-INF/" appended before the file name to actually load the wasm files: Last edited by KevinH; 07-28-2025 at 11:14 AM. |
![]() |
![]() |
![]() |
#10 |
Sigil Developer
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Posts: 8,816
Karma: 6000000
Join Date: Nov 2009
Device: many
|
So in line 179, I was able to prepend the required "../../../META-INF/" and now it finds the wasm file.
But unfortunately after that while trying to load the Hyphenopoly hyphenator itself it fails in many places. The file is found and loaded but the javascript QtWebEngine console shows this as the first error: Code:
Debug: Javascript error: QWebEnginePage::ErrorMessageLevel "Uncaught TypeError: Cannot read properties of null (reading 'hev') on line:35 Source:blob:sigil:/0828457a-16e9-47b5-8750-affcad42ce86" Code:
if (H.hev) { const userEvents = new Map(o.entries(H.hev)); knownEvents.forEach((eventFuncs, eventName) => { if (userEvents.has(eventName)) { eventFuncs.unshift(userEvents.get(eventName)); } }); } Are you sure this all actually worked in the Readium plugin? Maybe it is just the QWebEngine hyphenator working inside the Sigil readium plugin? |
![]() |
![]() |
![]() |
#11 | |
Wizard
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Posts: 1,804
Karma: 8700631
Join Date: Mar 2013
Location: Rosario - Santa Fe - Argentina
Device: Kindle 4 NT
|
Hi Kevin;
Thank you very much for your efforts. You must define the path to .wasm files in the config script. I have that config in Hyphenopoly_Loader.js so I don't have to write it in each .xhtml file; that way just by including the next declaration in the header is enough: Code:
<script type="text/javascript" src="../Misc/Hyphenopoly_Loader.js" ></script> Code:
<script type="text/javascript"> Hyphenopoly.config({ require: { "es": "FORCEHYPHENOPOLY", "de": "Silbentrennungsalgorithmus" } }); console.log(Hyphenopoly.hyphenators); //{en-us: Promise, HTML: Promise} </script> Code:
paths: { patterndir: "../../META-INF/" }, Code:
<script type="text/javascript"> Hyphenopoly.config({ require: { "es": "FORCEHYPHENOPOLY", "de": "Silbentrennungsalgorithmus" }, // DON'T OMIT THE COMMA HERE paths: { patterndir: "../../META-INF/" } // AND HERE NO COMMA }); console.log(Hyphenopoly.hyphenators); //{en-us: Promise, HTML: Promise} </script> Quote:
|
|
![]() |
![]() |
![]() |
#12 | |
Wizard
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Posts: 1,804
Karma: 8700631
Join Date: Mar 2013
Location: Rosario - Santa Fe - Argentina
Device: Kindle 4 NT
|
Quote:
![]() The only places where Hyphenopoly is not working is in Sigil, Calibre and Bibi Reader (Bibi incluso tiene problemas con Hyphenator, which is the JS I have been using so far. EDIT: Here you have some screenshots of Readium, JSReader and Thorium: Last edited by RbnJrg; 07-28-2025 at 11:39 AM. |
|
![]() |
![]() |
![]() |
#13 |
Sigil Developer
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Posts: 8,816
Karma: 6000000
Join Date: Nov 2009
Device: many
|
I even tried skipping the loader completely and directly loading Hyphenopoly.js and got the following error in the Javascript Console:
Debug: Javascript error: QWebEnginePage::ErrorMessageLevel "Uncaught ReferenceError: Hyphenopoly is not defined on line:61 Source:sigil:///Users/kbhend/Library/Application%20Support/sigil-ebook/sigil/workspace/Sigil-BxImZW/OEBPS/Misc/Hyphenopoly.js" So the Hyphenopoly object itself is undefined. It is almost if the javascript version was for a different release than what is needed. Very very strange. Then as a final test I commented out the loader script itself and the Readium plugin happily hyphenated everthing even with no Hyphenopoly installed. So I do not think Hyphenopoloy is used/working at all in that sample epub even if Sigil is modified to allow the fetch api in the "sigil" url schemehandler. I will push that one line change to master anyway, in the hopes you can get things to work eventually. There is no way it is finding the .wasm files with the path generated by the Hyphenopoly_loader.js as it is looking in the wrong place for those files. The latest QtWebEngine and Electron builds have a built in hyphenator. Last edited by KevinH; 07-28-2025 at 11:53 AM. |
![]() |
![]() |
![]() |
#14 | |
Wizard
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Posts: 1,804
Karma: 8700631
Join Date: Mar 2013
Location: Rosario - Santa Fe - Argentina
Device: Kindle 4 NT
|
When you run the loader.js, in line 179 you have the message:
Code:
FETCH API cannot load Sigil:///... URL scheme Sigil is not supported Do the following: 1. Open the epub I sent with Sigil. 2. Do right click in Section0001.xhtml and select Open with Chrome (or Firefox) and once the file is loaded in the browser, enable the Development tools and you'll be able to run the script there. Put a breakpoint in line 168 and press F5 to rerun the loader.js. 3. In line 179, you'll see that H.paths gives you as "maindir" something like "file:///.../Misc" and as "patterndir" "../../META-INF". 4. The issue is that Sigil as maindir gives us something like "Sigil:///.../Misc" and that can't be handle by Hyphenopoly. Quote:
|
|
![]() |
![]() |
![]() |
#15 |
Wizard
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Posts: 1,804
Karma: 8700631
Join Date: Mar 2013
Location: Rosario - Santa Fe - Argentina
Device: Kindle 4 NT
|
It's easy to test that. Open the epub I sent in Thorium; you'll see that hyphenation works. After that remove the script from the epub sample and open it again in Thorium; you won't see any hyphenation. Maybe things are different on Mac; on Windows and Linux the script works fine.
|
![]() |
![]() |
![]() |
|
![]() |
||||
Thread | Thread Starter | Forum | Replies | Last Post |
IngramSpark citing content.opf errors I can't find in the .opf | persand | Calibre | 4 | 03-21-2019 10:49 AM |
epub3 kobo external video opf issue | Ryn | ePub | 21 | 01-13-2018 05:34 PM |
Change opf filename from content.opf to title.opf | northstar7 | Sigil | 3 | 09-23-2013 12:44 PM |
Nook Covers OPF Issue | DTM | Sigil | 2 | 08-03-2013 05:39 PM |
TWO OPF files or something like Media Queries in the OPF file for KF8 and MOBI? | DHahn | Kindle Formats | 3 | 04-17-2012 04:06 AM |