150 lines
5.7 KiB
JavaScript
150 lines
5.7 KiB
JavaScript
|
const div = document.querySelector('.github-topic-projects')
|
||
|
|
||
|
async function getDataBatch(page) {
|
||
|
const response = await fetch(`https://api.github.com/search/repositories?q=topic:bankfind&per_page=100&page=${page}`, { headers: { Accept: 'application/vnd.github.mercy-preview+json' } })
|
||
|
const data = await response.json()
|
||
|
return data
|
||
|
}
|
||
|
|
||
|
async function getData() {
|
||
|
let page = 1
|
||
|
let data = []
|
||
|
let dataBatch = await getDataBatch(page)
|
||
|
data = data.concat(dataBatch.items)
|
||
|
const totalCount = dataBatch.total_count
|
||
|
while (data.length < totalCount) {
|
||
|
page += 1
|
||
|
dataBatch = await getDataBatch(page)
|
||
|
data = data.concat(dataBatch.items)
|
||
|
}
|
||
|
return data
|
||
|
}
|
||
|
|
||
|
function setupTermynal() {
|
||
|
document.querySelectorAll(".termynal").forEach(node => {
|
||
|
node.style.display = "block";
|
||
|
new Termynal(node, {
|
||
|
lineDelay: 500
|
||
|
});
|
||
|
});
|
||
|
const progressLiteralStart = "---> 100%";
|
||
|
const promptLiteralStart = "$ ";
|
||
|
const customPromptLiteralStart = "# ";
|
||
|
const termynalActivateClass = "termy";
|
||
|
let termynals = [];
|
||
|
|
||
|
function createTermynals() {
|
||
|
document
|
||
|
.querySelectorAll(`.${termynalActivateClass} .highlight`)
|
||
|
.forEach(node => {
|
||
|
const text = node.textContent;
|
||
|
const lines = text.split("\n");
|
||
|
const useLines = [];
|
||
|
let buffer = [];
|
||
|
function saveBuffer() {
|
||
|
if (buffer.length) {
|
||
|
let isBlankSpace = true;
|
||
|
buffer.forEach(line => {
|
||
|
if (line) {
|
||
|
isBlankSpace = false;
|
||
|
}
|
||
|
});
|
||
|
dataValue = {};
|
||
|
if (isBlankSpace) {
|
||
|
dataValue["delay"] = 0;
|
||
|
}
|
||
|
if (buffer[buffer.length - 1] === "") {
|
||
|
// A last single <br> won't have effect
|
||
|
// so put an additional one
|
||
|
buffer.push("");
|
||
|
}
|
||
|
const bufferValue = buffer.join("<br>");
|
||
|
dataValue["value"] = bufferValue;
|
||
|
useLines.push(dataValue);
|
||
|
buffer = [];
|
||
|
}
|
||
|
}
|
||
|
for (let line of lines) {
|
||
|
if (line === progressLiteralStart) {
|
||
|
saveBuffer();
|
||
|
useLines.push({
|
||
|
type: "progress"
|
||
|
});
|
||
|
} else if (line.startsWith(promptLiteralStart)) {
|
||
|
saveBuffer();
|
||
|
const value = line.replace(promptLiteralStart, "").trimEnd();
|
||
|
useLines.push({
|
||
|
type: "input",
|
||
|
value: value
|
||
|
});
|
||
|
} else if (line.startsWith("// ")) {
|
||
|
saveBuffer();
|
||
|
const value = "💬 " + line.replace("// ", "").trimEnd();
|
||
|
useLines.push({
|
||
|
value: value,
|
||
|
class: "termynal-comment",
|
||
|
delay: 0
|
||
|
});
|
||
|
} else if (line.startsWith(customPromptLiteralStart)) {
|
||
|
saveBuffer();
|
||
|
const promptStart = line.indexOf(promptLiteralStart);
|
||
|
if (promptStart === -1) {
|
||
|
console.error("Custom prompt found but no end delimiter", line)
|
||
|
}
|
||
|
const prompt = line.slice(0, promptStart).replace(customPromptLiteralStart, "")
|
||
|
let value = line.slice(promptStart + promptLiteralStart.length);
|
||
|
useLines.push({
|
||
|
type: "input",
|
||
|
value: value,
|
||
|
prompt: prompt
|
||
|
});
|
||
|
} else {
|
||
|
buffer.push(line);
|
||
|
}
|
||
|
}
|
||
|
saveBuffer();
|
||
|
const div = document.createElement("div");
|
||
|
node.replaceWith(div);
|
||
|
const termynal = new Termynal(div, {
|
||
|
lineData: useLines,
|
||
|
noInit: true,
|
||
|
lineDelay: 500
|
||
|
});
|
||
|
termynals.push(termynal);
|
||
|
});
|
||
|
}
|
||
|
|
||
|
function loadVisibleTermynals() {
|
||
|
termynals = termynals.filter(termynal => {
|
||
|
if (termynal.container.getBoundingClientRect().top - innerHeight <= 0) {
|
||
|
termynal.init();
|
||
|
return false;
|
||
|
}
|
||
|
return true;
|
||
|
});
|
||
|
}
|
||
|
window.addEventListener("scroll", loadVisibleTermynals);
|
||
|
createTermynals();
|
||
|
loadVisibleTermynals();
|
||
|
}
|
||
|
|
||
|
async function main() {
|
||
|
if (div) {
|
||
|
data = await getData()
|
||
|
div.innerHTML = '<ul></ul>'
|
||
|
const ul = document.querySelector('.github-topic-projects ul')
|
||
|
data.forEach(v => {
|
||
|
if (v.full_name === 'dpguthrie/bankfind') {
|
||
|
return
|
||
|
}
|
||
|
const li = document.createElement('li')
|
||
|
li.innerHTML = `<a href="${v.html_url}" target="_blank">★ ${v.stargazers_count} - ${v.full_name}</a> by <a href="${v.owner.html_url}" target="_blank">@${v.owner.login}</a>`
|
||
|
ul.append(li)
|
||
|
})
|
||
|
}
|
||
|
|
||
|
setupTermynal();
|
||
|
}
|
||
|
|
||
|
main()
|