PCでMarkdownファイルをDokuwikiに変換する方法


13

MarkdownファイルをDokuwiki形式に変換し、PCで実行するツールまたはスクリプトを探しています。

これは、PCでMarkdownPadを使用してドキュメントの下書きを作成し、Dokuwiki形式に変換して、自分が制御できないDokuwikiインストールにアップロードできるようにするためです。(これは、Markdownプラグインが私にとって役に立たないことを意味します。)

変換を自分で行うためにPythonスクリプトを書くのに時間を費やすことはできますが、そのようなものが既に存在する場合、これに時間を費やすことは避けたいと思います。

サポート/変換したいMarkdownタグは次のとおりです。

  • 見出しレベル1-5
  • 太字、斜体、下線、固定幅フォント
  • 番号付きリストと番号なしリスト
  • ハイパーリンク
  • 横罫線

そのようなツールは存在しますか、それとも適切な出発点がありますか?


私が見つけて考えたこと


DW出力のフィルターをpandocに追加しますか?!そして、ところで、要求された小さなサブセットについては、DWで純粋なMarkdownから始めようとすることができます(DWの構文規則を読みましたか?!)
Lazy Badger

@LazyBadgerありがとう。私はjohnmacfarlane.net/pandoc/scripting.htmlを読みましたが、私が見る限りでは、Pandoc ASTの変更に関するものです。ASTを変更せず、出力形式を変更したい。または私は誤解しましたか?
クレアマクレー

@LazyBadgerあなたの2番目の提案について、はい、私は(私は信じています)DW構文をとてもよく知っています!ただし、DWがMarkdownをサポートしている場合でも、編集できる同僚のために、テキストを従来のDW構文に変換したいと思います。
クレアマクレー

DokuWikiのサポートを要求する非常に短いPandoc Issueがあることを発見しました。
クレアマクレー

私はpandocの統合について話すとき、私は心を持っているAFAICSが、これ、「追加の作家を追加」コアを変更しないようMoinMoinのリーダーショー-それだけで、追加のHaskellのスクリプトです
レイジーバジャー

回答:


11

ストッププレス-2014年8月

Pandoc 1.13以降、PandocにはDokuWikiライティングの実装が含まれるようになりました。このスクリプトよりも多くの機能が実装されています。したがって、このスクリプトはかなり冗長になりました。


もともと、変換を行うためにPythonスクリプトを書きたくないと言っていたので、結局それをやることになりました。

本当の時間節約のステップは、Pandocを使用してMarkdownテキストを解析し、ドキュメントのJSON表現を書き出すことでした。このJSONファイルはほとんど解析が簡単で、DokuWiki形式で書き出すことができました。

以下は、私が気にかけていたMarkdownとDokuWikiの一部を実装するスクリプトです。(私が書いた対応する証言をアップロードしていません)

それを使用するための要件:

  • Python(Windowsで2.7を使用していました)
  • Pandocがインストールされ、PATHにpandoc.exeが含まれている(またはスクリプトを編集して、代わりにPandocへのフルパスを入力する)

これで誰か他の人にも時間を節約できたらいいのですが...

編集2:2013-06-26:このコードをgithubのhttps://github.com/claremacrae/markdown_to_dokuwiki.pyに配置しました。そこのコードはより多くの形式のサポートを追加し、テストスイートも含むことに注意してください。

編集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 )

@OliverSalzburgどういたしまして。(ところで、私はちょうど化粧品のタイプミスに気づいた:s / jason / json /いくつかの場所で... :
クレアマクレー

2

これは私が最近使用している代替アプローチです。

その利点は次のとおりです。

  • 私の他の答えの Pythonスクリプトよりもはるかに広い範囲のMarkDown構文を変換します
  • Pythonをインストールする必要はありません
  • pandocをインストールする必要はありません

レシピ:

  1. MarkdownPad 2で Markdownファイルを開きます

    MarkdownPad 2スクリーンショット

  2. [編集]-> [HTMLとしてドキュメントをコピー]を選択します

  3. Html2DokuWikiを実行する

    HTML to DokuWikiスクリーンショット

  4. HTMLを上部の「HTML入力」ペインに貼り付けます

  5. [すべて]を選択し、下部の[DokuWiki出力]ペインにあるすべてのテキストをコピーします

1

理想的ではないが、機能的なソリューション

Markdown-> HTML-> Dokuwiki

pandocによる最初の変換

2番目-HTML-WikiConverter-DokuWiki Perlモジュール

ヒント:既存のコードのアクションを逆にする

silverstripe-doc-restructuring git-repoには、DokuwikiからMarkdownに変換するためのコード(PHP)が含まれています


私はこれを試してみましたが、Perlに精通していなかったため、モジュールを機能させることに近づきませんでした。
クレアマクレー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.