Skip to main content

ass_core/plugin/
mod.rs

1//! Plugin system for extending ASS parsing and rendering capabilities.
2//!
3//! This module provides a trait-based extension system allowing custom tag handlers,
4//! section processors, and rendering backends to be registered at runtime. Designed
5//! for zero-allocation hot paths and efficient lookup via optimized hash maps.
6//!
7//! ## Architecture
8//!
9//! - **`TagHandler`**: Process custom override tags (e.g., `{\custom}`)
10//! - **`SectionProcessor`**: Handle non-standard sections (e.g., `[Aegisub Project]`)
11//! - **`ExtensionRegistry`**: Central registry for all extensions
12//!
13//! ## Example
14//!
15//! ```rust
16//! use ass_core::plugin::{ExtensionRegistry, TagHandler, TagResult};
17//!
18//! struct CustomColorTag;
19//!
20//! impl TagHandler for CustomColorTag {
21//!     fn name(&self) -> &'static str { "customcolor" }
22//!
23//!     fn process(&self, args: &str) -> TagResult {
24//!         // Custom color processing logic
25//!         TagResult::Processed
26//!     }
27//! }
28//!
29//! let mut registry = ExtensionRegistry::new();
30//! registry.register_tag_handler(Box::new(CustomColorTag));
31//! ```
32
33pub mod sections;
34pub mod tags;
35
36mod error;
37mod registry;
38mod traits;
39
40#[cfg(test)]
41mod tests;
42
43pub use error::{PluginError, Result};
44pub use registry::ExtensionRegistry;
45pub use traits::{SectionProcessor, SectionResult, TagHandler, TagResult};
46
47pub use sections::aegisub::{
48    create_aegisub_processors, AegisubExtradataProcessor, AegisubProjectProcessor,
49};
50pub use tags::{
51    advanced::{create_advanced_handlers, BlurEdgesTagHandler, BorderTagHandler, ShadowTagHandler},
52    alignment::{
53        create_alignment_handlers, AlignmentTagHandler, NumpadAlignmentTagHandler,
54        WrappingStyleTagHandler,
55    },
56    animation::{
57        create_animation_handlers, FadeTagHandler, SimpleFadeTagHandler, TransformTagHandler,
58    },
59    clipping::{create_clipping_handlers, ClipTagHandler},
60    color::{
61        create_color_handlers, Alpha1TagHandler, Alpha2TagHandler, Alpha3TagHandler,
62        Alpha4TagHandler, AlphaTagHandler, Color1TagHandler, Color2TagHandler, Color3TagHandler,
63        Color4TagHandler, PrimaryColorTagHandler,
64    },
65    font::{create_font_handlers, FontEncodingTagHandler, FontNameTagHandler, FontSizeTagHandler},
66    formatting::{
67        create_formatting_handlers, BoldTagHandler, ItalicTagHandler, StrikeoutTagHandler,
68        UnderlineTagHandler,
69    },
70    karaoke::{
71        create_karaoke_handlers, BasicKaraokeTagHandler, FillKaraokeTagHandler,
72        KaraokeTimingTagHandler, OutlineKaraokeTagHandler,
73    },
74    misc::{create_misc_handlers, OriginTagHandler, ResetTagHandler, ShortRotationTagHandler},
75    position::{create_position_handlers, MoveTagHandler, PositionTagHandler},
76    special::{
77        create_special_handlers, HardLineBreakTagHandler, HardSpaceTagHandler,
78        SoftLineBreakTagHandler,
79    },
80    transform::{
81        create_transform_handlers, RotationXTagHandler, RotationYTagHandler, RotationZTagHandler,
82        ScaleXTagHandler, ScaleYTagHandler, ShearXTagHandler, ShearYTagHandler, SpacingTagHandler,
83    },
84};