Tiddlywiki添加剪藏和本地图片

剪藏这里使用的是MaoXian Web Clipper(以下简称MWC),这个浏览器插件非常好用,支持Chrome和Firefox

Tiddlywiki(以下简称TW)作为一个免费的知识库也是非常棒的,如果希望快速开始可以参照林一二大佬的模版和教程

但是在TW使用过程中也有两个问题一直困扰着我:

  1. 图片只能嵌入,导致单html巨大
  2. 无法通过简单的操作收藏web页面到TW

我有提一个PR,但是MWC的作者给了一个更简单的方案

本地图片

主要用来解决问题1,配合收藏功能,思路是直接修改TW的路由处理规则,想了下提给官方不会通过的,还是算了吧

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# Server.prototype.requestHandler下添加
var inputPath = url.parse(request.url).pathname;
var inputSplit = inputPath.lastIndexOf(".");
if (inputSplit > 0 && inputPath.indexOf(":") < 0) {
var fileSuffix = inputPath.substring(inputSplit + 1)
if (fileSuffix == "jpg" || fileSuffix == "jpeg" || fileSuffix == "png" || fileSuffix == "gif" || fileSuffix == "bmp" || fileSuffix == "webp") {
var imageFilePath = decodeURIComponent(inputPath.substr(1));
try {
fs.accessSync(imageFilePath, fs.constants.R_OK);
response.writeHead(200, {"Content-Type": "image/"+fileSuffix});
var imageStream = fs.createReadStream(imageFilePath);
var responseData = [];
if (imageStream) {
imageStream.on("data", function(chunk) {
responseData.push(chunk);
});
imageStream.on("end", function() {
var finalData = Buffer.concat(responseData);
response.write(finalData);
response.end();
});
return;
}
} catch (err) {
$tw.utils.log("Local image: [" + imageFilePath + "] read failed, will use default router...");
}
}
}

这个文件一般在node_modules/tiddlywiki/core/modules/server/server.js

你可以通过npm -V来获取node_modules的绝对路径

添加剪藏

剪藏在不修改MWC源码的情况下通过油猴脚本实现,也就是说你的浏览器必须安装MWC和这个油猴脚本。目前存在的已知问题如下

  1. MWC的目录无用(无法映射到TW),标签会直接添加到TW,所以这个问题不大
  2. 剪切的文章会保存两份,一份在本地目录,一份在TW

思路是通过MWC的接口编程能力,监听其剪切时间,在剪切完成后通过http直接请求TW的接口来保存

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
// ==UserScript==
// @name Maoxian Tiddlywiki
// @name:zh-CN Maoxian插件结果导入Tiddlywiki
// @namespace https://github.com/dneht/maoxian-tiddlywiki
// @version 0.1
// @author dneht
// @match https://*/*
// @match http://*/*
// @grant GM_log
// @grant GM_getValue
// @grant GM_setValue
// @grant GM_xmlhttpRequest
// @connect self
// @connect localhost
// @connect 127.0.0.1
// ==/UserScript==

(function() {
'use strict';

const baseAddr = 'http://localhost:8080';
const putTiddlerUrl = baseAddr + '/recipes/default/tiddlers/';

function putTiddler(name, content, tags = []) {
GM_log('new tiddler', name, tags);
GM_xmlhttpRequest({
method: 'PUT',
timeout: 2000,
url: putTiddlerUrl + name,
headers: {
'Content-type': 'application/json',
'X-Requested-With': 'TiddlyWiki',
},
data: JSON.stringify({
'title': name,
'text': content,
'tags': tags,
'type': 'text/x-markdown',
}),
onerror: (res) => {
GM_log('put tiddler error', res);
},
});
}

function listenMxEvent(evName, listener) {
document.addEventListener(evName, function(e) {
// 注:有的事件会带有消息,消息为 JSON 字符串
const msg = JSON.parse(e.detail || '{}');
listener(msg);
})
}

listenMxEvent('mx-wc.clipped', function(msg) {
if (!msg.clipping || !msg.clipping.info || !msg.clipping.tasks) {
return;
}
const info = msg.clipping.info;
if (info.format !== 'md' && info.format !== 'markdown') {
GM_log('not support clip type: ', info);
return;
}
for (const task of msg.clipping.tasks) {
if (task.taskType === 'mainFileTask') {
putTiddler(info.title, task.text, info.tags);
}
}
});
})();

MaoXian配置

存储设置

必须是 浏览器Markdown

裁剪目录

修改下最好放在一个父目录里,类似 images/$TITLE

这样可以直接ln -s images这个目录到tiddlers的父目录下


Tiddlywiki添加剪藏和本地图片
https://back.pub/post/tutorial-tiddlywiki-webclipper/
作者
Dash
发布于
2021年4月16日
许可协议