wiki2latex
Texte initialement publié sur LinuxFR
Je suis en train de faire un travail avec d'autres. Nous avonc décider de travailler sur un wiki ... c'est chouette.
Je suis en train de faire un travail avec d'autres. Nous avonc décider de travailler sur un wiki ... c'est chouette.
Où c'et moins chouette, c'est lorsqu'ils m'ont proposé pour faire le rapport final ... et beau. J'ai l'habitude de faire ça sous LaTeX.
Comme j'ai pas spécialement envie de changer systématiquement les !!! blabla en \section{blabal}
... et tout le reste je me suis dis que le systématiquement devait me mettre sur la piste d'un script.
Ahma un p'tit script perl devrait trrès bien faire l'affaire. Malheureusement, je ne connais pas perl (j'ai bouquiner un peu mais pas assez) et c'est pour hier ...
Ok, vous me voyez venir.
Y aurait-il une âme charitable qui connait bien perl et qui saurait m'écrire un p'tit script qui convertit
__brol__ --> \textbf{brol}
''brol'' --> \textit{brol}
!!! brol --> \section{brol}
!! brol --> \subsection{brol}
* puce1 --> \begin{itemize} \item
* puce2 --> \item
* puce3 --> \item \end{itemize}
# puce1 --> \begin{enumerate} \item
# puce2 --> \item
# puce3 --> \item \end{enumerate}
Merci cher journal.
Commentaires
bah, pour de la substitution comme ça, sed fait l'affaire...
cat tonfichier.txt | sed -e "s/__brol__/\\textbf\{brol\}/g" | \
sed -e "s/''brol''/\\textit\{brol\}/g" | \
sed -e "s/\!\!\! brol/\\section\{brol\}/g" | \
sed -e "s/\!\! brol /\\subsection\{brol\}/g" | \
sed -e "s/\* puce1/\\begin\{itemize\} \\item/g" | \
sed -e "s/\* puce2/\\item/g" | \
sed -e "s/\* puce3/\\item \\end\{itemize\}/g" | \
sed -e "s/# puce1/\\begin\{enumerate\} \\item/g" | \
sed -e "s/# puce2/\\item/g" | \
sed -e "s/# puce3/\\item \\end\{enumerate\}/g" \
> tonfichier.tex
si tu préfères la solution du Perl:
cat fichier | perl -pe 's/REGEXP1/REGEXP_DEST1/g; \
s/REGEXP2/REGEXP_DEST2/g;' > fichier
avec autant de s/../../ que tu veut.
Le 'g' dans s/../../g demande à Perl de substituer toutes les occurences dans la ligne courantes (et non la première qu'il rencontre).
Pour finir les arguments de Perl:
-e le script est spécifiée sur la ligne de commande (les fameux one line).
-p boucle jusqu'à la fin de ton fichier et affiche le résultat sur la sortie standard. (sans le -p tu te retrouverais avec un fichier vide).
ouais, enfin lancer du perl pour faire du sed...
moi j'appelle ça bouffer de la ressource pour le plaisir ;)
J'ai la solution complete en perl :
#!/bin/perl
use strict ;
while (<>) {
s/__([^_]*)__/\textbf{$1}/g ;
s/\'\'([^\']*)\'\'/\textit{$1}/g ;
s/!!! ([^\s]*)/\section{$1}/g ;
s/!! ([^\s]*)/\subsection{$1}/g ;
s/\* puce1/\begin{itemize} \item/g ;
s/\* puce2/\item/g ;
s/\* puce3/\item \end{itemize}/g ;
s/\# puce1/\begin{enumerate} \item/g ;
s/\# puce2/\item/g ;
s/\# puce1/\item \end{enumerate}/g ;
print ;
}
print " " ;
Tu peux mettre ca dans le fichier wiki2latex et ensuite appeler
wiki2latex monfichier.wiki > monfichier.latex
PS en passant :
sed -e "s/''brol''/\\textit\{brol\}/g"
ca remplace
"brol" par \textit{brol}
mais ne faudrait-il pas que ca remplace aussi ?
"Titi" par \textit{Titi}
PPS en passant :
Pour le troll sed vs. perl .... Oh et puis non... trop facile !!!
Merci pour la réponse, je vais tester ça.
Merci aussi de préciser qu'il fallait prendre brol comme élément générique et que le but c'est de traduire une page.
Par contre pour le pucei c'est aussi générique, il faut comprendre ceci
* Ce que je veux
* Une peuce qui n'est ni la première ni la dernière
* Elles peuvent être plusiseurs
* Et la dernière
devient
\begin{itemize}
\item Ce que je veux
\item Une peuce qui n'est ni la première ni la dernière
\item Elles peuvent être plusiseurs
\item Et la dernière
\end{itemize}
Ca c'est un peu plus compliquer sans doute.
Pour ce cas là... je n'ai pas de solution simple...
c'est effectivement. plus compliqué... et du coup ca demande plus de temps...
désolé
un petit programme en awk (ou en python) serait plus simple a mon avis
Perl je connais un tout tout petit peu. Awk et python vraiment pas ... mais si tu proposes une solution, tu peux bien sur choisir ton langage :-))
Une preuve ?
# prg.awk
BEGIN { list_it = 0 }
/^\*.+$/ {
if (list_it==0) { print "\begin{enumerate}"; list_it=1;}
printf("%s%s ","\item",$0);
}
/^!!!/ { printf("%s%s%s ","\section{",$2,"}"); list_it=0; }
/^!!! / { printf("%s%s%s ","\subsection{",$2,"}"); list_it=0; }
/^[a-z]/ { if (list_it==1) {
print "\end{enumerate}"; }
printf("%s ",$0);
}
--
cat fichier | awk -f prg.awk > fichier 2
reste à compléter et a vérifier les expressions rationnelles
oups
remplacer
/^!!! / { printf("%s%s%s ","\subsection{",$2,"}"); list_it=0; }
par
/^!! / { printf("%s%s%s ","\subsection{",$2,"}"); list_it=0; }
Pour l'instant j'en suis là. Grace à jag et un collègue.
#! /usr/bin/perl
#
$inItem1 = 0; # boolean pour la gestion de *
$inItem2 = 0; # boolean pour la gestion de #
print "Essai ";
while (<>) {
s/__([^\_]*)__/\textbf{$1}/g ;
s/\'\'([^\']*)\'\'/\textit{$1}/g ;
s/!!!(.*)/\section{$1}/g ;
s/!!(.*)/\subsection{$1}/g ;
s/!(.*)/\subsubsection{$1}/g;
#
# Les puces
#
# Il faut traiter séparément la première et la dernière
# j'utilise un boolean
if (/\*/) {
if(!$inItem1) {$inItem1=1; print "\begin{itemize} ";}
print " \item ";
s/^\*//g;
}
else {
if ($inItem1) {
$inItem1=0;
print "\end{itemize} ";
}
}
# fin if
# Idem pour les puces numérotées
if (/\#/) {
if(!$inItem2) {$inItem2=1; print "\begin{enumerate} ";}
print " \item ";
s/^\#//g;
}
else {
if ($inItem2) {
$inItem2=0;
print "\end{enumerate} ";
}
}
# fin if
print;
}