// ==UserScript==
// @name 语雀知识库列表
// @namespace http://tampermonkey.net/
// @version 0.9
// @description 快速切换语雀知识库,请将脚本内所有的 itviewer 替换为你的用户名,token 替换为你的 Access Token
// @author itviewer
// @match https://www.yuque.com/itviewer/*
// @license MIT
// @grant GM_xmlhttpRequest
// @grant GM_addStyle
// @connect *
// @downloadURL https://update.greasyfork.icu/scripts/455661/%E8%AF%AD%E9%9B%80%E7%9F%A5%E8%AF%86%E5%BA%93%E5%88%97%E8%A1%A8.user.js
// @updateURL https://update.greasyfork.icu/scripts/455661/%E8%AF%AD%E9%9B%80%E7%9F%A5%E8%AF%86%E5%BA%93%E5%88%97%E8%A1%A8.meta.js
// ==/UserScript==
(function() {
'use strict';
// let url = window.location.href;
// console.log(url)
GM_addStyle(".selection-helper-toolbar,#present-btn,.lake-title-marks-add-control,.book-title-marks-input > span { display: none !important; }");
GM_addStyle('#ai-assistant-btn,div[class^="ViewerHeader-module_offlineButton"],#siteTipGuide > div:last-child { display: none;}');
function getRepos() {
let url = 'https://www.yuque.com/api/v2/users/itviewer/repos'
let token = 'RSqVJxC0TLBhL6NDGBHELXRjGOsYcLkb76Sy2cNB' // 语雀开发者 token,建议最小权限
GM_xmlhttpRequest({
method: "GET",
url: url,
headers: {
"X-Auth-Token": token
},
responseType: 'json',
onerror: function(response) { console.log("获取知识库失败") },
ontimeout: function(response) { console.log("获取知识库超时") },
onload: function(response) {
if (response.response.status == 304 || response.response.data !== undefined) {
renderSidebar(response.response.data);
renderButton();
} else {
console.log(response.responseText);
}
}
});
}
function renderSidebar(repos) {
const ul = document.createElement("ul");
ul.setAttribute(
"class",
"ant-menu aside-container menu-site ant-menu-light ant-menu-root ant-menu-inline"
);
ul.setAttribute(
"style",
"height: 90%; overflow-y: auto"
);
const fragment = document.createDocumentFragment();
if (Array.isArray(repos) && repos.length) {
repos.forEach((item)=> {
// console.log(item.name + ' ' + item.namespace);
const li = document.createElement("li");
li.setAttribute("class", `ant-menu-item ant-menu-item-only-child`);
li.setAttribute("style", "width: 100%; height: 25px; line-height: 25px;");
li.innerHTML = `${item.name}`;
fragment.appendChild(li);
})
}
ul.appendChild(fragment);
const container = document.createElement("div");
container.setAttribute("id", "reposidebar");
container.setAttribute(
"style",
"display: none; overflow: hidden; position: fixed; top: 50px; left: 0; width: 280px; height: 100%; max-height: 100vh; z-index: 999;"
);
container.appendChild(ul);
document.body.appendChild(container);
}
function renderButton() {
const reposidebar = document.querySelector("#reposidebar");
const header = document.querySelector("#asideHead>div:first-child");
// console.log(header);
const button = document.createElement("button");
button.setAttribute("class", `ant-btn ant-btn-primary`);
button.innerHTML = '显示知识库列表';
button.onclick = function() {
if (reposidebar.style.display == 'none') {
reposidebar.style.display="inline";
button.innerHTML = '隐藏知识库列表';
} else {
reposidebar.style.display="none";
button.innerHTML = '显示知识库列表';
}
};
header.appendChild(button);
}
// 虽然默认在文档加载完后执行,但我们需要的网页内容 header 是加载完动态创建的
setTimeout(function(){
getRepos();
}, 500);
})();