Files snapshot from wiki-and-tasks
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
a62ca2 Tucker McKnight
87bcc2 Tucker McKnight
4f267d Tucker McKnight
87bcc2 Tucker McKnight
7f8822 Tucker McKnight
7f8822 Tucker McKnight
7f8822 Tucker McKnight
7f8822 Tucker McKnight
87bcc2 Tucker McKnight
073785 Tucker McKnight
073785 Tucker McKnight
073785 Tucker McKnight
073785 Tucker McKnight
073785 Tucker McKnight
073785 Tucker McKnight
073785 Tucker McKnight
8df7e5 Tucker McKnight
8df7e5 Tucker McKnight
8df7e5 Tucker McKnight
8df7e5 Tucker McKnight
073785 Tucker McKnight
073785 Tucker McKnight
073785 Tucker McKnight
073785 Tucker McKnight
073785 Tucker McKnight
073785 Tucker McKnight
073785 Tucker McKnight
073785 Tucker McKnight
073785 Tucker McKnight
073785 Tucker McKnight
073785 Tucker McKnight
073785 Tucker McKnight
073785 Tucker McKnight
073785 Tucker McKnight
073785 Tucker McKnight
073785 Tucker McKnight
073785 Tucker McKnight
073785 Tucker McKnight
073785 Tucker McKnight
073785 Tucker McKnight
073785 Tucker McKnight
87bcc2 Tucker McKnight
7f8822 Tucker McKnight
7f8822 Tucker McKnight
7f8822 Tucker McKnight
be0819 Tucker McKnight
7f8822 Tucker McKnight
7f8822 Tucker McKnight
7f8822 Tucker McKnight
7f8822 Tucker McKnight
4f267d Tucker McKnight
073785 Tucker McKnight
073785 Tucker McKnight
073785 Tucker McKnight
8df7e5 Tucker McKnight
8df7e5 Tucker McKnight
8df7e5 Tucker McKnight
4f267d Tucker McKnight
4f267d Tucker McKnight
4f267d Tucker McKnight
073785 Tucker McKnight
073785 Tucker McKnight
073785 Tucker McKnight
612263 Tucker McKnight
073785 Tucker McKnight
073785 Tucker McKnight
073785 Tucker McKnight
073785 Tucker McKnight
7f8822 Tucker McKnight
7f8822 Tucker McKnight
4f267d Tucker McKnight
7f8822 Tucker McKnight
7f8822 Tucker McKnight
7f8822 Tucker McKnight
4f267d Tucker McKnight
7f8822 Tucker McKnight
7f8822 Tucker McKnight
7f8822 Tucker McKnight
4f267d Tucker McKnight
4f267d Tucker McKnight
7f8822 Tucker McKnight
7f8822 Tucker McKnight
7f8822 Tucker McKnight
ada2ba Tucker McKnight
ada2ba Tucker McKnight
ada2ba Tucker McKnight
ada2ba Tucker McKnight
ada2ba Tucker McKnight
ada2ba Tucker McKnight
073785 Tucker McKnight
7f8822 Tucker McKnight
7f8822 Tucker McKnight
4f267d Tucker McKnight
7f8822 Tucker McKnight
7f8822 Tucker McKnight
7f8822 Tucker McKnight
7f8822 Tucker McKnight
7f8822 Tucker McKnight
bd55d1 Tucker McKnight
7f8822 Tucker McKnight
7f8822 Tucker McKnight
7f8822 Tucker McKnight
4f267d Tucker McKnight
import { type Repository } from '../src/dataTypes.ts'
import { NavHelper } from './helpers/nav.ts'
export default async (eleventyConfig: any, data: any, nav: ReturnType<typeof NavHelper>) => {
const repo: Repository = data.currentRepo
const branch: Repository['branches'][0] = data.currentBranch
const renderContentIfAvailable = eleventyConfig.getFilter("renderContentIfAvailable")
const getReadMe = eleventyConfig.getFilter("getReadMe")
const latestCommit = repo.commits.get(branch.head)
const latestCommitMessage = latestCommit.message.length > 72
? latestCommit.message.split('\n')[0].substr(0, 72) + '...'
: latestCommit.message
const languageCounts = branch.fileList.reduce((counts, currentFile) => {
const fileParts = currentFile.split(".")
const fileExtension = fileParts[fileParts.length - 1]
// todo: add more ignoreable extensions
if (fileExtension === 'gitignore') {
return counts
}
counts.set(fileExtension, (counts.get(fileExtension) + 1) || 1)
return counts
}, new Map<string, number>())
// todo: this is probably broken for repos that use fewer than 6 languages
let languagePercentages: Array<[string, number]> = []
const total = branch.fileList.length
for (const entry of languageCounts) {
languagePercentages.push([entry[0], entry[1] / total])
}
languagePercentages.sort((a, b) => {
return b[1] - a[1]
})
const topLanguagePercentages = languagePercentages.slice(0, 5)
const otherLanguagePercent = languagePercentages.slice(6, languagePercentages.length - 6).reduce((sum, current) => {
return sum + current[1]
}, 0)
const largestPercent = Math.max(...topLanguagePercentages.map(tuple => tuple[1]), otherLanguagePercent)
return `
<div class="row">
<div class="col">
<div class="px-4 pt-3 bezel-header">
<div class="row">
<div class="col-12 col-xl-6">
<h1 class="display-2 text-white"><em>${repo.name}</em></h1>
${repo.description ? '<p class="text-white fs-5">' + repo.description + '</p>' : ''}
</div>
<div class="col-12 col-xl-6 d-flex flex-column justify-content-around">
<div class="row flex-grow-1 align-items-stretch language-percent-row">
<div class="col-12 d-flex align-items-stretch">
<div class="d-flex flex-grow-1 flex-nowrap">
${topLanguagePercentages.map((percentTuple) => `<div class='language-col flex-grow-1 overflow-hidden'><div class="language-name text-light font-monospace">${percentTuple[0]}</div><div class="language-percent" style="flex-grow: ${percentTuple[1] / largestPercent}"></div></div>`).join('')}
<div class='language-col flex-grow-1 overflow-hidden'><div class="language-name text-light font-monospace">other</div><div class="language-percent" style="flex-grow: ${otherLanguagePercent / largestPercent}"></div></div>
</div>
</div>
</div>
<div class="row align-items-center">
<div class="col-12">
<div class="header-button-container">
<button class="btn btn-info btn-lg dropdown-toggle clone-popover-btn">Clone</button>
${nav.homepageButtons.map((buttonConfig) => {
return `<a class="btn btn-outline-info btn-lg shadow-none" href="${buttonConfig.url}" ${buttonConfig.newTab ? 'target="_blank"' : ''}>${buttonConfig.text}${buttonConfig.newTab ? ' <span>⧉</span>' : ''}</a>`
}).join('')}
</div>
</div>
</div>
</div>
</div>
<noscript>
<div class="row mt-2">
<div class="col">
<p class="font-monospace text-white">
Clone URL: ${repo.cloneUrl}
</p>
</div>
</div>
</noscript>
<div class="row mt-2">
<div class="col">
<a class="btn btn-outline-info badge shadow-none me-2" href="${nav.repoCurrentBranchRssFeed()}">
<div class="d-flex">
<img src="${nav.rootPath()}frontend/img/rss-icon.svg" style="width: 11px; margin-right: 5px;" />RSS
</div>
</a>
<p class="font-monospace text-white mb-2 d-inline-block">
Latest commit: ${latestCommit.date.toDateString()} <a class="fw-bold link-info" href="${nav.repoBranchCommitsBase()}${latestCommit.hash}">${latestCommit.hash.substr(0, 6)}</a> ${latestCommitMessage}
</p>
</div>
</div>
</div>
</div>
</div>
<div class="row my-4 mx-1">
<div class="col">
${await renderContentIfAvailable(await getReadMe(repo.name, branch.name), branch.name)}
</div>
</div>
`
}