Foro de elhacker.net

Programación => PHP => Mensaje iniciado por: Diabliyo en 2 Junio 2008, 21:22 pm



Título: Crear la etiqueta CODE en mi propio codigo !!
Publicado por: Diabliyo en 2 Junio 2008, 21:22 pm
Hola:

Estoy terminando un sistema personal y me encuentro atorado en la parte de mostrar noticias, en especifico la parte cuando queremos mostrar codigos o texto de algun lenguaje de programacion utilizando las etiquetas CODE, pero por mas que lo intengo no logro imprimir bien algunas cosas...

El proceso que realizo para guardar la noticia de una forma muy resumida es:

OJO: register_globals= Off asi esta mi php.ini configuado.

Código:
<?php
switch( $buf_sec["TIPO"] ) //dependiendo el tipo de mensaje/noticia a colgar, es el modo
{
case 'noticia':
$msg= strip_tags($_POST["mensaje_noticia"]); //eliminamos etiquetas HTML
$msg= msg2caritas( $msg ); //de CODIGO a CARITAS, Ejm: :D => <img src="blabla">
$msg= msg2msgtags( $msg ); //de BBCode a HTML Tags, Ejm: [b] => <b>

//generamos array de insercion mysql
$valores= array(
"autor"=>"'". $_SESSION["log_usr"]. "'",
"titulo"=>"'". htmlentities($_POST["titulo_noticia"], ENT_QUOTES). "'",
"mensaje"=>"'". htmlentities($msg, ENT_QUOTES). "'",
"fecha"=>"'". time(). "'",
"menu"=>"'". htmlentities($buf_menu["NOMBRE"], ENT_QUOTES). "'",
"sección"=>"'". htmlentities($buf_sec["NOMBRE"], ENT_QUOTES). "'" );

unset($msg);

if( insertar_bdd( "NOTICIAS", $valores )==0 ) //insertamos a la BDD la trama
echo "Error en la Insercion de los Datos.";
else
echo "Datos Agregados con Exito.";
break;
//otros case...
}
?>

Para mostrar la noticia al publico es (de forma resumida):

Código:
<?php
//en una funcion anterior se reviso la validez y seguridad de la variable
//que actualmente esta pasandose como argumento con el  nombre de 'id_tmp'

$cons= consultar_con( "NOTICIAS", "ID='". $id_tmp. "'" );
$tmp= mysql_fetch_array($cons);

$fecha= date( "j", $tmp["FECHA"] ). " de ";
$fecha .= mes_esp(date( "m", $tmp["FECHA"] )). " del "; //el mes en espanol
$fecha .= date( "Y", $tmp["FECHA"] ). " a las ";
$fecha .= date( "g:i a", $tmp["FECHA"] );

$com_con= consultar_con( "SECCIONES", "NOMBRE='". $tmp["sección"]. "':RELACION='". $tmp["MENU"]. "'" );
$comm= mysql_fetch_array($com_con);

echo "<th colspan=\"2\"><a href=\"index.php?hoja=". $tmp["ID"]. "\" alt=\"". $tmp["TITULO"]. "\" title=\"". $tmp["TITULO"]. "\">". $tmp["TITULO"]. "</a></th><tr>";
echo "<td><div id=\"datos_publicacion\">Publicado por ";
echo "<a href=\"mailto:". consultar_datos_usuario( $tmp["AUTOR"], "email" ). "\" alt=\"". consultar_datos_usuario( $tmp["AUTOR"], "email" ). "\" title=\"". consultar_datos_usuario( $tmp["AUTOR"], "email" ). "\">";
echo "<b>". $tmp["AUTOR"]. "</b></a> el ". $fecha. "</div></td><tr>";
echo "<td>". html_entity_decode($tmp["MENSAJE"], ENT_QUOTES). "</td>";

ver_comentarios_thtd( $comm["COMENTARIOS"], $tmp["ID"], $id_tmp );
echo "<tr>";

unset($cons);
unset($id_tmp);
?>

La funcion de msg2msgtags:

