วิธีแปลงไฟล์ Markdown เป็น Dokuwiki บนเครื่อง PC


13

ฉันกำลังมองหาเครื่องมือหรือสคริปต์เพื่อแปลงไฟล์Markdownให้เป็นรูปแบบDokuwikiซึ่งจะทำงานบนพีซี

นี่คือเพื่อให้ฉันสามารถใช้MarkdownPadบนพีซีเพื่อสร้างร่างเอกสารเริ่มต้นจากนั้นแปลงเป็นรูปแบบ Dokuwiki เพื่ออัปโหลดไปยังการติดตั้ง Dokuwiki ที่ฉันไม่สามารถควบคุมได้ (ซึ่งหมายความว่าปลั๊กอิน Markdownไม่มีประโยชน์สำหรับฉัน)

ฉันสามารถใช้เวลาในการเขียนสคริปต์ Python เพื่อทำการแปลงด้วยตัวเอง แต่ฉันต้องการหลีกเลี่ยงการใช้เวลากับสิ่งนี้หากสิ่งนั้นมีอยู่แล้ว

แท็ก Markdown ที่ฉันต้องการสนับสนุน / แปลงคือ:

  • หัวเรื่องระดับ 1 - 5
  • ตัวหนาตัวเอียงขีดเส้นใต้ตัวอักษรความกว้างคงที่
  • รายการที่มีหมายเลขและหมายเลข
  • เชื่อมโยงหลายมิติ
  • กฎแนวนอน

มีเครื่องมือดังกล่าวหรือมีจุดเริ่มต้นที่ดีอยู่หรือไม่?


สิ่งที่ฉันได้พบและพิจารณา

  • ฉันเริ่มคิดว่าtxt2tagsจะมีประโยชน์ แต่แม้ว่ามันจะสามารถเขียนได้ทั้ง markdown และ Dokuwiki แต่มันก็เชื่อมโยงกับรูปแบบอินพุตเฉพาะของตัวเอง

  • ฉันเคยเห็นMarkdown2Dokuwikiและแม้ว่าฉันยินดีที่จะใช้สคริปต์ที่น่าจดจำแม้บนพีซีสิ่งนี้สนับสนุนเพียงส่วนเล็ก ๆ ของไวยากรณ์ของ Markdown

  • python-markdown2ฟังดูดี แต่มันเขียน HTML เท่านั้น

  • pandoc - แต่มันไม่รองรับ Dokuwiki output

  • MultiMarkdown - ไม่รองรับการส่งออก Dokuwiki


เพิ่มตัวกรองไปที่ pandoc สำหรับเอาต์พุต DW หรือไม่! และ btw สำหรับชุดย่อยขนาดเล็กที่ร้องขอคุณสามารถลองเริ่มต้นด้วย Markdown อย่างแท้จริงใน DW (คุณอ่านกฎไวยากรณ์ของ DW แล้วหรือยัง!)
Lazy Badger

@ LazyBadger ขอบคุณ ฉันเพิ่งอ่านjohnmacfarlane.net/pandoc/scripting.htmlและเท่าที่ฉันเห็นมันเป็นเรื่องเกี่ยวกับการเปลี่ยน Pandoc AST ฉันต้องการให้ AST ไม่เปลี่ยนแปลง แต่เปลี่ยนรูปแบบผลลัพธ์ หรือฉันเข้าใจผิด?
Clare Macrae

@ LazyBadger เป็นคำแนะนำที่สองของคุณใช่ฉัน (เชื่อฉัน) รู้ไวยากรณ์ของ DW ได้เป็นอย่างดี! อย่างไรก็ตามถึงแม้ว่า DW จะรองรับ Markdown แต่ฉันต้องการที่จะแปลงข้อความเป็นไวยากรณ์ DW ทั่วไปเพื่อประโยชน์ของเพื่อนร่วมงานที่อาจแก้ไขได้
Clare Macrae

ฉันเพิ่งค้นพบว่ามีPandoc Issueสั้น ๆที่ขอการสนับสนุนจาก DokuWiki
Clare Macrae

เมื่อฉันพูดเกี่ยวกับการรวมกันของ pandoc ฉันมีความคิดว่า "เพิ่มนักเขียนเพิ่มเติม" ซึ่ง AFAICS ไม่เปลี่ยนแกนในขณะที่ผู้อ่าน MoinMoinแสดง - เป็นเพียงสคริปต์ Haskell เพิ่มเติม
Lazy Badger

