import math
import re
from djangoblog.plugin_manage.base_plugin import BasePlugin
from djangoblog.plugin_manage import hooks
from djangoblog.plugin_manage.hook_constants import ARTICLE_CONTENT_HOOK_NAME


class ReadingTimePlugin(BasePlugin):
    """
    阅读时间预测插件
    功能：自动估算文章的阅读时间并显示在文章开头，帮助读者了解阅读时长
    """

    # 插件基本信息
    PLUGIN_NAME = '阅读时间预测'
    PLUGIN_DESCRIPTION = '估算文章阅读时间并显示在文章开头。'
    PLUGIN_VERSION = '0.1.0'
    PLUGIN_AUTHOR = 'liangliangyy'

    def register_hooks(self):
        """
        注册钩子函数
        将阅读时间计算方法注册到文章内容钩子
        """
        hooks.register(ARTICLE_CONTENT_HOOK_NAME, self.add_reading_time)

    def add_reading_time(self, content, *args, **kwargs):
        """
        计算文章阅读时间并添加到内容开头

        参数:
            content: str - 原始的文章HTML内容
            *args, **kwargs: 其他参数

        返回值:
            str - 添加了阅读时间提示的文章内容
        """
        # 1. 清理HTML内容，提取纯文本
        # 使用正则表达式移除所有HTML标签，只保留文本内容
        clean_content = re.sub(r'<[^>]*>', '', content)
        # 移除首尾空白字符
        clean_content = clean_content.strip()

        # 2. 计算字数（支持中英文混合）
        # 正则表达式说明：
        # [\u4e00-\u9fa5] - 匹配中文字符（Unicode范围）
        # | - 或者
        # \w+ - 匹配连续的英文单词字符（字母、数字、下划线）
        words = re.findall(r'[\u4e00-\u9fa5]|\w+', clean_content)
        word_count = len(words)

        # 3. 计算阅读时间
        # 按照平均每分钟200字的速度计算（适合中文阅读速度）
        reading_speed = 200
        # 使用math.ceil向上取整，确保不会出现0分钟的情况
        reading_minutes = math.ceil(word_count / reading_speed)

        # 4. 处理边界情况
        # 如果计算出的阅读时间少于1分钟，统一显示为1分钟
        # 避免出现"预计阅读时间：0分钟"的不合理显示
        if reading_minutes < 1:
            reading_minutes = 1

        # 5. 生成阅读时间提示的HTML代码
        # 使用灰色文字和斜体样式，视觉上不突兀
        reading_time_html = f'<p style="color: #888;"><em>预计阅读时间：{reading_minutes} 分钟</em></p>'

        # 6. 将阅读时间提示添加到文章内容开头
        return reading_time_html + content


# 实例化插件，自动注册到系统
plugin = ReadingTimePlugin()