Stop-Press - August 2014
Seit Pandoc 1.13 enthält Pandoc nun meine Implementierung des DokuWiki-Schreibens - und dort sind viel mehr Funktionen implementiert als in diesem Skript. Also dieses Skript ist jetzt ziemlich überflüssig.
Nachdem ich ursprünglich gesagt hatte, dass ich kein Python-Skript für die Konvertierung schreiben wollte, habe ich genau das getan.
Der wirklich zeitsparende Schritt bestand in der Verwendung von Pandoc, um den Markdown-Text zu analysieren und eine JSON-Darstellung des Dokuments auszugeben. Diese JSON-Datei war dann meist relativ einfach zu analysieren und im DokuWiki-Format zu schreiben.
Nachfolgend finden Sie das Skript, das die Teile von Markdown und DokuWiki implementiert, die mir wichtig waren - und ein paar mehr. (Ich habe nicht die entsprechende Testversion hochgeladen, die ich geschrieben habe)
Anforderungen zur Verwendung:
- Python (ich habe 2.7 unter Windows verwendet)
- Pandoc insatlled und pandoc.exe in Ihrem PATH (oder bearbeiten Sie das Skript, um stattdessen den vollständigen Pfad zu Pandoc einzugeben)
Ich hoffe, das erspart jemandem auch etwas Zeit ...
Edit 2 : 2013-06-26: Ich habe diesen Code jetzt in https://github.com/claremacrae/markdown_to_dokuwiki.py in github eingefügt . Beachten Sie, dass der Code dort Unterstützung für weitere Formate bietet und auch Testsuite enthält.
Edit 1 : angepasst, um Code zum Analysieren von Codebeispielen im Backtick-Stil von Markdown hinzuzufügen:
# -*- 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 )