WDTP:一款“三合一”的写作工具和桌面版静态网站生成器

2017 年 2 月 4 日
 SwingCoder

谢谢 Akkuman 和 CoderZh 两位朋友的介绍和推荐,让我得知了 V2EX 这个尊重原创,热爱分享与创造的好网站。我想在此和大家分享一款我刚刚开发完成的软件(目前是内测版,正在不断完善更新),如有不妥,请管理员批评指正并谅解。

WDTP 是一款“三合一”的另类写作工具与桌面 GUI 单机性质的静态网站(博客)生成器,这个项目的主页是:

http://underwaysoft.com/works/wdtp/index.html

WDTP 昨天首发于国内的凯迪论坛,我将原帖复制粘贴在此吧。


WDTP :源于凯迪论坛的又一款写作利器

2016 年年初,我在凯迪论坛看帖的时候,意外地发现了一座高楼,所讨论的话题是我前几年很感兴趣的。于是开始关注,时不时也掺和几句,然后就和几位骨干帖友混了个脸熟——其中一位是陈坪先生。有天我去拜访他的博客,浏览文章的时候突然冒出一个 idea ,可能更像是一些自我觉察,大致如下:

诸如此类。相信其他一大批小众也会有这些想法。说实话,以上这些真心不好用,尤其是学习与使用成本,还有使用时的心情,数据的随时检视、备份、管理与迁移,远程修改、调试与刷新等等。很折磨人。它们或许非常适合更广泛的一大批用户,某些情况下肯定也是非用不可,但很多时候确实不再适合我,也没必要时时动用这些怪兽级的庞然大物。

更进一步,笔记、写书、博客、网站这几件看似互相割裂的事,其实完全可以也早就应该简简单单、清清爽爽地合而为一了。而写作时,“内容与样式分离、样式与模板分离”等程序员最熟悉的理念与常规做法,这么多年以来,我为什么没有在自己的文字写作过程中更深入地理解和贯彻呢?有点不应该。

想法中还包括了其他。比如:“静态网站生成器( Static Site Generator )”,这东西近两年在喜欢尝鲜的技术类博主中很受推崇。有媒体放言:“下一批互联网大事件中,新型的静态网页及其生成将位列其中”……据我所知,这类程序目前至少上百,采用了各种各样的编程语言,它们中比较知名的有: Jeklly 、 Hugo 、 Hexo 、 Octopress 、 Pelican 、 Hyde 等等。尤其是 Jekyll ,背靠 Github 这棵大树,几乎一夜之间风靡全球。我对此做了一些肤浅的调查,一个匪夷所思的事实是:就我所接触到的“对口者”,竟无一例外——清一色的命令行程序!没有 GUI ,没有文本编辑器与可视化的 TreeView ,有的居然还要安装整个语言环境或依赖库。动辄百兆以上,太让人愤慨了。大不说,还麻烦。无论获取、安装,还是设置、使用,都不直观,也不方便,对一般人来说门槛有点高。这就势必将更广泛的用户群(比如普通的写作者)排斥在外,使他们很难享受到文本标记语法、内容 /样式分离、高自由度和灵活随意的静态博客等另类而好玩的写作 /分享模式。

既然尚无,那迟早就会有人下手,不妨等等,于是我就把这个事搁置了。此期间,我曾加入一个推广某静态生成器的国内群,也在 Stack Overflow 上转了转,四下打探一番,无果。有人曾抱怨过,但最终也是不了了之。

浏览陈坪先生的文章时,以上想法突然变得强烈起来。我琢磨了一下,这个事技术含量虽不高,但并不轻巧。脏活总是让同行包揽始终让人过意不去,干脆我自己趟一次浑水,再造个轮子吧:写一款跨平台且简洁清爽的桌面版静态网页生成器,顺便糅合上面提到的那几个功能,尽量将它们捏到一起,争取做的轻巧点、优雅点,先把基础和架子搭起来,后续事务和细化处理慢慢再捯饬。

琢磨的七七八八后,就立项动工了。关于编程语言的选择,脚本不考虑,平台相关的谢绝,数据库滚蛋。这么一来,似乎只有 Java 或 C++了。 Java 一贯不是我篮子里的菜,就 C++吧。

