2011-05-08 71 views
4

在我创建的网站上,我使用Python-Markdown来格式化新闻帖子。为了避免死链接和HTTP内容对HTTPS页面问题的问题,我要求编辑们将所有图像上传到网站,然后嵌入它们(我使用了一个我已经打补丁的降价编辑器,以允许轻松嵌入这些图像使用标准markdown语法)。使用python-markdown检查图像网址

但是,我想在我的代码中执行no-external-images策略。

一种方法是编写一个正则表达式来从降价源代码中提取图像URL,甚至通过降价渲染器运行它,并使用DOM解析器从img标签中提取所有src属性。

但是,我很好奇在解析过程中是否有某种方法可以挂钩到Python-Markdown中以提取所有图像链接或执行自定义代码(例如,如果链接是外部引发的异常)。

回答

6

一种方法是在一个较低的水平,以拦截<img>节点降价解析,并构建它只是后:

import re 
from markdown import Markdown 
from markdown.inlinepatterns import ImagePattern, IMAGE_LINK_RE 

RE_REMOTEIMG = re.compile('^(http|https):.+') 

class CheckImagePattern(ImagePattern): 

    def handleMatch(self, m): 
     node = ImagePattern.handleMatch(self, m) 
     # check 'src' to ensure it is local 
     src = node.attrib.get('src') 
     if src and RE_REMOTEIMG.match(src): 
      print 'ILLEGAL:', m.group(9) 
      # or alternately you could raise an error immediately 
      # raise ValueError("illegal remote url: %s" % m.group(9)) 
     return node 

DATA = ''' 
![Alt text](/path/to/img.jpg) 
![Alt text](http://remote.com/path/to/img.jpg) 
''' 

mk = Markdown() 
# patch in the customized image pattern matcher with url checking 
mk.inlinePatterns['image_link'] = CheckImagePattern(IMAGE_LINK_RE, mk) 
result = mk.convert(DATA) 
print result 

输出:

ILLEGAL: http://remote.com/path/to/img.jpg 
<p><img alt="Alt text" src="/path/to/img.jpg" /> 
<img alt="Alt text" src="http://remote.com/path/to/img.jpg" /></p> 
+0

看起来真的不错 - 听起来像+ 120为代表你除非在以后再测试它时才开始。我想我必须为'ImagePattern'和'ImageReferencePattern'这样做吗? – ThiefMaster 2011-05-12 06:25:18

+0

看看这似乎很容易的事实,我可能只是完全阻止'image_link',自动添加上传图像的引用(带有像'img'的一些前缀),然后更改正则表达式,以便使用此前缀定义新引用是不可能的,图像只使用这个前缀的引用。你对此有何看法?可能会更干净,因为我可以动态生成图像URL,而不必一开始就创建它们(我需要相对/绝对URL,取决于它是否位于原子Feed或网站本身) – ThiefMaster 2011-05-12 06:30:14

+0

是的,您可以完全替换如果你愿意,regexp和'ImagePattern'类本身可以拒绝/忽略'image_link'。你也需要替换'ImageReferencePattern'(为了简洁起见我省略),这也是正确的。我认为你在正确的轨道上 - 根据特定于应用程序的标志(相对/绝对,原子/站点等)自定义类行为。 – samplebias 2011-05-12 15:33:14