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

2023-11-06

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

  1. 每行的开头要加上空格或制表符,很麻烦。
  2. 如果要显示行号的话,就更麻烦了。

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

1[+]查看原图

2

3

在这个网页中:

  • Line Count 复选框表示是否需要加上行号。
  • Prefix 中的的 SpaceTab 无线按钮让你选择每行开头是增加空格还是制表符。
  • Prefix Count 文本框让你输入缩进的层次。默认是缩进一层 。但是如果遇到在有序列表或无序列表中的程序代码,就需要缩进两层,甚至更多层了。

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

4

网站的配置文件 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/html; charset=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" />
    &nbsp;
  </span>
  &nbsp;
  <span style="background-color:LightBlue;">
    &nbsp;Prefix:
    <asp:RadioButton Id="rbnSpace" Text="Space" Checked="True"
      GroupName="Prefix" Runat="Server" />
    <asp:RadioButton Id="rbnTab" Text="Tab"
      GroupName="Prefix" Runat="Server" />
    &nbsp;
  </span>
  &nbsp;
  <span style="background-color:LightBlue;">
    &nbsp;Prefix Count:
    <asp:TextBox Runat="Server" Id="tbxLevel" Text="1" Columns="2" MaxLength="1" />
    &nbsp;
  </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 行的 TextReaderTextWriter 分别用于读取数据和输出格式化后的结果,这两个类是抽象基类。
  • 在这个网站中,是使用 StringReaderStringWriter 派生类,对应于 Web 页面的 tbxInputtbxOutput 文本框。
  • 如果使用 StreamReaderStreamWriter 派生类,就可以从输入流读取数据,写到输出流中。
  • 如果使用 Console.InConsole.Out,就可以从标准输入读取数据,写到标准输出。
  • 第 23 至 28 行的 Read 方法读取数据到内存的 List<string> 数据结构中。
  • 第 30 至 38 行的 Writer 方法将内存中的数据格式化后写出去。
  • 第 32 行根据 isTablevel 参数决定程序代码数据每行的前缀。
  • 第 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

这就大功告成了。


from: http://www.ituring.com.cn/article/35350

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

