mirror of
https://github.com/fastapi/sqlmodel.git
synced 2025-08-14 17:41:37 +08:00
🍱 Add custom CSS and JS for docs
This commit is contained in:
113
docs/js/custom.js
Normal file
113
docs/js/custom.js
Normal file
@ -0,0 +1,113 @@
|
||||
function setupTermynal() {
|
||||
document.querySelectorAll(".use-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() {
|
||||
setupTermynal()
|
||||
}
|
||||
|
||||
main()
|
Reference in New Issue
Block a user