rank.tsimport Spinner from "https://deno.land/x/cli_spinners@v0.0.2/mod.ts";
interface ScrapboxPagesJson {
count: number;
pages: { title: string; charsCount: number }[];
}
const getList = (projectName: string, offset: number) => {
return fetch(
"https://scrapbox.io/api/pages/" +
projectName +
"/?limit=100&skip=" +
encodeURIComponent(offset),
).then((pageRes) => {
if (pageRes.ok) {
return pageRes.json();
} else {
return { pages: [] };
}
}).then((pageJson: ScrapboxPagesJson) => {
return pageJson.pages;
});
};
const allpagelist = (pjname: string) => {
const spinner = Spinner.getInstance();
spinner.start("Fetching All Page List...");
const projectName: string = pjname;
const marked: { title: string; charsCount: number }[] = [];
return fetch("https://scrapbox.io/api/pages/" + projectName).then(
(pageRes) => {
if (!pageRes.ok) {
throw Error;
}
return pageRes.json();
},
).then((pageJson: Readonly<ScrapboxPagesJson>) => {
const arrayRange = (start: number, stop: number, step: number) =>
Array.from(
{ length: (stop - start) / step + 1 },
(_, index) => start + index * step,
);
const getiter = arrayRange(0, pageJson.count, 100);
function getitertick():Promise<void>|void {
const element = getiter.shift();
if (typeof element == "undefined") {
return;
}
spinner.setText(
"Fetching All Page List...[" +
element.toString().padStart(pageJson.count.toString().length) +
"/" +
pageJson.count +
"]",
);
return getList(projectName, element).then((pages) => {
marked.push(...pages);
return getitertick();
});
}
return getitertick();
}).then(() => {
spinner.succeed("Fetched All Page List");
spinner.stop();
marked.sort((a, b) => b.charsCount - a.charsCount);
let scrapchar = "";
for (const element2 of marked.slice(0, 500)) {
scrapchar += " [" + element2.title + "] (" + element2.charsCount +
"文字)\n";
}
return scrapchar;
});
};
allpagelist("villagepump").then((a) => {
return Deno.writeTextFile(
"villagepumpsoko.txt",
a,
);
});