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


13

Я шукаю інструмент або сценарій для перетворення Markdown файлів Докувікі формат, який буде працювати на ПК.

Це так, що я можу використовувати MarkdownPad на ПК, щоб створити початкові проекти документів, а потім перетворити їх у формат Dokuwiki, щоб завантажити до установки Dokuwiki, на яку я не маю контролю. (Це означає, що Плагін відмітки мені не потрібне.)

I міг витрачайте час на написання скрипта Python для самого перетворення, але я хотів би не витрачати час на це, якщо така річ вже існує.

Теги позначки, які я хотів би підтримувати / конвертувати, це:

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

Чи існує такий інструмент, або є хороша відправна точка?


Речі, які я знайшов і розглянув


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

@LazyBadger Спасибо. Я тільки що прочитав johnmacfarlane.net/pandoc/scripting.html і, наскільки я бачу, мова йде про зміну Pandoc AST. Я хочу зберегти AST без змін, але змінити вихідний формат. Чи я неправильно зрозумів?
Clare Macrae

@LazyBadger Re ваше друге пропозиція, так, я (вважаю, що я) знаю DW синтаксис дуже добре! Однак, навіть якщо DW підтримував Markdown, я хотів би перетворити текст на звичайний синтаксис DW заради моїх колег, які можуть його редагувати.
Clare Macrae

Я тільки що виявив там дуже короткий Pandoc Випуск запит на підтримку DokuWiki.
Clare Macrae

Коли я говорю про інтеграцію пандока, я маю на увазі "додати додаткового письменника", який, AFAICS, не змінює ядро як MoinMoin читач показує - це просто додатковий сценарій Haskell
Lazy Badger

Відповіді:


11

Стоп-прес - серпень 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 . Зауважте, що код додає підтримку більшої кількості форматів, а також містить testsuite.

Редагувати 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 - Ласкаво просимо. (BTW, я тільки що помітив косметичну друкарську помилку: s / jason / json / у декількох місцях ... :-))
Clare Macrae

2

Це альтернативний підхід, який я використовую останнім часом.

Його переваги:

  • він перетворює a набагато ширший діапазон синтаксису MarkDown ніж скрипт Python в моя інша відповідь
  • вона не вимагає встановлення python
  • він не вимагає встановлення pandoc

Рецепт:

  1. Відкрийте файл Markdown у MarkdownPad 2

    MarkdownPad 2 Screenshot

  2. Виберіть Редагувати - & gt; "Копіювати документ як HTML"

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

    HTML to DokuWiki Screenshot

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

  5. Виберіть All (Усі) і Copy (Копіювати весь текст) в нижній панелі "Output DokuWiki"

1

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

Markdown - & gt; HTML - & gt; Докувікі

Перше перетворення зроблено пандоком

Другий - HTML-WikiConverter-ДокуВікі Модуль Perl

Підказка: Скасування дій існуючого коду

сріблясто-док-реструктуризація git-repo містить код (PHP) для перетворення від Dokuwiki до Markdown


Я спробував це, але, не будучи знайомим з Perl, я не наблизився до того, щоб модуль працював.
Clare Macrae
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.