Class Diagrams

Core Source System Classes

classDiagram
    class BaseSource {
        +config
        +session
        +source_type
        +__init__(config, session)
        +discover_articles(count)
        +fetch_article_content(article, output_dir)
        +fetch_comments(comment_url, ...)
    }

    class ConfigDrivenSource {
        +config
        +selectors
        +__init__(config)
        +source_type()
        +discover_articles(count)
        +fetch_article_content(article, output_dir)
        -_parse_article_list(html)
        -_extract_content(html)
    }

    class HnSource {
        +_HN_API_BASE
        +_CONCURRENT_WORKERS
        +__init__(config)
        +source_type()
        +discover_articles(count)
        +fetch_article_content(article, output_dir)
        +fetch_comments(comment_url, ...)
        -_fetch_from_api(endpoint)
        -_process_comment_tree(item)
    }

    class LbSource {
        +__init__(config)
        +source_type()
        +discover_articles(count)
        +fetch_article_content(article, output_dir)
        +fetch_comments(comment_url, ...)
        -_parse_rss(xml)
    }

    class SourceFactory {
        +registry
        +__init__(registry)
        +create_source(name)
        +get_available_sources()
        +validate_source(name)
        -_resolve_source_type(name)
    }

    class SourceRegistry {
        +sources
        +__init__()
        +register_source(metadata)
        +get_source_metadata(name)
        +list_sources()
        +discover_sources()
        -_load_config_driven_sources()
        -_load_custom_sources()
    }

    class Article {
        +title
        +url
        +content
        +author
        +published_date
        +source
        +metadata
        +comments
        +media_urls
    }

    class Comment {
        +author
        +content
        +timestamp
        +replies
        +score
    }

    BaseSource <|-- ConfigDrivenSource
    BaseSource <|-- HnSource
    BaseSource <|-- LbSource
    SourceFactory --> BaseSource  : creates
    SourceFactory --> SourceRegistry  : uses
    SourceRegistry --> BaseSource  : manages
    BaseSource --> Article  : produces
    Article --> Comment  : contains

Media Processing Classes

classDiagram
    class UnifiedMediaProcessor {
        +session
        +output_dir
        +download_media
        +__init__(session, output_dir, download_media)
        +process_article_media(article)
        +download_images(urls)
        +download_media_files(urls)
        -_detect_media_type(url)
        -_organize_media_files()
    }

    class ImageProcessor {
        +max_size
        +quality
        +__init__(max_size, quality)
        +process_image(file_path)
        +resize_image(image)
        +optimize_image(image)
        +convert_format(image)
        -_validate_image(file_path)
    }

    class MediaDownloader {
        +session
        +timeout
        +retry_count
        +__init__(session, timeout, retry_count)
        +download_file(url)
        +get_file_info(url)
        +validate_download(file_path)
        -_create_directories(path)
        -_handle_download_error(error)
    }

    class ContentFormatter {
        +markdown_options
        +__init__(options)
        +html_to_markdown(html)
        +process_images(content)
        +update_links(content)
        +clean_html(html)
        -_convert_tables(html)
        -_handle_code_blocks(html)
    }

    UnifiedMediaProcessor --> ImageProcessor  : uses
    UnifiedMediaProcessor --> MediaDownloader  : uses
    UnifiedMediaProcessor --> ContentFormatter  : uses
    ImageProcessor --> PIL  : uses
    MediaDownloader --> requests  : uses
    ContentFormatter --> BeautifulSoup  : uses

HTML Generation Classes

classDiagram
    class BaseHTMLGenerator {
        +template_dir
        +theme
        +__init__(template_dir, theme)
        +generate_html(article)
        +load_template(name)
        +render_template(template)
        -_prepare_context(article)
        -_copy_assets(output_dir)
    }

    class ArticleHTMLGenerator {
        +source_config
        +__init__(template_dir, theme, source_config)
        +generate_html(article)
        +generate_index(articles)
        -_generate_navigation(articles)
        -_process_article_content(content)
    }

    class CommentHTMLGenerator {
        +comment_template
        +__init__(template_dir, theme)
        +render_comments(comments)
        +render_comment_tree(comment)
        -_anonymize_usernames(comments)
        -_format_timestamps(comments)
    }

    class ThemeManager {
        +themes_dir
        +current_theme
        +__init__(themes_dir, default_theme)
        +load_theme(name)
        +get_css_files(theme)
        +get_js_files(theme)
        +validate_theme(name)
        -_copy_theme_assets(theme)
    }

    BaseHTMLGenerator <|-- ArticleHTMLGenerator
    ArticleHTMLGenerator --> CommentHTMLGenerator  : uses
    BaseHTMLGenerator --> ThemeManager  : uses
    ThemeManager --> Jinja2  : uses

Configuration Classes

classDiagram
    class ConfigManager {
        +config_file
        +config_data
        +__init__(config_file)
        +load_config()
        +get_setting(key)
        +update_setting(key)
        +save_config()
        +validate_config()
        -_merge_configs(base)
        -_expand_environment_variables(config)
    }

    class SourceConfig {
        +name
        +display_name
        +base_url
        +category
        +selectors
        +rate_limit
        +__init__(config_dict)
        +validate()
        +to_dict()
        -_validate_selectors()
        -_validate_urls()
    }

    class CLIConfig {
        +args
        +__init__(args)
        +get_sources()
        +get_output_dir()
        +get_count()
        +should_download_media()
        +should_generate_html()
        +get_log_level()
    }

    ConfigManager --> SourceConfig  : creates
    CLIConfig --> ConfigManager  : uses