Cómo agregar números de línea al código de programa en Markdown
Al escribir artículos usando Markdown en la comunidad de Turing, si agrega cuatro espacios o un carácter de tabulación (Tab) al comienzo de cada línea de un fragmento de texto, el texto se considerará código de programa. . De esta forma, se reconocerá automáticamente el lenguaje de programación utilizado, se realizará el coloreado del código y el resaltado de sintaxis. Sin embargo, si este programa es muy largo, hay dos pequeños problemas:
Es problemático agregar espacios o tabulaciones al principio de cada línea.
Si desea mostrar el número de línea, será aún más problemático.
Por lo tanto, escribí un pequeño programa en lenguaje C# para crear un sitio web ASP.NET 4 para resolver los dos problemas anteriores:
[ ]Ver imagen original
En esta página web:
La casilla de verificación Recuento de líneas indica si es necesario agregar números de línea.
Los botones inalámbricos Espacio y Tabulación en Prefijo te permiten elegir si deseas agregar espacios o tabulaciones al principio de cada línea.
El cuadro de texto Recuento de prefijos le permite ingresar el nivel de sangría. El valor predeterminado es sangrar un nivel. Pero si encuentra código de programa en una lista ordenada o en una lista desordenada, necesita sangrar dos niveles, o incluso más.
La estructura general de este sitio web es la siguiente:
El archivo de configuración Web.config del sitio web es el siguiente:
lt;?xml version= "1.0" encoding="utf-8"?gt;
lt;configurationgt;
lt;system.webgt;
lt;httpRuntime requestValidationMode=" 2.0" / gt;
lt; solicitud de globalizaciónEncoding="utf-8" respuestaEncoding="utf-8" /gt;
lt; /system.webgt;
lt;/configurationgt;
El archivo de página web CodeFormat.aspx del sitio web es el siguiente:
lt;@ Page validarRequest="false" Language="C#" hereda= "Skyiv. Ben.Web.CodeFormatPage" gt;
lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transicional//EN" "http //www w3 org/TR/xhtml1 /DTD/ xhtml1-transitional.dtd"gt;
lt; html xmlns="http //www w3 org/1999/xhtml" gt;
lt; head runat=" servidor"gt ;
lt;meta http-equiv="Tipo de contenido" content="text/html; charset=utf-8" /gt;
lt;titlegt; Formato de código; /titlegt;
lt; /headgt;
lt; bodygt;
lt; ;
lt; p>
lt;asp:Button Onclick="Enviar" Text="Enviar" Runat="Servidor" /gt;
lt;span style= "background-color:LightBlue;"gt;
lt; CheckBox Id="chkLineCount" Text="Recuento de líneas" Checked="True" Runat="Servidor" /gt;
lt; /spangt;
lt; p>
lt; span estilo="color de fondo: azul claro;"
Prefijo:
lt; asp: RadioButton Id="rbnSpace" Text="Espacio " Checked="True"
GroupName="Prefijo" Runat="Servidor" /gt;
lt;asp: RadioButton Id="rbnTab" Texto="Ta
b"
NombreGrupo="Prefijo" Runat="Servidor" /gt;
lt; /spangt;
lt; span style="color-de fondo : Azul claro; "gt;
Recuento de prefijos:
lt; asp: TextBox Runat="Servidor" Id="tbxLevel" Text="1" Columns="2" MaxLength= "1" /gt;
lt /spangt;
lt;
lt; ; asp: TextBox Runat="Servidor" Id="tbxInput" Wrap="False"
TextMode="MultiLine" Columns="80" Rows="10" /gt;
lt;br /gt;
lt;asp: TextBox Runat="Servidor" Id="tbxOutput" ReadOnly="True" Wrap="False"
TextMode="MultiLine " BackColor="Azul Claro" Columnas="80" Filas="10" /gt;
lt;/divgt;
lt;/formgt;
lt;/bodygt;
lt;/htmlgt;
Y el código C# de fondo correspondiente CodeFormat.aspx.cs:
1: usando System; p> p>
2: usando System.IO
3: usando System.Web
4: usando System.Web.UI
5: usando System.Web.UI.WebControls
6: usando Skyiv.Utils
7:
8: espacio de nombres Skyiv.Ben.Web; p>
9: {
10: clase pública CodeFormatPage: Página
11: {
12: TextBox protegido tbxInput;
13: TextBox tbxOutput protegido;
14: TextBox tbxLevel protegido;
15: CheckBox protegido chkLineCount;
16: RadioButton rbnTab protegido;
17:
18: Page_Load vacío protegido (remitente del objeto, EventArgs e)
19: {
20: tbxOutput.Text = cadena.formato(" SO: {1} (
{2}-bit){0}CLR: {3}",
21: Environment.NewLine, Environment.OSVersion,
22: Environment.Is64BitOperatingSystem? 64: 32,
23: Entorno.Versión);
24: }
25:
26: envío vacío protegido (remitente del objeto, EventArgs). e)
27: {
28: var escritor = nuevo StringWriter();
29: nuevo CodeFormat(nuevo StringReader(tbxInput.Text),
30: escritor).Run(chkLineCount.Checked, rbnTab.Checked, GetLevel(tbxLevel.Text));
31: tbxOutput.Text = escritor.ToString(); p>
p>
32: }
33:
34: int GetLevel(string str)
35: {
36 : int n;
37: if (!int.TryParse(str, out n)) n = 1
38: devuelve Math.Min(5; , Math.Max( 0, n));
39: }
40: }
41: }
En el programa anterior:
El método GetLevel en las líneas 34 a 39 lee el nivel de sangría en el cuadro de texto Recuento de prefijos y el resultado devuelto se limita a 0 a 5.
El método Enviar en las líneas 26 a 32 se llama cuando se hace clic en el botón Enviar en la página web
Las líneas 29 a 30 llaman al método Ejecutar de la clase CodeFormat para formatear el código del programa (agregue números de línea, primeros espacios). , etc.).
El siguiente es el código fuente de la clase CodeFormat CodeFormat.cs:
1: usando System
2: usando System.IO
3: usando System.Collections.Generic
4:
5: espacio de nombres Skyiv.Utils
6: {
7: clase sellada CodeFormat
8: {
9: lector TextReader
10: escritor TextWriter
11:
p>12: CodeFormat público (lector TextReader, escritor TextWriter)
13: {
14: this.reader = lector;
15: this.writer = escritor;
16: }
17:
18: public void Run(bool hasCount, bool isTab, int nivel )
19: {
20: Escribir(Leer(), hasCount, isTab, nivel
21: }
22:
p>23: Listlt; stringgt; Read()
24: {
25: var líneas = new Listlt ();
26: for (cadena s; (s = lector.ReadLine()) != null; ) líneas.Add(s);
27: devolver líneas
28: }
29:
30: void Write(Listlt; stringgt; lineas, bool hasCount, bool isTab, int nivel)
31: {
32: var prefix = "".PadLeft((isTab? 1: 4) * nivel, isTab? '\t': ' ');
33: var formato = "{0 }" (hasCount ? "{1,"
34: líneas.Count.ToString().Length "}: ": "") "{2}" p>
35: var recuento = 0;
36: foreach (var línea en líneas)
37: escritor.WriteLine(formato, prefijo, recuento, línea);
38:
}
39: }
40: }
En el programa anterior:
TextReader y TextWriter en las líneas 9 a 10 son Se utilizan respectivamente. Estas dos clases son clases base abstractas para leer datos y generar resultados formateados.
En este sitio web se utilizan las clases derivadas StringReader y StringWriter, correspondientes a los cuadros de texto tbxInput y tbxOutput de la página Web.
Si utiliza las clases derivadas StreamReader y StreamWriter, puede leer datos del flujo de entrada y escribirlos en el flujo de salida.
Si usa Console.In y Console.Out, puede leer datos de la entrada estándar y escribirlos en la salida estándar.
El método Read en las líneas 23 a 28 lee datos en la estructura de datos Listlt;
El método Writer en las líneas 30 a 38 formatea los datos en la memoria y los escribe.
La línea 32 determina el prefijo para cada línea de datos de código de programa en función de los parámetros isTab y de nivel.
Las líneas 33 a 34 determinan el contenido del número de línea según el parámetro hasCount.
lines.Count.ToString().La longitud de la línea 34 es el ancho que ocupa el número de línea.
El bucle de las líneas 36 a 37 formatea los datos línea por línea.
Finalmente el Makefile:
CSC = dmcs
DLL1 = -r: System.Web.dll
../bin/ CodeFormat.dll: CodeFormat.aspx.cs CodeFormat.cs
$(CSC) -out:$@ -t:library $(DLL1) CodeFormat.aspx.cs CodeFormat.cs
Después de tener el programa fuente anterior, ejecute el comando make para compilar todo el sitio web:
src$ make
dmcs -out:../bin/CodeFormat.dll -t: biblioteca - r: System.Web.dll CodeFormat.aspx.cs CodeFormat.cs
Ya terminaste.