text: const div = document.querySelector('.github-topic-projects')
  
  async function getDataBatch(page) {
      const response = await fetch(`https://api.github.com/search/repositories?q=topic:fastapi&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(".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} .codehilite`)
              .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 === 'tiangolo/fastapi') {
                  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()
  