1
0
mirror of synced 2025-12-22 03:16:52 -05:00
Files
docs/script/search/popular-pages.js
2021-10-26 10:08:14 -07:00

41 lines
1.7 KiB
JavaScript

import fs from 'fs/promises'
const POPULAR_PAGES_JSON = './lib/search/popular-pages.json'
export default async function getPopularPages(redirects) {
const popularPages = {}
try {
const popularPagesRaw = await fs.readFile(POPULAR_PAGES_JSON, 'utf-8')
let biggestCount = 0
for (const line of popularPagesRaw.split('\n')) {
if (!line.trim()) continue
const { path_article: path, path_count: count } = JSON.parse(line)
// The root page or any other potentially dirty record that is empty.
if (!path) continue
// This is safe because the `POPULAR_PAGES_JSON` always lists the
// most popular first.
if (!biggestCount) biggestCount = count
// Don't bother writing massively long floating point numbers
// because reducing it makes the JSON records smaller and we don't
// need any more precision than 7 significant figures.
const ratio = Number((count / biggestCount).toFixed(7))
// The reason we're heeding redirects is because it's very possible
// that the `POPULAR_PAGES_JSON` file is older/"staler" than the
// content itself.
// Imaging our analytics recorded that `/en/foo` had 1,234 pageviews,
// and someone goes and... `git mv content/foo content/bar` plus
// adding `redirect_from: - /foo` into the front-matter.
// Then, by using the redirects first, we can maintain that popularity
// by now "pretending" that it's `/en/bar` that has 1,234 pageviews.
popularPages[redirects[path] || path] = ratio
}
} catch (error) {
if (error.code === 'ENOENT') {
console.warn(`The file ${POPULAR_PAGES_JSON} can not be found.`)
} else {
throw error
}
}
return popularPages
}