คำตอบ:


12

Stop-Press - สิงหาคม 2014

ตั้งแต่Pandoc 1.13ตอนนี้ Pandoc มีการใช้งานการเขียน DokuWiki ของฉัน - และคุณสมบัติอื่น ๆ อีกมากมายถูกนำไปใช้ที่นั่นมากกว่าในสคริปต์นี้ ดังนั้นตอนนี้สคริปต์นี้ซ้ำซ้อนค่อนข้างสวย


จากเดิมที่กล่าวว่าฉันไม่ต้องการเขียนสคริปต์ Python เพื่อทำการแปลงฉันจบลงด้วยการทำเช่นนั้น

ขั้นตอนการประหยัดเวลาจริงคือการใช้ Pandoc ในการแยกวิเคราะห์ข้อความ Markdown และเขียนการเป็นตัวแทนของ JSON ของเอกสาร ไฟล์ JSON นี้ส่วนใหญ่ค่อนข้างง่ายต่อการแยกวิเคราะห์และเขียนในรูปแบบ DokuWiki

ด้านล่างเป็นสคริปต์ซึ่งใช้บิตของ Markdown และ DokuWiki ที่ฉันใส่ใจ - และอีกไม่กี่ (ฉันไม่ได้อัปโหลดชุดทดสอบที่เกี่ยวข้องที่ฉันเขียน)

ข้อกำหนดที่จะใช้:

  • Python (ฉันใช้ 2.7 บน Windows)
  • ติดตั้ง Pandoc และ pandoc.exe ใน PATH ของคุณ (หรือแก้ไขสคริปต์เพื่อใส่พา ธ เต็มไปยัง Pandoc แทน)

ฉันหวังว่านี่จะช่วยคนอื่นให้รอดด้วย ...

แก้ไข 2 : 2013/06/26: ผมตอนนี้ใส่รหัสนี้ใน GitHub ที่https://github.com/claremacrae/markdown_to_dokuwiki.py โปรดทราบว่ารหัสที่มีเพิ่มการสนับสนุนสำหรับรูปแบบเพิ่มเติมและยังมีชุดทดสอบ

แก้ไข 1 : ปรับเพื่อเพิ่มรหัสสำหรับการแยกวิเคราะห์ตัวอย่างโค้ดในรูปแบบ backtick ของ 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 )

@OliverSalzburg ยินดีต้อนรับ (BTW ฉันเพิ่งสังเกตเห็นว่ามีการพิมพ์ผิด: s / jason / json / ในหลายสถานที่ ... :-))
Clare Macrae

2

นี่เป็นวิธีทางเลือกที่ฉันใช้เมื่อไม่นานมานี้

ข้อดีของมันคือ:

  • มันแปลงช่วงกว้างของไวยากรณ์ MarkDownมากกว่าสคริปต์ Python ในคำตอบอื่น ๆ ของฉัน
  • ไม่จำเป็นต้องติดตั้งไพ ธ อน
  • ไม่จำเป็นต้องติดตั้ง pandoc

สูตร:

  1. เปิดไฟล์MarkdownในMarkdownPad 2

    ภาพหน้าจอ MarkdownPad 2

  2. เลือกแก้ไข -> "คัดลอกเอกสารเป็น HTML"

  3. เรียกใช้Html2DokuWiki

    ภาพหน้าจอ HTML เป็น DokuWiki

  4. วาง HTML ลงในบานหน้าต่างด้านบน "HTML Input"

  5. เลือกทั้งหมดและคัดลอกข้อความทั้งหมดในบานหน้าต่างด้านล่าง "เอาท์พุท DokuWiki"

1

ไม่ใช่โซลูชันที่สมบูรณ์แบบ แต่ใช้งานได้ดี

Markdown -> HTML -> Dokuwiki

การแปลงครั้งแรกทำโดย pandoc

ที่สอง - โมดูลHTML-WikiConverter-DokuWiki Perl

คำแนะนำ: การย้อนกลับการทำงานของรหัสที่มีอยู่

silverstripe-doc- adjustment git-repo มีรหัส (PHP) สำหรับการแปลงจาก Dokuwiki เป็น Markdown


ฉันลองสิ่งนี้ แต่ไม่คุ้นเคยกับ Perl ฉันไม่ได้เข้าใกล้โมดูลเพื่อให้ทำงานได้
Clare Macrae
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.