然后……然后就是今天 WDTP 内测版的首发,地点就在凯迪论坛的猫眼看人版块。可能有点唐突违和,请允许我解释一下:一方面这个程序的诞生确实与凯迪有直接的关系;另一方面此处风云际会、藏龙卧虎,能写、会写、喜欢写的人非常多,给这批笔友提供另一件顺手的写作工具应该是一件有意思的事。此外,似乎还没有哪位同行在这样的大杂烩论坛里做过这种类型的“主播”。这事有挑战性,风险并不小。但我想试试。

产品的首发式上,一般都会真真假假、虚虚实实地谈谈愿景、希望什么的。我这会儿有点忐忑,不敢满口火车。现在最大的希望是:值班编辑此刻心情不错,不删改这个贴,也不打算将它转移到凯迪的其他版块里。

关于程序的授权方式和性质, GPL v3 ,开源免费。不光凯迪的网友,全世界任何个人和组织都可以随意使用、传播、解剖源码或 PR 贡献,也接受来自任何方面的捐助。这些没什么需要多解释的。该有的,《授权协议》里都提到了,不够我再加几条:)

项目开工后,中间曾停工 3 个多月。 2016 年我周围发生了几件悲伤的事,让人心碎,这几乎导致了项目的夭折。费了很大劲我才将自己振作起来,硬挺着把 WDTP 的第一个版本敲了出来。活干得如何,横竖不论,交给诸位评说。目前 Bugs 肯定一堆,代码急需规整,很多细节也亟待完善。我实在不好意思说自己是一个敲了整整 30 年代码的老一代苦逼程序员——面老色衰,人狗远之。大江东去,属于我们的时代过去了……滚出这个行业之前,尽力散发点余温吧。希望热情还在,理想还在,更希望能听到真实而有价值的反馈与意见,以及各位同行的 PR 提交、无私贡献。

可能有人对大部分开源软件的维护更新感到不放心。我在此表个态吧:未来很长一段时间内,我可能每天都要用它,而且是重度使用。无论作为设计人、开发者、项目的第一责任人,还是作为用户之一,我肯定不愿意为了它而过分难堪或郁闷,更不会让它在七歪八扭、一团乱麻的失控状态下无果而终。

关于 WDTP ,还有几个必须要感谢的人——期待未来会更多,以后有机会一定专门提及。

That's it. 谢谢所有看了此贴的人,谢谢即将成为 WDTP 用户的每一个人,谢谢陈坪先生和那个高楼长贴,以及该贴中所有让我感到温馨的人。

今日立春,使用愉快!

SwingCoder 2017.02.03 于凯迪论坛

本文已发布在凯迪论坛的猫眼看人版块: http://club.kdnet.net/dispbbs.asp?id=12102372&boardid=1


欢迎大家下载试用并提出宝贵意见!

谢谢!

SwingCoder

35276 次点击
所在节点    分享创造
651 条回复
SwingCoder
2017 年 3 月 8 日
•更新:标题栏文本由“ WDTP-项目文件名”改为“项目文件名-WDTP ”。
SwingCoder
2017 年 3 月 8 日
改进:预览模式下修改文档、目录或项目的属性后,实时更新渲染结果(无需手动重新生成并刷新当前页面)。
SwingCoder
2017 年 3 月 8 日
•实现:“复习 /锤炼 /提醒”三合一功能。详情:

◦文档属性中增加“提醒日期”设置项。其格式同“创建日期”和“最后修改日期”(年.月.日 时:分:秒)。
◦创建文档时,“提醒日期”自动设置为隔日同一时间。
◦快速修改“提醒日期”的小 tip :双击日期中的某个“字段”,可选中该字段,直接输入合法值即可。
◦如果不想设置该文档的“提醒日期”,也可将此设置项清空。
◦“提醒日期”到期后,文件树中该文档所对应条目的颜色发生改变,以做提醒。
SwingCoder
2017 年 3 月 8 日
“复习 /锤炼 /提醒”三合一功能详解:

