如何在PC上将Markdown文件转换为Dokuwiki


13

我正在寻找将Markdown文件转换为Dokuwiki格式(可在PC上运行)的工具或脚本。

这样一来,我可以在PC上使用MarkdownPad创建文档的初始草稿,然后将其转换为Dokuwiki格式,以上传到我无法控制的Dokuwiki安装中。(这意味着Markdown插件对我没有用。)

可以花一些时间自己编写一个Python脚本来进行转换,但是如果这样的事情已经存在,我想避免花一些时间。

我想要支持/转换的Markdown标签是:

  • 标题级别1-5
  • 粗体,斜体,下划线,固定宽度字体
  • 编号和未编号列表
  • 超连结
  • 水平尺

是否存在这样的工具,或者有一个好的起点?


我发现并考虑过的事情


将过滤器添加到pandoc以获得DW输出?而且,顺便说一句,对于所请求的小子集,您可以尝试从DW中的纯Markdown开始(您是否读过DW语法规则?!)
Lazy Badger 2012年

@LazyBadger谢谢。我刚刚阅读了johnmacfarlane.net/pandoc/scripting.html,据我所知,这与更改Pandoc AST有关。我想保持AST不变,但更改输出格式。还是我误会了?
克莱尔·麦克雷

@LazyBadger关于您的第二个建议,是的,我(相信我)非常了解DW语法!但是,即使DW支持Markdown,我还是希望将文本转换为常规的DW语法,以便我的同事进行编辑。
克莱尔·麦克雷

我刚刚发现有一个简短的Pandoc Issue请求DokuWiki支持。
克莱尔·麦克雷

当我谈到pandoc整合,我心里有“增加额外的作家”,其中,AFAICS,不改变核心MoinMoin的读者展示-它只是额外的Haskell脚本
懒獾

Answers:


12

Stop-Press-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:我现在将此代码放入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 )

@OliverSalzburg不客气。(顺便说一句,我刚刚注意到一个装饰性的错字:s / jason / json /在几个地方... :
克莱尔·麦克雷

2

这是我最近一直在使用的替代方法。

它的优点是:

  • 我的其他答案相比,它转换的MarkDown语法范围比Python脚本大得多
  • 它不需要安装python
  • 它不需要安装pandoc

配方:

  1. MarkdownPad 2中打开Markdown文件

    MarkdownPad 2截图

  2. 选择编辑->“将文档复制为HTML”

  3. 运行Html2DokuWiki

    HTML到DokuWiki屏幕截图

  4. 将HTML粘贴到顶部的“ HTML输入”窗格中

  5. 选择全部,然后复制底部的“ DokuWiki输出”窗格中的所有文本

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.