插件能力

pull/12/head
liangliangyy 7 months ago
parent 650e16ea9d
commit ef3efec630

@ -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',
]
# 加载插件

@ -0,0 +1 @@
# This file makes this a Python package

@ -0,0 +1 @@
# This file makes this a Python package

@ -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<hr><p>本文由 {article.author.username} 原创,转载请注明出处。</p>"
copyright_info = f"\n<hr><p>本文由 {article.author.nickname} 原创,转载请注明出处。</p>"
return content + copyright_info

@ -0,0 +1 @@
# This file makes this a Python package

@ -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
# 正则表达式查找所有 <a> 标签
link_pattern = re.compile(r'(<a\s+(?:[^>]*?\s+)?href=")([^"]*)(".*?/a>)', re.IGNORECASE)
def replacer(match):
# match.group(1) 是 <a ... href="
# match.group(2) 是链接 URL
# match.group(3) 是 ">...</a>
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()

@ -0,0 +1 @@
# This file makes this a Python package

@ -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'<p style="color: #888;"><em>预计阅读时间:{reading_minutes} 分钟</em></p>'
return reading_time_html + content
plugin = ReadingTimePlugin()
Loading…
Cancel
Save