Bagaimana mengkonversi file penurunan harga ke Dokuwiki, di PC

13

Saya mencari alat atau skrip untuk mengonversi file penurunan harga ke format Dokuwiki , yang akan berjalan di PC.

Ini agar saya dapat menggunakan MarkdownPad pada PC untuk membuat draf dokumen awal, dan kemudian mengonversinya menjadi format Dokuwiki, untuk mengunggah ke instalasi Dokuwiki yang tidak dapat saya kendalikan. (Ini berarti bahwa plugin Markdown tidak ada gunanya bagi saya.)

Saya dapat menghabiskan waktu menulis skrip Python untuk melakukan konversi sendiri, tetapi saya ingin menghindari menghabiskan waktu untuk ini, jika hal seperti itu sudah ada.

Tag Markdown yang ingin saya dukung / konversi adalah:

  • Tajuk level 1 - 5
  • Huruf tebal, miring, garis bawah, lebar tetap
  • Daftar bernomor dan tidak bernomor
  • Hyperlink
  • Aturan horisontal

Apakah alat semacam itu ada, atau adakah titik awal yang baik tersedia?


Hal-hal yang saya temukan dan pertimbangkan

Clare Macrae
sumber
Tambahkan filter ke pandoc untuk output DW ?! Dan, btw, untuk subset kecil yang diminta, Anda dapat mencoba memulai dengan Markdown murni dalam DW (apakah Anda membaca aturan sintaks DW ?!)
Lazy Badger
@LazyBadger Terima kasih. Saya baru saja membaca johnmacfarlane.net/pandoc/scripting.html , dan sejauh yang saya bisa lihat, ini tentang mengubah Pandoc AST. Saya ingin menjaga AST tidak berubah, tetapi ubah format output. Atau apakah saya salah paham?
Clare Macrae
@ LazyBadger Re saran kedua Anda, ya, saya (yakin saya) tahu sintaks DW dengan sangat baik! Namun, bahkan jika DW mendukung penurunan harga, saya ingin mengkonversi teks menjadi sintaks DW konvensional, demi kolega saya yang dapat mengeditnya.
Clare Macrae
Saya baru saja menemukan ada masalah Pandoc yang sangat singkat yang meminta dukungan DokuWiki.
Clare Macrae
Ketika saya berbicara tentang integrasi pandoc, ada dalam pikiran saya "tambahkan penulis tambahan", yang, AFAICS, tidak mengubah inti seperti yang ditunjukkan oleh pembaca MoinMoin - itu hanya skrip Haskell tambahan
Lazy Badger

Jawaban:

11

Stop-Press - Agustus 2014

Sejak Pandoc 1.13 , Pandoc sekarang berisi implementasi saya dari penulisan DokuWiki - dan banyak lagi fitur yang diterapkan di sana daripada di skrip ini. Jadi skrip ini sekarang cukup berlebihan.


Setelah awalnya mengatakan saya tidak ingin menulis skrip Python untuk melakukan konversi, saya akhirnya melakukan hal itu.

Langkah hemat waktu sebenarnya adalah menggunakan Pandoc untuk mem-parsing teks penurunan harga, dan menulis representasi JSON dari dokumen. File JSON ini kemudian sebagian besar cukup mudah diurai, dan ditulis dalam format DokuWiki.

Di bawah ini adalah skrip, yang mengimplementasikan bit dari Markdown dan DokuWiki yang saya pedulikan - dan beberapa lagi. (Saya belum mengunggah testuite yang sesuai yang saya tulis)

Persyaratan untuk menggunakannya:

  • Python (Saya menggunakan 2.7 pada Windows)
  • Pandoc insatlled, dan pandoc.exe di PATH Anda (atau edit skrip untuk menempatkan path lengkap ke Pandoc sebagai gantinya)

Saya harap ini menghemat waktu orang lain juga ...

Sunting 2 : 2013-06-26: Sekarang saya telah memasukkan kode ini ke github, di https://github.com/claremacrae/markdown_to_dokuwiki.py . Perhatikan bahwa kode di sana menambahkan dukungan untuk lebih banyak format, dan juga mengandung tesuite.

Sunting 1 : disesuaikan untuk menambahkan kode untuk sampel kode parsing dalam gaya backtick 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 )
Clare Macrae
sumber
@ OliverSalzburg Terima kasih. (BTW, saya baru saja melihat kesalahan ketik kosmetik: s / jason / json / di beberapa tempat ... :-))
Clare Macrae
2

Ini adalah pendekatan alternatif yang saya gunakan baru-baru ini.

Keuntungannya adalah:

  • itu mengkonversi rentang yang lebih luas dari sintaks MarkDown daripada skrip Python di jawaban saya yang lain
  • itu tidak memerlukan python untuk diinstal
  • itu tidak memerlukan pandoc untuk diinstal

Resep:

  1. Buka file Penurunan harga di MarkdownPad 2

    Tampilan Layar MarkdownPad 2

  2. Pilih Edit -> "Salin Dokumen sebagai HTML"

  3. Jalankan Html2DokuWiki

    Cuplikan HTML ke DokuWiki

  4. Rekatkan HTML ke panel "Input HTML" teratas

  5. Pilih Semua, dan Salin semua teks di panel "DokuWiki Output"
Clare Macrae
sumber
1

Bukan solusi ideal, tetapi fungsional

Penurunan harga -> HTML -> Dokuwiki

Konversi pertama dilakukan oleh pandoc

Kedua - modul Perl HTML-WikiConverter-DokuWiki

Petunjuk: Membalikkan tindakan kode yang ada

silverstripe-doc-restrukturisasi git-repo berisi kode (PHP) untuk mengkonversi dari Dokuwiki ke Markdown

Malas Badger
sumber
Saya mencoba ini, tetapi, karena tidak terbiasa dengan Perl, saya tidak mendekati modul untuk bekerja.
Clare Macrae