菜单导航

探索发现
导航站增加导出为书签格式文件功能
探索发现

导航站增加导出为书签格式文件功能

NoiseNoise
2024-10-07

说明

此次调整是为提高静态导航的自由度及降低我的网站的过量访问增加的这个功能,同时降低站长角色为仅收录推送、定期维护站点的角色,你可以在导航站的右下角侧边图标中选择一键导出下载为浏览器书签格式文件,你可以通过近期收录的标签星球等精选app将书签设置为自己的浏览器新标签页

1728305924402

附:导航本身是为个人及所需要了解不同站点的人群而服务,本次增加的功能为对其部署运行的API发送请求并接受新文件,路由为:”/api/export-bookmarks“,同时你也可以在导航中找到检测失效网站的记录,记录会保留,如有误删的你也可以随时提醒我。

此次是在nav-manage这个项目上所增加的新路由,更新文件为本地及云服务器server文件,更新代码为:

// 输出书签格式的目录
const BOOKMARKS_OUTPUT_DIR = path.resolve('/请修改为你的文件实际路径/bookmarks/');

// 确保目录存在的辅助函数
async function ensureDirectoryExists(dirPath) {
try {
await fs.promises.access(dirPath);
} catch (error) {
if (error.code === 'ENOENT') {
await fs.promises.mkdir(dirPath, { recursive: true });
} else {
throw error;
}
}
}

// 删除文件的辅助函数
async function deleteOldBookmarks(dirPath) {
const files = await fs.promises.readdir(dirPath);
const now = Date.now();

for (const file of files) {
    const filePath = path.join(dirPath, file);
    const stats = await fs.promises.stat(filePath);

    // 检查文件是否超过 3 分钟(180000 毫秒)
    if (now - stats.mtimeMs > 180000) {
        await fs.promises.unlink(filePath);
        console.log(`Deleted old bookmark file: ${filePath}`);
    }
}

}

// 启动定时器每 3 分钟检查并删除旧文件
setInterval(() => {
deleteOldBookmarks(BOOKMARKS_OUTPUT_DIR).catch(err => console.error('Error deleting old bookmarks:', err));
}, 180000); // 180000 毫秒 = 3 分钟

// 导出为书签格式的路由
app.get('/api/export-bookmarks', async (req, res) => {
console.log('Received request for export-bookmarks:', req.query);
const { outputDir } = req.query; // 从查询参数获取输出目录
const dataDir = path.resolve('请修改为你的文件实际路径/data/');
const bookmarks = [];

// 确保输出目录存在
const outputPath = path.resolve(outputDir || BOOKMARKS_OUTPUT_DIR);
await ensureDirectoryExists(outputPath);

const yamlFiles = await fs.promises.readdir(dataDir);

for (const file of yamlFiles) {
    if (file.endsWith('.yaml') || file.endsWith('.yml')) {
        const filePath = path.join(dataDir, file);
        const yamlContent = await fs.promises.readFile(filePath, 'utf8');
        const yamlData = yaml.load(yamlContent);

        yamlData.forEach(category => {
            // 添加一级标题
            const taxonomyTitle = category.taxonomy; 
            if (taxonomyTitle) {
                bookmarks.push({ title: taxonomyTitle, url: '', isHeader: true });
            }

            if (Array.isArray(category.links)) {
                category.links.forEach(link => {
                    bookmarks.push({ title: link.title, url: link.url });
                });
            }

            if (Array.isArray(category.list)) {
                category.list.forEach(subCategory => {
                    // 添加二级标题
                    const termTitle = subCategory.term; 
                    if (termTitle) {
                        bookmarks.push({ title: termTitle, url: '', isHeader: true });
                    }

                    if (Array.isArray(subCategory.links)) {
                        subCategory.links.forEach(link => {
                            bookmarks.push({ title: link.title, url: link.url });
                        });
                    }
                });
            }
        });
    }
}

// 生成书签 HTML
let bookmarkHtml = '<!DOCTYPE NETSCAPE-Bookmark-file-1>\n';
bookmarkHtml += '<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=UTF-8">\n';
bookmarkHtml += '<TITLE>Bookmarks</TITLE>\n<H1>Bookmarks</H1>\n<DL><p>\n';

bookmarks.forEach(bookmark => {
    if (bookmark.isHeader) {
        bookmarkHtml += `    <DT><H3 ADD_DATE="${Date.now()}">${bookmark.title}</H3>\n`;
    } else {
        bookmarkHtml += `    <DT><A HREF="${bookmark.url}">${bookmark.title}</A>\n`;
    }
});

bookmarkHtml += '</DL><p>';

// 写入书签文件
const outputFilename = `bookmarks_${Date.now()}.html`;
const fullOutputPath = path.join(outputPath, outputFilename);
await fs.promises.writeFile(fullOutputPath, bookmarkHtml, 'utf8');

// 直接下载生成的书签文件
res.download(fullOutputPath, outputFilename, (err) => {
    if (err) {
        console.error('Error downloading file:', err);
        res.status(500).send('文件下载失败');
    }
});

});

功能

一、导出导航站yml文件为浏览器书签格式html文件,带有导航站本身的一级目录标题及二级目录标题并设置输出路径下生成的文件自动3分钟删除

二、导入浏览器书签格式文件并增加到原始yml文件

还未增加到前端扩展中,也会随时间推移再调整,你也可以自行随意调整更改

版权声明

本文为「Noise」原创内容或编译整理;除特别说明外,文中图片并非个人手绘,可能来源于网络、AI 生成、截图等,后期使用 PhotoMator / Procreate 进行处理,仅用于学习与交流。如涉及版权或来源标注不全,请联系处理。未经授权,禁止用于商业用途,禁止抹除水印。转载请注明出处与链接并保留本声明。

...

评论 (0)

评论功能加载中...
Noise

Noise

执迷不悟

推荐阅读

Memory-不负时光摄影相册程序
探索发现

Memory-不负时光摄影相册程序

Noise | 2025-08-10

简介

一个瀑布流摄影图库,也是专为摄影师做的独立网络相册程序,它是基于[Moment](https://github.com/Robert-Stackflow/M

139
AI Movie Clip - 基于python的智能视频剪辑系统
探索发现

AI Movie Clip - 基于python的智能视频剪辑系统

Noise | 2025-08-10

一个基于人工智能的自动视频剪辑系统,能够自动分析视频内容并根据用户需求生成编辑后的视频。该项目为视频剪辑mcp提供了一个新的研究方向,它使用python脚本来分

75
CrossPaste-跨设备的粘贴神器,在任意设备间复制粘贴
探索发现

CrossPaste-跨设备的粘贴神器,在任意设备间复制粘贴

Noise | 2025-07-26

此前已介绍过多个粘贴软件了,如PasteBar等,它们各有所长,但有没有适合不同设备之间使用的呢,有的,CrossPaste就很好满足了跨设备同时复制粘贴的问题

特性

  • 🔄 实时共享:设备之间实时共享粘贴板内容,操作自然流畅。
  • 🖥️ 跨平台统一体验:Mac、Win
94

标签