2009/11/17

Du flan oui mais convi

De plus en plus dans mon boulot je dois faire du flan, du corpo flan même je dirai, le problème c'est qu'il faut pour cela utiliser OpenOffice... Et OpenOffice bah c'est très très lourd, c'est bloat, et quand je rédige, je ne vois pas pourquoi j'utiliserai autre chose que mon convi vim.

Heureusement pandoc existe, il s'agit d'un convertisseur de document qui gère entre autre en entrée le format markdown et gère entre autre en sortie le format odt.

Je tente le coup, je rédige un début de document en markdown avec mon plus beau vim et je le converti en odt.

$ pandoc -f markdown -t conviflan.txt -o corpoflan.odt

Le résultat est presque parfait, mon document OpenOffice respecte différente hiérarchie de style. Presque parfait parce qu'il faut que j'y applique le style de la boite à ce document, quand même. Pour cela rien de plus simple.

On extrait le style d'un document corpoflan déjà existant :

$ unzip corpoflan-modele.odt styles.xml

Puis on l'insère dans le document générer :

$ zip corpoflan.odt styles.xml

Et voilà un beau document rédigé en toute légèreté qui respecte la mise en forme corpo.

Voici une autre petite astuce que j'ai trouvé pour rédiger des diagrammes simplement :

J'utilise pgf/tikz parce que ça fait très simplement de très belles choses corpo ready via LateX. Je fait donc mon diagramme en LateX et le transforme en pdf avec pdflatex, enfin, pour pouvoir le réutiliser sous la forme de png dans les documents corpoflan, imagemagick est mon sauveur :

$ convert -density 200x200 -quality 90 -trim diagramme.pdf diagramme.png

Elle n'est pas belle la vie ?

UPDATE

Si dans votre modèle de document d'origine il y a des images, pour les récupérer il faudra déterminer où elle se trouve de corpoflan-modele.odt, pour xmlstarlet peut vous aider :

$ xml sel -N draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0"  -N xlink="http://www.w3.org/1999/xlink" -t -v "//draw:image/@xlink:href" styles.xml
Pictures/100000000000004200000032A4B86058.png

d'où

$ unzip Pictures/100000000000004200000032A4B86058.png corpoflan-modele.odt
$ zip corpoflan.odt Pictures/100000000000004200000032A4B86058.png

