html2wikit

 

Kroc - 03 Juin 2004


Petit utilitaire destiné à convertir grossièrement mais rapidement une page html en texte compatible avec Wikit grâce à lynx. Seul le corps du texte html sera conservé. Le résultat peut être collé directement dans une fenêtre d'édition de Wikit.


    #!/usr/bin/env tclsh

    ################################################################################
    #
    # Script pour transformer une page html au format wikit
    #
    # Copyright © 2004 - David Zolli - http://www.zolli.fr
    #
    # Ce script est distribué sous licence NOL http://wfr.tcl.tk/nol
    #
    # Version 1.0 - Juin 2004
    #
    ################################################################################

    # Contrôle de la ligne de commande :
    if {$argc != 2 || ![file exist [lindex $argv 0]]} {
        puts stdout "Utilisation :\nhtml2wikit source.html cible.txt"
        exit
    }

    # Conversion des tags HTML en tags Wikit :
    proc retag { l } {
        # Titres :
        set l [string map -nocase {
            <h1> <br>----<br>''' <h2> <br>----<br>''' <h3> <br>----<br>'''
            </h1> '''<br>----<br> </h2> '''<br>----<br> </h3> '''<br>----<br>
            <h4> <p>''' <h5> <p>''' <h6> <p>'''
            </h4> '''<p> </h5> '''<p> </h6> '''<p>
        } $l]
        # Gras :
        set l [string map -nocase {
            <b> ''' </b> '''
            <u> ''' </u> '''
        } $l]
        # Italique :
        set l [string map -nocase {
            <i> '' </i> ''
        } $l]
        # Quelques suppressions :
        set l [string map -nocase {
            <blockquote> "" </blockquote> ""
            <center> "" </center> ""
        } $l]
        # Crochets :
        set l [string map -nocase {
            [ \[\[ ] \]\]
            \[ \[\[ \] \]\]
        } $l]
        # Liens :
        while {[string first "<a href=" [string tolower $l]] != -1} {
            set d1 [string first "<a href=" [string tolower $l]]
            set f1 [expr [string first "/a>" [string range [string tolower $l] $d1 end]] +$d1+2]
            set link [string map {
                \" ""
                ./ "http://www.iciouailleurs.tk/"
            } [string range $l $d1 $f1]]
            set d2 [expr [string first = $link]+1]
            set f2 [expr [string first > [string range $link $d2 end]] +$d2 -1]
            set link \[[string range $link $d2 $f2]\]
            set l [string range $l 0 $d1]$link[string range $l $f1 end]
            set l [string map { "<\[" "" "\]>" "" } $l]
        }
        # Images :
        while {[string first "<img src=" [string tolower $l]] != -1} {
            set d1 [string first "<img src=" [string tolower $l]]
            set f1 [expr [string first ">" [string range [string tolower $l] $d1 end]] +$d1]
            set link [string map {
                \" ""
                ./ "http://www.iciouailleurs.tk/"
            } [string range $l $d1 $f1]]
            set d2 [expr [string first = $link]+1]
            set f2 [string first " " [string range $link $d2 end]]
            if { $f2 == -1 } {
                set f2 [string first > [string range $link $d2 end]]
            }
            set f2 [expr $f2 +$d2 -1]
            set link \[[string range $link $d2 $f2]\]
            set l [string range $l 0 $d1]$link[string range $l $f1 end]
            set l [string map { "<\[" <p>\[ "\]>" \]<p> } $l]
        }
        # Listes :
        set l [string map -nocase {
            <li> "" </li> ""
            <ul> "" </ul> ""
            <ol> "" </ol> ""
        } $l]
        # Lignes horizontales :
        set l [string map -nocase { <hr> <br>----<br> } $l]
        # Texte brut :
        set l [string map -nocase {
            <pre> "<pre><br>_pRe_<br>" </pre> "<br>_/pRe_<br></pre>"
        } $l]
    }

    # Espaces en début de ligne :
    proc brut { texte } {
        set brut 0
        set res ""
        foreach ligne [split $texte \n] {
            if {[string match $ligne _pRe_]} {
                incr brut
            } elseif {[string match $ligne _/pRe_]} {
                incr brut -1
            } else {
                if { $brut } {
                    append res " [string map { \[\[ \[ \]\] \] } $ligne]\n"
                } else {
                    # retrait des blancs :
                    set i 0
                    while {[string index $ligne $i] eq " "} {
                        incr i
                    }
                    append res [string range $ligne $i end]\n
                }
            }
        }
        return $res
    }

    # Traitement :

    set fichier [lindex $argv 0]
    set htm [file rootname $fichier]2.htm
    set txt [lindex $argv 1]
    set bodytag 0
    set fin [open $fichier r]
    set fout [open $htm w]
    while {![eof $fin]} {
        set ligne [gets $fin]
        # On ne garde que le corps :
        if {[string first <body $ligne] != -1 } {
            set bodytag 1
            puts $fout <body>
        } elseif {[string first </body> $ligne] != -1 } {
            set bodytag 0
            puts $fout </body>
        } elseif {$bodytag} {
            puts $fout [retag $ligne]
        }
    }
    close $fin
    close $fout
    exec lynx -dump -width 120 -dont_wrap_pre $htm > $txt
    set fin [open $txt r]
    set data [read $fin]
    close $fin
    set fout [open $txt w]
    puts -nonewline $fout [brut $data]
    close $fout
    file delete -force $htm

    # C'est fini :
    puts stdout Fait.

Faite quand même une relecture du résultat, car si le code html d'origine est mal écrit (ce qui arrive souvent) le code produit contiendra certainement des erreurs.