Código:
<?php
function msg2msgtags( $mensaje )
{
/*
strchr( lugar, palabraclave )  busca la "palabraclave" en "lugar"
str_replace( palabraclave, sustituto, lugar )  busca en "lugar" la "palabraclave" y la sustituye por "sustituto"
*/
if( strchr( $mensaje, "[b]" ) &&  strchr( $mensaje, "[/b]" ) )
{
$mensaje= str_replace( "[b]", "<b>", $mensaje );
$mensaje= str_replace( "[/b]", "</b>", $mensaje );
}
if( strchr( $mensaje, "[i]" ) &&  strchr( $mensaje, "[/i]" ) )
{
$mensaje= str_replace( "[i]", "<i>", $mensaje );
$mensaje= str_replace( "[/i]", "</i>", $mensaje );
}
if( strchr( $mensaje, "[u]" ) &&  strchr( $mensaje, "[/u]" ) )
{
$mensaje= str_replace( "[u]", "<u>", $mensaje );
$mensaje= str_replace( "[/u]", "</u>", $mensaje );
}
if( strchr( $mensaje, "[center]" ) &&  strchr( $mensaje, "[/center]" ) )
{
$mensaje= str_replace( "[center]", "<center>", $mensaje );
$mensaje= str_replace( "[/center]", "</center>", $mensaje );
}
if( strchr( $mensaje, "[img]" ) &&  strchr( $mensaje, "[/img]" ) )
{
$mensaje= str_replace( "[img]", "<img class=\"img_post\" src=\"", $mensaje );
$mensaje= str_replace( "[/img]", "\">", $mensaje );
}
if( strchr( $mensaje, "[code]" ) ||  strchr( $mensaje, "
" ) )
      {
      $mensaje= str_replace( "
Código:
", "<div id=\"etiqueta_code\">", $mensaje );
$mensaje= str_replace( "
", "</div>", $mensaje );
      }
   if( strchr( $mensaje, "\n" ) )
      {
      $mensaje= str_replace( "\n", "<br>", $mensaje );
      }
   if( strchr( $mensaje, "<script>" ) )
      {
      $mensaje= str_replace( "<script>", htmlentities( "<script>", ENT_QUOTES ), $mensaje );
      }
   if( strchr( $mensaje, "</script>" ) )
      {
      $mensaje= str_replace( "</script>", htmlentities( "</script>", ENT_QUOTES ), $mensaje );
      }
   /*if( strchr( $mensaje, "" ) &&  strchr( $mensaje, "" ) )
      {
      $mensaje= str_replace();
      $mensaje= str_replace();
      }*/
   return $mensaje;
   }
?>[/code]

El estilo de la etiqueta #etiqueta_code en mi css es:

Código:
#etiqueta_code
{
background-color:yellow;
width:390px;
padding:3px 5px 3px 5px;margin-left:5px;
}


Título: Re: Crear la etiqueta CODE en mi propio codigo !!
Publicado por: Diabliyo en 2 Junio 2008, 21:27 pm
Al final de todo, al publicar el mensaje se come esto:

- Si el texto/codigo tiene TABULARES, los elimina.
- Si el texto/codigo tiene ESPACIOS extra, los elimina.
- Si el codigo es programa en C, elimina las cabeceras que esten declaradas asi: < cabecera >
- Solo se puede imprimir una cabecera de codigo C, mediante la inclucion asi: include "cabecera"

Alguna idea ?


Título: Re: Crear la etiqueta CODE en mi propio codigo !!
Publicado por: SirLanceCC en 2 Junio 2008, 21:51 pm
debes reemplazar los espacios con &nbsp;
reemplazar los < y > por &lt; y &gt; respectivamente o usar alguna función como html_entities()
...
el tabulador podrías reemplazarlo por 4 espacios &nbsp;


Título: Re: Crear la etiqueta CODE en mi propio codigo !!
Publicado por: Diabliyo en 3 Junio 2008, 01:37 am
debes reemplazar los espacios con &nbsp;
reemplazar los < y > por &lt; y &gt; respectivamente o usar alguna función como html_entities()
...
el tabulador podrías reemplazarlo por 4 espacios &nbsp;

Lo del remplazo de los espacios por &nbsp y los < > por &lt; &gt seria en la funcion msg2mstags() que utilizo ??... o en que parte del codigo serua conveniente invocar eso ??


Título: Re: Crear la etiqueta CODE en mi propio codigo !!
Publicado por: Hans el Topo en 3 Junio 2008, 10:42 am
cuando se tiene dudas sobre funciones y demás se va a la fuente que es www.php.net
para convertir carácteres html especiales http://es2.php.net/manual/es/function.htmlspecialchars.php

para salvar las comillas con el magic_quote off
http://es2.php.net/manual/es/function.addslashes.php


si quieres agregar la etiqueta code existe una librería bastante útil que coloreará y dará formato por ti

syntax highlight (http://code.google.com/p/syntaxhighlighter/downloads/list)

te paso un tutorial que hice de como implementarla en blogger (la instalación es genérica a cualquier sitio) en donde explica como personalizar la instalación/dependencias
Tutorial (http://blog-indomita.blogspot.com/2008/05/anadir-la-etiqueta-code-en-blogger.html)