osf 0.1.0

Parser for Open Screenplay Format (OSF) files used by Fade In Pro screenwriting software
Documentation
//! # OSF — Open Screenplay Format Parser
//!
//! A Rust parser for [Open Screenplay Format](https://github.com/OpenScreenplayFormat/osf-sdk)
//! (OSF) files, the native format of [Fade In Pro](https://www.fadeinpro.com) screenwriting
//! software.
//!
//! ## Supported Versions
//!
//! | Version | Attribute Style | Title Page | Notes |
//! |---------|----------------|------------|-------|
//! | 1.2     | `basestylename` | `<info>` attributes | Metadata embedded in `<info>` element |
//! | 2.0/2.1 | `baseStyleName` (camelCase) | `<titlepage>` bookmarks | Separate title page section |
//! | 4.0     | `basestyle` (snake_case) | `<titlepage>` bookmarks | Current version |
//!
//! ## File Format
//!
//! `.fadein` files are ZIP archives containing an XML file called `document.xml`
//! in the Open Screenplay Format. The parser handles both the ZIP container and
//! raw XML input.
//!
//! ## Usage
//!
//! ```no_run
//! // Parse a .fadein file from disk
//! let data = std::fs::read("screenplay.fadein").unwrap();
//! let doc = osf::parse(&data).unwrap();
//!
//! println!("Title: {:?}", doc.title_page.title);
//! println!("Authors: {:?}", doc.title_page.authors);
//! println!("Scenes: {}", doc.scenes.len());
//!
//! for scene in &doc.scenes {
//!     println!("  Scene {}: {}", scene.number, scene.heading);
//! }
//! ```
//!
//! ## Raw XML
//!
//! You can also parse raw OSF XML directly:
//!
//! ```
//! let xml = r#"<?xml version="1.0" encoding="UTF-8"?>
//! <document type="Open Screenplay Format document" version="40">
//!   <info uuid="test" pagecount="1"/>
//!   <settings/><styles/>
//!   <paragraphs>
//!     <para><style basestyle="Scene Heading"/><text>INT. OFFICE - DAY</text></para>
//!     <para><style basestyle="Action"/><text>A desk. A chair.</text></para>
//!   </paragraphs>
//!   <titlepage/><lists/>
//! </document>"#;
//!
//! let doc = osf::parse(xml.as_bytes()).unwrap();
//! assert_eq!(doc.scenes.len(), 1);
//! assert_eq!(doc.scenes[0].heading, "INT. OFFICE - DAY");
//! ```

mod error;
mod model;
mod parser;

pub use error::OsfError;
pub use model::*;
pub use parser::parse;