Added 'Git' element gathering information from forgejo and displaying it. Added language-map dependency.
This commit is contained in:
parent
364a680894
commit
b2e94296dd
8 changed files with 244 additions and 3 deletions
7
package-lock.json
generated
7
package-lock.json
generated
|
@ -11,6 +11,7 @@
|
||||||
"@jamescoyle/svelte-icon": "^0.1.1",
|
"@jamescoyle/svelte-icon": "^0.1.1",
|
||||||
"@mdi/js": "^7.4.47",
|
"@mdi/js": "^7.4.47",
|
||||||
"animejs": "^3.2.2",
|
"animejs": "^3.2.2",
|
||||||
|
"language-map": "^1.5.0",
|
||||||
"svelte2tsx": "^0.7.35"
|
"svelte2tsx": "^0.7.35"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
@ -1139,6 +1140,12 @@
|
||||||
"node": ">=6"
|
"node": ">=6"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/language-map": {
|
||||||
|
"version": "1.5.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/language-map/-/language-map-1.5.0.tgz",
|
||||||
|
"integrity": "sha512-n7gFZpe+DwEAX9cXVTw43i3wiudWDDtSn28RmdnS/HCPr284dQI/SztsamWanRr75oSlKSaGbV2nmWCTzGCoVg==",
|
||||||
|
"license": "MIT"
|
||||||
|
},
|
||||||
"node_modules/locate-character": {
|
"node_modules/locate-character": {
|
||||||
"version": "3.0.0",
|
"version": "3.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/locate-character/-/locate-character-3.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/locate-character/-/locate-character-3.0.0.tgz",
|
||||||
|
|
|
@ -24,6 +24,7 @@
|
||||||
"@jamescoyle/svelte-icon": "^0.1.1",
|
"@jamescoyle/svelte-icon": "^0.1.1",
|
||||||
"@mdi/js": "^7.4.47",
|
"@mdi/js": "^7.4.47",
|
||||||
"animejs": "^3.2.2",
|
"animejs": "^3.2.2",
|
||||||
|
"language-map": "^1.5.0",
|
||||||
"svelte2tsx": "^0.7.35"
|
"svelte2tsx": "^0.7.35"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
95
src/lib/components/git.svelte
Normal file
95
src/lib/components/git.svelte
Normal file
|
@ -0,0 +1,95 @@
|
||||||
|
<script>
|
||||||
|
import "$lib/css/base.css";
|
||||||
|
import "$lib/css/git.css";
|
||||||
|
|
||||||
|
import { mdiBookmark, mdiHistory, mdiDatabase } from "@mdi/js";
|
||||||
|
import SvgIcon from "@jamescoyle/svelte-icon";
|
||||||
|
import { load_api, getCommitCount } from "$lib/ts/load.ts";
|
||||||
|
import { get_size } from "$lib/ts/size.ts";
|
||||||
|
import { onMount } from "svelte";
|
||||||
|
import map from "language-map";
|
||||||
|
|
||||||
|
export let repo = "Etheryo/blog";
|
||||||
|
let loading = true;
|
||||||
|
let title = repo.split("/")[1];
|
||||||
|
let commitNum = 0;
|
||||||
|
let repoSize = 0;
|
||||||
|
let repoTopics = [];
|
||||||
|
let repoColors = [];
|
||||||
|
|
||||||
|
onMount(async () => {
|
||||||
|
// Gathering commit number
|
||||||
|
let response = await getCommitCount(repo);
|
||||||
|
if (response.error === null) commitNum = response.count;
|
||||||
|
|
||||||
|
// Gathering Repository data
|
||||||
|
response = await load_api(
|
||||||
|
`https://git.etheryo.fr/api/v1/repos/${repo}`,
|
||||||
|
);
|
||||||
|
if (response.error === null) {
|
||||||
|
repoSize = response.data.size;
|
||||||
|
repoTopics = response.data.topics;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Gathering Colors for code percentage
|
||||||
|
response = await load_api(
|
||||||
|
`https://git.etheryo.fr/api/v1/repos/${repo}/languages`,
|
||||||
|
);
|
||||||
|
let lang_percentage = 0.0;
|
||||||
|
let lang_total = 0;
|
||||||
|
if (response.error === null) {
|
||||||
|
for (const [lang, lang_val] of Object.entries(response.data)) {
|
||||||
|
lang_percentage = lang_val;
|
||||||
|
repoColors.push({ lang, lang_percentage });
|
||||||
|
lang_total += lang_val;
|
||||||
|
}
|
||||||
|
for (let i = 0; i < repoColors.length; i++) {
|
||||||
|
repoColors[i].lang_percentage =
|
||||||
|
Math.round(
|
||||||
|
(repoColors[i].lang_percentage / lang_total) * 1000,
|
||||||
|
) / 10;
|
||||||
|
}
|
||||||
|
console.log(repoColors);
|
||||||
|
loading = false;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<div
|
||||||
|
class="git-container flex-col"
|
||||||
|
role="button"
|
||||||
|
tabindex="0"
|
||||||
|
on:click={() => {
|
||||||
|
window.location.href = `https://git.etheryo.fr/${repo}`;
|
||||||
|
}}
|
||||||
|
on:keypress={() => {
|
||||||
|
window.location.href = `https://git.etheryo.fr/${repo}`;
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{#if !loading}
|
||||||
|
<div class="flex-row">
|
||||||
|
<SvgIcon type="mdi" path={mdiBookmark}></SvgIcon>
|
||||||
|
<div class="git-commit flex-row">
|
||||||
|
<p>{get_size(repoSize)}</p>
|
||||||
|
<SvgIcon type="mdi" path={mdiDatabase}></SvgIcon>
|
||||||
|
<p>{commitNum}</p>
|
||||||
|
<SvgIcon type="mdi" path={mdiHistory}></SvgIcon>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<h1>{title}</h1>
|
||||||
|
<div class="git-tag margin-bot-force flex-row">
|
||||||
|
{#each repoTopics as topic}
|
||||||
|
<span>{topic}</span>
|
||||||
|
{/each}
|
||||||
|
</div>
|
||||||
|
<div class="git-color flex-row">
|
||||||
|
{#each repoColors as cl}
|
||||||
|
<div
|
||||||
|
style={`width:${cl.lang_percentage}%; background-color: ${map[cl.lang].color};`}
|
||||||
|
></div>
|
||||||
|
{/each}
|
||||||
|
</div>
|
||||||
|
{:else}
|
||||||
|
<p>Loading...</p>
|
||||||
|
{/if}
|
||||||
|
</div>
|
|
@ -29,7 +29,7 @@ h2 {
|
||||||
--color-subtext: #413543;
|
--color-subtext: #413543;
|
||||||
--color-hiddentext: #AA94AD;
|
--color-hiddentext: #AA94AD;
|
||||||
--color-background: #F8F1F1;
|
--color-background: #F8F1F1;
|
||||||
--color-code: #ECE6F1;
|
--color-code: #dcd4e2;
|
||||||
--color-pill: #D0D4CA;
|
--color-pill: #D0D4CA;
|
||||||
|
|
||||||
--palette-pink: #ad62aa;
|
--palette-pink: #ad62aa;
|
||||||
|
@ -53,8 +53,8 @@ h2 {
|
||||||
--border-max: 2rem;
|
--border-max: 2rem;
|
||||||
--profile-content-width-max: 40rem;
|
--profile-content-width-max: 40rem;
|
||||||
--profile-content-width-min: 36rem;
|
--profile-content-width-min: 36rem;
|
||||||
--content-width: 50rem;
|
--content-width: 60rem;
|
||||||
--content-height: 52rem;
|
--content-height: 55rem;
|
||||||
|
|
||||||
--width-min-desktop: 1275px;
|
--width-min-desktop: 1275px;
|
||||||
--width-mobile: 875px;
|
--width-mobile: 875px;
|
||||||
|
|
75
src/lib/css/git.css
Normal file
75
src/lib/css/git.css
Normal file
|
@ -0,0 +1,75 @@
|
||||||
|
.git-container {
|
||||||
|
background-image: var(--background-light);
|
||||||
|
box-shadow: rgba(79, 50, 93, 0.25) 0px 30px 60px -12px, rgba(0, 0, 0, 0.3) 0px 18px 36px -18px;
|
||||||
|
border-radius: 1rem;
|
||||||
|
width: calc(var(--content-width)/3);
|
||||||
|
height: 10rem;
|
||||||
|
cursor: pointer;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
.git-container svg {
|
||||||
|
width: 3rem;
|
||||||
|
height: auto;
|
||||||
|
transform: translate(-2px, -8px);
|
||||||
|
color: var(--color-subtext);
|
||||||
|
margin-bottom: 0;
|
||||||
|
padding-bottom: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.git-container h1 {
|
||||||
|
font-family: "JetBrains Mono";
|
||||||
|
font-weight: 800;
|
||||||
|
font-size: 1.4rem;
|
||||||
|
margin: 1rem;
|
||||||
|
margin-top: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.git-commit {
|
||||||
|
margin-left: auto;
|
||||||
|
border-radius: 1rem;
|
||||||
|
margin-right: 0.3rem;
|
||||||
|
transition: var(--transition);
|
||||||
|
}
|
||||||
|
|
||||||
|
.git-commit:hover {
|
||||||
|
background-color: var(--color-code);
|
||||||
|
}
|
||||||
|
|
||||||
|
.git-commit svg {
|
||||||
|
transform: translate(0);
|
||||||
|
width: 2rem;
|
||||||
|
margin-left: 0.3rem;
|
||||||
|
margin-right: 0.3rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.git-commit p {
|
||||||
|
color: var(--color-subtext);
|
||||||
|
font-family: "JetBrains Mono";
|
||||||
|
margin: 0;
|
||||||
|
margin-left: 0.6rem;
|
||||||
|
user-select: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.git-tag span {
|
||||||
|
color: var(--color-text);
|
||||||
|
background-color: var(--color-pill);
|
||||||
|
font-family: "JetBrains Mono";
|
||||||
|
font-weight: 500;
|
||||||
|
font-size: 0.8rem;
|
||||||
|
margin-bottom: 1rem;
|
||||||
|
margin-left: 0.8rem;
|
||||||
|
padding: 0.4rem;
|
||||||
|
border-radius: var(--border-min);
|
||||||
|
}
|
||||||
|
|
||||||
|
.git-color {
|
||||||
|
height: 1rem;
|
||||||
|
width: 100%;
|
||||||
|
background-color: red;
|
||||||
|
}
|
||||||
|
|
||||||
|
.git-color > div {
|
||||||
|
height: 100%;
|
||||||
|
|
||||||
|
}
|
43
src/lib/ts/load.ts
Normal file
43
src/lib/ts/load.ts
Normal file
|
@ -0,0 +1,43 @@
|
||||||
|
export async function load_api<T = any>(url: string): Promise<{
|
||||||
|
data: T | null;
|
||||||
|
error: Error | null;
|
||||||
|
}> {
|
||||||
|
let data: T | null = null;
|
||||||
|
let error: Error | null = null;
|
||||||
|
|
||||||
|
try {
|
||||||
|
const res = await fetch(url);
|
||||||
|
if (!res.ok) throw new Error(`Failed to fetch: ${res.status} ${res.statusText}`);
|
||||||
|
data = await res.json();
|
||||||
|
} catch (err) {
|
||||||
|
error = err instanceof Error ? err : new Error('Unknown error');
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
data,
|
||||||
|
error,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function getCommitCount(repo: string): Promise<{
|
||||||
|
count: Number | null;
|
||||||
|
error: Error | null;
|
||||||
|
}> {
|
||||||
|
let error = null;
|
||||||
|
let pageCount = null;
|
||||||
|
|
||||||
|
try {
|
||||||
|
const res = await fetch(`https://git.etheryo.fr//api/v1/repos/${repo}/commits?limit=1&page=1`);
|
||||||
|
if (!res.ok) throw new Error(`Failed to fetch: ${res.status} ${res.statusText}`);
|
||||||
|
else pageCount = res.headers.get('X-Pagecount');
|
||||||
|
}
|
||||||
|
catch (err) {
|
||||||
|
error = err instanceof Error ? err : new Error('Unknown error');
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
count: pageCount ? parseInt(pageCount) : null,
|
||||||
|
error: error,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
16
src/lib/ts/size.ts
Normal file
16
src/lib/ts/size.ts
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
export function get_size(kbytes: number): string {
|
||||||
|
if (kbytes < 1024) {
|
||||||
|
return `${kbytes} KiB`;
|
||||||
|
}
|
||||||
|
|
||||||
|
const units = ["MiB", "GiB", "TiB"];
|
||||||
|
let size = kbytes / 1024;
|
||||||
|
let unitIndex = 0;
|
||||||
|
|
||||||
|
while (size >= 1024 && unitIndex < units.length - 1) {
|
||||||
|
size /= 1024;
|
||||||
|
unitIndex++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return `${Math.round(size)} ${units[unitIndex]}`;
|
||||||
|
}
|
|
@ -5,6 +5,7 @@
|
||||||
import CoverImg from "$lib/components/cover-img.svelte";
|
import CoverImg from "$lib/components/cover-img.svelte";
|
||||||
import Person from "$lib/components/person.svelte";
|
import Person from "$lib/components/person.svelte";
|
||||||
import Project from "$lib/components/project.svelte";
|
import Project from "$lib/components/project.svelte";
|
||||||
|
import Git from "$lib/components/git.svelte";
|
||||||
|
|
||||||
import topics from "$lib/ts/topic.ts";
|
import topics from "$lib/ts/topic.ts";
|
||||||
|
|
||||||
|
@ -57,4 +58,7 @@
|
||||||
<div class="section">
|
<div class="section">
|
||||||
<h1>{hubjson.lab}</h1>
|
<h1>{hubjson.lab}</h1>
|
||||||
</div>
|
</div>
|
||||||
|
<Git repo="Etheryo/blog"/>
|
||||||
|
<Git repo="INSA/assembly_project"/>
|
||||||
|
<Git repo="Etheryo/curriculum-vitae"/>
|
||||||
</div>
|
</div>
|
||||||
|
|
Loading…
Add table
Reference in a new issue