diff options
| author | A Farzat <a@farzat.xyz> | 2026-11-04 15:25:31 +0300 |
|---|---|---|
| committer | A Farzat <a@farzat.xyz> | 2026-11-04 15:35:27 +0300 |
| commit | 3d54b73266646f73e855a175dbfd86ca2d50ba96 (patch) | |
| tree | 07708ce988d1d70b2d79af360338398a640975ad /src/xml.rs | |
| parent | 1020098497c37b7acfe3ff70845db58c3de22f98 (diff) | |
| download | oreilly-epub-8de2c5e88ddf5250baf78d3af5207754f37b3e19.tar.gz oreilly-epub-8de2c5e88ddf5250baf78d3af5207754f37b3e19.zip | |
Store the O'Reilly bookid as EPUB metadata instead of relying solely on
the filename. Preserving the original bookid makes it possible to look
up additional information from the upstream O'Reilly resource later,
even if the EPUB is renamed or imported into a library manager.
Diffstat (limited to 'src/xml.rs')
| -rw-r--r-- | src/xml.rs | 21 |
1 files changed, 16 insertions, 5 deletions
@@ -124,6 +124,7 @@ pub fn build_epub_chapter<R: BufRead, W: Write>( pub fn write_modified_opf<R: BufRead, W: Write>( opf_input: R, mut out: &mut W, + bookid: &str, description: &str, ) -> Result<()> { // Setup the XML Reader and Writer. @@ -146,11 +147,21 @@ pub fn write_modified_opf<R: BufRead, W: Write>( writer.write_event(Event::Start(tag_data))?; } Ok(Event::End(tag_data)) => { - // Write description if end of metadata is reached without finding one. - if tag_data.name().as_ref() == b"metadata" && !desc_found { - writer.write_event(Event::Start(BytesStart::new("dc:description")))?; - writer.write_event(Event::Text(BytesText::new(description)))?; - writer.write_event(Event::End(BytesEnd::new("dc:description")))?; + // Extra attributes are added just before the closing metadata tag. + if tag_data.name().as_ref() == b"metadata" { + // A new dc:identifier records the O'Reilly resource ID used to obtain the book. + let mut start_elem = BytesStart::new("dc:identifier"); + start_elem.push_attribute(("id", "oreilly-id")); + writer.write_event(Event::Start(start_elem))?; + let oreilly_id = &format!("urn:orm:book:{bookid}"); + writer.write_event(Event::Text(BytesText::new(oreilly_id)))?; + writer.write_event(Event::End(BytesEnd::new("dc:identifier")))?; + // Write description if end of metadata is reached without finding one. + if !desc_found { + writer.write_event(Event::Start(BytesStart::new("dc:description")))?; + writer.write_event(Event::Text(BytesText::new(description)))?; + writer.write_event(Event::End(BytesEnd::new("dc:description")))?; + } } // Pass through unmodified. writer.write_event(Event::End(tag_data))?; |
