Skip to content

witekbobrowski/EPUBKit

Repository files navigation

Fallback image description

Swift Package Manager Swift Version Platforms License

A powerful and modern Swift library for parsing EPUB documents

EPUBKit provides a comprehensive solution for parsing and extracting information from EPUB files in Swift. Built with modern Swift practices and designed for reliability, it supports both EPUB 2 and EPUB 3 specifications while maintaining a clean, intuitive API.

Features

  • πŸ“š Complete EPUB Support: Full parsing of EPUB 2 and EPUB 3 documents
  • πŸ—οΈ Modern Swift: Built with Swift 6+, leveraging modern language features
  • πŸ“‹ Rich Metadata: Extract comprehensive Dublin Core metadata
  • πŸ—‚οΈ Manifest Parsing: Access all publication resources with media type detection
  • πŸ“– Reading Order: Parse spine for linear reading progression
  • 🧭 Navigation: Extract table of contents and navigation structure
  • πŸ§ͺ Thoroughly Tested: Comprehensive test suite built with Swift Testing
  • 🎯 Thread Safe: Designed for concurrent parsing operations

Installation

Swift Package Manager

Add EPUBKit to your project via Xcode or by adding it to your Package.swift:

dependencies: [
    .package(url: "https://github.com/witekbobrowski/EPUBKit.git", from: "1.0.0")
]

CocoaPods

pod 'EPUBKit'

Quick Start

Basic Usage

import EPUBKit

// Parse an EPUB file
guard let epubURL = Bundle.main.url(forResource: "book", withExtension: "epub"),
      let document = EPUBDocument(url: epubURL) else {
    print("Failed to load EPUB")
    return
}

// Access document metadata
print("Title: \(document.title)")
print("Author: \(document.author)")
print("Publisher: \(document.publisher)")
print("Language: \(document.language)")

// Access document structure
print("Chapters: \(document.spine.items.count)")
print("Resources: \(document.manifest.items.count)")

Working with Document Components

// Access metadata details
if let creator = document.metadata.creator {
    print("Author: \(creator.name)")
    print("Role: \(creator.role)")
    print("File as: \(creator.fileAs)")
}

// Iterate through spine items (reading order)
for spineItem in document.spine.items {
    if let manifestItem = document.manifest.items[spineItem.idref] {
        print("Chapter: \(manifestItem.path)")
        print("Media Type: \(manifestItem.mediaType)")
    }
}

// Access table of contents
func printTOC(_ toc: EPUBTableOfContents, level: Int = 0) {
    let indent = String(repeating: "  ", count: level)
    print("\(indent)- \(toc.label)")
    
    for child in toc.children {
        printTOC(child, level: level + 1)
    }
}

printTOC(document.tableOfContents)

EPUB Specification Support

EPUBKit supports the EPUB specification standards:

  • βœ… EPUB 3.3 - Full support for modern EPUB files
  • βœ… EPUB 2.0 - Backward compatibility with older EPUB files
  • βœ… Dublin Core Metadata - Complete metadata extraction
  • βœ… OCF (Open Container Format) - Proper ZIP archive handling
  • βœ… NCX Navigation - Table of contents parsing
  • βœ… Media Type Detection - Automatic resource type identification

Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

License

EPUBKit is available under the MIT license. See the LICENSE file for more info.