스톱 프레스-2014 년 8 월
Pandoc 1.13 부터 Pandoc 에는 DokuWiki 쓰기 구현이 포함되어 있으며이 스크립트보다 더 많은 기능이 구현되어 있습니다. 따라서이 스크립트는 이제 거의 중복됩니다.
원래 변환을 수행하기 위해 Python 스크립트를 작성하고 싶지 않다고 말하면서 결국 그렇게했습니다.
실제로 시간을 절약하는 단계는 Pandoc을 사용하여 Markdown 텍스트를 구문 분석하고 문서의 JSON 표현을 작성하는 것이 었습니다. 이 JSON 파일은 대부분 구문 분석이 쉽고 DokuWiki 형식으로 작성되었습니다.
아래는 내가 걱정했던 Markdown과 DokuWiki의 비트를 구현하는 스크립트입니다. (내가 작성한 해당 테스트 스위트를 업로드하지 않았습니다)
사용 요구 사항 :
- 파이썬 (Windows에서 2.7을 사용하고있었습니다)
- Pandoc을 설치하고 PATH에 pandoc.exe를 설치하십시오 (또는 대신 Pandoc의 전체 경로를 입력하도록 스크립트를 편집하십시오)
나는 이것이 다른 누군가를 구하기를 바랍니다.
편집 2 : 2013-06-26 : 이제이 코드를 https://github.com/claremacrae/markdown_to_dokuwiki.py 에서 GitHub에 넣었습니다 . 이 코드는 더 많은 형식에 대한 지원을 추가하고 테스트 스위트도 포함합니다.
편집 1 : Markdown의 백틱 스타일로 코드 샘플을 구문 분석하기위한 코드를 추가하도록 조정되었습니다.
# -*- coding: latin-1 -*-
import sys
import os
import json
__doc__ = """This script will read a text file in Markdown format,
and convert it to DokuWiki format.
The basic approach is to run pandoc to convert the markdown to JSON,
and then to parse the JSON output, and convert it to dokuwiki, which
is written to standard output
Requirements:
- pandoc is in the user's PATH
"""
# TODOs
# underlined, fixed-width
# Code quotes
list_depth = 0
list_depth_increment = 2
def process_list( list_marker, value ):
global list_depth
list_depth += list_depth_increment
result = ""
for item in value:
result += '\n' + list_depth * unicode( ' ' ) + list_marker + process_container( item )
list_depth -= list_depth_increment
if list_depth == 0:
result += '\n'
return result
def process_container( container ):
if isinstance( container, dict ):
assert( len(container) == 1 )
key = container.keys()[ 0 ]
value = container.values()[ 0 ]
if key == 'Para':
return process_container( value ) + '\n\n'
if key == 'Str':
return value
elif key == 'Header':
level = value[0]
marker = ( 7 - level ) * unicode( '=' )
return marker + unicode(' ') + process_container( value[1] ) + unicode(' ') + marker + unicode('\n\n')
elif key == 'Strong':
return unicode('**') + process_container( value ) + unicode('**')
elif key == 'Emph':
return unicode('//') + process_container( value ) + unicode('//')
elif key == 'Code':
return unicode("''") + value[1] + unicode("''")
elif key == "Link":
url = value[1][0]
return unicode('[[') + url + unicode('|') + process_container( value[0] ) + unicode(']]')
elif key == "BulletList":
return process_list( unicode( '* ' ), value)
elif key == "OrderedList":
return process_list( unicode( '- ' ), value[1])
elif key == "Plain":
return process_container( value )
elif key == "BlockQuote":
# There is no representation of blockquotes in DokuWiki - we'll just
# have to spit out the unmodified text
return '\n' + process_container( value ) + '\n'
#elif key == 'Code':
# return unicode("''") + process_container( value ) + unicode("''")
else:
return unicode("unknown map key: ") + key + unicode( " value: " ) + str( value )
if isinstance( container, list ):
result = unicode("")
for value in container:
result += process_container( value )
return result
if isinstance( container, unicode ):
if container == unicode( "Space" ):
return unicode( " " )
elif container == unicode( "HorizontalRule" ):
return unicode( "----\n\n" )
return unicode("unknown") + str( container )
def process_pandoc_jason( data ):
assert( len(data) == 2 )
result = unicode('')
for values in data[1]:
result += process_container( values )
print result
def convert_file( filename ):
# Use pandoc to parse the input file, and write it out as json
tempfile = "temp_script_output.json"
command = "pandoc --to=json \"%s\" --output=%s" % ( filename, tempfile )
#print command
os.system( command )
input_file = open(tempfile, 'r' )
input_text = input_file.readline()
input_file.close()
## Parse the data
data = json.loads( input_text )
process_pandoc_jason( data )
def main( files ):
for filename in files:
convert_file( filename )
if __name__ == "__main__":
files = sys.argv[1:]
if len( files ) == 0:
sys.stderr.write( "Supply one or more filenames to convert on the command line\n" )
return_code = 1
else:
main( files )
return_code = 0
sys.exit( return_code )