怎样在 Markdown 中使程序代码带上行号 的相关文章

  • 带有特定乳胶模板的 bookdown

    我非常相信 Rmarkdown 和 bookdown 是内容出版的未来 但是一些出版商使用特定的 LaTeX 模板 并且为了提交手稿 他们需要在该精确的模板中使用它 例如 请参阅此施普林格手稿模板 http resource cms spr
  • 以富文本形式 Markdown 到剪贴板

    在 Windows 上使用 Python 我尝试获取一个 Markdown 文件并将其作为富文本粘贴到我的剪贴板中 大部分拼图都很简单 将 Markdown 解析为 HTML 没有问题 通过 TKinter 将内容放入剪贴板 是的 但这是我
  • 如何将 GitHub wiki 存储为源代码的一部分

    GitHub 以及许多git服务器 例如 GitLab 提供项目级 wiki 其中通常包含 markdown md 文件被存储并形成 好吧 你的项目的wiki 这将是so cool如果有一种方法可以将您的 wiki 存储为主项目源代码的一部
  • gulp通过markdown json用jade生成html文件

    我在用着gulp markdown to json and gulp jade 我的目标是从 markdown 文件中获取数据 如下所示 template index jade title Europa This is a test gra
  • 《美人鱼》中的空间

    我有一个 md文件已保存 我正在使用 Atom 和 Mermaid Preview 包查看它 我将关闭他们的 GitHub 页面上的示例 graph TD A gt B A gt C B gt D C gt D 这渲染得很好 但是如何在文本
  • PHP 替换,但替代替换字符串

    好的 这就是我想做的 我正在尝试使用 PHP 来开发本质上是tinyMarkdown 实现的子集 不值得使用完整的 Markdown 类 我本质上需要执行 str replace 但每次出现针时都会交替替换替换字符串 以便处理开始和结束 H
  • 停止pandoc自动添加id

    我在用Pandoc对Markdown的扩展 http pandoc org MANUAL html pandocs markdown来生成 HTML 以下降价 test specificId test2 test3 生成以下 html h1
  • 如果我设置 echo=FALSE,R Markdown 会使自定义绘图消失

    我创建了一个自定义函数 它将 mfrow 设置为 nxn 并根据数据框的输入列表创建 n 2 个散点图 每个图上有多个数据集 我的绘图函数的签名如下所示 plot return list lt function df list num pl
  • Markdown/Github:作为列表子项的代码块的语法突出显示

    在Github MD中 如果我们想在列表的子级时启用代码块 我们需要用8个空格来表示它 但是如何让该代码块具有语法高亮功能呢 以下代码无法按预期工作 1 foo python print bar 2 bar python print bar
  • Jekyll 在子网站上生成静态网站?

    是否可以将 Jekyll 放在 GitHub 上托管的网站的单个部分上 即是否可以让 example github io 成为常规站点 而 example github io blog 由 Jekyll 静态生成 我相信可以通过创建另一个名
  • 如何在knitr中安装软件包?

    到目前为止 我一直在使用这段代码来加载 R 包并编写 R 文件 但我正在尝试使用knitr rm list ls all TRUE kpacks lt c ggplot2 install github devtools mapdata ne
  • yaml / yaml 多行转义序列中的 Markdown?

    是否可以在 yaml 中存储未转义的 Markdown 文档 我测试过 key markdown text block that could have any combination of line breaks gt etc etc 这是
  • 在 Rails 3 中渲染 Markdown 文本

    我想将 markdown 转换为 html 在我看来我有markdown some text variable 但我得到了错误undefined method markdown I added require BlueCoth 到envir
  • 将 Powershell 输出转换为 Markdown 文件

    我有以下代码 xmlFile C Users kraer Desktop bom xml xml xml Get Content xmlFile xml bom components component ForEach Object fin
  • 在 RMarkdown 输出到 PDF 时缩进而不添加项目符号点或编号

    之前有人问过如何在没有项目符号的情况下缩进文本 RMarkdown 中的点 但这是针对 HTML 输出的 在 RMarkdown 中缩进而不添加项目符号点或数字 https stackoverflow com questions 47087
  • MathJax 自动方程编号在 Jupyter 中无法正常工作

    我想对 LaTeX 方程进行编号 我在网上搜索了我将使用的 javascript MathJax Hub Config TeX equationNumbers autoNumber all 我也用一个方程进行了测试 eqref In equ
  • 表格内的 Markdown 列表

    根据标题 是否可以在 Markdown 中将列表放入表格中 我试图搜索它但找不到任何东西 一个表是这样的 Fruit Color Apples Red Pears Green 和一个类似的列表 清单项目 1 清单项目 2 You can 在
  • 让 pandoc 对没有 h1 的部分进行编号

    当我用 markdown 编写文档时 为了用 pandoc 将其处理为 HTML 我总是有一个第一顺序的标题 Heading 即文档标题 以及二阶多个标题 Heading 但当我开机时 number sections在 pandoc 中 所
  • Prettier 不断用下划线替换星号字符

    我正在尝试在 Visual Studio Code 中编写一些 Markdown 文本 每当我编写以下内容时 some text 我保存文件后它就会被替换为 some text 我将其范围缩小为由 Prettier 扩展引起的 我尝试寻找一
  • 创建pdf时在markdown中分页

    我正在使用 doxygen 1 8 6 创建 Markdown 文本文件的 pdf 现在我想在 Markdown 文件的特定阶段获得分页符 我使用了这个link http daringfireball net projects markdo

