Jak konwertować pliki Markdown do Dokuwiki na PC


13

Szukam narzędzia lub skryptu do konwersji plików Markdown do formatu Dokuwiki , które będą działać na komputerze PC.

Dzięki temu mogę używać MarkdownPad na PC do tworzenia wstępnych szkiców dokumentów, a następnie konwertowania ich do formatu Dokuwiki, aby przesłać je do instalacji Dokuwiki, nad którą nie mam kontroli. (Oznacza to, że wtyczka Markdown nie jest dla mnie przydatna).

I mógłby spędzać czas pisząc skrypt Pythona zrobić konwersję siebie, ale chciałbym uniknąć spędzać czas na to, czy coś takiego już istnieje.

Tagi Markdown, które chciałbym wspierać / konwertować to:

  • Poziomy nagłówków 1–5
  • Pogrubiona, kursywa, podkreślenie, stała szerokość czcionki
  • Listy numerowane i nienumerowane
  • Hiperłącza
  • Zasady horyzontalne

Czy takie narzędzie istnieje, czy jest dostępny dobry punkt wyjścia?


Rzeczy, które znalazłem i rozważałem


Dodać filtr do pandoc dla wyjścia DW ?! A przy okazji, dla żądanego małego podzbioru możesz spróbować zacząć od czystego Markdown w DW (czy przeczytałeś zasady składni DW ?!)
Lazy Badger

@LazyBadger Thanks. Właśnie przeczytałem johnmacfarlane.net/pandoc/scripting.html i, o ile widzę, chodzi o zmianę Pandoc AST. Chcę zachować AST bez zmian, ale zmień format wyjściowy. A może źle zrozumiałem?
Clare Macrae,

@LazyBadger Re twoja druga sugestia, tak, ja (sądzę, że) znam bardzo dobrze składnię DW! Jednak nawet jeśli DW obsługuje Markdown, chcę przekonwertować tekst na konwencjonalną składnię DW, ze względu na moich kolegów, którzy mogą go edytować.
Clare Macrae

Właśnie odkryłem, że istnieje bardzo krótki problem Pandoc z prośbą o wsparcie DokuWiki.
Clare Macrae

Mówiąc o integracji pandoc, mam na myśli „dodaj dodatkowego pisarza”, który, AFAICS, nie zmienia rdzenia, jak pokazuje czytelnik MoinMoin - to tylko dodatkowy skrypt Haskell
Lazy Badger

Odpowiedzi:


12

Stop-Press - sierpień 2014 r

Od Pandoc 1.13 , Pandoc zawiera teraz moją implementację pisania DokuWiki - i tam implementowanych jest o wiele więcej funkcji niż w tym skrypcie. Więc ten skrypt jest teraz prawie zbędny.


Po tym, jak pierwotnie powiedziałem, że nie chcę pisać skryptu w Pythonie, aby dokonać konwersji, ostatecznie to zrobiłem.

Oszczędność czasu polegała na użyciu Pandoc do parsowania tekstu Markdown i napisaniu reprezentacji JSON dokumentu. Ten plik JSON był wówczas w większości dość łatwy do przeanalizowania i zapisania w formacie DokuWiki.

Poniżej znajduje się skrypt, który implementuje fragmenty Markdown i DokuWiki, na których mi zależało - i kilka innych. (Nie przesłałem odpowiedniego pakietu testowego, który napisałem)

Wymagania do korzystania z niego:

  • Python (korzystałem z wersji 2.7 w systemie Windows)
  • Zainstalowano Pandoc i pandoc.exe w ŚCIEŻCE (lub edytuj skrypt, aby zamiast tego wprowadzić pełną ścieżkę do Pandoc)

Mam nadzieję, że zaoszczędzi to także komuś innemu ...

Edycja 2 : 26.06.2013: Teraz umieściłem ten kod w GitHub na https://github.com/claremacrae/markdown_to_dokuwiki.py . Zauważ, że kod tam dodaje obsługę większej liczby formatów, a także zawiera pakiet testowy.

Edycja 1 : dostosowano, aby dodać kod do analizowania próbek kodu w stylu zaznaczenia wstecznego 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 Nie ma za co. (BTW, właśnie zauważyłem kosmetyczną literówkę: s / jason / json / w kilku miejscach ... :-))
Clare Macrae 3'12

2

Jest to alternatywne podejście, którego ostatnio używałem.

Jego zalety to:

  • konwertuje znacznie szerszy zakres składni MarkDown niż skrypt Python w mojej innej odpowiedzi
  • nie wymaga instalacji Pythona
  • nie wymaga instalacji pandoc

Przepis:

  1. Otwórz plik Markdown w MarkdownPad 2

    Zrzut ekranowy MarkdownPad 2

  2. Wybierz Edycja -> „Kopiuj dokument jako HTML”

  3. Uruchom Html2DokuWiki

    Zrzut ekranu HTML do DokuWiki

  4. Wklej HTML do górnego panelu „HTML Input”

  5. Wybierz Wszystkie i skopiuj cały tekst w dolnym okienku „Wyjście DokuWiki”

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.