介绍
电脑中存了很多markdown文档,为了管理这些文档,特写了这个md管理工具。
我的想法是,把现有的markdown文件复制到指定文件夹中,自动生成markdown的网页,不仅可以在自己电脑上运行,而且还能把它上传到网站上,供其它人在线使用;多个markdown文档项目可同进行管理,以后只需增删改查markdown文件。
最近花了点时间,完成了这个小巧便㑺的md文档管理应用RsCode.Doc.Web
功能
markdown文档自动生成url,可以通过浏览器访问,方便管理
自动生成文档目录,并且自定义文档url名称
可在电脑上直接运行
SEO友好,可部署为网站运行
特点
不使用任何数据库
同时管理多个项目文档
可自定义url,服务端生成html,在线上运行(支持windows和linux),更有利于seo
可直接在PC端运行,也可以在部署在服务器上运行
下载
下载地址 https://pan.rs888.net/detail/32
下载密码 rscode
使用
打开Document
文件夹
解压后,先打开项目文件夹,有个名称为Document
的文件夹,如果没有就新建一个;
复制md文件
把你的md文件或文件夹复制到Document
文件夹下,例子中的可以参考,或删除
双击运行Rswl.Doc.Web.exe
打开cmd窗口不要关闭,在浏览器中打开 http://localhsot:5000即可访问
以后新增或修改md文件,直接丢到这个文件夹里就行了
提示:如果电脑上没有安装.net ,请打开https://dotnet.microsoft.com/zh-cn/download/dotnet/6.0
windows系统 下载 HostingBundle 和 下载Asp.net Core
macOs系统 下载相安装包
rscode的文档就是用它来运行的,可供参考rscode.cn
配置
项目文件夹下,有个doc.json的文件,节点conig保存的是配置
name
表示真实存在的文件夹名称或文件名(不含扩展名)
tag
表示这个文件夹或文件的别名,值为英文字母或数字,url将显示tag
profile
定义文档简称
title
定义网页标题
description
定义网页描述
keywords
定义网页关键词
cacheTime
缓存时间,以分钟为单位
如果部署为网站,建议对中文的文件夹或文件名设置tag
,设置网页的keywords
和 description
如果不对文件或文件夹配置,文件访问地址将变为 http://xx.xx/文件夹名/文件名.html
的形式
技术实现
使用asp.net core mvc开发这个应用,用到markdown转html,动态控制器,缓存等技术
一. markdown转html
引用Markdig
,对md文件的内容进行html转码
- var pipeline = new MarkdownPipelineBuilder().UseAdvancedExtensions().Build();
- var result = Markdown.ToHtml(txt,pipeline);
二. 动态Controller
使用方法MapDynamicControllerRoute()
实现思路
1.定义路由规则
- app.UseEndpoints(endpoints =>
- {
- endpoints.MapControllerRoute(
- name: "default",
- pattern: "{controller=Home}/{action=Index}/{id?}");
-
- endpoints.MapDynamicControllerRoute<TranslationTransformer>("{project}/{action}.html");
- endpoints.MapDynamicControllerRoute<TranslationTransformer>("{project}/{controller}/{action}.html");
- });
2.将符合规则的url,交给指定的Controller/Action
进行管理
2.1 注册符合规则的路由数据
将文件夹和文件的tag数据保存,以供url验证
2.2 处理符合规则的路由,接管理请求
自定义TranslationTransformer
类继承DynamicRouteValueTransformer
,重写TransformAsync()
- //请求将由/doc/detail接管
- public override async ValueTask<RouteValueDictionary> TransformAsync(HttpContext httpContext, RouteValueDictionary values)
- {
- if (!values.ContainsKey("project") || !values.ContainsKey("action")) return values;
-
- var project = (string)values["project"];
- string controller = "";
- if(values["controller"]!=null)
- {
- controller = await _translationDatabase.ResolveController(project, (string)values["controller"]);
- if (controller == null) return values;
- }
- var action = await _translationDatabase.ResolveAction(project, (string)values["action"]);
- if (action == null) return values;
-
- values["controller"] = "doc";
- values["action"] = "detail";
-
- values["projectTag"] = project;
- values["dirTag"] = controller;
- values["docTag"]= action;
-
- return values;
- }
-
values 保存的是符合规则的路由参数,把己注册过的 url 交给doc/detail
处理数据
3.指定的Controller/Action
负责读取md,转成html
doc/detail
得到参数 projectTag
,dirTag
,docTag
查找/projectTag/dirTag/docTag.md
文件内容
三 缓存
使用RsCode中的缓存,使用内存缓存
使用内存缓存服务
builder.Services.AddMemoryCaches();
注入缓存
- ICacheProvider cache;
- public DocService(IEnumerable<ICacheProvider>caches)
- {
- env = hostEnvironment;
- cache = caches.FirstOrDefault(c => c.CacheName== "memory");
- }
-
- public void test()
- {
- //cache.Get("key")
- //cache.Set("key","value")
- }
-
简单的逻辑,解决了我md文档管理的大问题,如果你有疑问,可进群交流
好了, 以上是本文所有内容,希望对大家有所帮助,也希望大家对码农之家多多支持,你们的支持是我创作的动力!祝大家生活愉快!