(Il faut noter là que xml c'est le nom du binaire de xmlstarlet sous FreeBSD sous linux c'est généralement xmlstarlet le nom du binaire.

Exemple en image :

vim

pandoc-nosytle

pandoc-nosytle

2009/06/11

Zsh avec Ncurses c'est beau

Depuis un moment déjà zsh a un nouveau module zsh/curses qui permet de faire de belles interface en ncurses directemet en script zsh. Depuis le temps que je voulais essayer, j'ai fini par me décider.

Pour mon premier bout de zsh/curses, j'ai décider de me faire un mixer tout joli utilisant mixer(8), je m'inspire donc de rexima dont j'aime bien l'ui et je suis donc parti pour me faire un zmixer.

De plus j'ai découvert que l'on pouvais faire du ZSH avec une syntaxe "un peu objet" alors voila le code obtenu :

#!/usr/bin/env zsh

zmodload zsh/curses

zmix()
{
    local mixer
    local -a zmix_dev
    integer y
    integer posy
    integer length
    #get list of devices
    zmix.draw()
    {
        zcurses addwin main $(( $LINES - 2 )) $(( $COLUMNS - 2 )) 1 1
        title="zmixer"
        zcurses move main 1 $(( ($COLUMNS - 2 - $#title) / 2 ))
        zcurses string main $title
        y=4
        for dev ($zmix_dev);do
            y+=1
            zcurses move main $y 5
            zcurses string main $dev
            zcurses move main $y 15
            zcurses string main ":"
            # Set the recording device
            if [[ "x$dev" = "x$record" ]]; then
                zcurses addwin record 1 1 $(( y + 1 )) 4 main
                zcurses attr record red/black bold
                zcurses string record "*"
            fi
            level=${${(f)"$(/usr/sbin/mixer -s $dev)"}[(w)2]}
            numlevel=${${(s#:#)level}[1]}
            zcurses move main $(( y )) 17
            line="|"
            zcurses string main "[${(r:$length::-:)${(l:$(( numlevel / 2))::=:)line}}] ($level)"
        done
        if (( posy == 0 ));then
            posy=5
        fi
        zmix.sel $posy
        zcurses refresh main
    }
    zmix.listen()
    {
        while true;do
            if [[ -z $key ]];then
                zcurses input main REPLY key
            fi
            newkey=$key
            key=
            case $newkey in
                (UP)
                if (( posy <= 5 )); then
                    zmix.sel $y
                else
                    zmix.sel $(( posy - 1 ))
                fi
                ;;
                (DOWN)
                if (( posy >= y )); then
                    zmix.sel 5
                else
                    zmix.sel $(( posy + 1 ))
                fi
                ;;
                (LEFT)
                dev=$zmix_dev[$(( posy - 4 ))]
                mixer $dev -1 2>&1 >/dev/null
                zmix.redraw $dev
                ;;
                (RIGHT)
                dev=$zmix_dev[$(( posy - 4 ))]
                mixer $dev +1 2>&1 >/dev/null
                zmix.redraw $dev
                ;;
                ("")
                if [[ -z $REPLY ]];then
                    zcurses delwin record
                    zcurses delwin main
                    zcurses clear stdscr redraw
                    zcurses refresh stdscr
                    zmix.draw
                else
                    break
                fi
                ;;
            esac
        done
    }
    zmix.sel()
    {
        zcurses move main $posy 0
        zcurses string main "  "
        posy=$1
        zcurses move main $posy  0
        zcurses string main "->"
        zcurses refresh main
    }
    zmix.redraw()
    {
        dev=$1
        level=${${(f)"$(/usr/sbin/mixer -s $dev)"}[(w)2]}
        numlevel=${${(s#:#)level}[1]}
        zcurses move main $posy 16
        zcurses clear main eol
        level=${${(f)"$(/usr/sbin/mixer -s $dev)"}[(w)2]}
        numlevel=${${(s#:#)level}[1]}
        zcurses move main $posy 17
        line="|"
        zcurses string main "[${(r:$length::-:)${(l:$(( numlevel / 2))::=:)line}}] ($level)"
        zcurses move main $posy 2
        zcurses refresh main
    }
    #Constructor
    {
        length=50
        mixer=(${=${(f)"$(/usr/sbin/mixer -S)"}})
        for line ($mixer);do
            [[ -n ${line:#*:*:*} ]] && continue
            zmix_dev+=${${(s#:#)line}[1]}
        done
        record=$mixer[$#mixer]
        zcurses init
        zmix.draw
        zmix.listen
    } always
    {
        #cleanup all windows
        for win ($zcurses_windows);do
            [[ -z ${win:#(main|stdscr)} ]] && continue
            zcurses delwin $win
        done
        zcurses delwin main
        zcurses end
    }
}
zmix

Je sais pas vous mais moi je trouve ça beau.

Le résultat en image :

zmixer

EDIT: Promis dès que ça sera plus propre ça ira dans zen

2008/08/07

Amélioration de la completion ZSH sous FreeBSD

Je me lance dans l'amélioration de la completion ZSH sous FreeBSD, N'hésitez pas à venir me faire part de ce que vous souhaiteriez voir améliorer, ajouter.

Seule limitation, l'amélioration ne concernera que ce qui fait parti du userland ou ce qui est spécifique à FreeBSD (portmaster/portupgrade par exemple).

J'ai mis en place en 1s un wiki pour que vous puissiez me faire vos retours/attentes.

Tout ce passe ici

La même chose est en cours depuis un moment pour Gentoo ici

2008/07/11

Tout lire en console en libre bien sûr

Je vais ici faire un récapitulatif des utilisataires qui permette de lire plein de format différent en console, je ne parle pas ici de framebuffer, le but étant de récupérer le contenu de différents types de fichiers, et éventuellement de pouvoir les traiter.

Le Format .doc MS Word

Souvent on vous envoies des documents .doc, au format MS Word donc, vous avez beau expliquer autour de vous que vous ne voulez rien dans ce format vous en recevez quand, même, une bonne solution pour pouvoir les lire / récupérer le texte contenu sans sortir l'artillerie lourd (OOo, abiword ou kword) c'est d'utiliser antiword c'est vieux, mais ça marche très très bien. (GPLv2)

Les Formats .xls ou .ppt (MS Excel ou MS Powerpoint

Tout comme les .doc, vous ne voulez pas de ces document mais on vous les envoie quand même, dans ces cas là il ne vous reste plus qu'a utiliser le bon vieux xlhtml. (GPLv2)

Les Formats HTML

Dans ce cas la il y a une pléthore d'outils, les principaux sont lynx avec l'option -dump (GPLv2) avec la même option, il y a links (GPLv2), elinks (GPLv2)

mais il y a aussi en beaucoup plus léger html2text (GPLv2)

Les formats OpenDocument

il y a odt2txt (GPLv2) pour aller lire les formats OpenDocument (Texte, Tableur Présentation) cerise sur le gâteau, il permet également d'aller lire les anciens documents .sxw (OpenOffice 1.x)

Le format .ps PostScript

le package ghostscript (GPLv2 et CPLv1) fourmit le binaire ps2ascii qui permet permet donc de récupérer le texte contenu dans le fichier postscript.

Le format .pdf Portable Document Format

poppler (GPLv2) et xpdf (GPLv2) fournissent la même gamme d'outils (normale poppler se base sur xpdf) pour manipuler les pdf, parmi tous ces outils on retrouve pdftotext.

Le format .djvu DJVU

le projet djvulibre (CPLv2) fournit tout un ensemble d'outil de manipulation de fichiers djvu en console, il offre entre autre djvutxt.

Mention spéciale pour tous les formats de document MS (Word, Excel, PPT, RTF)

catdoc fournit trois binaires : catdoc pour lire les document .doc et .rtf, xls2csv pour les excel et catppt pour les PowerPoint. Le gros plus de catdoc est la conversion possible vers latex.

Voila pour le petit point sur les outils permettant de lire/manipuler en console divers formats de documents.

Si comme moi vous lisez vos mail avec mutt, tous ces outils pourront vous être utiles, un autre outil qui pourra vous servir est demoroniser en effet si vous recevez des mails envoyés depuis outlook, ils sont souvent en html (SAYMAL) mais en html foireux en plus, demoroniser est un outil qui remettera le tout en html propre, il suffit ensuite de passer le résultat dans html2text pour pouvoir les lire correctement.

Pages : 1