快捷搜索:  汽车  科技

开源项目markdown:MarkWord-可发布博客的

开源项目markdown:MarkWord-可发布博客的NetAnalyzer2016网络协议分析软件源码开放购买,可以分析80多种协议,支持http数据还原(包含chunked和gzip数据) ,欢迎大家可以支持一下!! CommonMark.CommonMarkConverter.Convert("### test") 如有疑问欢迎交流!!!/// <summary> /// 文档上传,包括新增与更新 /// </summary> public static string UploadBlogs(string apiUrl string BlogId string userId string password string BlogsModel string postId string title string Markdown bool publish) { int

因为前一段时间看到 NetAnalyzer 在Windows10系统下UI表现惨不忍睹,所以利用一段时间为了学习一下WPF相关的内容,于是停停写写,用了WPF相关的技术,两个星期做了一个Markdown编辑器,并且集成了:编辑时与网页同步,博客发布,PDF导出等功能。也主要是不忿某款外国软件收费,故有此作。

展示与说明

代码同步编辑

开源项目markdown:MarkWord-可发布博客的(1)

博客发布

开源项目markdown:MarkWord-可发布博客的(2)

代码说明

博客发布

MarkWord支持博客园和CSDN博客发布,并且可以进行图片同步(无论是本地图片还是网上的图片,都可以同步到博客服务器)。 该功能使用了MetaWeblog技术。使用方法如下:

/// <summary> /// 文档上传,包括新增与更新 /// </summary> public static string UploadBlogs(string apiUrl string BlogId string userId string password string BlogsModel string postId string title string Markdown bool publish) { int procIndex = 1; SendMsg(5 procIndex "准备数据中……"); //转换为html string Blogs = string.Format("<!-- edit by MarkWord 墨云软件 -->\r\n{0}" CommonMark.CommonMarkConverter.Convert(Markdown)); metaTools.Url = apiUrl; Post blogsPost = new Post; //分类 List<string> tmpCategories = new List<string>; tmpCategories.Add("");//添加空分类,是因为部分博客(如csdn)字段这部分为必填字段不添加会产生异常 blogsPost.categories = tmpCategories.ToArray; //添加时间 blogsPost.dateCreated = DateTime.Now.ToLocalTime; //添加标题 blogsPost.title = title; //指定文章编号 blogsPost.postid = postId; //内容 blogsPost.description = BlogsModel.Contains("{0}") ?//必须使用{0}占位符 string.Format(BlogsModel Blogs) : //根据模板生成数据 主要是为了制定Markdown模板 BlogsModel Blogs; //通过前缀方式添加 //开始查找图片并更新到服务器 HtmlDocument htmlDoc = new HtmlDocument; WebClient webClient = new WebClient; htmlDoc.LoadHtml(blogsPost.description); var ImgList = htmlDoc.DocumentNode.Descendants("img"); int procCount = 3 ImgList.Count; SendMsg(procCount procIndex string.Format("数据分析完成,总共需要上传{0}张图片" ImgList.Count)); int imgErr = 0;//图片上传错误数量 foreach (var i in ImgList) { SendMsg(procCount procIndex "正在上传图片数据……"); //获取图片文件字符串 string ImgUrl = i.GetAttributeValue("src" ""); if (string.IsNullOrEmpty(ImgUrl)) { imgErr ; continue; } try { var imgeData = webClient.DownloadData(ImgUrl);//下载文件 FileData fd = default(FileData); fd.bits = imgeData;//图片数据 fd.name = Path.GetExtension(ImgUrl);//文件名 fd.type = string.Format("image/{0}" fd.name.Substring(1)); UrlData obj = metaTools.newMediaObject(BlogId userId password fd); blogsPost.description = blogsPost.description.Replace(ImgUrl obj.url); } catch { imgErr ; continue; } } try { if (string.IsNullOrWhiteSpace(postId)) { SendMsg(procCount procIndex "开始发布文章……"); postId = metaTools.newPost(BlogId userId password blogsPost publish); } else { SendMsg(procCount procIndex "正在更新文章……"); metaTools.editPost(postId userId password blogsPost publish); } } catch (Exception ex) { Common.ShowMessage("博客发送失败"); return postId; } if (imgErr == 0) { Common.ShowMessage("博客发送成功"); } else { Common.ShowMessage(string.Format("博客发送成功了,但是有{0}张图片发送失败" imgErr)); } SendMsg(procCount procCount "完成"); return postId; }

具体API实现方法见代码中的BlogsAPI项目

PDF导出

PDF导出功能,使用了HTML转PDF方法 相关DLL已经包含在项目当中了

//html to Pdf public static void HtmlToPdf(string filePath string html bool isOrientation = false) { if (string.IsNullOrEmpty(html)) html = "Null"; // 创建全局信息 GlobalConfig gc = new GlobalConfig; gc.SetMargins(new Margins(50 50 60 60)) .SetDocumentTitle("MarkWord") .SetPaperSize(PaperKind.A4) .SetPaperOrientation(isOrientation) .SetOutlineGeneration(true); //页面信息 ObjectConfig oc = new ObjectConfig; oc.SetCreateExternalLinks(false) .SetFallbackEncoding(Encoding.UTF8) .SetLoadImages(true) .SetScreenMediaType(true) .SetPrintBackground(true); //.SetZoomFactor(1.5); var pechkin = new SimplePechkin(gc); pechkin.Finished = Pechkin_Finished; pechkin.Error = Pechkin_Error; pechkin.ProgressChanged = Pechkin_ProgressChanged; var buf = pechkin.Convert(oc html); if (buf == null) { Common.ShowMessage("导出异常"); return; } try { string fn = filePath; //Path.GetTempFileName ".pdf"; FileStream fs = new FileStream(fn FileMode.Create); fs.Write(buf 0 buf.Length); fs.Close; //Process myProcess = new Process; //myProcess.StartInfo.FileName = fn; //myProcess.Start; } catch { } }

CommonMark使用

最后就Markdown的转换,在这里我使用了CommonMark,使用方法比较简单

CommonMark.CommonMarkConverter.Convert("### test")

如有疑问欢迎交流!!!

最后来一发小广告

NetAnalyzer2016网络协议分析软件源码开放购买,可以分析80多种协议,支持http数据还原(包含chunked和gzip数据) ,欢迎大家可以支持一下!!

如有疑问欢迎QQ470200051

祝大家周末愉快

猜您喜欢: