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 月 9 日
•实现:自定义 index 页功能。即:可将某个文档设置为所在目录或整个网站的 index 页。详情:

◦新建文档时将其命名为 index 。也可将已有的某个文档重命名为 index 。
◦该文档位于某个子目录下,则为该目录的 index 页。
◦该文档位于项目根目录下,则为整个网站的首页。
TheKiteRunner
2017 年 3 月 9 日
突然想到,写下,发布。又有录音功能特色,叫妙笔知音如何呢😄
SwingCoder
2017 年 3 月 10 日
有用户询问如何插入锚链接和图片链接。

锚链接:各种类型的链接,网址最后加一个#号,后接锚点文本即可。锚点文本为该网页(文档)中的二级或三级标题的文本。

图片链接:先插入一个文字型链接,而后将此链接所显示的文本(中括号内的文本)替换为插入图片的文本标记。语法:
[![](../../media/app.jpg)](../../works/index.html) 此为项目内的链接,使用了相对路径
[![]( http://aSite.com/app.jpg)]( http://aSite.com/app.html) 此为外部链接,使用了绝对路径
SwingCoder
2017 年 3 月 10 日
如需在新窗口(新标签页)中打开链接,使用 WDTP 的新窗加载语法即可。网址最后、右小括号之前,空格加一个小写的减号。格式:

[点此访问]( http://underwaySoft.com -)
SwingCoder
2017 年 3 月 10 日
@TheKiteRunner 先生,不错的中文名字。谢谢您的宝贵建议。

WDTP 这个名字比较“简朴”和通用。也省得为每一个语种起一个不同的名字了:)这个软件最大和最有价值的用户群不在中国。下一步如有时间,我会考虑一下如何海外推广的事。希望它能造福全球:)
SwingCoder
2017 年 3 月 10 日
•新增:扩展文本标记:[latestPublish]。作用:提取当前文档所在目录下最新创作的前 5 篇文章。

◦提取后的结果为无序列表,文本链接。
◦将该标记用于项目根目录下的某个文档中,可提取整站的前 5 篇最新文章(包括所有子目录)。
◦将该标记用于某个子目录下的某个文档中,可提取该子目录的前 5 篇最新文章(包括其下的所有子目录)。
◦该标记在制作网站首页或某个目录的 index 页时比较有用。
SwingCoder
2017 年 3 月 10 日
新增:扩展文本标记[latestModify]。作用:提取当前文档所在目录下最新修改的前 5 篇文章。

- 提取后的结果为无序列表,文本链接。
- 将该标记用于项目根目录下的某个文档中,可提取整站前 5 篇最新修改的文章(包括所有子目录)。
- 将该标记用于某个子目录下的某个文档中,可提取该子目录下前 5 篇最新修改的文章(包括其下的所有子目录)。
- 所提取的最新修改文章中不包含最新创作(发布)的文章(防止二者同时使用时某些文章将重复显示)。
- 该标记在制作网站首页或某个目录的 index 页时比较有用。
SwingCoder
2017 年 3 月 10 日
- 新增:模板文件 blog/page-ad.html 。该模板不显示页面底部的广告图片,其余同 page 模板。
TheKiteRunner
2017 年 3 月 10 日
刚上厕所看了土豆的上的五分钟视频之后,我收回海句不好上手的不负责任的说法。软件逻辑很清楚,只是快速使用文档不够清爽,缺乏图示和视频链接。自动分句和合并功能太好了。
SwingCoder
2017 年 3 月 10 日
本日新增的两个扩展标记的默认显示效果可参见 UnderwaySoft 官网首页:
http://underwaysoft.com/index.html
TheKiteRunner
2017 年 3 月 10 日
您好,很多软件有 copy as picture 的功能,有时候写作过程中也会截图作为内容,请问有没有可能将图片以这种方式插入,即在编辑窗口右键粘贴,此时 wdtp 自动在默认某一文件夹内生成图片,并且在编辑框口中输入![]()这样的代码,感谢。

用海句听自己手头上的 mp3 ,=, space, enter 之类的小细节真是好。

对了,我是不是在您官网上留言更好,感觉这儿可能会干扰别人看您的更新部分。
SwingCoder
2017 年 3 月 10 日
@TheKiteRunner 先生,谢谢您对海句的肯定与真实体验后的客观评价。这个软件的操作界面也是简约型的设计风格,但内部很复杂,实际功能非常强悍,使用方式也比较灵活。这样能最大限度适合各个层次、各个习得阶段、采用各种外语学习法的用户所需。

海句的自动切分语句功能是我个人发明并已经申报了专利的一种新型算法,它基于并模拟了人脑对自然语言的切分运作原理。优势很多,但代价也不小,对 CPU 的压力很大。多次改进并优化后,目前的执行效率还算尚可吧(精确性方面有一些损失)。

抓图后立即粘贴到比较正规的文档中,这个功能看似方便,实际上低效。因为很难一次性抓图满意,或者需要更多处理,比如添加说明、图示、更改图片格式或大小等等。我个人建议用户提前抓图并确保无误后再插入 WDTP 中。

还有一个思路是给 WDTP 添加必要的图像处理功能,这样就可以考虑更多的插图模式,比如让它本身就具有截图、针对图像的各类常规处理、添加文字、图示等等功能。这方面的工作量并不大,算法方面也有很多成熟的技术可资借鉴、利用。目前我还没有仔细考虑这一块。其他软件都有的此类功能我也不想模仿并添加进来。因为这是一个开源软件,崇尚超前、创新、引领、开放、独具特色与“人无我有”,而不是面面俱到、(功能)多多益善、四平八稳的商业软件。
SwingCoder
2017 年 3 月 10 日
V2EX 等网站,我这段时间以来一直保留在浏览器中,相当于在这些网站做“开发直播”了:)这事有挑战性,本身也是一个新鲜的“玩法”。您有问题,可以随时在此回复, UnderwaySoft 网站留言板、 Email 、 GitHub 等等都可以,这些都能保证我及时看到所有人的反馈、讨论、交流,并在第一时间尽快处理。对我来说,这本身也是一个学习与思考的宝贵机会。

