Asuntos Oficiales > Sobre los Foros de SoloCodigo
Cómo Poner Varios Espacios Seguidos
Ruben3d:
Hola.
He hecho un pequeño programa que lee un fichero de C++ y genera la sintaxis coloreada usando los tags del foro, para que quede el código bien claro. El problema es que si pongo varios espacios seguidos (porque las tabulaciones las convierto en espacios) al postearlo en el foro desaparecen, y pierdo la justificación del código. ¿Hay alguna manera de conservar los espacios sin usar el tag CODE (porque no me deja colorear CODE)?
Muchas gracias.
Ruben3d
PD: Si consigo sulocionar lo de los espacios haré una versión para Pascal.
PD2: Dejo un ejemplo de lo que genera el programa con un fichero de prueba. Se puede ver cómo todos los grupos de uno o más espacios son reducidos a uno al ser mostrado por el foro:
//
// ejcpp.cpp
//
/*
Fichero C++ de ejemplo
todo] Introducir más cosas
*/
#include <iostream>
#include <string>
#include <cstdio>
#include <cstdlib>
using namespace std;
// Directiva multilinea
#define ASSERT(x) if (!(x)) \
{ \
cout << "La condicion \"" << #x << "\" ha fallado en " << __FILE__ << ":" << __LINE__ << endl; \
abort(); \
}
/*
CLASE CEscritor
Escribe el texto que se le asigne.
*/
class CEscritor
{
public:
CEscritor(string str) : m_str(str) {}
// Escribe el texto asignado mediante el constructor o asignar()
void escribir();
// Le asigna un texto que se escribirá mediante asignar()
void asignar(string &str);
private:
std::string m_str;
};
void CEscritor::escribir()
{
for (int i=0; i<5; i++)
cout << m_str << endl;
}
void CEscritor::asignar(string &str)
{
m_str = str;
}
/* Punto de entrada del programa */
int main(int argc, char **argv[])
{
CEscritor *pEscritor = new CEscritor(string("Este texto tiene \"comillas dobles\""));
ASSERT(pEscritor != NULL); // Comprueba que nada haya fallado.
pEscritor->escribir();
delete pEscritor; // Libera la memoria
char c = '\'';
char ch = '\xA2';
printf("El valor de 'c' es: %c.\n", c);
printf("Un float: %02.2f.\n", 4.2356f);
double d = 3.675;
unsigned short int usi = 0xA2;
getchar();
return 0;
}
Ruben3d:
Bueno. He llegado a una solución provisional poniendo el carácter '·' de color amarillo, de forma que se ve poco. Lo ideal sería tener un tag como el PRE de HTML para que la gente pudiera copiar y pegar el código sin tener que quitar los puntos que hacen de espacio. De esta manera queda así:
//
//·ejcpp.cpp
//
/*
Fichero·C++·de·ejemplo
todo:·Introducir·más·cosas
*/
#include·<iostream>
#include·<string>
#include·<cstdio>
#include·<cstdlib>
using·namespace·std;
//·Directiva·multilinea
#define·ASSERT(x)····if·(!(x))····\
····················{············\
························cout·<<·"La·condicion·\""·<<·#x·<<·"\"·ha·fallado·en·"·<<·__FILE__·<<·":"·<<·__LINE__·<<·endl;····\
························abort();····\
····················}
/*
····CLASE·CEscritor
····Escribe·el·texto·que·se·le·asigne.
*/
class·CEscritor
{
public:
····CEscritor(string·str)·:·m_str(str)·{}
····//·Escribe·el·texto·asignado·mediante·el·constructor·o·asignar()
····void·escribir();
····//·Le·asigna·un·texto·que·se·escribirá·mediante·asignar()
····void·asignar(string·&str);
private:
····std::string·m_str;
};
void·CEscritor::escribir()
{
····for·(int·i=0;·i<5;·i++)
········cout·<<·m_str·<<·endl;
}
void·CEscritor::asignar(string·&str)
{
····m_str·=·str;
}
/*·Punto·de·entrada·del·programa·*/
int·main(int·argc,·char·**argv[])
{
····CEscritor·*pEscritor·=·new·CEscritor(string("Este·texto·tiene·\"comillas·dobles\""));
····ASSERT(pEscritor·!=·NULL);············//·Comprueba·que·nada·haya·fallado.
····pEscritor->escribir();
····delete·pEscritor;····················//·Libera·la·memoria
····char·c·=·'\'';
····char·ch·=·'\xA2';
····printf("El·valor·de·'c'·es:·%c.\n",·c);
····printf("Un·float:·%02.2f.\n",·4.2356f);
····double·d·=·3.675;
····unsigned·short·int·usi·=·0xA2;
····getchar();
····return·0;
}
iron man:
Tiene muy buena pinta el código coloreado.
Una pregunta: el único problema que has encontrado es el de los espacios o hay alguno más? Por ejemplo, si tienes una línea de código del tipo
--- Código: Text ---cadena[i] = 'a';
¿convertirá el texto en cursiva desde el = en adelante o has encontrado algún truquillo para que no lo convierta?
Un saludo.
Ruben3d:
Horror, no me lo había planteado. Sólo se me ocurre meter un espacio después de cada '[' de manera sistemática, para evitar que coincida con algún tag, aunque puede quedar un poco feo si no meto otro delante de los ']'. A no ser que exista alguna manera de poner un [ i ] u otros tags sin que lo interprete como tag, pero me da que no.
Un saludo.
Ruben3d
EDIT: Bueno, parece que no queda tan mal con el invento de los espacios. Un poco espacioso, pero bueno. Pongo una comparación con cómo se vería con el tag CODE.
--- Código: Text ---// test.cpp void funcion(){ char array[256]; for (int i=0; i<256; i++) { array[i] = i; }}
//·test.cpp
void·funcion()
{
····char·array[ 256 ];
····for·(int·i=0;·i<256;·i++)
····{
········array[ i ]·=·i;
····}
}
iron man:
Creo que lo mejor será crear un tag nuevo, que sea como el CODE pero que reconozca el tag COLOR. Aparte del COLOR utilizas alguno más?
Navegación
[#] Página Siguiente
Ir a la versión completa