Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   PHP (https://www.clubdelphi.com/foros/forumdisplay.php?f=15)
-   -   Colorear o formatear palabras reservadas (BBCode) (https://www.clubdelphi.com/foros/showthread.php?t=61287)

enecumene 03-11-2008 01:53:39

Colorear o formatear palabras reservadas (BBCode)
 
Hola compañeros, estoy tratando de crear unas etiquetas (tags) con BBCode, y tengo lo siguiente:

Código:

<div class="post" id="msg_4"><div class="codeheader">Texto:</div><div class="code"><pre style="margin-top: 0; display: inline;">{content}</div>
donde {content} es el contenido a formatear, ahora, quería saber si conocen algún javascript que coloree o formatee algunas palabras específicas o reservadas para implementarla junto al código BBCode.

Saludos.

enecumene 03-11-2008 04:11:54

Traté de implementar este código que conseguí aquí en el club:

Código PHP:

<?php // magic!

/*
    delphi2html PHP class v1.0b

    (w) 2005 David Esperalta Calderón

    Thanks very much to the people of ClubDelphi Forums
    ([url]http://www.clubdelphi.com[/url]) and specially to Román
    from the idea and tutorial. ¡Thanks to all! ;-)

    Comments are welcome in davidesperalta @ gmail.com
    or in the ClubDelphi Forums (see url above)

*/

/*
    // Example usage 1
    //
    $colorize = new delphi2html();
     $file = file('./delphi_unit.pas');
    foreach ($file as $line) $temp .= $line;
     echo $colorize->execute($temp, true, true);

*/

/*
    // Example usage 2
    //
    $colorize = new delphi2html();
    $text = "type\n";
    $text .= " TForm1 = class(TForm)\n";
    $text .= " { Private declarations }\n";
    $text .= " private\n";
    $text .= "    procedure AMethod(param: string);\n";
    $text .= " end;\n";
    echo $colorize->execute($text, true, true);

*/    

class delphi2html {

    
// Style (CSS code)
    //
    
var $css_style =
     
"<style type='text/css'>
         .str { background-color: transparent; color: Green; }
         .idn { background-color: transparent; color: Black; }
         .res { background-color: transparent; color: Navy; font-weight: bold; }
         .com { background-color: transparent; color: Gray; font-style: italic; }
     </style>\n"
;

    
// Reserved keywords in Delphi
    //
    
var $keybords = array (
     
"Piedra""Tijeras""Lápiz""Hoja"
    
);

    
// Regular Exp for strings, identifiers and comments tokens.
    //
    
var $reg_exp             "";
    var 
$reg_exp_strings     "('.*?')|";
    var 
$reg_exp_identifiers "([a-z_][a-z0-9_]*)|";
    var 
$reg_exp_comments    "(\{.*?\}|\(\*.*?\*\)|//.*?\n|//.*\$)";

    
// Class constructor.
    //
    
function delphi2html() {

        
$this->reg_exp "#".
         
$this->reg_exp_strings.
         
$this->reg_exp_identifiers.
         
$this->reg_exp_comments ."#si";
    }

    
// Callback function.
    //
    
function replace($matches) {

        switch (
$matches[0])
         {
            case 
$matches[1]: // strings
             
return "<span class='str'>" .$matches[1]. "</span>";
             break;

             case 
$matches[2]: // identifiers
                 
if (in_array($matches[2], $this->keybords))
                    return 
"<span class='res'>" .$matches[2]. "</span>";
                 else
                    return 
"<span class='idn'>" .$matches[2]. "</span>";
                 break;

             case 
$matches[3]: // comments
                 
return "<span class='com'>" .$matches[3]. "</span>";
                 break;
         }
    }

    
// The main public method: execute
    //
    // param: code, string: the delphi source code to colorize.
    // param: add_css_code, boolean: add the CSS code in result.
    // param: add_pre_tags, boolean: add the <pre></pre> HTML tags.
    //
    // return: HTML delphi colorized text.
    //
    
function execute($code$add_css_code true$add_pre_tags true) {

        
$result preg_replace_callback($this->reg_exp,
                    array(
$this'replace'), $code);
        
        if(!
$add_pre_tags) {
            
         if(!
$add_css_code) { return $result; }
         else { return 
$this->css_style $result; }            
        
        } else {
            
         if(!
$add_css_code) { return "<pre>" .$result"</pre>"; }
         else { return 
$this->css_style "<pre>" .$result"</pre>"; }
        
        }            
        
    } 
// function execute

// class delphi2html

?>

Mi código BBCode:

Código PHP:

<div class="post" id="msg_4"><div class="codeheader">Texto:</div><div class="code"><pre style="margin-top: 0; display: inline;"><?php $colorize = new delphi2html();
     echo 
$colorize->execute({content}, truetrue); ?></div>

¿Problema?:

Cita:

Fatal error: Cannot redeclare class delphi2html in C:\AppServ\www\smf\Sources\Delphi.php on line 41
lo que hice fue, grabé ese código en un archivo Texto.php, y lo incluí en el php donde se usa los tags.

¿A qué se debe ese error?.

Saludos.

enecumene 03-11-2008 13:43:19

¡Buenos Días!, poniendo el hilo de primero para que algún alma caritativa me ayude :D :D.

Saludos.

dec 03-11-2008 15:10:21

Hola,

Hay que aclarar un par de cosas, al menos. La clase que has mostrado más arriba está escrita en PHP y funcionará con PHP, pero, no con JavaScript. El código que tienes que resaltar parece puro HTML, y, contiene una especie de "clave" ({content}) que acaso deberá ser reemplazada por el verdadero contenido, o sea el código fuente que se va a mostrar.

Ahora bien, PHP y Javascript son hasta cierto punto incompatibles, porque, el primero funciona en el servidor, y, el segundo lo hace en el cliente o navegador. Si tienes acceso al código fuente PHP del sistema que usas (que creo que sí) entonces tal vez podrías usar la clase "Delphi2Html", pero, si se trata de trabajar en el cliente, con Javascript, entonces no podrías usarla así como así.

Desde luego hay soluciones para "resaltar" código fuente utilizando Javascript, como pueda ser la que ofrece SHJS (no es la que yo conocía, pero, apareció tras una búsqueda en Google, y es que debe haber varias soluciones similares), así que es cuestión de aclarar un poco más las cosas. De todas formas, no te digo nada que no sepas ya, pero, ¿qué hay de algún plugin para el sistema de foros que estás usando? Igual podrías partir de ahí... o intentar aclarar qué tipo de solución necesitas: Javascript o PHP.

enecumene 03-11-2008 19:52:27

Hola Dec, pos sí estoy usando PHP no Javascript, yo sólo sugerí si existía alguno, lo que hice fue es que en el archivo donde se maneja las etiquetas de dicho foro hice un include (include 'delphi2html.php') y en el código HTML donde te muestro puse a ejecutar la función execute de la clase y al correr el foro me ocasionó dicho error, repito, no estoy trabajando con javascript sino PHP.

Saludos.

dec 03-11-2008 20:03:51

Hola,

Bueno. Pues ciñéndonos al error, de lo que se trata es de que no puede declararse dos veces la misma clase, es decir, puede ser que se esté incluyendo dos veces el archivo que contiene la clase, o puede ser que exista otra clase que se llame igual. Sería cuestión de buscar qué puede estar ocurriendo, pero, una solución para salir del paso sería usar "include_once" o "require_once" en lugar de "include" o "require", puesto que así nos aseguraríamos de que no incluímos el archivo de la clase sino una sola vez.

Por otro lado, si estás trabajando del lado del servidor, la clase en cuestión no parece muy complicada (y eso que la escribí yo hace tiempo) y sólo precisa una cadena como argumento en su método principal "Execute()". El mismo método retorna el código fuente una vez "resaltado", así que en principio no me parece muy complicado su uso, si bien dependerá del entorno en que te estés moviendo, y que yo desconozco, me temo.

enecumene 03-11-2008 21:40:20

Hola, tengo este array que crea la etiqueta del archivo origina y le hice unas modificacionesl:

Código PHP:

array(
            'tag' => 'texto',
            'type' => 'unparsed_content',
            'content' => '<div class="codeheader">' . $txt['smf238'] . ':</div><div class="code">' . ($context['browser']['is_gecko'] ? '<pre style="margin-top: 0; display: inline;"><? $colorize = new delphi2html(); echo $colorize->execute("$1",true,true); ?></pre>' : '$1') . '</div>',
            'block_level' => true,                        
            ),

Resultado:

Cita:

execute("Hoja de maquina y Lápiz de carbon",true,true); ?>
esa es la cita que muestra sin coloreado. Lo que hice fue poner la clase directo en el archivo php original en vez de include y require ya que me daba cierto problema.

Saludos,

dec 03-11-2008 21:47:44

Hola,

No entiendo muy bien qué es "Hoja de maquina y Lápiz de carbon". ¿Es el código a colorear? Pero ahí no hay código que colorear... Por otro lado, tendrías que hacer alguna prueba para asegurarte de que en "$1" recibes el código fuente a colorear, puesto que, recibiéndolo, el asunto debería funcionar más o menos. Y digo más o menos porque estamos hablando de aplicar un determinado estilo a ciertas etiquetas HTML. Ahora bien, no estamos solos en la página, y otros estilos pueden ser aplicados, que, incluso tengan mayor relevancia que los nuestros.

Debes asegurarte (mirando el código HTML resultante) de que estás obteniendo el resultado adecuado, o qué resultado estás obteniendo. :rolleyes:

enecumene 03-11-2008 23:18:00

Hola Dec, ya pude conseguir un mod para el SMF y me ha funcionado de pelos, y se llama Geshi y GeshiSmf, gracias por tu ayuda amigo.

Saludos.

dec 03-11-2008 23:26:30

Hola,

Ya te dije yo que... era raro que no hubiera algo ya hecho, y basándose, precisamente, en Geshi, como otros muchos proyectos. ;)

enecumene 04-11-2008 00:16:17

Cita:

Empezado por dec (Mensaje 323958)
Hola,

Ya te dije yo que... era raro que no hubiera algo ya hecho, y basándose, precisamente, en Geshi, como otros muchos proyectos. ;)

Hola Dec, estoy teniendo problemas agregando una linea, según la documentación debe ser así:

Código PHP:

$geshi->set_line_style('background: red;''background: blue;'true); 

y me ocurre este error:

Cita:

Parse error: syntax error, unexpected T_STRING in C:\AppServ\www\smf\Sources\Subs.php on line 1180
También dice que puede ser así:

Código PHP:

$geshi->set_line_style('background: #fcfcfc;''background: #f0f0f0;'); 

y también me ocurre el mismo error:

Cita:

Parse error: syntax error, unexpected T_STRING in C:\AppServ\www\smf\Sources\Subs.php on line 1180
tengo tiempo que no manejo php :p, el problema está en el sintaxis de esa línea, he probado de todo y nada.

Saludos.

dec 04-11-2008 00:38:39

Hola,

La sintaxis de esa línea parece correcta, o me equivoco. ¿Qué pasa exactamente en la línea 1180 del archivo "Subs.php"? Igual debes mirar por ahí, porque, ya digo, no parece que haya ningún error de sintaxis en el código que muestras. ¿Funciona el asunto si no usas ese método de Geshi? ¿Falla también?

enecumene 04-11-2008 00:49:22

La línea 1180 es esa misma, la cuestión funciona si quito la línea, pero es una opción que quiero tener, lo que no entiendo es porque da ese error.

Saludos.

dec 04-11-2008 01:00:01

Hola,

Supongo que revisaste la documentación de Geshi a este respecto. No sé. Por lo visto hay varias formas de usar el método que te da problemas, mejor dicho, los parámetros del mismo varían, según otras opciones de Geshi. Igual por ahí van los tiros. Me sorprende el error (aunque no estoy trabajando con ello) porque, personalmente, no veo error de sintaxis en esa línea en concreto... e igual está ahí a punto de comerme. :D

enecumene 04-11-2008 01:16:38

Cita:

Empezado por dec (Mensaje 323975)
Hola,

Supongo que revisaste la documentación de Geshi a este respecto. No sé. Por lo visto hay varias formas de usar el método que te da problemas, mejor dicho, los parámetros del mismo varían, según otras opciones de Geshi. Igual por ahí van los tiros. Me sorprende el error (aunque no estoy trabajando con ello) porque, personalmente, no veo error de sintaxis en esa línea en concreto... e igual está ahí a punto de comerme. :D

:D :D, sí dec, he revisado la documentación, he cambiado, quitado, cambiado apóstrofe, doble comillas y comillas hasta el punto que el tiro me la pego yo :D :D


La franja horaria es GMT +2. Ahora son las 09:27:43.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi