2011-10-29 3 views
3

내 목표는 bitbucket의 wiki 브라우저를 로컬에서 탐색 할 수있는 복제본을 만드는 것입니다. 페이지는 creole 구문을 사용하여 작성됩니다.python-creole을 사용하여 내부 링크 렌더링 변경

저는 파일을 html로 렌더링하기 위해 python-creole을 사용하고 있습니다. 그것은 비교적 잘 작동하지만 python-creole과 bitbucket이 내부 링크를 렌더링하는 방식에는 차이가 있습니다. 의 Bitbucket 사이트에

[[system programming]] 같은 공간과 내부 링크는 파이썬 - 크리올를 사용하는 동안이 <a href="system programming">system programming</a>에 렌더링 <a href="/wiki/system_programming">system programming</a> (공간 _로 대체) 같은 것으로 렌더링됩니다.

python-creole을 공백으로 바꾸는 방법을 _ 및 어떻게 변형 할 수 있습니까?

답변

1

나는 이것을하기에 상당히 더러운 방법을 발견했다고 생각한다. 소스 코드를 크리올을 찾고, HTML 링크를 회전 코드는 여기에 있습니다 :

나는 다음과 같은 코드를 시도 파이썬 쉘에서
def link_emit(self, node): 
    target = node.content 
    if node.children: 
     inside = self.emit_children(node) 
    else: 
     inside = self.html_escape(target) 

    return '<a href="%s">%s</a>' % (
     self.attr_escape(target), inside) 

'로 공백을 대체 할

>>> import creole 
>>> from creole.creole2html import emitter 
>>> def new_emitter(self, node): 
... return 'blah' 
>>> emitter.HtmlEmitter.link_emit = new_emitter 
>>> creole.creole2html(u"[[link]]") 
u'<p>blah</p>' 

정확한 코드를 _ '는 독자에게 연습 문제로 남아 있습니다 ...

"공식적인 방법"으로 이것을 수행하는 더 정확한 방법을 찾고 있습니다.

2

Ascobol의 대답은 작동하지만 클래스 상속을 사용하는 것이 더 깔끔합니다.

이것은 내가 만들고있는 위키 응용 프로그램에서 (약간 변경된) 추출물입니다. 링크와 테이블의 출력을 변경합니다. 재정의 할 수있는 메소드를보고 싶다면 python-creole의 소스 코드를 살펴보십시오.

class WikiLinkHtmlEmitter(HtmlEmitter): 
    def link_emit(self, node): 
     target = node.content 
     if node.children: 
      inside = self.emit_children(node) 
     else: 
      inside = self.html_escape(target) 
     m = self.link_rules.addr_re.match(target) 
     if m: 
      if m.group('extern_addr'): 
       return u'<a href="%s">%s</a>' % (
        self.attr_escape(target), inside) 
      elif m.group('inter_wiki'): 
       raise NotImplementedError 
     if re.match(r'^\[email protected]\S+$', target): 
      target = 'mailto:%s' % target 
      return u'<a href="%s">%s</a>' % (
       self.attr_escape(target), inside) 

     target = target.lower() 
     target = slugify(target) 

     target = '/wiki/' + target 

     return u'<a href="%s" class="%s">%s</a>' % (
      self.attr_escape(target), classes, inside) 

    def table_emit(self, node): 
     return u''' 
     <table class="table table-bordered table-striped"> 
      \n%s 
     </table>\n''' % self.emit_children(node) 

def creole_markup(value): 
    document = Parser(value).parse() 
    return mark_safe(WikiLinkHtmlEmitter(document).emit())