首页 / 知识
HTML目录生成工具基础介绍
2023-04-11 13:43:00
园子里面很多博主都会为自己的博文创建目录,方便大家浏览。我很好奇大家是怎么做的,是不是有自动生成目录的工具可以推荐一下(我知道word可以,但是直接贴word文档会生成很多多余的html tag)。
前几天写前端网页最佳实践目录项实在有点多,手动加起来太麻烦了,我尝试搜了下没有找到,于是写了几行代码来完成这工作。拿出来分享给有同样需要的朋友。
工具代码
using System;
using System.IO;
using System.Text;
using System.Text.RegularExpressions;
namespace HtmlIndexGenerator
{
class Program
{
const string HeaderPattern = @"<h(?<level>[1-6])[sS]*?>[sS]*?</h([1-6])>";
const string TagPattern = @"<[sS]*?>";
const string IdPattern = "(id|name)="(?<id>[\s\S]*?)"";
const int MaxHeaderLimit = 6;
const string H1Style = @"font-weight:bold";
const string H2Style = @"";
const string H3Style = @"";
const string H4Style = @"";
const string H5Style = @"";
const string H6Style = @"font-size:10px;";
static string[] HeaderStyles = new string[]{
H1Style,
H2Style,
H3Style,
H4Style,
H5Style,
H6Style
};
static void Main(string[] args)
{
string fileName;
int limit;
ParseParameter(args, out fileName, out limit);
string html = GetHtml(fileName);
if (string.IsNullOrEmpty(html))
return;
string index = GenerateIndex(html, limit);
string outputFile = "index.htm";
File.WriteAllText(outputFile, index, Encoding.UTF8);
Console.WriteLine("{0} generated.", outputFile);
}
/// <summary>
/// Prints help document.
/// </summary>
private static void PrintHelp()
{
Console.WriteLine("Usage: IndexGen.exe [filename] [-l] level");
Console.WriteLine("-l: header level limit, -l 3 limit the output to <h3>");
Console.WriteLine("Example: IndexGen.exe page.htm");
}
/// <summary>
/// Parses command line paramters.
/// </summary>
/// <param name="args">Input parameters</param>
/// <param name="fileName">Output parameter for parsed file name. Null if parse failed.</param>
/// <param name="limit">Output parameter for header level limit.</param>
private static void ParseParameter(string[] args, out string fileName, out int limit)
{
fileName = null;
limit = MaxHeaderLimit;
for (int i = 0; i < args.Length; i++)
{
if (args[i].Equals("-l", StringComparison.InvariantCultureIgnoreCase))
{
if (i + 1 >= args.Length || !int.TryParse(args[i + 1], out limit))
{
Console.WriteLine("Invalid parameter for -l");
PrintHelp();
return;
}
}
}
if (args.Length > 0)
{
fileName = args[args.Length - 1];
}
}
/// <summary>
/// Reads html content according to specified file name.
/// </summary>
/// <param name="fileName">File name</param>
/// <returns>Html content of the specific file.</returns>
private static string GetHtml(string fileName)
{
string html = null;
if (string.IsNullOrEmpty(fileName))
{
Console.WriteLine("Specify a file name");
PrintHelp();
return html;
}
if (!File.Exists(fileName))
{
Console.WriteLine("File {0} dose not exist", fileName);
PrintHelp();
return html;
}
// Auto defect file encoding.
using (StreamReader reader = new StreamReader(fileName, detectEncodingFromByteOrderMarks: true))
{
Encoding encoding = reader.CurrentEncoding;
html = File.ReadAllText(fileName, encoding);
}
return html;
}
/// <summary>
/// Generates the index html.
/// </summary>
/// <param name="html">Html content of specified file.</param>
/// <param name="limit">Header limit</param>
/// <returns>Generated index html</returns>
private static string GenerateIndex(string html, int limit)
{
Regex regex = new Regex(HeaderPattern, RegexOptions.IgnoreCase);
Regex regexId = new Regex(IdPattern, RegexOptions.IgnoreCase);
MatchCollection headerMatches = regex.Matches(html);
int previousLevel = 1;
StringBuilder indexBuilder = new StringBuilder();
indexBuilder.Append("<div id="doc-index">");
indexBuilder.Append("<ul>");
foreach (Match headerMatch in headerMatches)
{
int currentLevel = int.Parse(headerMatch.Groups["level"].Value);
string header = Regex.Replace(headerMatch.Value, TagPattern, string.Empty);
Match idMatch = regexId.Match(headerMatch.Value);
string id = idMatch.Success ? idMatch.Groups["id"].Value : null;
string link = string.IsNullOrEmpty(id) ? header : string.Format("<a href="#{0}">{1}</a>", id, header);
if (currentLevel == previousLevel)
{
indexBuilder.AppendFormat("<li style="{1}">{0}</li>", link, HeaderStyles[currentLevel - 1]);
}
else if (currentLevel > previousLevel && currentLevel <= limit)
{
indexBuilder.AppendFormat("<ul><li style="{1}">{0}</li>", link, HeaderStyles[currentLevel - 1]);
previousLevel = currentLevel;
}
else if (currentLevel < previousLevel)
{
indexBuilder.AppendFormat("</ul><li style="{1}">{0}</li>", link, HeaderStyles[currentLevel - 1]);
previousLevel = currentLevel;
}
}
indexBuilder.Append("</ul></div>");
return indexBuilder.ToString();
}
}
}
使用方法
将程序编译成执行文件,把博文存成本地文件,注意要存成unicode或utf-8,通过命令行运行。一个名叫index.htm的文件会生成在相同目录下。
如果你只希望限制生成目录的级数,可以用 -l 参数指定,-l 3代表只生成<h1> 到<h3>的目录。
接下来需要做的是将生成的内容复制粘贴到博文你想放目录的地方。简单的目录就生成了,参看本文目录。
如果你想更改样式,可以直接修改代码中对不同的header的样式定义。
工具改进
这只是个小工具,肯定有很多让小伙伴们惊呆的不足,
首先不应该用正则表达式解析html,具体原因可以看这里,如果真的要分析html,.net推荐使用htmlagilitypack,python推荐使用beautifulsoup,我这里不想再引入外部库,所以假设我们解析的html都是标准格式。
另外我没写代码去生成标题的id属性,因为很多朋友希望id是有意义的名字而不简单的header1、lable2之类的,所以id还是需要你自己添加,不然超链接出不来。 <h1 id="intro"></h1>
也尝试把这段代码转换成powershell脚本省了大家编译,这里有介绍如何做的方法,可惜插件也有硬伤,有些语法还不支持,比如using, out 参数等。
|
最新内容
相关内容
python生成不重复的随机数怎么写
python生成不重复的随机数怎么写,培训,数字,范围内,结果,表达式,语法,个数,模块,以上,表示,python中的random模块用于生成随机数,其语法表达式python怎么生成xml文件
python怎么生成xml文件,数据,培训,设计,标准,文件,标记,语言,实例,模块,宗旨,用python内置的xml.dom可以对xml文件进行解析处理。什么是xml?XpythonTKinter普通菜单的介绍
pythonTKinter普通菜单的介绍,培训,名称,菜单,果菜,顶层,快捷键,函数,实例,种类,定义,pythonTKinter普通菜单的介绍TKinter中的菜单种类比较python如何委派生成器
python如何委派生成器,培训,暂停,数据,代码,异常,生成器,表达式,主线,函数,实例, python如何委派生成器1、生成器函数包含yieldfrom表达关于fogbugz:基于证据的计划工具
关于fogbugz:基于证据的计划工具,关于fogbugz:基于证据的计划工具,工具,计划,证据,免费,Evidence Based Scheduling Tool是否有任何免W3C XHTML/CSS 验证在完成工作时有
W3C XHTML/CSS 验证在完成工作时有多重要?,W3C XHTML/CSS 验证在完成工作时有多重要?,验证,运行,这是,是在,How important is W3C XHTM如何在FogBugz维基页面中创建HTML
如何在FogBugz维基页面中创建HTML锚点?,如何在FogBugz维基页面中创建HTML锚点?,基页,链接,我想,单是,How do I create an HTML anchor前端入门学习之路,HTML、CSS篇介绍
前端入门学习之路,HTML、CSS篇介绍,前端,入门,学习,之路,HTML,、,CSS,篇,介绍,本文,, 本文不是教程,只要当做学习条记就好,盼望可以HTML5从入门到精通这八本书必看分
HTML5从入门到精通这八本书必看分享,HTML5,从,入门,到,精通,这,八,本书,必看,分享,, 最近,要问互联网这个圈子中最火的是什么?我想HTML5新手入门书籍推荐分享
HTML5新手入门书籍推荐分享,HTML5,新手入门,书籍,推荐,分享,HTML5,入门,书籍,, HTML5入门书籍推荐,“从入门到精通”到网站建设HTML5基础知识分享
网站建设HTML5基础知识分享,网站建设,HTML5,基础知识,分享,HTML,是,一种,, HTML是一种网页程序语言,自上个世纪九十年代初推出起,Hhtml5入门到精通的快速学习方法分
html5入门到精通的快速学习方法分享,html5,入门,到,精通,的,快速,学习方法,分享,, html5是web开发世界的一次重大改变,它代表着未