Как конвертировать файлы Markdown в Dokuwiki, на ПК
Я ищу инструмент или скрипт для конвертации файлов Markdown в формат Dokuwiki, который будет работать на ПК.
Это сделано для того, чтобы я мог использовать MarkdownPad на ПК для создания первоначальных черновиков документов, а затем преобразовывать их в формат Dokuwiki для загрузки в установку Dokuwiki, над которой я не имею никакого контроля. (Это означает, что плагин Markdown бесполезен для меня.)
Я мог бы потратить время на написание скрипта Python, чтобы выполнить преобразование самостоятельно, но я бы хотел не тратить время на это, если такая вещь уже существует.
Теги Markdown, которые я бы хотел поддержать / преобразовать:
- Заголовок уровней 1 - 5
- Жирный, курсив, подчеркивание, шрифт фиксированной ширины
- Нумерованные и ненумерованные списки
- Гиперссылки
- Горизонтальные правила
Существует ли такой инструмент или есть хорошая отправная точка?
Вещи, которые я нашел и рассмотрел
Сначала я подумал, что txt2tags будет полезен, но хотя он может записывать как уценку, так и Dokuwiki, он очень привязан к своему определенному формату ввода
Я также видел Markdown2Dokuwiki, и хотя я, безусловно, хотел бы использовать сценарий sed даже на ПК, он поддерживает только крошечную часть синтаксиса Markdown.
Python-markdown2 также звучит многообещающе, но он только записывает HTML.
pandoc - но он не поддерживает вывод Dokuwiki
3 ответа
Это альтернативный подход, который я использовал недавно.
Его преимущества:
- он конвертирует гораздо более широкий диапазон синтаксиса MarkDown, чем скрипт Python в моем другом ответе
- это не требует Python для установки
- не требует установки pandoc
Рецепт:
Откройте файл Markdown в MarkdownPad 2
Выберите "Правка" -> "Копировать документ как HTML"
Запустите Html2DokuWiki
Вставьте HTML в верхнюю панель "HTML Input"
- Выберите "Все" и скопируйте весь текст в нижней панели "Вывод DokuWiki"
Стоп-Пресс - август 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 )
Не идеальное, но функциональное решение
Уценка -> HTML -> Докувики
Первое преобразование сделано pandoc
Второй - модуль Perl http://search.cpan.org/~diberri/HTML-WikiConverter-DokuWiki-0.53/
Подсказка: изменение действия существующего кода
https://github.com/chillu/silverstripe-doc-restructuring git-repo содержит код (PHP) для преобразования из Докувики в Markdown