复习:适合于笔记和个人知识管理类项目。如配合艾宾浩斯遗忘曲线等记忆领域里的新旧科研成果,酌情、合理、逐次设置下次复习的日期,则可将笔记内容或要点(知识或技能)以最高效的方式形成长期记忆或固化记忆。 i+1 精深训练和学霸必备!注:高效记忆背后的科学原理涉及到认知学与大脑神经学等多个前沿学科及领域,非常复杂,但其中一个主要因素就是:重复刺激、间隔递增。

锤炼:适合于创作精品级的作品,特别是文艺及杂文作品。一篇隽永、不朽的文章往往需要多次修改、反复锤炼。此过程与高效记忆一样,同样需要科学、合理、最优化地任务管理与时间分配。

提醒:适合于所有建站者,特别是发展较快的领域内的技术型博主。相信大家都有这种极度不爽的体验:网上搜索一些技术性的东西,但文章却是 N 年前写的,花大量的时间去读这些内容老化、陈旧不堪的东西简直是浪费生命,这也大大降低了访客对网站的好感与信任度。可能有些负责的博主也会想着定期更新或修补完善,但由于缺乏顺手的工具或更好的控制手段而经常顾此失彼、挂一漏万,实在令人遗憾。鉴于此,我给 WDTP 加上了提醒功能,希望该功能可以让所有建站者意识到“及时更新”这个问题的重要性与必要性,更希望能在此方面为所有负责任的站长(博主)减轻一些负担,提供一点便利。

换个思维方式和分析问题的角度, WDTP 的提醒功能还可用于其它目的……能够发挥更大的实用价值。

从辩证法的角度来看,人类所有的文明、知识与工具都是“双刃剑”。 WDTP 的提醒功能亦不例外。该功能对程序本身的代码品质和实际运行等方面来说没任何负面效应(由于底层架构合理,实现此功能的全部代码不超过 10 行),但是“提醒”这件事本身却有两面性。它能够更高效、更方便、更科学地帮助我们,同时也会给我们带来负担……究竟如何,还有赖于用户的正确认识与合理运用。
SwingCoder
2017 年 3 月 8 日
•新增:文档属性:精华推荐。
SwingCoder
2017 年 3 月 8 日
设置为精华的文档,文件树面板中,对应条目的前面出现“五角星”标记。
TheKiteRunner
2017 年 3 月 8 日
@SwingCoder 我用一款开源记忆软件 anki https://apps.ankiweb.net/,记单词。然后有一个小伙伴做了个类似的算法,可以复习本地 markdown 笔记,不知道能不能参考😳
TheKiteRunner
2017 年 3 月 8 日
@SwingCoder 可以请教您一个非常弱智的问题吗~您 github 里面的代码,如果想自己调整功能,是不是还得最终编译成 exe 。如果不是太弱智的话,麻烦您跟我说一下关键词,我学着检索试一下~如果太弱智,请无视我~
SwingCoder
2017 年 3 月 8 日
@TheKiteRunner 先生,谢谢您的推荐。因为 WDTP 刚刚添加了“提醒”功能,而您也提到了记忆类软件。我尝试多说两句,如有不妥,请批评指正。话题就从我上午的“双刃剑”开始吧,主要谈谈不好的那面刃。

这类软件比较“老牌”的有 SuperMemo ,后起之秀 Anki 等等, iPad 上也有一款不错的,叫 FlashCards 。我对这类软件做过很深的研究和长时间的使用(包括它们背后的原理、算法与编程实现)。这类基于(强制型)重复刺激、间隔递增(倍增)等古老“成果”的软件,有非常便利和对用户助益巨大的一面,但副作用也相当相当大。这其中,使用场景就是一个非常值得进一步研究的领域。一个最常见的错误用法就是将其用于外语学习(二语习得)方面。结果就是典型的事倍功半、适得其反。

我这么说是因为我曾经设计、开发过一款理念非常先进的科研级二语习得软件:海句。现在 UnderwaySoft 还在提供下载和注册,我所掌握的数据,这个软件的全球用户大概有 2 万多人,其中有上千人至今仍重度使用。效果非常好。这款软件,在核心架构方面就吸收借鉴了强制类型的重复刺激与间隔唤醒,虽然算法是自己的(基于实验室和样本跟踪统计数据),但模式基本不变。“成也萧何,败也萧何”,也正是这一点,让广大重度使用的用户疲惫不堪,对海句是又爱又恨……

归根结底,人类的大脑不喜欢“被强制”……重复刺激与间隔唤醒,大方向是不错的,但前提不是强制,而是偶发……如果前提错了,整个系统的根基轰然倒塌。效果(或说结果)自然朝着相反的方向发展……

也因此, WDTP 的提醒功能深刻吸取了教训,将间隔唤醒(下次提醒时间)的设置权完全交给了用户。我相信,这种模式对大多数明白记忆原理的用户来说,效果会非常好。

************************************
288 楼您的两个问题,我没有看得太明白。尝试理解并答复如下:

WDTP 是开源软件,任何人都可以 Clone 源码,自行编译。如果您有好的想法、新的功能实现、 bug 修复等等,可以自己实现后自用,更欢迎提交 issue 和 PR 。这方面,我可能和其它开源软件的作者有一点不同。如有第三方提交的任何代码,我一定会逐行检视、编译调试后再亲自合并。

WDTP 实现关键词功能,核心函数有三个,均位于 HtmlProcessor 类中。分别是:

Line 451:: extractKeywords():提取 1 参数据模型的所有关键词。算法是多叉树深度遍历,递归实现。

Line 472 : getDocTreeWithKeyword():提取功能的“反功能”。基于给出的关键词,深度遍历多叉树,找到所有包含该关键词的子节点。同样用递归来实现。

Line 375 : getKeywordsLinks():这个函数的实现比较复杂,但原理很简单。基于上面两个函数,先提取所有关键词,接着提取所有关键词所对应的子节点,最后将子节点转换为 html 链接,供渲染时替代[keywords]标志词。
SwingCoder
2017 年 3 月 8 日
•更新:系统界面和文本编辑器默认的字体大小和颜色。
TheKiteRunner
2017 年 3 月 8 日
@SwingCoder

1 专家面前厚脸皮说下观点~我感觉学习语言最开始的受苦是必须的,而且要保证记忆质量必须有源有输出, anki 现在很活跃,与之相关有两个软件解决了我记忆来源的问题: kindlemate 和 anki 划词助手,分别记录了 kindle 阅读原著和 chrome 看网页留下的生词和原句,并且支持导出到 anki 。输出问题比较严重,动手之后才发现写和看之间的天壤之别,不过这就不是工具方面的问题了。海句在官网上有看到,看到 http://underwaysoft.com/works/iw/qaAboutLearn.html ,老脸又是一红。

2 我表述得不清楚,您还耐心讲了这么多,真是惭愧。我这个渣渣还是算了~

再次感谢!
TheKiteRunner
2017 年 3 月 8 日
TheKiteRunner
2017 年 3 月 8 日
您的作品都很精简,可能问题就在于推广上学习难度会比很多软件大。比如我一眼看去海句的快速上手就差点一脸懵逼了~感觉软件的使用说明最好是场景式的,然后有图解,这样会降低软件使用成本。不过您一人做这么多事,实在是不容易。因为还是学生,很小气地赞助 5 元别嫌少哈哈。
SwingCoder
2017 年 3 月 9 日
•修复: macOS 下快速选择并预览文件树条目时有可能出现的线程死锁及 html 文件不匹配等问题。
SwingCoder
2017 年 3 月 9 日
@TheKiteRunner 先生,谢谢您对 WDTP 和开源软件的支持!

您说的对,产品的推广营销是一门很深的学问,这方面我一直都不太擅长,急需各方面的大力协助。面对普通用户的文档、教程编撰也一直是 UnderwaySoft 的短板。希望下一步能腾出时间精力把这一块好好加强一下:)

在第二语言习得方面,我感觉您的认识有值得商榷之处。这方面我比较熟悉和了解。海句这款软件的前身,起源于国外一所名校的内部科研项目,团队的第一任管理者就是克拉申大师的高徒。这个项目时间跨度很长,我作为骨干成员之一和软件编程与算法实现方面的负责人,参与并跟进了好几年时间。获益良多,心得体会也很多。这方面如您有问题,欢迎垂询。
SwingCoder
2017 年 3 月 9 日
•优化:预览时的代码流程与相关算法。
TheKiteRunner
2017 年 3 月 9 日
@SwingCoder 谢谢您百忙之中的答疑。其实学习英语很多年,但先前凭着比较好的记忆力和“语感”,还自以为良好。这种麻木大大推迟了悔悟的时间。如今感觉记忆力大不如前,“语感”也抛弃了我,过去的慵懒和轻松造成了现在的尴尬局面,只好硬下头皮重新开始。

现在有两个症结:听力和口语长期忽视,下笔时真实词汇量很小。听从一个比较有经验的大哥建议,从 ESL podcast 开始练习听力,希望过渡到 voa 慢速和中速。练习听力的主要目的是从声音而不是从视觉上找回“语感”;词汇量的话,在保证一定的阅读量基础上,正在攻克美国当代语料库,配合了 vocabulary.com 的简§祥释义到 anki 强制化练习。计划每周到 testvocab 上检测词汇量。海句一定是一款极好的工具,希望以后有机会能够深入学习。

********
您现在忙,其实很多消息不必回复,尤其是类似于我上面这种与软件无关的话题。
********

对了,今天发现 wdtp 无法宽屏显示的另一困扰:图片可能无法看清楚里面的细节,页面虽然可以 zoom ,但是图片并没有同步。还好可以在外部浏览器加载。

此外, wdtp 可以记录提醒日期,其实相比而言我觉得回顾日期更值得记录,回顾日期如果大于当前日期,就是一个提醒计划。如果回顾日期是一个列表,那么还可以依次提醒。相应的还可以在页面上显示回顾频次。
SwingCoder
2017 年 3 月 9 日
- 取消: Markdown 表格解析最左侧一列的单元格内容靠右,回复为默认(左对齐)
SwingCoder
2017 年 3 月 9 日
@TheKiteRunner 先生,页面宽度是用 css 来设置的。系统默认的样式表位于:../site/add-in 目录下,文件名: style.css
默认样式表里图片的显示宽度为 100%,布局于一个 div 中,居中显示。 WDTP 在解析图片显示时,不指定图片大小。

提醒日期的设置比较灵活,由用户自行把握。这方面, WDTP 吸取了教训,强制性提醒或回顾的弊大于利,这些功能的添加,不但不能帮用户减轻负担,反而会加重。

关于语言技能的掌握(或者说习得),它不是知识,绝对不要抱着“学习”的心态去对待它。学习与习得是完全不同的两个概念。语言与文字更是不同的概念。在大脑没有形成最基本的、固化的、本能的“音义”对应之前,绝对绝对不要涉及文字,更不要从开始就进行文字阅读。绝大多数受过现代教育的中日韩三国的国民,在拉丁系文字的阅读方面具有天生优势。最多适应一周就可以开始阅读的强化训练了(以中国人为例,适应初期,直接用汉语拼音的文本作为教材即可。因为象形文字的“阅”读与拉丁系拼音文字的“拼”读是两种完完全全截然不同的阅读方式,他们所“动用”的大脑区域是不同的)。这个阶段,必须且仅在二语习得的中级阶段之后才能进行。此阶段,日常的听说交流、相对比较正规和完整的口头表达或叙述应该毫无问题(包括具象和抽象这两个方面的)。

婴儿 8 个月之后,大脑会形成语句自然切分的能力, 36 个月之内,母语的发音特点、骨干词汇及骨干语法基本全部掌握。包括语法现象最复杂的阿拉伯语。婴儿对整个世界是毫无概念和任何理解、联想能力的。也就是说,在语言习得方面,起步就是完全的“白痴”。一个白痴,最多 36 个月就能达到语言习得的中级阶段,更何况成年人。

也就是说,在最基本的语言能力不具备的时候,绝对绝对不要训练阅读能力。我上面说了,对中国人来说,拼音式文字的阅读根本不是个事,略加适应即可。

在二语习得的全过程中,或者说达到自由使用阶段之前,根本不存在背单词一说。
TheKiteRunner
2017 年 3 月 9 日
@SwingCoder 感谢您的耐心回复.关于二语习得问题, 您这样一讲,我脑袋里更糊涂了~

我决定了,先收藏您的建议, 但先按既定想法来, 看下效果. 我最大的问题是不行动.

再次感谢!

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://study.congcong.us/t/338138

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX