一种方法是在一个较低的水平,以拦截<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>
看起来真的不错 - 听起来像+ 120为代表你除非在以后再测试它时才开始。我想我必须为'ImagePattern'和'ImageReferencePattern'这样做吗? – ThiefMaster 2011-05-12 06:25:18
看看这似乎很容易的事实,我可能只是完全阻止'image_link',自动添加上传图像的引用(带有像'img'的一些前缀),然后更改正则表达式,以便使用此前缀定义新引用是不可能的,图像只使用这个前缀的引用。你对此有何看法?可能会更干净,因为我可以动态生成图像URL,而不必一开始就创建它们(我需要相对/绝对URL,取决于它是否位于原子Feed或网站本身) – ThiefMaster 2011-05-12 06:30:14
是的,您可以完全替换如果你愿意,regexp和'ImagePattern'类本身可以拒绝/忽略'image_link'。你也需要替换'ImageReferencePattern'(为了简洁起见我省略),这也是正确的。我认为你在正确的轨道上 - 根据特定于应用程序的标志(相对/绝对,原子/站点等)自定义类行为。 – samplebias 2011-05-12 15:33:14