随机推荐

  • 代码行数统计小工具

    一 先下载好SourceCounter小工具 解压 然后直接打开文件夹中的SourceCounter exe 如果没有找到此工具的下载链接 点这里下载 二 选择代码类型 勾选上所有类型 三 双击点开后 选择文件夹 就可以直接统计出字数了
  • 前端笔记(4)JavaScript宏观与微观任务

    宏观和微观任务 在 ES3 和更早的版本中 JavaScript 本身还没有异步执行代码的能力 这也就意味着 宿主环境传递给 JavaScript 引擎一段代码 引擎就把代码直接顺次执行了 这个任务也就是宿主发起的任务 但是 在 ES5 之
  • 顺序表的基本操作(C语言实现)

    顺序表 前言 本文主要讲线性表的其中一种 那就是顺序表 顺序表就是采用顺序储存方式来存储数据 所谓顺序存储 就是数据在内存上的地址同样为连续储存 中间不允许有空 有间隔 顺序表的优点在于支持随机访问 就是通过下标来访问元素 缺点是插入 删除
  • iBatis resultMap报错 nullValue完美解决

    错误信息 SQLErrorCodesFactory Database product name cached for DataSource org apache commons dbcp BasicDataSource 19c5048 na
  • OSWatcher.sh脚本说明

    OSWatcher sh脚本位于oswbb目录下 Oracle 19c数据库中脚本的路径是 u01 app oracle product 19 0 0 dbhome 1 suptools tfa release tfa home ext o
  • Maven中dependencyManagement作用说明

    备注 今天有好些实习的同事问到Maven中关于dependencyManagement和普通dependencies的区别 说多了 麻烦 记录一下 在Maven多模块的时候 管理依赖关系是非常重要的 各种依赖包冲突 查询问题起来非常复杂 于
  • python网络爬虫有那些实例_python爬虫经典例子有哪些

    python爬虫例子 首先导入爬虫的库 生成一个response对象 然后设置编码格式 并打印状态码 最后输出爬取的信息 代码为 print response text python爬虫例子 1 爬取强大的BD页面 打印页面信息 第一个爬虫
  • 毕业设计-基于机器视觉的焊缝图像处理研究- OpenCV

    目录 前言 课题背景和意义 实现技术思路 一 焊缝识别系统设计 二 焊缝图像预处理 实现效果图样例 最后 前言 大四是整个大学期间最忙碌的时光 一边要忙着备考或实习为毕业后面临的就业升学做准备 一边要为毕业设计耗费大量精力 近几年各个学校要
  • 设置读取plc时间_Visual Studio 2010-C#跟西门子1200(Sharp7)窗体控制④-循环读取

    Visual Studio 2010 C 跟西门子1200 Sharp7 窗体控制 循环读取 上期回顾 上期主要是对单个按钮 按下后能够同时置位PLC的多个位 本期做一个读取PLC的OK NOK的统计数据的C 标签 先创建一个标签 在设定一
  • SpringBoot:@Schedule定时任务

    一 Schedule SpringBoot内置了Sping Schedule定时框架 通过注解驱动方式添加所注解方法到定时任务 根据配置定时信息定时执行 二 定时任务实现 1 开启定时任务 package com gupao springb
  • 使用VBA在工作表中快速插入行

    在工作表中插入行 有需要用到代码吗 是不是杀鸡用牛刀的感觉 其实不是这样的 在很多复杂的应用场景中 插入行不再是简单的单击鼠标右键就可以即刻完成的 比如需要隔行插入空行 如果有一万行数据 是不是搞到手抽筋了 再比如插入空行的数量不是固定的
  • 自动记录数据录入时间不懂得VBA的朋友可以看看

    在日常工作中 经常会遇到需要实时记录数据录入的时间问题 有朋友会说了 用快捷键啊 按Ctrl 分号 可以返回当前的系统日期 按Ctrl Shift 分号 可以返回当前的系统时间 但是如果需要同时返回日期和时间又该怎么处理呢 对于懂得VBA的
  • 关于对Vue中slot插槽理解

    关于slot插槽理解 1 何时需要使用插槽 在开发中 我们需要将共性内容抽取到组件中 将不同的暴露为插槽 插槽的益处便是 一旦预留了插槽 使用者便可以根据自己的需求来决定插槽中插入的的内容 2 slot的基本使用 div div
  • 软件测试之网络协议基础

    软件测试之网络协议基础 前言 我会在此账号上持续更新 软件测试的文章 包括网络部分 前端代码部分 数据库部分 软件测试部分 互联网协议 osi 7层协议 tcp ip 5层协议 网络协议的存在是为了两者中间根据一定的协议沟通交流 每层运行常
  • 光线跟踪(RayTracing)原理及c++实现

    Chapt1 Why to write a RayTracing Render 提到Computer Graphics 众所周知的是如OpenGL Direct3D这样非常流行的光栅化渲染器 事实上 这些大部分应用于游戏制作的API主要为实
  • Flutter控件——布局控件:层叠

    Stack 层叠布局 Android 中的 Frame 布局是相似的 子组件可以根据距父容器四个角的位置来确定自身的位置 层叠布局允许子组件按照代码中声明的顺序堆叠起来 Flutter中使用Stack和Positioned这两个组件来配合实
  • 怎么关闭win10虚拟机服务器,win10系统彻底关闭退出vmware虚拟机的步骤

    有关win10系统彻底关闭退出vmware虚拟机的操作方法想必大家有所耳闻 但是能够对win10系统彻底关闭退出vmware虚拟机进行实际操作的人却不多 其实解决win10系统彻底关闭退出vmware虚拟机的问题也不是难事 小编这里提示两点
  • 数十万条以上的大量数据如何快速插入数据库中

    引言 这几天工作这边同事遇到了一个问题 对十五万条数据进行计算 插入数据库的时候耗时很严重 使用了批量插入对十五万条数据插入仍然耗费了30秒 前面计算也耗费了二十多秒 系统流畅度因此很难堪 经过我的排查发现主要是两个点需要优化 1 计算的算
  • 关于STM32在线升级文件大或者跳转后中断有问题的解决方法(IAR环境)

    首先 大家都知道是跳转到每个程序的复位中断地址 一开始我的IAR环境的启动文件是没有复位中断地址的 可以去IAR官网随便下载一个重新覆盖掉启动文件 当然还得看你的外设中断有没有包含 或者有多的要去掉 DCD Handler类型的 如果遇到I
  • 怎样在 Markdown 中使程序代码带上行号

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