From ef3efec6304b6b3bef9dd1085f2e60c57e654f50 Mon Sep 17 00:00:00 2001 From: liangliangyy Date: Wed, 2 Jul 2025 23:11:14 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8F=92=E4=BB=B6=E8=83=BD=E5=8A=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- djangoblog/settings.py | 4 +- plugins/__init__.py | 1 + plugins/article_copyright/__init__.py | 1 + .../plugin.py | 6 +-- plugins/article_copyright_plugin/__init__.py | 0 plugins/external_links/__init__.py | 1 + plugins/external_links/plugin.py | 47 +++++++++++++++++++ plugins/reading_time/__init__.py | 1 + plugins/reading_time/plugin.py | 41 ++++++++++++++++ 9 files changed, 97 insertions(+), 5 deletions(-) create mode 100644 plugins/article_copyright/__init__.py rename plugins/{article_copyright_plugin => article_copyright}/plugin.py (80%) delete mode 100644 plugins/article_copyright_plugin/__init__.py create mode 100644 plugins/external_links/__init__.py create mode 100644 plugins/external_links/plugin.py create mode 100644 plugins/reading_time/__init__.py create mode 100644 plugins/reading_time/plugin.py diff --git a/djangoblog/settings.py b/djangoblog/settings.py index ea7add5..a092698 100644 --- a/djangoblog/settings.py +++ b/djangoblog/settings.py @@ -334,7 +334,9 @@ if os.environ.get('DJANGO_ELASTICSEARCH_HOST'): # Plugin System PLUGINS_DIR = BASE_DIR / 'plugins' ACTIVE_PLUGINS = [ - 'article_plugin_test', + 'article_copyright', + 'reading_time', + 'external_links', ] # 加载插件 diff --git a/plugins/__init__.py b/plugins/__init__.py index e69de29..e88afca 100644 --- a/plugins/__init__.py +++ b/plugins/__init__.py @@ -0,0 +1 @@ +# This file makes this a Python package diff --git a/plugins/article_copyright/__init__.py b/plugins/article_copyright/__init__.py new file mode 100644 index 0000000..e88afca --- /dev/null +++ b/plugins/article_copyright/__init__.py @@ -0,0 +1 @@ +# This file makes this a Python package diff --git a/plugins/article_copyright_plugin/plugin.py b/plugins/article_copyright/plugin.py similarity index 80% rename from plugins/article_copyright_plugin/plugin.py rename to plugins/article_copyright/plugin.py index 2dab2b3..a97dd92 100644 --- a/plugins/article_copyright_plugin/plugin.py +++ b/plugins/article_copyright/plugin.py @@ -3,11 +3,9 @@ from djangoblog.plugin_manage import hooks class ArticleCopyrightPlugin(BasePlugin): - # 1. 将插件元数据定义为类属性,以匹配 BasePlugin 的要求 PLUGIN_NAME = '文章结尾版权声明' - PLUGIN_DESCRIPTION = '一个在文章正文末尾添加版权声明的测试插件。' + PLUGIN_DESCRIPTION = '一个在文章正文末尾添加版权声明的插件。' PLUGIN_VERSION = '0.2.0' - # 也可以添加作者等其他自定义元数据 PLUGIN_AUTHOR = 'liangliangyy' # 2. 实现 register_hooks 方法,专门用于注册钩子 @@ -24,7 +22,7 @@ class ArticleCopyrightPlugin(BasePlugin): if not article: return content - copyright_info = f"\n

本文由 {article.author.username} 原创,转载请注明出处。

" + copyright_info = f"\n

本文由 {article.author.nickname} 原创,转载请注明出处。

