Hola
chicos.
Mi
enhorabuena por el foro y aquí va mi consulta.
Estoy escribiendo un
parser en perl para
markdown y posteriormente convertirlo a
BBCode, sin embargo me quedo bastante bastante estancado.
Este es el código que he escrito hasta ahora, se encarga de transformar los bloques cabecera (H1, H2, H3, H4, H5, H6) en el equivalente de
donde
Ypt es un valor entre 60 y 10. Así, por ejemplo, un bloque del tipo H1 sería igual en bbcode a:
.
En
markdown, la sintaxis para un bloque H1-H6 es que obligatoriamente, la línea empiece por el símbolo de almohadilla (#), así que mi código lo busca y evalúa el tipo de bloque a crear, por ejemplo, si queremos un bloque H5, el código buscará 5 consecutivos (#####).
Using perl Syntax Highlighting
# Convert markdown headers style to bbcode
#
# r3daurii
$file = $ARGV[0]; #Get the file from command line. other arguments will be ignored.
chomp ($file);
open(FICH, "<$file") || die "No se puede abrir $file\n";
while($linea = <FICH>){
$resul = mk_Headers($linea);
print $resul;
}
#Funcion - md_Headers()
sub mk_Headers
{
@h_Size = qw/JUNK [size=60pt] [size=50pt] [size=40pt] [size=30pt] [size=20pt] [size=10pt]/;
$linea = shift;
$ck_Header = index($linea,"#",0);
if(($ck_Header==-1)||($ck_Header!=0)){
return $linea;
}else{
LOOP: for($count=0; $count<=6; $count++){
$h_Counter = index($linea,"#",$count);
if ($h_Counter == -1) {
$h_Counter = $count;
last LOOP;
}
}
$linea =~ s/^\#{$h_Counter}/$h_Size[$h_Counter]/;
$linea =~ s/\Z/\[\/size\]/;
return $linea;
}
}
Coloreado en 0.003 segundos, usando
GeSHi 1.0.8.4
Podéis probar el
script pasando un archivo de texto como único argumento, por ejemplo el siguiente:
- #H1
- ##H2
- ###H3
- ####H4
- #####H5
- ######H6
-
- One more test #
-
- Si la línea no contiene al principio la almohadilla, no se lee #
Y la salida de este al pasarlo por el programa será:
- [size=60pt]H1[/size]
- [size=50pt]H2[/size]
- [size=40pt]H3[/size]
- [size=30pt]H4[/size]
- [size=20pt]H5[/size]
- [size=10pt]H6[/size]
-
- One more test #
-
- Si la línea no contiene al principio almohadilla, no se lee #
Como veis, funcionar, funciona. Sin embargo, además de "feo" es, creo, muy ilegible
el código en si.
El mayor problema lo tengo cuando hay etiquetas de apertura y cierre.
En
markdown si queremos poner en negrita un texto, haríamos
- Código: Seleccionar todo
**Este texto está en negrita**
y transformado a
BBcode sería
- Código: Seleccionar todo
[b]Este texto está en negrita[/b]
Hasta aquí, sencillo, pero ¿qué pasaría si tuviésemos algo como
?, es decir, ¿cómo procesar y saber qué estilo tengo que aplicar al "hola".
Por otro lado, ¿cómo identificar cuál es el asterisco de apertura y de cierre en ese ejemplo?
No solo en ese ejemplo, debería funcionar en cualquier ejemplo.