Markdown dosyalarını PC'de Dokuwiki'ye dönüştürme


13

Markdown dosyalarını PC'de çalışacak Dokuwiki formatına dönüştürmek için bir araç veya komut dosyası arıyorum .

Böylece, belgelerin ilk taslaklarını oluşturmak için bir bilgisayarda MarkdownPad'i kullanabilir ve daha sonra üzerinde kontrol sahibi olmadığım bir Dokuwiki kurulumuna yüklemek için bunları Dokuwiki formatına dönüştürebilirim. (Bu, Markdown eklentisinin benim için bir faydası olmadığı anlamına gelir .)

Ben olabilir dönüşüme kendim yapmak için bir Python komut dosyası yazma zaman harcamak, ama böyle bir şey zaten varsa, bu konuda vakit kaçınmak istiyorum.

Desteklemek / dönüştürmek istediğim Markdown etiketleri şunlardır:

  • Başlık seviyeleri 1 - 5
  • Kalın, italik, altı çizili, sabit genişlikli yazı tipi
  • Numaralı ve numarasız listeler
  • Köprüler
  • Yatay kurallar

Böyle bir araç mevcut mu, yoksa iyi bir başlangıç ​​noktası var mı?


Bulduğum ve düşündüğüm şeyler


DW çıkışı için pandoc'a filtre eklensin mi ?! Ve btw, istenen küçük alt küme için DW'de saf Markdown ile başlamayı deneyebilirsiniz (okuma DW sözdizimi kurallarınız mı var ?!)
Lazy Badger

@LazyBadger Teşekkürler. Ben sadece johnmacfarlane.net/pandoc/scripting.html okudum ve görebildiğim kadarıyla Pandoc AST'yi değiştirmekle ilgili. AST'yi değişmeden tutmak istiyorum, ancak çıktı biçimini değiştiriyorum. Yoksa yanlış mı anladım?
Clare Macrae

@LazyBadger İkinci öneriniz, evet, DW sözdizimini çok iyi biliyorum! Ancak DW, Markdown'u desteklese bile, metni düzenleyebilen meslektaşlarım uğruna metni geleneksel DW sözdizimine dönüştürmek istiyorum.
Clare Macrae

DokuWiki desteği isteyen çok kısa bir Pandoc Sorunu olduğunu keşfettim .
Clare Macrae

Pandoc entegrasyonundan bahsettiğimde, AFAICS'in MoinMoin okuyucunun gösterdiği gibi çekirdeği değiştirmediği "ek yazar ekle" yi aklımda tutuyorum - sadece ek Haskell betiği
Lazy Badger

Yanıtlar:


12

Stop-Press - Ağustos 2014

Pandoc 1.13'ten bu yana , Pandoc artık DokuWiki yazımı uygulamamı içeriyor - ve bu komut dosyasından çok daha fazla özellik var. Yani bu senaryo artık fazlasıyla gereksiz.


Başlangıçta dönüşüm yapmak için bir Python betiği yazmak istemediğimi söyledikten sonra, bunu yaptım.

Gerçek zaman kazandıran adım, Markdown metnini ayrıştırmak ve belgenin JSON temsilini yazmak için Pandoc'u kullanmaktı. Bu JSON dosyasının ayrıştırılması ve DokuWiki formatında yazılması oldukça kolaydı.

Aşağıda, önemsediğim Markdown ve DokuWiki'nin bitlerini ve birkaçını uygulayan komut dosyası var. (Yazdığım ilgili test paketini yüklemedim)

Kullanmak için gerekenler:

  • Python (Windows'ta 2.7 kullanıyordum)
  • Pandoc yüklendi ve PATH'nizde pandoc.exe (veya bunun yerine Pandoc'un tam yoluna koymak için komut dosyasını düzenleyin)

Umarım bu da bir başkasını kurtarır ...

Düzenleme 2 : 2013-06-26: Şimdi bu kodu GitHub'a https://github.com/claremacrae/markdown_to_dokuwiki.py adresinden ekledim . Buradaki kodun daha fazla biçim için destek eklediğini ve ayrıca bir test paketi içerdiğini unutmayın.

Düzenleme 1 : Markdown'un backtick stilinde kod örneklerini ayrıştırmak için kod eklemek üzere ayarlandı:

# -*- 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 Rica ederim. (BTW, ben sadece bir kozmetik yazım hatası fark ettim: s / jason / json / çeşitli yerlerde ... :-))
Clare Macrae

2

Bu son zamanlarda kullandığım alternatif bir yaklaşım.

Avantajları:

  • Bir dönüştürür Markdown sözdizimi çok daha geniş yelpazede yer Python komut daha benim diğer cevap
  • yüklü python gerektirmez
  • pandoc kurulmasını gerektirmez

Yemek tarifi:

  1. Markdown dosyasını MarkdownPad 2'de açma

    MarkdownPad 2 Ekran Görüntüsü

  2. Düzenle -> "Belgeyi HTML Olarak Kopyala" yı seçin

  3. Html2DokuWiki'yi çalıştırın

    Önizleme Oyun HTML to DokuWiki

  4. HTML'yi üstteki "HTML Girişi" bölmesine yapıştırın

  5. Tümü'nü seçin ve "DokuWiki Çıktısı" bölmesinin altındaki tüm metni kopyalayın

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.