markdown 生成静态网站
数据结构
内容信息
- 标题
- 所有文章
- 所有分类
- 所有标签
标题
所有页面都有引用,因此存为全局变量使用
{
'title':'希洛克的个人小站',
'logo':'logo.png',
'description':'生命不止,编码不息!'
}
文章
一个文章列表,存储所有的文章信息,对于每个文章,结构如下:
[
{
'title':'xxxxx',
'link':'xxx.html',
'category':{
'title':'xxx',
'link':'xxx.html'
},
'tags':[
{
'title':'xxx',
'link':'xxx.html'
},
{
'title':'xxx',
'link':'xxx.html'
},
{
'title':'xxx',
'link':'xxx.html'
},
]
},
{
'title':'xxxxx',
'link':'xxx.html',
'category':{
'title':'xxx',
'link':'xxx.html'
},
'tags':[
{
'title':'xxx',
'link':'xxx.html'
},
{
'title':'xxx',
'link':'xxx.html'
},
{
'title':'xxx',
'link':'xxx.html'
},
]
},
{
'title':'xxxxx',
'link':'xxx.html',
'category':{
'title':'xxx',
'link':'xxx.html'
},
'tags':[
{
'title':'xxx',
'link':'xxx.html'
},
{
'title':'xxx',
'link':'xxx.html'
},
{
'title':'xxx',
'link':'xxx.html'
},
]
}
]
分类
收集所有文档数据,最后生成一个所有分类的数据,应该是一个列表,结构如下:
[
{
'title':'xxx',
'links':['xxx.html','xxx.html','xxx.html']
},
{
'title':'xxx',
'links':['xxx.html','xxx.html','xxx.html']
},
{
'title':'xxx',
'links':['xxx.html','xxx.html','xxx.html']
}
]
对于每一个分类,下面有多篇文章,那么肯定不能一次加载那么多,所以这里必须要分页,也就是一个分类,生成好几个页面,然后通过上下页进行关联。
在分类页面,会显示所有分类和当前分类,以及当前页的文章。
标签
标签和分类类似,不过又有不同,因为标签和文章是多对多的,但是将文章和标签分开来处理,从标签的角度看,一个标签对应多个文章,因此也是一对多,和分类的数据结构类似。
[
{
'title':'xxx',
'links':['xxx.html','xxx.html','xxx.html']
},
{
'title':'xxx',
'links':['xxx.html','xxx.html','xxx.html']
},
{
'title':'xxx',
'links':['xxx.html','xxx.html','xxx.html']
}
]
生成思路
收集文档目录下的所有markdown,并且提取头部信息,头部信息里面包括了标题,分类,和标签,这三个基础信息。
生成三者的数据结构,最后根据数据结构,生成相应页面。
页面
主页/列表页
所有分类,文章,标签第一页,分类第一页
分类页
所有分类,文章,上下页。
标签页
所有分类,文章,上下页。
代码
依据上述分析,用代码构造数据结构
主要数据结构
export interface Article{
title:string,
link:string,
category?:Category,
tags?:Tag[]
}
export interface Category{
title:string,
links:string,
articles:Article[]
}
export interface Tag{
title:string,
links:string,
articles:Article[]
}
// 因为标签和分类的数据结构,完全一致,因此只声明一个就可以了,就是文章集合,使用的时候,就用这一个
export interface ArticleSet{
title:string,
links:string,
articles:Article[]
}
export interface SiteConfig{
title:string,
description:string,
icon:string
}
// 三个文件目录必须填写
// 列表页用于分页加载文章
// 详情页用于加载单个文章
export interface GenerateConfig{
docPath:string,
templatePath:string,
distPath:string,
listTemplate:string,
detailTemplate:string,
}