function PintarHTML($Texto)
{
    $_Debug = false;
    // El primer paso es separar todas las etiquetas en un array
    $Texto = str_replace('	', '    ', $Texto);
    // Re-emplazo tabuladores
    $Texto = str_replace('&', '&', $Texto);
    // Re-emplazo simbolos AND
    $TamTexto = strlen($Texto);
    $PalabraActual = "";
    $Estado = "";
    // Puede ser : PHP, JavaScript_Inicio, JavaScript_Str1, JavaScript_Str2, JavaScript_Fin,
    // 			 CSS_Inicio, CSS_Str1, CSS_Str2, CSS_Fin, Etiqueta, Etiqueta_Str1, Etiqueta_Str2,
    //             Comentario, Estilo_Str1, Estilo_Str2
    $TextoColoreado = "";
    $InicioEtiqueta = 0;
    $InicioEstilo = 0;
    for ($i = 0; $i < $TamTexto; $i++) {
        switch ($Estado) {
            case "":
                // Sin estado
                if ($Texto[$i] == "<") {
                    // Posible etiqueta abierta
                    if (substr($Texto, $i, 7) == "<script") {
                        // JavaScript
                        $TextoColoreado .= $PalabraActual;
                        $PalabraActual = "<span class='Codigo_Marron'>&lt;script";
                        $Estado = "JavaScript_Inicio";
                        $i += 6;
                    } else {
                        if (substr($Texto, $i, 6) == "<style") {
                            // CSS
                            $TextoColoreado .= $PalabraActual;
                            $PalabraActual = "<span class='Codigo_Lila'>&lt;style";
                            $Estado = "CSS_Inicio";
                            $i += 5;
                        } else {
                            if (substr($Texto, $i, 5) == "<?php") {
                                // PHP
                                $TextoColoreado .= $PalabraActual;
                                $PalabraActual = "<?php ";
                                $Estado = "PHP";
                                $i += 5;
                            } else {
                                if (substr($Texto, $i, 4) == "<!--") {
                                    // Comentario
                                    $TextoColoreado .= $PalabraActual;
                                    $PalabraActual = "<span class='Codigo_Gris'>&lt;!--";
                                    $Estado = "Comentario";
                                    $i += 4;
                                } else {
                                    // Otras etiquetas
                                    $TextoColoreado .= $PalabraActual;
                                    $PalabraActual = "&lt;";
                                    $Estado = "Etiqueta";
                                    $InicioEtiqueta = $i + 1;
                                }
                            }
                        }
                    }
                } else {
                    $PalabraActual .= $Texto[$i];
                }
                break;
                // -[FIN devildrey33.PintarHTML1]-
                // -[INICIO devildrey33.PintarHTML2]-
                // Estado : String con comillas simples dentro de una etiqueta
            // -[FIN devildrey33.PintarHTML1]-
            // -[INICIO devildrey33.PintarHTML2]-
            // Estado : String con comillas simples dentro de una etiqueta
            case "Etiqueta_Str1":
                if (_FinString1($Texto, $i) == true) {
                    $PalabraActual .= "'</span>";
                    $Estado = "Etiqueta";
                } else {
                    $PalabraActual .= $Texto[$i];
                }
                break;
                // Estado : String con comillas dobles dentro de una etiqueta
            // Estado : String con comillas dobles dentro de una etiqueta
            case "Etiqueta_Str2":
                if (_FinString2($Texto, $i) == true) {
                    $PalabraActual .= '"</span>';
                    $Estado = "Etiqueta";
                } else {
                    $PalabraActual .= $Texto[$i];
                }
                break;
                // Estado : dentro de una etiqueta
            // Estado : dentro de una etiqueta
            case "Etiqueta":
                if ($Texto[$i] == ">") {
                    // Final de la etiqueta
                    $Color = _BuscarEtiqueta(substr($Texto, $InicioEtiqueta, $i - $InicioEtiqueta));
                    $TextoColoreado .= "<span class='" . $Color . "'>" . $PalabraActual . "&gt;</span>";
                    $PalabraActual = "";
                    $Estado = "";
                } else {
                    if ($Texto[$i] == "<") {
                        // Estabamos en una etiqueta falsa
                        $TextoColoreado .= $PalabraActual;
                        $PalabraActual = "&lt;";
                        $InicioEtiqueta = $i + 1;
                    } else {
                        if ($Texto[$i] == "s") {
                            // miramos si es el atributo style
                            if (substr($Texto, $i, 5) == "style") {
                                while ($Texto[$i] != "'" && $Texto[$i] != '"') {
                                    $PalabraActual .= $Texto[$i++];
                                }
                                if ($Texto[$i] == "'") {
                                    $Estado = "Estilo_Str1";
                                } else {
                                    if ($Texto[$i] == '"') {
                                        $Estado = "Estilo_Str2";
                                    }
                                }
                                $PalabraActual .= "<span class='Codigo_Azul'>" . $Texto[$i++];
                                $InicioEstilo = $i;
                            } else {
                                $PalabraActual .= $Texto[$i];
                            }
                        } else {
                            if ($Texto[$i] == "'") {
                                // String con comillas simples dentro de la etiqueta
                                $PalabraActual .= "<span class='Codigo_Azul'>'";
                                $Estado = "Etiqueta_Str1";
                            } else {
                                if ($Texto[$i] == '"') {
                                    // String con comillas dobles dentro de la etiqueta
                                    $PalabraActual .= '<span class="Codigo_Azul">"';
                                    $Estado = "Etiqueta_Str2";
                                } else {
                                    $PalabraActual .= $Texto[$i];
                                }
                            }
                        }
                    }
                }
                break;
                // Estado : inicio del atributo style encapsulado por comillas simples
            // Estado : inicio del atributo style encapsulado por comillas simples
            case "Estilo_Str1":
                if (_FinString1($Texto, $i) == true) {
                    $PalabraActual .= PintarEstiloCSS(substr($Texto, $InicioEstilo, $i - $InicioEstilo)) . "'</span>";
                    $Estado = "Etiqueta";
                }
                break;
                // Estado : inicio del atributo style encapsulado por comillas dobles
            // Estado : inicio del atributo style encapsulado por comillas dobles
            case "Estilo_Str2":
                if (_FinString2($Texto, $i) == true) {
                    $PalabraActual .= PintarEstiloCSS(substr($Texto, $InicioEstilo, $i - $InicioEstilo)) . '"</span>';
                    $Estado = "Etiqueta";
                }
                break;
                // -[FIN devildrey33.PintarHTML2]-
                // -[INICIO devildrey33.PintarHTML3]-
                // Estado : inicio de un texto de un atributo dentro de una etiqueta script con comillas simples
            // -[FIN devildrey33.PintarHTML2]-
            // -[INICIO devildrey33.PintarHTML3]-
            // Estado : inicio de un texto de un atributo dentro de una etiqueta script con comillas simples
            case "JavaScript_Str1":
                if (_FinString1($Texto, $i) == true) {
                    $PalabraActual .= "'</span>";
                    $Estado = "JavaScript_Inicio";
                } else {
                    $PalabraActual .= $Texto[$i];
                }
                break;
                // Estado : inicio de un texto de un atributo dentro de una etiqueta script con comillas dobles
            // Estado : inicio de un texto de un atributo dentro de una etiqueta script con comillas dobles
            case "JavaScript_Str2":
                if (_FinString2($Texto, $i) == true) {
                    $PalabraActual .= '"</span>';
                    $Estado = "JavaScript_Inicio";
                } else {
                    $PalabraActual .= $Texto[$i];
                }
                break;
                // Estado : dentro de una etiqueta script
            // Estado : dentro de una etiqueta script
            case "JavaScript_Inicio":
                if ($Texto[$i] == ">") {
                    // Final de una etiqueta script
                    $TextoColoreado .= $PalabraActual . "&gt;</span>";
                    $PalabraActual = "";
                    $Estado = "JavaScript_Fin";
                } else {
                    if ($Texto[$i] == "'") {
                        // String dentro de una etiqueta script con comillas simples
                        $PalabraActual .= "<span class='Codigo_Azul'>'";
                        $Estado = "JavaScript_Str1";
                    } else {
                        if ($Texto[$i] == '"') {
                            // String dentro de una etiqueta script con comillas dobles
                            $PalabraActual .= '<span class="Codigo_Azul">"';
                            $Estado = "JavaScript_Str2";
                        } else {
                            $PalabraActual .= $Texto[$i];
                        }
                    }
                }
                break;
                // Estado : se ha encontrado el final de una etiqueta script
            // Estado : se ha encontrado el final de una etiqueta script
            case "JavaScript_Fin":
                if (substr($Texto, $i, 9) == "</script>") {
                    // Comprobamos que sea la etiqueta de cierre
                    if (strlen($PalabraActual) > 1) {
                        $TextoColoreado .= PintarJavaScript($PalabraActual);
                    } else {
                        $TextoColoreado .= $PalabraActual;
                    }
                    $TextoColoreado .= "<span class='Codigo_Marron'>&lt;/script&gt;</span>";
                    $PalabraActual = "";
                    $Estado = "";
                    $i += 8;
                } else {
                    $PalabraActual .= $Texto[$i];
                }
                break;
                // -[FIN devildrey33.PintarHTML3]-
                // -[INICIO devildrey33.PintarHTML4]-
                // Estado : string dentro de una etiqueta style con comillas simples
            // -[FIN devildrey33.PintarHTML3]-
            // -[INICIO devildrey33.PintarHTML4]-
            // Estado : string dentro de una etiqueta style con comillas simples
            case "CSS_Str1":
                if (_FinString1($Texto, $i) == true) {
                    $PalabraActual .= "'</span>";
                    $Estado = "CSS_Inicio";
                } else {
                    $PalabraActual .= $Texto[$i];
                }
                break;
                // Estado : string dentro de una etiqueta style con comillas dobles
            // Estado : string dentro de una etiqueta style con comillas dobles
            case "CSS_Str2":
                if (_FinString2($Texto, $i) == true) {
                    $PalabraActual .= '"</span>';
                    $Estado = "CSS_Inicio";
                } else {
                    $PalabraActual .= $Texto[$i];
                }
                break;
                // Estado : etiqueta style inicial
            // Estado : etiqueta style inicial
            case "CSS_Inicio":
                if ($Texto[$i] == ">") {
                    // Final de la etiqueta style
                    $TextoColoreado .= $PalabraActual . "&gt;</span>";
                    $PalabraActual = "";
                    $Estado = "CSS_Fin";
                } else {
                    if ($Texto[$i] == "'") {
                        // String con comillas simples dentro de la etiqueta style
                        $PalabraActual .= "<span class='Codigo_Verde'>'";
                        $Estado = "CSS_Str1";
                    } else {
                        if ($Texto[$i] == '"') {
                            // String con comillas dobles dentro de la etiqueta style
                            $PalabraActual .= '<span class="Codigo_Verde">"';
                            $Estado = "CSS_Str2";
                        } else {
                            $PalabraActual .= $Texto[$i];
                        }
                    }
                }
                break;
                // Estado : etiqueta style de cierre
            // Estado : etiqueta style de cierre
            case "CSS_Fin":
                if (substr($Texto, $i, 8) == "</style>") {
                    $TextoColoreado .= PintarEstilosCSS($PalabraActual);
                    $TextoColoreado .= "<span class='Codigo_Lila'>&lt;/style&gt;</span>";
                    $PalabraActual = "";
                    $Estado = "";
                    $i += 8;
                } else {
                    $PalabraActual .= $Texto[$i];
                }
                break;
                // -[FIN devildrey33.PintarHTML4]-
                // -[INICIO devildrey33.PintarHTML5]-
                // Estado : Comentario HTML (puede ser multilinea)
            // -[FIN devildrey33.PintarHTML4]-
            // -[INICIO devildrey33.PintarHTML5]-
            // Estado : Comentario HTML (puede ser multilinea)
            case "Comentario":
                if ($Texto[$i] == ">" && $Texto[$i - 1] == "-" && $Texto[$i - 2] == "-") {
                    $PalabraActual .= "&gt;</span>";
                    $Estado = "";
                } else {
                    if ($Texto[$i] == "<") {
                        $PalabraActual .= "&lt;";
                    } else {
                        if ($Texto[$i] == ">") {
                            $PalabraActual .= "&gt;";
                        } else {
                            $PalabraActual .= $Texto[$i];
                        }
                    }
                }
                break;
                // Estado : dentro de un código php
            // Estado : dentro de un código php
            case "PHP":
                if ($Texto[$i] == ">" && $Texto[$i - 1] == "?") {
                    $TextoColoreado .= PintarPHP($PalabraActual . ">");
                    $PalabraActual = "";
                    $Estado = "";
                } else {
                    $PalabraActual .= $Texto[$i];
                }
                break;
        }
    }
    $TextoColoreado .= $PalabraActual;
    if ($_Debug == true) {
        echo "PintarHML<pre>";
        print_r($Etiquetas);
        echo "</pre>";
    }
    return $TextoColoreado;
}
function PintarPHP($Texto)
{
    //	$_Debug = true;
    global $_DiccionarioPHP;
    $Texto = str_replace('	', '    ', $Texto);
    // Cambio tabulaciones por 4 espacios
    $Texto = str_replace('<', '&lt;', $Texto);
    // Cambio el caracter '<' por '&lt;'
    $Texto = str_replace('>', '&gt;', $Texto);
    // Cambio el caracter '>' por '&gt;'
    $TotalCaracteres = strlen($Texto);
    $Palabras = array();
    $TotalPalabras = 0;
    $Palabras[$TotalPalabras++] = "<span class='Codigo_Negro'>";
    $PalabraActual = "";
    $Estado = "";
    // Puede ser : Comentario, ComentarioML, String1, String2, Variable, y Numero
    for ($i = 0; $i < $TotalCaracteres; $i++) {
        switch ($Estado) {
            case "":
                // Sin estado
                if ($Texto[$i] == "/" && $Texto[$i + 1] == "*") {
                    // Principio ComentarioML
                    $Estado = "ComentarioML";
                    $Palabras[$TotalPalabras++] = $PalabraActual;
                    $PalabraActual = "<span class='Codigo_Amarillo'>/*";
                    $i++;
                } else {
                    if ($Texto[$i] == "/" && $Texto[$i + 1] == "/") {
                        // Principio Comentario
                        $Estado = "Comentario";
                        $Palabras[$TotalPalabras++] = $PalabraActual;
                        $PalabraActual = "<span class='Codigo_Amarillo'>//";
                        $i++;
                    } else {
                        if ($Texto[$i] == '"' && $Texto[$i - 1] != "\\") {
                            // Principio String2
                            $Estado = "String2";
                            $Palabras[$TotalPalabras++] = $PalabraActual;
                            $PalabraActual = '<span class="Codigo_Rojo">"';
                        } else {
                            if ($Texto[$i] == "'" && $Texto[$i - 1] != "\\") {
                                // Principio String1
                                $Estado = "String1";
                                $Palabras[$TotalPalabras++] = $PalabraActual;
                                $PalabraActual = "<span class='Codigo_Rojo'>'";
                            } else {
                                if ($Texto[$i] == "\$") {
                                    // Principio Variable
                                    $Estado = "Variable";
                                    $Palabras[$TotalPalabras++] = $PalabraActual;
                                    $PalabraActual = "<span class='Codigo_AzulClaro'>\$";
                                } else {
                                    if (_EsNumero($Texto[$i]) == true && _BuscarDelimitadorPHP($Texto[$i - 1])) {
                                        $Estado = "Numero";
                                        $Palabras[$TotalPalabras++] = $PalabraActual;
                                        $PalabraActual = "<span class='Codigo_Rojo'>" . $Texto[$i];
                                    } else {
                                        // Cualquier letra
                                        $PalabraActual .= $Texto[$i];
                                        if (_BuscarDelimitadorPHP($Texto[$i]) == true) {
                                            // Para no gripar el array de palabras miramos que el siguiente caracter no sea un delimitador
                                            // Si no lo hacemos, creara un espacio en el array para cada delimitador, incluidos los caracteres ' '
                                            // De todas formas no estoy seguro si esto puede traer problemas
                                            if (_BuscarDelimitadorPHP($Texto[$i + 1]) != true) {
                                                $Palabras[$TotalPalabras++] = $PalabraActual;
                                                $PalabraActual = "";
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
                break;
                // Estado : comentario multi linea
            // Estado : comentario multi linea
            case "ComentarioML":
                if ($Texto[$i] == "*" && $Texto[$i + 1] == "/") {
                    $Palabras[$TotalPalabras++] = $PalabraActual . "*/</span>";
                    $PalabraActual = "";
                    $Estado = "";
                    $i++;
                } else {
                    $PalabraActual .= $Texto[$i];
                }
                break;
                // Estado : comentario hasta el final de la linea
            // Estado : comentario hasta el final de la linea
            case "Comentario":
                if ($Texto[$i] == chr(10) || $Texto[$i] == chr(13)) {
                    $Palabras[$TotalPalabras++] = $PalabraActual . "</span>" . $Texto[$i];
                    $PalabraActual = "";
                    $Estado = "";
                } else {
                    $PalabraActual .= $Texto[$i];
                }
                break;
                // Estado : string de comillas dobles
            // Estado : string de comillas dobles
            case "String2":
                if (_FinString2($Texto, $i) == true) {
                    $Palabras[$TotalPalabras++] = $PalabraActual . '"</span>';
                    $PalabraActual = "";
                    $Estado = "";
                } else {
                    $PalabraActual .= $Texto[$i];
                }
                break;
                // Estado : string de comillas simples
            // Estado : string de comillas simples
            case "String1":
                if (_FinString1($Texto, $i) == true) {
                    $Palabras[$TotalPalabras++] = $PalabraActual . "'</span>";
                    $PalabraActual = "";
                    $Estado = "";
                } else {
                    $PalabraActual .= $Texto[$i];
                }
                break;
                // Estado : en una variable
            // Estado : en una variable
            case "Variable":
                if (_BuscarDelimitadorPHP($Texto[$i]) == true) {
                    $Palabras[$TotalPalabras++] = $PalabraActual . "</span>";
                    $PalabraActual = "";
                    $Estado = "";
                }
                $PalabraActual .= $Texto[$i];
                break;
                // Estado : en un valor numérico
            // Estado : en un valor numérico
            case "Numero":
                if (_BuscarDelimitadorPHP($Texto[$i]) == true) {
                    $Palabras[$TotalPalabras++] = $PalabraActual . "</span>";
                    $PalabraActual = $Texto[$i];
                    $Estado = "";
                } else {
                    $PalabraActual .= $Texto[$i];
                }
                break;
        }
    }
    // Si se ha quedado algun estado abierto, cerramos su span
    // (los comentarios pueden quedar abiertos si se encuentran en la ultima linea)
    if ($Estado != "") {
        $PalabraActual .= "</span>";
    }
    // Pasamos la ultima palabra al array de palabras
    $Palabras[$TotalPalabras++] = $PalabraActual;
    // -[FIN devildrey33.PintarPHP1]-
    // -[INICIO devildrey33.PintarPHP2]-
    // Post-análisis del array de palabras
    for ($i = 0; $i < $TotalPalabras; $i++) {
        if ($Palabras[$i][0] != '<') {
            // Si tiene '<' es el principio de un span por lo que no se debe tocar
            foreach ($_DiccionarioPHP as $Palabra) {
                $PosPalabra = strpos($Palabras[$i], $Palabra['Palabra']);
                // El operador !== también puede ser usado.
                // Puesto que != no funcionará como se espera porque si la posición de la palabra es 0.
                // La declaración (0 != false) se evalúa a false.
                if ($PosPalabra !== false) {
                    $DelimitadorInicio = false;
                    $DelimitadorFin = false;
                    $TamPalabra = strlen($Palabra['Palabra']);
                    // Miramos si el caracter anterior es un delimitador
                    if ($PosPalabra == 0) {
                        $DelimitadorInicio = true;
                    } else {
                        $DelimitadorInicio = _BuscarDelimitadorPHP($Palabras[$i][$PosPalabra - 1]);
                    }
                    // Miramos si el caracter inmediatamente siguiente a la palabra es un delimitador
                    if ($PosPalabra + $TamPalabra == strlen($Palabras[$i])) {
                        $DelimitadorFin = true;
                    } else {
                        $DelimitadorFin = _BuscarDelimitadorPHP($Palabras[$i][$PosPalabra + $TamPalabra]);
                    }
                    // Si la palabra esta bien delimitada la coloreamos
                    if ($DelimitadorInicio == true && $DelimitadorFin == true) {
                        $Palabras[$i] = str_replace($Palabra['Palabra'], "<span class='" . $Palabra['Color'] . "'>" . $Palabra['Palabra'] . "</span>", $Palabras[$i]);
                        break;
                        // Salimos del foreach para no colorear 2 veces la misma palabra
                    }
                }
            }
        }
        $TextoColoreado .= $Palabras[$i];
    }
    // Imprime el array para depurar
    if ($_Debug == true) {
        echo "PintarPHP<pre>";
        print_r($Palabras);
        echo "</pre>";
    }
    // Buscamos el inicio del código PHP que al ser con &lt;?php no es detectable por el algoritmo (<?php)
    $TextoColoreado = str_replace("&lt;?php", "<span class='Codigo_Rojo'>&lt;?php</span>", $TextoColoreado);
    return $TextoColoreado . "</span>";
}
function PintarC($Texto)
{
    global $_DiccionarioC;
    $Texto = str_replace('	', '    ', $Texto);
    // Cambio tabulaciones por 4 espacios
    $Texto = str_replace('<', '&lt;', $Texto);
    // Cambio el caracter '<' por '&lt;'
    $Texto = str_replace('>', '&gt;', $Texto);
    // Cambio el caracter '>' por '&gt;'
    $TotalCaracteres = strlen($Texto);
    $Palabras = array();
    $TotalPalabras = 0;
    $Palabras[$TotalPalabras++] = "<span class='Codigo_Negro'>";
    $PalabraActual = "";
    $Estado = "";
    // Puede ser : Comentario, ComentarioML, String1, String2, Directiva, Directiva_Fin
    for ($i = 0; $i < $TotalCaracteres; $i++) {
        switch ($Estado) {
            case "":
                // Sin estado
                if ($Texto[$i] == "/" && $Texto[$i + 1] == "*") {
                    // Principio ComentarioML
                    $Estado = "ComentarioML";
                    $Palabras[$TotalPalabras++] = $PalabraActual;
                    $PalabraActual = "<span class='Codigo_Verde'>/*";
                    $i++;
                } else {
                    if ($Texto[$i] == "/" && $Texto[$i + 1] == "/") {
                        // Principio Comentario
                        $Estado = "Comentario";
                        $Palabras[$TotalPalabras++] = $PalabraActual;
                        $PalabraActual = "<span class='Codigo_Verde'>//";
                        $i++;
                    } else {
                        if ($Texto[$i] == '"' && $Texto[$i - 1] != "\\") {
                            // Principio String2
                            $Estado = "String2";
                            $Palabras[$TotalPalabras++] = $PalabraActual;
                            $PalabraActual = '<span class="Codigo_Rojo">"';
                        } else {
                            if ($Texto[$i] == "'" && $Texto[$i - 1] != "\\") {
                                // Principio String1
                                $Estado = "String1";
                                $Palabras[$TotalPalabras++] = $PalabraActual;
                                $PalabraActual = "<span class='Codigo_Rojo'>'";
                            } else {
                                if ($Texto[$i] == "#" && $Texto[$i + 1] != "#" && $Texto[$i - 1] != "#") {
                                    $Estado = "Directiva";
                                    $Palabras[$TotalPalabras++] = $PalabraActual;
                                    $PalabraActual = "<span class='Codigo_Azul'>#";
                                } else {
                                    // Cualquier letra
                                    $PalabraActual .= $Texto[$i];
                                    if (_BuscarDelimitadorC($Texto[$i]) == true) {
                                        // Para no gripar el array de palabras miramos que el siguiente caracter no sea un delimitador
                                        // Si no lo hacemos, creara un espacio en el array para cada delimitador, incluidos los caracteres ' '
                                        // De todas formas no estoy seguro si esto puede traer problemas
                                        if (_BuscarDelimitadorC($Texto[$i + 1]) != true) {
                                            $Palabras[$TotalPalabras++] = $PalabraActual;
                                            $PalabraActual = "";
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
                break;
                // -[FIN devildrey33.PintarC1]-
                // -[INICIO devildrey33.PintarC2]-
                // Estado : dentro de una directiva ej : #include
            // -[FIN devildrey33.PintarC1]-
            // -[INICIO devildrey33.PintarC2]-
            // Estado : dentro de una directiva ej : #include
            case "Directiva":
                if ($Texto[$i] == " ") {
                    $Palabras[$TotalPalabras++] = $PalabraActual . " </span>";
                    $PalabraActual = "";
                    $Estado = "Directiva_Fin";
                } else {
                    $PalabraActual .= $Texto[$i];
                }
                break;
                // Estado : justo despues de una directiva.
                //          Hay que mirar por si empieza un simbolo <
            // Estado : justo despues de una directiva.
            //          Hay que mirar por si empieza un simbolo <
            case "Directiva_Fin":
                switch ($Texto[$i]) {
                    case "&":
                        // posible &lt; o &gt;
                        if (substr($Texto, $i, 4) == "&lt;") {
                            // <
                            $PalabraActual .= "<span class='Codigo_Rojo'>&lt;";
                            $i += 3;
                        } else {
                            if (substr($Texto, $i, 4) == "&gt;") {
                                // >
                                $PalabraActual .= "&gt;</span>";
                                $Palabras[$TotalPalabras++] = $PalabraActual;
                                $PalabraActual = "";
                                $Estado = "";
                                $i += 3;
                            } else {
                                $PalabraActual .= "&";
                            }
                        }
                        break;
                    case "/":
                        // Pasamos el estado a String1
                        if ($Texto[$i + 1] == "/") {
                            $Estado = "Comentario";
                            $Palabras[$TotalPalabras++] = $PalabraActual;
                            $PalabraActual = "<span class='Codigo_Verde'>//";
                            $i++;
                        } else {
                            if ($Texto[$i + 1] == "*") {
                                $Estado = "ComentarioML";
                                $Palabras[$TotalPalabras++] = $PalabraActual;
                                $PalabraActual = "<span class='Codigo_Verde'>/*";
                                $i++;
                            } else {
                                $PalabraActual .= $Texto[$i];
                            }
                        }
                        break;
                    case "'":
                        // Pasamos el estado a String1
                        $Palabras[$TotalPalabras++] = $PalabraActual;
                        $PalabraActual = "<span class='Codigo_Rojo'>'";
                        $Estado = "String1";
                        break;
                    case '"':
                        // Pasamos el estado a String2
                        $Palabras[$TotalPalabras++] = $PalabraActual;
                        $PalabraActual = '<span class="Codigo_Rojo">"';
                        $Estado = "String2";
                        break;
                    case chr(10):
                    case chr(13):
                        $PalabraActual .= $Texto[$i];
                        $Estado = "";
                        break;
                    default:
                        $PalabraActual .= $Texto[$i];
                        break;
                }
                break;
                // Estado : dentro de un comentario multilinea
            // Estado : dentro de un comentario multilinea
            case "ComentarioML":
                if ($Texto[$i] == "*" && $Texto[$i + 1] == "/") {
                    $Palabras[$TotalPalabras++] = $PalabraActual . "*/</span>";
                    $PalabraActual = "";
                    $Estado = "";
                    $i++;
                } else {
                    $PalabraActual .= $Texto[$i];
                }
                break;
                // Estado : dentro de un comentario hasta el final de la linea
            // Estado : dentro de un comentario hasta el final de la linea
            case "Comentario":
                if ($Texto[$i] == chr(10) || $Texto[$i] == chr(13)) {
                    $Palabras[$TotalPalabras++] = $PalabraActual . "</span>" . $Texto[$i];
                    $PalabraActual = "";
                    $Estado = "";
                } else {
                    $PalabraActual .= $Texto[$i];
                }
                break;
                // Estado : dentro de un string con comillas dobles
            // Estado : dentro de un string con comillas dobles
            case "String2":
                if (_FinString2($Texto, $i) == true) {
                    $Palabras[$TotalPalabras++] = $PalabraActual . '"</span>';
                    $PalabraActual = "";
                    $Estado = "";
                } else {
                    $PalabraActual .= $Texto[$i];
                }
                break;
                // Estado : dentro de un string con comillas simples
            // Estado : dentro de un string con comillas simples
            case "String1":
                if (_FinString1($Texto, $i) == true) {
                    $Palabras[$TotalPalabras++] = $PalabraActual . '"</span>';
                    $PalabraActual = "";
                    $Estado = "";
                } else {
                    $PalabraActual .= $Texto[$i];
                }
                break;
        }
    }
    // Si se ha quedado algun estado abierto, cerramos su span
    // (los comentarios pueden quedar abiertos si se encuentran en la ultima linea)
    if ($Estado != "") {
        $PalabraActual .= "</span>";
    }
    // Pasamos la ultima palabra al array de palabras
    $Palabras[$TotalPalabras++] = $PalabraActual;
    // -[FIN devildrey33.PintarC2]-
    // -[INICIO devildrey33.PintarC3]-
    for ($i = 0; $i < $TotalPalabras; $i++) {
        if ($Palabras[$i][0] != '<') {
            // Si tiene '<' es el principio de un span por lo que no se debe tocar
            foreach ($_DiccionarioC as $Palabra) {
                $PosPalabra = strpos($Palabras[$i], $Palabra['Palabra']);
                // El operador !== también puede ser usado.
                // Puesto que != no funcionará como se espera porque si la posición de la palabra es 0.
                // La declaración (0 != false) se evalúa a false.
                if ($PosPalabra !== false) {
                    $DelimitadorInicio = false;
                    $DelimitadorFin = false;
                    $TamPalabra = strlen($Palabra['Palabra']);
                    // Miramos si el caracter anterior es un delimitador
                    if ($PosPalabra == 0) {
                        $DelimitadorInicio = true;
                    } else {
                        $DelimitadorInicio = _BuscarDelimitadorC($Palabras[$i][$PosPalabra - 1]);
                    }
                    // Miramos si el caracter inmediatamente siguiente a la palabra es un delimitador
                    if ($PosPalabra + $TamPalabra == strlen($Palabras[$i])) {
                        $DelimitadorFin = true;
                    } else {
                        $DelimitadorFin = _BuscarDelimitadorC($Palabras[$i][$PosPalabra + $TamPalabra]);
                    }
                    // Si la palabra esta bien delimitada la coloreamos
                    if ($DelimitadorInicio == true && $DelimitadorFin == true) {
                        $Palabras[$i] = str_replace($Palabra['Palabra'], "<span class='" . $Palabra['Color'] . "'>" . $Palabra['Palabra'] . "</span>", $Palabras[$i]);
                        break;
                        // Salimos del foreach para no colorear 2 veces la misma palabra
                    }
                }
            }
        }
        $TextoColoreado .= $Palabras[$i];
    }
    // Imprime el array para depurar
    if ($_Debug == true) {
        echo "PintarC<pre>";
        print_r($Palabras);
        echo "</pre>";
    }
    return $TextoColoreado . "</span>";
}