怎样在 Markdown 中使程序代码带上行号

怎样在 Markdown 中使程序代码带上行号,第1张

在图灵社区使用 Markdown 写文章时,如果在一段文字的每行开头加上四个空格,或者一个制表符(Tab),这段文字就会被视为程序代码。这样,就会自动识别所用的编程语言,进行代码染色,语法高亮显示。但是,如果这段程序很长的话,就有两个小问题:

每行的开头要加上空格或制表符,很麻烦。

如果要显示行号的话,就更麻烦了。

因此,我用皮培 C# 语言写了小程序,建设一个 ASP.NET 4 网站来解决上述两个麻烦:

[+]查看原图

在这个网页中:

Line Count 复选框表示是否需要加上行模尘号。

Prefix 中的的 Space 和 Tab 无线按钮让你选择每行开头是增加空格还是制表符。

Prefix Count 文本框让你输入缩进的层次。默认是缩进一层 。但是如果遇到在有序列表或无序列表中的程序代码,就需要缩进两层,甚至更多层了。

这个网站的总体结构如下所示:

网站的配置文件 Web.config 如下所示:

<?xml version="1.0" encoding="utf-8"?>

<configuration>

<system.web>

<httpRuntime requestValidationMode="2.0" />

<globalization requestEncoding="utf-8" responseEncoding="utf-8" />

</system.web>

</configuration>

网站的 Web 页面文件 CodeFormat.aspx 如下所示:

<%@ Page validateRequest="false" Language="C#" inherits="Skyiv.Ben.Web.CodeFormatPage" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http //www w3 org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http //www w3 org/1999/xhtml" >

<head runat="server">

<meta http-equiv="Content-Type" content="text/htmlcharset=utf-8" />

<title>Code Format</title>

</head>

<body>

<form id="form1" runat="server">

<asp:Button Onclick="Submit" Text="Submit" Runat="Server" />

<span style="background-color:LightBlue">

<asp:CheckBox Id="chkLineCount" Text="Line Count" Checked="True" Runat="Server" />

</span>旦握禅

<span style="background-color:LightBlue">

Prefix:

<asp:RadioButton Id="rbnSpace" Text="Space" Checked="True"

GroupName="Prefix" Runat="Server" />

<asp:RadioButton Id="rbnTab" Text="Tab"

GroupName="Prefix" Runat="Server" />

</span>

<span style="background-color:LightBlue">

Prefix Count:

<asp:TextBox Runat="Server" Id="tbxLevel" Text="1" Columns="2" MaxLength="1" />

</span>

<hr />

<div>

<asp:TextBox Runat="Server" Id="tbxInput" Wrap="False"

TextMode="MultiLine" Columns="80" Rows="10" />

<br />

<asp:TextBox Runat="Server" Id="tbxOutput" ReadOnly="True" Wrap="False"

TextMode="MultiLine" BackColor="LightBlue" Columns="80" Rows="10" />

</div>

</form>

</body>

</html>

以及对应的后台 C# 代码 CodeFormat.aspx.cs:

1: using System

2: using System.IO

3: using System.Web

4: using System.Web.UI

5: using System.Web.UI.WebControls

6: using Skyiv.Utils

7:

8: namespace Skyiv.Ben.Web

9: {

10: public class CodeFormatPage : Page

11: {

12: protected TextBox tbxInput

13: protected TextBox tbxOutput

14: protected TextBox tbxLevel

15: protected CheckBox chkLineCount

16: protected RadioButton rbnTab

17:

18: protected void Page_Load(object sender, EventArgs e)

19: {

20: tbxOutput.Text = string.Format(" OS: {1} ({2}-bit){0}CLR: {3}",

21: Environment.NewLine, Environment.OSVersion,

22: Environment.Is64BitOperatingSystem ? 64 : 32,

23: Environment.Version)

24: }

25:

26: protected void Submit(object sender, EventArgs e)

27: {

28: var writer = new StringWriter()

29: new CodeFormat(new StringReader(tbxInput.Text),

30: writer).Run(chkLineCount.Checked, rbnTab.Checked, GetLevel(tbxLevel.Text))

31: tbxOutput.Text = writer.ToString()

32: }

33:

34: int GetLevel(string str)

35: {

36: int n

37: if (!int.TryParse(str, out n)) n = 1

38: return Math.Min(5, Math.Max(0, n))

39: }

40: }

41: }

上述程序中:

第 34 至 39 行的 GetLevel 方法读取 Prefix Count 文本框中的缩进层次,返回结果限制在 0 到 5 之间。

第 26 至 32 行的 Submit 方法在 Web 页面中的 Submit 按钮被点击时被调用。

第 29 至 30 行调用 CodeFormat 类的 Run 方法对程序代码进行格式化(加行号、行首空格等)。

下面就是 CodeFormat 类的源程序代码 CodeFormat.cs:

1: using System

2: using System.IO

3: using System.Collections.Generic

4:

5: namespace Skyiv.Utils