V2EX 的发言采取扣分的策略,可能等我的分数用完之后,就无法再继续发言了。

说到这里,我得再次感谢您和其他两位朋友对 WDTP 及我个人的大力支持与鼓励。你们的感谢,不但是精神上的支持,更直接增加了我在 V2EX 的分数,这保证了我能多发一些“直播”,多和网友进行几次讨论交流。
SwingCoder
2017 年 3 月 10 日
关于本日新增的两个扩展标记(提取最新创作和最新修改的文章),这个功能在常规的 CMS/博客程序中必备,不算新鲜。但是在 WDTP 中,意义不同。主要是:

1. 使用扩展标记的形式,简化了用户的操作,完全不必和模板打交道。直接在文档中给出该标记,不但可以供访客浏览,更可以自己在本地随时获取最新信息(作为创作时的一种另类的调试技巧)。非常方便。

2. 配合指定任意文档作为 index 功能,可以直接用撰写文档的常规办法设计出满足需求的网站首页或目录 index 页。甚至可以把这两个标记嵌到表格里,而表格又是采用方便简单的 Markdown 扩展标记。

等等。
SwingCoder
2017 年 3 月 10 日
关于[keywords], [lastestPublish]等扩展文本标记,另外两个深层次的考虑与意图是:

1. 对绝大多数作家和创作者来说,稍具篇幅的作品,我个人强烈推荐使用一种更简单、更先进的创作理念。它源自软件工程领域。说是先进,其实在工程领域早就是老生常谈了。这个理念就是:分而治之、自顶向下、多重关联、并发处理。这么做的优势非常明显,更会大幅度提升生产效率并减少差错率。

体现在 WDTP 中,就是我开发这个软件的核心初衷之一:分章节撰写、编辑、组织、管理、集成您的作品。也就是:将一个大部头作品,按任意您给出的标准或需求进行拆分,而后可以按任意所需进行排列组合。比如:将每一节作为一个独立的文档,以创建时间为整合时的排序标准,等等。这方面, WDTP 做了很大的努力,已经实现了一大批与此直接相关的功能。

采取“分而治之、并发处理”等方式之后,作者对整个项目的宏观把握与掌控将变得更加高级、抽象和灵活,但同时也增加了一些困难(特别是不熟悉工程理念、抽象思维有所欠缺的人)。此时,有必要用一种更强大自由、更简单直观的方式进行强化(或者说弥补)。再三考虑后,我决定用文本标记这种方式来实现。

该方式,其实也是编译型计算机语言最强大的一个理念和工具之一:“宏代换”。只不过,这种宏的内部运作更加复杂与精准。说到这里,我得再次感谢 V2EX 上热心网友 TheKiteRunner 先生的需求与建议。他的需求直接催生出 WDTP 的“缩略语”功能(其实就是“宏”思维在应用层面的实现之一)。而最近添加的这几个扩展标记,其实都是“缩略语(宏)”思维方式的变体和具体应用。

2. 传统的 Markdown 等文本标记语言,只是将初衷与目的锁定(局限)在某一篇独立的文档中。没有任何标记能体现或实现文档之间(跨文档)的联系与正相关性。这种孤立的表达法,我个人并不赞成。世界本来就是多元与互相关联的,更何况文档(特别是出自于同一位作者的所有作品,而不仅仅是一部作品。扩展开来,甚至可以囊括全世界所有健在或离去的作者——如果 WDTP 下一步实现基于云处理的大数据分析和更先进的拓扑协作等功能与模式,这一点将变得极端重要)。

用什么方式来实现跨文档的关联颇让我费了一番心思。基于 WDTP 的特点,再三斟酌后,我决定:文本标记本身的问题,就用它本身来解决。这种架构模式,我觉得可行。

用简单直观、方便易用的扩展标记来实现创作与写作等方面更宏大的构思与狂想,不但可行,而且必要。这可能会成为此方面的未来趋势之一(如果引领得当)。目前 WDTP 所给出的,只是最初级的实现(或者说示范)。如果您在此方面有更多好的想法或点子,欢迎不吝指教并提供。
SwingCoder
2017 年 3 月 11 日
•新增:扩展文本标记:[featuredArticle]。作用:提取当前文档所在目录下最新修改的前 5 篇精华文章。
SwingCoder
2017 年 3 月 11 日
•新增:扩展文本标记:[randomArticle]。作用:从整个项目中随机提取 5 篇文章。
SwingCoder
2017 年 3 月 11 日
•新增:扩展文本标记:[allPublish]。作用:提取整个项目的所有文档。
◦提取后的结果为无序列表,文本链接,后缀为该文章的创建日期。
◦该标记适合于制作“发布记录”页面(类似于 WordPress 等博客程序的“归档”页)。
SwingCoder
2017 年 3 月 11 日
•新增:扩展文本标记:[allModify]。作用:提取整个项目的所有文档(以最后修改日期为排序基准)。
◦提取后的结果为无序列表,文本链接,后缀为该文章的最后修改日期。
◦该标记适合于制作“更新记录”页面。
SwingCoder
2017 年 3 月 11 日
最近添加的这批跨文档的扩展文本标记,不仅可用于制作页面,更可以在本机写作 /创作时供“调试”所用,可临时性的获取整个项目、某个目录和创作进程中的相关重要信息,一定程度上有助于写作和创作时的宏观把握和整体推进。

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

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

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

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

© 2021 V2EX