" return content + copyright_info diff --git a/plugins/article_copyright_plugin/__init__.py b/plugins/article_copyright_plugin/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/plugins/external_links/__init__.py b/plugins/external_links/__init__.py new file mode 100644 index 0000000..e88afca --- /dev/null +++ b/plugins/external_links/__init__.py @@ -0,0 +1 @@ +# This file makes this a Python package diff --git a/plugins/external_links/plugin.py b/plugins/external_links/plugin.py new file mode 100644 index 0000000..bb8b734 --- /dev/null +++ b/plugins/external_links/plugin.py @@ -0,0 +1,47 @@ +import re +from urllib.parse import urlparse +from djangoblog.plugin_manage.base_plugin import BasePlugin +from djangoblog.plugin_manage import hooks + + +class ExternalLinksPlugin(BasePlugin): + PLUGIN_NAME = '外部链接处理器' + PLUGIN_DESCRIPTION = '自动为文章中的外部链接添加 target="_blank" 和 rel="noopener noreferrer" 属性。' + PLUGIN_VERSION = '0.1.0' + PLUGIN_AUTHOR = 'liangliangyy' + + def register_hooks(self): + hooks.register('the_content', self.process_external_links) + + def process_external_links(self, content, *args, **kwargs): + from djangoblog.utils import get_current_site + site_domain = get_current_site().domain + + # 正则表达式查找所有 标签 + link_pattern = re.compile(r'(]*?\s+)?href=")([^"]*)(".*?/a>)', re.IGNORECASE) + + def replacer(match): + # match.group(1) 是 ... + href = match.group(2) + + # 如果链接已经有 target 属性,则不处理 + if 'target=' in match.group(0).lower(): + return match.group(0) + + # 解析链接 + parsed_url = urlparse(href) + + # 如果链接是外部的 (有域名且域名不等于当前网站域名) + if parsed_url.netloc and parsed_url.netloc != site_domain: + # 添加 target 和 rel 属性 + return f'{match.group(1)}{href}" target="_blank" rel="noopener noreferrer"{match.group(3)}' + + # 否则返回原样 + return match.group(0) + + return link_pattern.sub(replacer, content) + + +plugin = ExternalLinksPlugin() diff --git a/plugins/reading_time/__init__.py b/plugins/reading_time/__init__.py new file mode 100644 index 0000000..e88afca --- /dev/null +++ b/plugins/reading_time/__init__.py @@ -0,0 +1 @@ +# This file makes this a Python package diff --git a/plugins/reading_time/plugin.py b/plugins/reading_time/plugin.py new file mode 100644 index 0000000..7a6a13e --- /dev/null +++ b/plugins/reading_time/plugin.py @@ -0,0 +1,41 @@ +import re +from djangoblog.plugin_manage.base_plugin import BasePlugin +from djangoblog.plugin_manage import hooks + + +class ReadingTimePlugin(BasePlugin): + PLUGIN_NAME = '阅读时间预测' + PLUGIN_DESCRIPTION = '估算文章阅读时间并显示在文章开头。' + PLUGIN_VERSION = '0.1.0' + PLUGIN_AUTHOR = 'liangliangyy' + + def register_hooks(self): + hooks.register('the_content', self.add_reading_time) + + def add_reading_time(self, content, *args, **kwargs): + """ + 计算阅读时间并添加到内容开头。 + """ + # 移除HTML标签和空白字符,以获得纯文本 + clean_content = re.sub(r'<[^>]*>', '', content) + clean_content = clean_content.strip() + + # 中文和英文单词混合计数的一个简单方法 + # 匹配中文字符或连续的非中文字符(视为单词) + words = re.findall(r'[\u4e00-\u9fa5]|\w+', clean_content) + word_count = len(words) + + # 按平均每分钟200字的速度计算 + reading_speed = 200 + reading_minutes = round(word_count / reading_speed) + + # 如果阅读时间少于1分钟,则显示为1分钟 + if reading_minutes < 1: + reading_minutes = 1 + + reading_time_html = f'

预计阅读时间:{reading_minutes} 分钟

' + + return reading_time_html + content + + +plugin = ReadingTimePlugin() \ No newline at end of file