Как конвертировать файлы Markdown в Dokuwiki, на ПК


13

Я ищу инструмент или скрипт для преобразования файлов Markdown в формат Dokuwiki , который будет работать на ПК.

Это сделано для того, чтобы я мог использовать MarkdownPad на ПК для создания первоначальных черновиков документов, а затем преобразовывать их в формат Dokuwiki для загрузки в установку Dokuwiki, над которой я не имею никакого контроля. (Это означает, что плагин Markdown бесполезен для меня.)

Я мог бы потратить время на написание скрипта Python, чтобы выполнить преобразование самостоятельно, но я бы хотел не тратить время на это, если такая вещь уже существует.

Теги Markdown, которые я бы хотел поддержать / преобразовать:

  • Заголовок уровней 1 - 5
  • Жирный, курсив, подчеркивание, шрифт фиксированной ширины
  • Нумерованные и ненумерованные списки
  • Гиперссылки
  • Горизонтальные правила

Существует ли такой инструмент или есть хорошая отправная точка?


Вещи, которые я нашел и рассмотрел

  • Сначала я думал, что txt2tags будет полезен, но, хотя он может записывать как уценку, так и Dokuwiki, он очень привязан к своему определенному формату ввода

  • Я также видел Markdown2Dokuwiki , и хотя я, безусловно, хотел бы использовать сценарий sed даже на ПК, он поддерживает только крошечную часть синтаксиса Markdown.

  • Python-markdown2 также звучит многообещающе, но он только записывает HTML.

  • pandoc - но он не поддерживает вывод Dokuwiki

  • MultiMarkdown - не поддерживает вывод Dokuwiki


Добавить фильтр в pandoc для вывода DW ?! И, между прочим, для запрошенного небольшого подмножества вы можете попробовать начать с чистого Markdown в DW (ваши правила синтаксиса DW прочитаны ?!)
Lazy Badger

@LazyBadger Спасибо. Я только что прочитал johnmacfarlane.net/pandoc/scripting.html , и, насколько я вижу, речь идет об изменении Pandoc AST. Я хочу оставить AST без изменений, но изменить формат вывода. Или я неправильно понял?
Клэр Макрэй

@LazyBadger Re ваше второе предложение, да, я (кажется, я) очень хорошо знаю синтаксис DW! Однако, даже если DW поддерживает Markdown, я хочу преобразовать текст в обычный синтаксис DW ради моих коллег, которые могут его редактировать.
Клэр Макрэй

Я только что обнаружил, что есть очень короткая проблема Pandoc, требующая поддержки DokuWiki.
Клэр Макрэй

Когда я говорю об интеграции pandoc, я имею в виду «добавить дополнительного писателя», который, AFAICS, не меняет ядро, как показывает читатель MoinMoin, - это просто дополнительный скрипт на Haskell
Lazy Badger

Ответы:


12

Стоп-Пресс - август 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 : исправлено добавление кода для разбора примеров кода в стиле обратной пометки 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. Откройте файл Markdown в MarkdownPad 2

    Скриншот MarkdownPad 2

  2. Выберите «Правка» -> «Копировать документ как HTML»

  3. Запустите Html2DokuWiki

    Скриншот HTML в DokuWiki

  4. Вставьте HTML в верхнюю панель «HTML Input»

  5. Выберите «Все» и скопируйте весь текст в нижней панели «Вывод DokuWiki»

1

Не идеальное, но функциональное решение

Уценка -> HTML -> Докувики

Первое преобразование сделано pandoc

Второй - модуль Perl HTML-WikiConverter-DokuWiki

Подсказка: изменение действия существующего кода

Silver-Stripe-Doc -реструктуризация GIT-РЕПО содержат код (PHP) для преобразования из Dokuwiki в Markdown


Я попробовал это, но, не знакомый с Perl, я не приблизился к тому, чтобы заставить модуль работать.
Клэр Макрэй
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.