Python 对flatpage内容执行文本处理,包括处理自定义标记
我在我的项目中使用flatpages应用程序来管理一些html内容。该内容将包括图像,因此我制作了一个Python 对flatpage内容执行文本处理,包括处理自定义标记,python,django,algorithm,text-processing,Python,Django,Algorithm,Text Processing,我在我的项目中使用flatpages应用程序来管理一些html内容。该内容将包括图像,因此我制作了一个ContentImage模型,允许用户使用管理面板上传图像。 然后,用户应该能够将这些图像包含在flatpages的内容中。他当然可以通过在标记中手动键入图像url来实现这一点,但这不是我想要的 为了使包含图像更方便,我考虑这样做: import re from django.utils.translation import ugettext as _ def process_image_ta
ContentImage
模型,允许用户使用管理面板上传图像。
然后,用户应该能够将这些图像包含在flatpages的内容中。他当然可以通过在
标记中手动键入图像url来实现这一点,但这不是我想要的
为了使包含图像更方便,我考虑这样做:
import re
from django.utils.translation import ugettext as _
def process_image_tags(text, ImageModel):
'''image tag usage:
... some text ... [img=image_name:image_class(optional)] ... some text ...
'''
t1 = re.split(r'(\[img=[a-z0-9\-_\:]+\])', text)
t2 = []
for i in t1:
if i[:5] == '[img=':
attrs = i[5:-1].split(':')
name_attr = attrs[0] #name attribute
error = None
try:
image = ImageModel.objects.get(name=name_attr)
except ImageModel.DoesNotExist:
error = '<span class="image_tag_error">%s</span>' % _('Image with given name not found')
except ImageModel.MultipleObjectsReturned:
error = '<span class="image_tag_error">%s</span>' % _('More than one image found')
if not error:
p = ['<img']
p.append('src="%s"' % image.image.url)
if len(attrs) > 1:
p.append('class="%s"' % attrs[1]) #class attribute
if image.description:
p.append('title="%s"' % image.description)
p.append('alt="%s"' % image.name)
p.append('/>')
t2.append(' '.join(p))
else:
t2.append(error)
else:
t2.append(i)
return ''.join(t2)
def save(self, *args, **kwargs):
self.content = process_image_tags(self.pre_content, ContentImage)
super(CustomFlatPage, self).save(*args, **kwargs)
- 用户编辑
model的一个额外的,比如说CustomFlatPage
字段(我已经在使用CustomFlatPage模型了)pre\u内容
- 他没有直接定义
标记,而是使用一个自定义标记,类似于
,其中[img=…]
是..
实例的名称ContentImage
- 现在最难的部分是:在保存
之前,检查CustomFlatPage
字段中的所有pre\u content
事件,并按如下方式处理:[img=…]
- 如果存在具有给定名称的图像实例,则搜索
模型,如果存在,则用适当的ContentImage
标记替换[img=…]
- flatpage实际
用已处理的内容
填充,然后保存flatpage(预处理内容
保留不变,由用户编辑)预处理内容
有人能给我一些线索吗?我终于用正则表达式实现了这个。我决定,自定义标记中不允许有空格。主文本处理函数如下所示:
import re
from django.utils.translation import ugettext as _
def process_image_tags(text, ImageModel):
'''image tag usage:
... some text ... [img=image_name:image_class(optional)] ... some text ...
'''
t1 = re.split(r'(\[img=[a-z0-9\-_\:]+\])', text)
t2 = []
for i in t1:
if i[:5] == '[img=':
attrs = i[5:-1].split(':')
name_attr = attrs[0] #name attribute
error = None
try:
image = ImageModel.objects.get(name=name_attr)
except ImageModel.DoesNotExist:
error = '<span class="image_tag_error">%s</span>' % _('Image with given name not found')
except ImageModel.MultipleObjectsReturned:
error = '<span class="image_tag_error">%s</span>' % _('More than one image found')
if not error:
p = ['<img']
p.append('src="%s"' % image.image.url)
if len(attrs) > 1:
p.append('class="%s"' % attrs[1]) #class attribute
if image.description:
p.append('title="%s"' % image.description)
p.append('alt="%s"' % image.name)
p.append('/>')
t2.append(' '.join(p))
else:
t2.append(error)
else:
t2.append(i)
return ''.join(t2)
def save(self, *args, **kwargs):
self.content = process_image_tags(self.pre_content, ContentImage)
super(CustomFlatPage, self).save(*args, **kwargs)
它似乎有效,所以我可能最终会使用该解决方案。也许我会添加一些javascript,让用户通过从生成的图像列表中选择图像来插入图像标记,但即使是现在,我认为这也比手动键入URL要好。我喜欢这样。通常答案是:“不要使用正则表达式,使用html解析器”,但是自定义标记呢?我也想知道:
BeautifulSoup
是一个很棒的HTML解析库。如果你愿意查看来源,我相信这将是一个极好的资源。即使是在处理破损的html方面,它也是王者。不过,我开始认为正则表达式可能适合您的标记,因为它不涉及结束标记的复杂性,而是一些可能的变体[img=]
[img=]
谢谢。我来看看这个BeautilfulSoup
源代码。也许我可以从中借用一些想法。我注意到您没有添加alt
属性。您也可以使用image.name
@JordanReiter是的,为什么不呢,谢谢:-)。我只是把它添加到代码中。