🏠 Home 

戴森球蓝图 增强

Extend the website Dyson Sphere Blueprints

// ==UserScript==
// @name         戴森球蓝图 增强
// @namespace    https://blog.rhilip.info/
// @version      0.0.3
// @description  Extend the website Dyson Sphere Blueprints
// @author       Rhilip
// @match        https://www.dysonsphereblueprints.com/*
// @require      https://unpkg.com/[email protected]/dist/jquery.min.js
// @require      https://unpkg.com/[email protected]/dist/jszip.min.js
// @require      https://unpkg.com/[email protected]/dist/FileSaver.min.js
// @grant        none
// ==/UserScript==
(async function () {
'use strict';
// 清理文件名中的特殊字符
function sanitizeFileName(input) {
if (typeof input !== 'string') {
throw new Error('Input must be string');
}
return input
.replace(/[\/\?<>\\:\*\|":]/g, '_')
.replace(/[\x00-\x1f\x80-\x9f]/g, '_')
.replace(/^\.+$/, '_')
.replace(/^(con|prn|aux|nul|com[0-9]|lpt[0-9])(\..*)?$/i, '_')
.replace(/[\. ]+$/, '_');;
}
function getBlueprintNameFromAnother(another) {
return another.find('div.o-blueprint-card__content h2 a').text().trim();
}
function getBlueprintTextFromAnother(another) {
return another.find('button[data-clipboard-text]').data('clipboard-text');
}
function getBlueprintDataFromAnother(another) {
return [getBlueprintNameFromAnother(another), getBlueprintTextFromAnother(another)]
}
// 给列表的单个蓝图加上下载按钮
function addBlueprintDownloadBtn() {
$('.o-blueprint-card__copy').each(function () {
const that = $(this);
const blueprintString = that.data('clipboard-text');
const blueprintAnother = that.parents('li.o-blueprint-card');
const blueprintName = getBlueprintNameFromAnother(blueprintAnother);
const downloadBtn = $('<button class="o-blueprint-card__copy uj_added uj_download_this" style="left:80px">Download</button>');
downloadBtn.click(function () {
saveAs(new Blob([blueprintString]), `${sanitizeFileName(blueprintName)}.txt`);
})
if (blueprintAnother.find('button.uj_download_this').length === 0) {
that.after(downloadBtn);
}
})
}
function addDownloadThisPageBtn() {
const downloadThisPageBtn = $('<button class="o-blueprint-card__copy uj_added uj_download_page" style="position: static;">Download This Page</button>');
downloadThisPageBtn.click(function () {
const allBlueprintInThisPage = $('li.o-blueprint-card').map(function () {
return [getBlueprintDataFromAnother($(this))];
}).get();
if (allBlueprintInThisPage.length > 1) {
const jszip = new JSZip();
for (const getBlueprintDataFromAnother of allBlueprintInThisPage) {
const [blueprintName, blueprintString] = getBlueprintDataFromAnother
jszip.file(`${sanitizeFileName(blueprintName)}.txt`, blueprintString)
}
jszip.generateAsync({ type: "blob" })
.then(function (content) {
saveAs(content, "blueprint.zip");
});
} else {
const [blueprintName, blueprintString] = allBlueprintInThisPage[0];
saveAs(new Blob([blueprintString]), `${sanitizeFileName(blueprintName)}.txt`);
}
})
if ($('button.uj_download_page').length === 0) {
$('div.t-blueprint-list').prepend(downloadThisPageBtn);
}
}
function main() {
$('.uj_added').remove();  // 清空所有我们添加的DOM,防止 turbolinks 切换时出现重复按钮
if (
location.pathname === '/' // 首页
|| (location.pathname === '/blueprints' && location.search.includes('search='))  // 搜索页
) {
console.log('首页以及蓝图搜索页');
addBlueprintDownloadBtn();
addDownloadThisPageBtn();
} else if (
location.pathname === '/collections'
) {
console.log('合集搜索页面');
// TODO 直接在合集搜索页面搜索下载整个合集
} else if (
location.pathname.startsWith('/blueprints/')
) {
console.log('蓝图详细页面');
const downloadBtn = $('<button class="t-blueprint__copy uj_added" style="margin-right: 10px;"><i class="fas fa-download"></i>Download</button>');
downloadBtn.click(function () {
const bpText = $('div.t-blueprint__blueprint > textarea').text();
const bpName = $('div.t-blueprint__title h2').text().trim();
saveAs(new Blob([bpText]), `${sanitizeFileName(bpName)}.txt`);
});
$('.t-blueprint__blueprint button.t-blueprint__copy').after(downloadBtn);
} else if (
location.pathname.startsWith('/collections/')
|| /^\/users(\/\d+)?\/blueprints/.test(location.pathname)  // 用户列表页(包括自己和他人)
) {
console.log('合集详细页面');
addBlueprintDownloadBtn();
addDownloadThisPageBtn();
}
}
// 运行主方法,并在页面切换时同样运行
main();
document.addEventListener("turbolinks:load", function () {
main();
})
})();