Python 对flatpage内容执行文本处理,包括处理自定义标记

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

我在我的项目中使用flatpages应用程序来管理一些html内容。该内容将包括图像,因此我制作了一个
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)
  • 用户编辑
    CustomFlatPage
    model的一个额外的,比如说
    pre\u内容
    字段(我已经在使用CustomFlatPage模型了)
  • 他没有直接定义
    标记,而是使用一个自定义标记,类似于
    [img=…]
    ,其中
    ..
    ContentImage
    实例的名称
  • 现在最难的部分是:在保存
    CustomFlatPage
    之前,检查
    pre\u content
    字段中的所有
    [img=…]
    事件,并按如下方式处理:
  • 如果存在具有给定名称的图像实例,则搜索
    ContentImage
    模型,如果存在,则用适当的
    标记替换
    [img=…]
  • flatpage实际
    内容
    用已处理的
    预处理内容
    填充,然后保存flatpage(
    预处理内容
    保留不变,由用户编辑)
我不能处理的部分是文本处理。我应该使用正则表达式吗?显然,对于大的字符串,它们的速度可能会很慢。 如何组织逻辑?我认为这是一个相当复杂的算法问题,但我对Python中的文本处理还不够熟悉,不能自己做


有人能给我一些线索吗?

我终于用正则表达式实现了这个。我决定,自定义标记中不允许有空格。主文本处理函数如下所示:

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是的,为什么不呢,谢谢:-)。我只是把它添加到代码中。