写一个 Markdown 博客客户端
这个“伪需求”是最近才想到的。
关于文章管理的想法,说来话长。我最初是在 CSDN 写技术文章,就用网页上的编辑器。后来在 CppBlog 写,用上了 Windows Live Write,一般在 Word 里面写好,再贴到 WLW 发布。再后来由于太忙了,一直停到现在。其中除了我懒,有两个客观原因,第一是中间好几年不搞 C++,那么在 CppBlog 上写非 C++ 的东西好像有点奇怪;第二是,服务端的东西真的没法每天下班自己玩呀,每天下班提心吊胆地看短信报警,也没哪个心情和时间再去重新开辟一个和白天工作内容迥异的学习场景维持下去。(佩服自己找借口的能力~)
前些年,Markdown 兴起,GitHub Pages 兴起,一众静态博客工具也蓬勃发展。Markdown 真的太适合用来写技术博客了,唯一不足是图片的处理。尽管如此,我还是花了很大的精力把以前所有的文章都转成了 Markdown。然后曾经一度也玩上了 GitHub Pages,用 Huge 生成静态博客。然而,博客的这东西我认为价值点和动力还是在于交流、碰撞,自己写自己看,跟存本地没啥区别——我的 GitHub Pages 几乎没人看……那时候也没写几篇,大概是 2018 年末到 2019 年初的时间。
半年前,我想到了近年来第一个“伪需求”。我嫌 Hugo 这种形态操作太罗嗦:先写 Markdown,再放到 source repo 的 post 里,提交一把;再生成静态页面,把 public 提交到 public repo。如果折腾模版啥的,就更复杂。我就想写 Markdown,写完提交一次 .md,能不能就看到呢?甚至干脆不提交,直接同步到服务端。这样,就得做一套动态系统(相对于 Hogo 的静态页面)去做这件事,而生成被浏览的数据的逻辑理论上跟 Hugo 之类的没本质区别。而一般个人博客这种文章量,根本不用纳入性能上的考量,因此做成动态是完全可操作的。看了下市面上没有此类的工具,于是就开搞了。我把它叫“NoteIsSite”,GitHub 地址 https://github.com/Streamlet/NoteIsSite,Demo 地址 https://note-is-site.streamlet.org/,然后把我所有的文章也用这个工具挂在主页下的一个子分类,见 https://www.streamlet.org/note/。关于这个,以后再开一篇文章细说。
到这里为止,写的过程代价很小了。但是刚才说了,博客这东西,对于我的动力很大一部分来自于评论、碰撞,还是需要发到公共平台上去的好。最近看到一个去年离职的前同事的博客 https://gclxry.com/,我惊叹于人家一直在坚持写。我想我是不是也要捡起来了,还是回归 CppBlog 吧。于是问题就来了。最近觉得最好用的 Markdown 编辑器是 typora,然后它没法发博客;以前的 WLW 虽然还能用,但毕竟不基于 Markdown。然而 typora 不开源,没法给他加一个“发布”功能了事。所以自己做做看?顺便入一下 Electron 的坑,以及前端的坑。
花了这么大篇幅把需求来源说完了。至于为什么选 Electron 呢?就是为了快点搞定……
上周学习了下 Electron 的 demo 以及打包流程:https://github.com/StreamletStudy/ElectronHelloWorld
然后正式用这个 repo:https://github.com/Streamlet/MarkdownBlog
现在功能就两个:编辑、发布。编辑不是所见即所得的,左边 Markdown,右边 HTML。发布要每次填 API 地址、账号,没做管理。整个流程通了,于是停下来写了这篇文章,用刚写的工具发布上来。
发现了 Electron 的一个坑,只要在页面里调用了 alert,页面上的焦点就有问题,输入框再也无法输入内容了。目前用 remote.dialog.* 替代。不知道有没有正解?
后面的规划:
- 搞清楚前端的语言体系,然后选择用原生 JS 还是它的衍生语言,把工程组织进一步完善
- 搞清楚 UI 复杂度,看要不要选择一个虚拟 DOM 方案
- 撸功能,账号管理等
- 撸功能,做成所见即所得
- 撸功能,支持图片粘贴、上传
再后面,先不规划,做完了再看。当前版本 Release:https://github.com/Streamlet/MarkdownBlog/releases/tag/publish_to_metaweblog_api
写一个 Markdown 博客客户端的更多相关文章
- 写markdown博客如何截图并快速上传到图床——记一个工具插件的实现
1. 背景 写博客有一个自己的图床是不错的选择,如果不借助工具,在markdown博客中添加图片的步骤如下: 截取图片,保存到本地(得来回点对话框,选择保存路径,选择文件类型,输入文件名). 上传到图 ...
- 写markdown博客如何将截图快速上传到图床——记一个工具插件的实现(windows版 开源)
打造一个上传图片到图床利器的插件(Mac版 开源)(2018-06-24 19:44) 更新于2018年2月 做了以下改动: 1.修复了一个bug,把服务器区域做成可配: 七牛有华北,华东,华南以及美 ...
- Dropplets – 极简的 Markdown 博客平台
Dropplets 是一个简单的博客平台,专注于提供正是你在博客解决方案中需要的.当涉及到基础的博客功能,你真正想要做的是写和发表,而这就是 Dropplets 的过人之处.Dropplets 是一个 ...
- 我的第一篇Markdown博客
我的第一篇Markdown博客 这是我第一次用Markdown写博客,发现还是比较好用的,加上Marsedit也支持了Markdown的博客预览,博客园也加了Markdown的格式支持,就更加方便了, ...
- 如何搭建一个独立博客——简明Github Pages与Hexo教程
摘要:这是一篇很详尽的独立博客搭建教程,里面介绍了域名注册.DNS设置.github和Hexo设置等过程,这是我写得最长的一篇教程.我想将我搭建独立博客的过程在一篇文章中尽可能详细地写出来,希望能给后 ...
- OpenLiveWriter 这篇文章使用博客客户端撰写
OpenLiveWriter是非常方便的博客客户端,起码相比在浏览器写博客多了一种选择.而且借助于MetaWeblog接口,可以很方便地同步博客文章到多个博客地址.本站cms.xlongwei.com ...
- 用 Flask 来写个轻博客 (33) — 使用 Flask-RESTful 来构建 RESTful API 之二
Blog 项目源码:https://github.com/JmilkFan/JmilkFan-s-Blog 目录 目录 前文列表 扩展阅读 构建 RESTful Flask API 定义资源路由 格式 ...
- 用 Flask 来写个轻博客 (32) — 使用 Flask-RESTful 来构建 RESTful API 之一
目录 目录 前文列表 扩展阅读 RESTful API REST 原则 无状态原则 面向资源 RESTful API 的优势 REST 约束 前文列表 用 Flask 来写个轻博客 (1) - 创建项 ...
- 用 Flask 来写个轻博客 (24) — 使用 Flask-Login 来保护应用安全
Blog 项目源码:https://github.com/JmilkFan/JmilkFan-s-Blog 目录 目录 前文列表 扩展阅读 用户登录帐号 用户登录状态 Flask-Login 使用 F ...
- 用 Flask 来写个轻博客 (23) — 应用 OAuth 来实现 Facebook 第三方登录
目录 目录 前文列表 扩展阅读 第三方登录流程 OAuth 应用 OAuth 实现 Facebook 第三方登录 实现效果 前文列表 用 Flask 来写个轻博客 (1) - 创建项目 用 Flask ...
随机推荐
- 45.限流Throttling及源码解析
什么是限流? 限流类似于权限机制,它也决定是否接受当前请求,用于控制客户端在某段时间内允许向API发出请求的次数,也就是频率 假设有客户端(比如爬虫程序)短时间发起大量请求,超过了服务器能够处理的能力 ...
- 【SSM】学习笔记(二)——SpringMVC入门
原视频链接:https://www.bilibili.com/video/BV1Fi4y1S7ix/?p=43&spm_id_from=pageDriver&vd_source=8ae ...
- 三、Python语法介绍
三.Python语言介绍 3.1.了解Python语言 Python 是1989 年荷兰人 Guido van Rossum (简称 Guido)在圣诞节期间为了打发时间,发明的一门面向对象的解释性编 ...
- scrapy 如何使用代理 以及设置超时时间
使用代理 1. 单文件spider局部使用代理 entry = 'http://xxxxx:xxxxx@http-pro.abuyun.com:xxx'.format("帐号", ...
- [AGC057D] Sum Avoidance
Link 本篇题解大部分内容来自这篇文章 首先题意翻译: 给定一个正整数 \(S\) ,称一个正整数集合 \(A\) 是好的,当且仅当它满足以下条件: \(A\) 中元素在 \((0,S)\) 之间 ...
- 2022春每日一题:Day 30
题目:[JSOI2009]电子字典 读完题后,暴力?确实,计算一下时间复杂度最坏情况下,20263*10000=1.5e8,卡一下常可以直接卡到7e7,最严格来说应该卡的过去,但是此题数据可以直接卡过 ...
- 学习ASP.NET Core Blazor编程系列十——路由(下)
学习ASP.NET Core Blazor编程系列一--综述 学习ASP.NET Core Blazor编程系列二--第一个Blazor应用程序(上) 学习ASP.NET Core Blazor编程系 ...
- virtual继承和不继承
用virtual修饰的虚函数,用来继承重写,没有virtual修饰的,取决于父类 定义 父类 *x=new 子类 首先父类不能调用子类的函数,自能调用本身的函数,所以,只有两种情况,1.无virtua ...
- 4.2:Scrapy爬虫
使用Scrapy框架对网站的内容进行爬取 在桌面处打开终端,并在终端中输入: scrapy startproject bitNews cd bitNews/bitNews 修改items文件的内容,输 ...
- 【SQL进阶】Day05:窗口函数
〇.概述 一.专用窗口函数 1.每类试卷得分前3名 自己写出来的部分 SELECT tag AS tid, uid AS uid, Rank AS ranking -- 如何确定排名 FROM exa ...