剪藏这里使用的是MaoXian Web Clipper
(以下简称MWC
),这个浏览器插件非常好用,支持Chrome和Firefox
Tiddlywiki
(以下简称TW
)作为一个免费的知识库也是非常棒的,如果希望快速开始可以参照林一二大佬的模版和教程
但是在TW
使用过程中也有两个问题一直困扰着我:
- 图片只能嵌入,导致单html巨大
- 无法通过简单的操作收藏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
和这个油猴脚本。目前存在的已知问题如下
MWC
的目录无用(无法映射到TW
),标签会直接添加到TW
,所以这个问题不大
- 剪切的文章会保存两份,一份在本地目录,一份在
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
|
(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) { 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的父目录下