Cách chuyển đổi tệp Markdown sang Dokuwiki, trên PC


13

Tôi đang tìm kiếm một công cụ hoặc tập lệnh để chuyển đổi các tệp Markdown sang định dạng Dokuwiki , nó sẽ chạy trên PC.

Điều này là để tôi có thể sử dụng MarkdownPad trên PC để tạo các bản nháp tài liệu ban đầu, sau đó chuyển đổi chúng sang định dạng Dokuwiki, để tải lên bản cài đặt Dokuwiki mà tôi không kiểm soát được. (Điều này có nghĩa là plugin Markdown không có tác dụng với tôi.)

Tôi có thể dành thời gian viết kịch bản Python để tự thực hiện chuyển đổi, nhưng tôi muốn tránh dành thời gian cho việc này, nếu điều đó đã tồn tại.

Các thẻ Markdown mà tôi muốn được hỗ trợ / chuyển đổi là:

  • Tiêu đề cấp 1 - 5
  • In đậm, in nghiêng, gạch chân, phông chữ có chiều rộng cố định
  • Danh sách đánh số và không đánh số
  • Siêu liên kết
  • Quy tắc ngang

Liệu một công cụ như vậy tồn tại, hoặc có một điểm khởi đầu tốt có sẵn?


Những điều tôi đã tìm thấy và xem xét


Thêm bộ lọc vào pandoc cho đầu ra DW?! Và, btw, đối với tập hợp nhỏ được yêu cầu, bạn có thể thử bắt đầu với Markdown thuần túy trong DW (bạn đã đọc quy tắc cú pháp DW chưa?!)
Lazy Badger

@LazyBadger Cảm ơn. Tôi chỉ đọc johnmacfarlane.net/pandoc/scripting.html , và theo như tôi thấy, đó là về việc thay đổi Pandoc AST. Tôi muốn giữ AST không thay đổi, nhưng thay đổi định dạng đầu ra. Hay tôi đã hiểu lầm?
Clare Macrae

@LazyBadger Re đề nghị thứ hai của bạn, vâng, tôi (tin rằng tôi) biết cú pháp DW rất tốt! Tuy nhiên, ngay cả khi DW hỗ trợ Markdown, tôi muốn chuyển đổi văn bản sang cú pháp DW thông thường, vì lợi ích của các đồng nghiệp có thể chỉnh sửa nó.
Clare Macrae

Tôi vừa phát hiện ra có một vấn đề Pandoc rất ngắn gọn yêu cầu hỗ trợ DokuWiki.
Clare Macrae

Khi tôi nói về tích hợp pandoc, tôi có ý nghĩ "thêm nhà văn bổ sung", trong đó, AFAICS, không thay đổi cốt lõi như trình đọc MoinMoin cho thấy - đó chỉ là kịch bản Haskell bổ sung
Lazy Badger

Câu trả lời:


11

Dừng báo chí - Tháng 8 năm 2014

Kể từ Pandoc 1.13 , Pandoc hiện chứa triển khai viết DokuWiki của tôi - và nhiều tính năng khác được triển khai ở đó hơn trong tập lệnh này. Vì vậy, kịch bản này bây giờ là khá dư thừa.


Ban đầu nói rằng tôi không muốn viết một kịch bản Python để thực hiện chuyển đổi, cuối cùng tôi đã làm điều đó.

Bước tiết kiệm thời gian thực là sử dụng Pandoc để phân tích văn bản Markdown và viết ra một bản trình bày JSON của tài liệu. Tệp JSON này sau đó hầu như khá dễ phân tích và viết ra ở định dạng DokuWiki.

Dưới đây là tập lệnh thực hiện các bit của Markdown và DokuWiki mà tôi quan tâm - và một vài thứ nữa. (Tôi chưa tải lên testuite tương ứng mà tôi đã viết)

Yêu cầu sử dụng nó:

  • Python (Tôi đã sử dụng 2.7 trên Windows)
  • Pandoc không chú ý và pandoc.exe trong PATH của bạn (hoặc chỉnh sửa tập lệnh để đưa vào đường dẫn đầy đủ đến Pandoc thay thế)

Tôi hy vọng điều này cũng giúp người khác tiết kiệm thời gian ...

Chỉnh sửa 2 : 2013-06-26: Bây giờ tôi đã đặt mã này vào github, tại https://github.com/claremacrae/markdown_to_dokuwiki.py . Lưu ý rằng mã ở đó thêm hỗ trợ cho nhiều định dạng hơn và cũng chứa testsuite.

Chỉnh sửa 1 : được điều chỉnh để thêm mã để phân tích mẫu mã theo kiểu backtick của 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 Bạn được chào đón. (BTW, tôi chỉ nhận thấy một lỗi đánh máy mỹ phẩm: s / jason / json / ở một số nơi ... :-))
Clare Macrae

2

Đây là một cách tiếp cận khác mà tôi đã sử dụng gần đây.

Ưu điểm của nó là:

  • nó chuyển đổi một phạm vi cú pháp MarkDown rộng hơn nhiều so với tập lệnh Python trong câu trả lời khác của tôi
  • nó không yêu cầu cài đặt python
  • nó không yêu cầu cài đặt pandoc

Công thức:

  1. Mở tệp Markdown trong MarkdownPad 2

    Ảnh chụp màn hình MarkdownPad 2

  2. Chọn Chỉnh sửa -> "Sao chép Tài liệu dưới dạng HTML"

  3. Chạy Html2DokuWiki

    Ảnh chụp màn hình HTML sang DokuWiki

  4. Dán HTML vào khung "Đầu vào HTML" hàng đầu

  5. Chọn Tất cả và Sao chép tất cả văn bản trong ngăn "Đầu ra DokuWiki" dưới cùng

1

Không lý tưởng, nhưng giải pháp chức năng

Đánh dấu -> HTML -> Dokuwiki

Chuyển đổi đầu tiên được thực hiện bởi pandoc

Thứ hai - Mô-đun HTML-WikiConverter-DokuWiki Perl

Gợi ý: Đảo ngược hành động của mã hiện có

Silverstripe-doc-tái cấu trúc git-repo chứa mã (PHP) để chuyển đổi từ Dokuwiki sang Markdown


Tôi đã thử điều này, nhưng, không quen thuộc với Perl, tôi đã không đến gần để làm cho mô-đun hoạt động.
Clare Macrae
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.