6: {

7: sealed class CodeFormat

8: {

9: TextReader reader

10: TextWriter writer

11:

12: public CodeFormat(TextReader reader, TextWriter writer)

13: {

14: this.reader = reader

15: this.writer = writer

16: }

17:

18: public void Run(bool hasCount, bool isTab, int level)

19: {

20: Write(Read(), hasCount, isTab, level)

21: }

22:

23: List<string>Read()

24: {

25: var lines = new List<string>()

26: for (string s(s = reader.ReadLine()) != null) lines.Add(s)

27: return lines

28: }

29:

30: void Write(List<string>lines, bool hasCount, bool isTab, int level)

31: {

32: var prefix = "".PadLeft((isTab ? 1 : 4) * level, isTab ? '\t' : ' ')

33: var format = "{0}" + (hasCount ? "{1," +

34: lines.Count.ToString().Length + "}: " : "") + "{2}"

35: var count = 0

36: foreach (var line in lines)

37: writer.WriteLine(format, prefix, ++count, line)

38: }

39: }

40: }

上述程序中:

第 9 至 10 行的 TextReader 和 TextWriter 分别用于读取数据和输出格式化后的结果,这两个类是抽象基类。

在这个网站中,是使用 StringReader 和 StringWriter 派生类,对应于 Web 页面的 tbxInput 和 tbxOutput 文本框。

如果使用 StreamReader 和 StreamWriter 派生类,就可以从输入流读取数据,写到输出流中。

如果使用 Console.In 和 Console.Out,就可以从标准输入读取数据,写到标准输出。

第 23 至 28 行的 Read 方法读取数据到内存的 List<string>数据结构中。

第 30 至 38 行的 Writer 方法将内存中的数据格式化后写出去。

第 32 行根据 isTab 和 level 参数决定程序代码数据每行的前缀。

第 33 至 34 行根据 hasCount 参数决定行号的内容。

第 34 行的 lines.Count.ToString().Length 是行号所占的宽度。

第 36 至 37 行的循环逐行格式化数据。

最后是 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

有了上面的源程序后,执行 make 命令编译整个网站:

src$ make

dmcs -out:../bin/CodeFormat.dll -t:library -r:System.Web.dll CodeFormat.aspx.cs CodeFormat.cs

这就大功告成了。

我们都希望在网页上显示一个网址时,它可以被直接点击而不是需要我们手动将网址复制粘贴到浏览器的地址栏中。下面介绍几种将链接文字转化为可跳转链接的做法。

自动链接就是知碧敏将地址原封不动地显示出来,同时它也将生成该地址的超链接,它常用于邮箱地址和较短网址的显示。 *** 作方法是在该链接地址前后加上一对 >,可见形式如下:

它的显示为:

  https://www.baidu.com

行内链接通常用于在一个段落中插入一个链接,同时我慧穗们希望链接不要突兀地显示出来影响阅读体验。这时,我们可以为链接起一个介绍名字,将其关联起来,读者可以直接点击该名字就能实现跳转,而不用显示冗长的链接地址。 *** 作方法是在链接别名前后加一对[ ],将紧跟在其后面的链接地址用( )括起来,可见形式如下:

实现效果如下:

 点我进百度

参考链接通常用于在全文多处引用某个链接的时候,并且如果该链接很长,我们还像行内链接一样在每次需要使用它的地方就复制粘贴一次,不仅 *** 作很复杂,也看上去很愚蠢。因此我们可以另起一个段落专门用于放置链接和它的别名,然后在全文每次需要这个链接的时候,再对它的别名进行引用,这和论文的参考文献引用十分类似。 *** 作方式如下:

参考效果如下:

我需要引用百度的网址,点这里。

我们很多时候并不需要大量列出代码,而是进行小范围的展示搭枝,并加以文字说明。这时候最推荐使用的是行内代码,它不仅可以插在文字当中作为代码说明,还可以用作关键字等重要的高亮提示。

  使用方法是将所需要展示的代码或者需要高亮的语句用一对 `` 括起来。这个符号是由键盘上数字1旁边的键打出,以下是 *** 作例子和效果显示。

例子:

效果:

print("hello")

这是我的关键词

如果我们想大范围的展示代码,并且使得展示的代码根据不同的语言进行语法高亮,就要选取多行代码块的展示。多行代码块的引用方法是采用一对 ```符号将目标代码括出,并在第一行的的符号后,写明使用何种编程语言的高亮方法。以下是 *** 作实例和效果显示:

还有一些时候,我们不需要展示代码的语法高亮,我们只想展示最原始的代码,例如,我们在展示markdown *** 作语法时,不希望浏览器把它解码,而仅仅是把它当成普通文本展示处理,这时候就可以用到缩进式插入。 *** 作方法为:另起一个段落(空出一行,在行首插入Tab键)。

使用列表可以将我们的想法更有条理的表达出来,MarkDown中支持有序列表和无序列表。

无序列表使用*,+,-作为列表标记,其语法格式如下:

展示效果都为:

有序列表是使用数字和.来表示,比如:

在遇到需要展示二维信息的时候,往往会需要用到列表嵌套,其语法格式表现为在需要嵌套的列表前加上四个空格,例如:

展示效果如下:


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12434666.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存