From 6e6fcb352254a4f48fe3d9415696255c2c3c8ef4 Mon Sep 17 00:00:00 2001 From: amiceli Date: Fri, 9 Jan 2026 21:48:38 +0100 Subject: [PATCH 01/12] chore: add start comand on just --- justfile | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/justfile b/justfile index f404524..e51e6c4 100644 --- a/justfile +++ b/justfile @@ -80,3 +80,9 @@ sync: clean_smala: php artisan config:clear php artisan config:cache + +start: + just up + just up_db + just up_adminer + just open From 0eb047a1a8e0a402c4cb778c9efffad38fdfdfc8 Mon Sep 17 00:00:00 2001 From: amiceli Date: Fri, 9 Jan 2026 23:24:55 +0100 Subject: [PATCH 02/12] feat: add some langs data --- app/Console/Commands/ProLangAssets.php | 30 +++++++++++++++++++++++--- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git a/app/Console/Commands/ProLangAssets.php b/app/Console/Commands/ProLangAssets.php index 99b7fde..74969fe 100644 --- a/app/Console/Commands/ProLangAssets.php +++ b/app/Console/Commands/ProLangAssets.php @@ -846,7 +846,9 @@ function member ), 'Boo' => array(), 'Cobra' => array(), - 'CoffeeScript' => array(), + 'CoffeeScript' => array( + 'rawCodeLink' => 'https://raw.githubusercontent.com/acmeism/RosettaCodeData/refs/heads/main/Task/Fibonacci-sequence/CoffeeScript/fibonacci-sequence-2.coffee', + ), 'Commodore BASIC' => array(), 'Compiler Description Language' => array(), 'Component Pascal' => array(), @@ -1050,7 +1052,27 @@ function member ), 'GPSS' => array(), 'Hamilton C shell' => array(), - 'Io' => array(), + 'Io' => array( + 'mainRepository' => 'https://github.com/IoLanguage/io?tab=readme-ov-file#example-code', + 'rawCode' => <<<'EOD' + #!/usr/bin/env io + + Account := Object clone do( + balance := 0.0 + deposit := method(v, balance = balance + v) + show := method(write("Account balance: $", balance, "\n")) + ) + + "Inital: " print + Account show + + "Depositing $10\n" print + Account deposit(10.0) + + "Final: " print + Account show + EOD + ), 'JOSS II' => array(), 'Jacquard machine' => array(), 'KornShell' => array(), @@ -1092,7 +1114,9 @@ function member 'occam' => array( 'rawCodeLink' => 'https://raw.githubusercontent.com/leachim6/hello-world/refs/heads/main/o/occam.occam', ), - 'Dart' => array(), + 'Dart' => array( + 'rawCodeLink' => 'https://raw.githubusercontent.com/acmeism/RosettaCodeData/refs/heads/main/Task/Fibonacci-sequence/Dart/fibonacci-sequence-4.dart', + ), 'Common Lisp' => array(), 'Windows PowerShell' => array(), ); From b98787ed0c57f33e9c909be2e7afe8d467d2b7b5 Mon Sep 17 00:00:00 2001 From: amiceli Date: Fri, 9 Jan 2026 23:25:38 +0100 Subject: [PATCH 03/12] feat: add prolang parents and cbildren data / types --- app/Http/Controllers/MainController.php | 2 ++ resources/js/types/main.d.ts | 2 ++ 2 files changed, 4 insertions(+) diff --git a/app/Http/Controllers/MainController.php b/app/Http/Controllers/MainController.php index 6134c6d..0a624b4 100644 --- a/app/Http/Controllers/MainController.php +++ b/app/Http/Controllers/MainController.php @@ -135,6 +135,8 @@ public function searchStarredRepository(Request $r) { */ public function langHistory() { $groups = YearGroup::with('languages.authors') + ->with('languages.parents') + ->with('languages.children') ->orderBy('position', 'ASC') ->get(); diff --git a/resources/js/types/main.d.ts b/resources/js/types/main.d.ts index b50e1f4..71e7ef0 100644 --- a/resources/js/types/main.d.ts +++ b/resources/js/types/main.d.ts @@ -125,6 +125,8 @@ export type ProLangLanguage = { codeTitle: string rawCode: string | null rawCodeLink: string | null + children: ProLangLanguage[] + parents: ProLangLanguage[] } export type YearGroup = { From 1c99712841782163722c68a738940181f4580dda Mon Sep 17 00:00:00 2001 From: amiceli Date: Fri, 9 Jan 2026 23:26:14 +0100 Subject: [PATCH 04/12] feat: show lang parents and children --- resources/js/components/prolang/LangCard.vue | 69 ++++++++++++++++++-- resources/js/pages/LangHistory.vue | 19 +++++- 2 files changed, 82 insertions(+), 6 deletions(-) diff --git a/resources/js/components/prolang/LangCard.vue b/resources/js/components/prolang/LangCard.vue index 2370a09..41b66c9 100644 --- a/resources/js/components/prolang/LangCard.vue +++ b/resources/js/components/prolang/LangCard.vue @@ -1,7 +1,7 @@ From 0f8bf79a70db7d9c630502f0a6e7b1beef7e89f2 Mon Sep 17 00:00:00 2001 From: amiceli Date: Sat, 10 Jan 2026 23:09:51 +0100 Subject: [PATCH 11/12] feat(graph): add prolang network graph --- .../js/components/prolang/LangGraphData.ts | 46 ++++++++++ .../js/components/prolang/LangGraphStore.ts | 45 ++++++++++ .../components/prolang/LangNetworkFilter.vue | 34 ++++++++ .../js/components/prolang/useLangGraph.ts | 14 ++++ resources/js/pages/LangFamily.vue | 83 +++++++++++++++++++ 5 files changed, 222 insertions(+) create mode 100644 resources/js/components/prolang/LangGraphData.ts create mode 100644 resources/js/components/prolang/LangGraphStore.ts create mode 100644 resources/js/components/prolang/LangNetworkFilter.vue create mode 100644 resources/js/components/prolang/useLangGraph.ts create mode 100644 resources/js/pages/LangFamily.vue diff --git a/resources/js/components/prolang/LangGraphData.ts b/resources/js/components/prolang/LangGraphData.ts new file mode 100644 index 0000000..c9bc2fe --- /dev/null +++ b/resources/js/components/prolang/LangGraphData.ts @@ -0,0 +1,46 @@ +import type { Edges, Layouts, Nodes } from "v-network-graph" +import type { ProLangLanguage } from "@/types/main" + +function langNameMatch(lang: ProLangLanguage, search: string) { + return lang.name.toLowerCase().includes(search.toLowerCase()) +} + +export function isMemberOf(search: string, lang: ProLangLanguage): boolean { + return ( + lang.parents.some((l) => langNameMatch(l, search)) || + lang.children.some((l) => langNameMatch(l, search)) || + langNameMatch(lang, search) + ) +} + +export function getGraphData(prolangs: ProLangLanguage[]) { + const orphan = prolangs.filter((l) => l.parents.length === 0) + const smala = prolangs.filter((l) => l.parents.length > 0) + + const edges: Edges = {} + const nodes: Nodes = { + humain: { name: "Human" }, + } + + for (const l of prolangs) { + nodes[l.name] = { name: l.name } + } + + for (const l of orphan) { + edges[l.name] = { + source: "humain", + target: l.name, + } + } + + for (const l of smala) { + l.parents.forEach((p) => { + edges[`${l.name}_${p.name}`] = { + source: p.name, + target: l.name, + } + }) + } + + return { nodes, edges } +} diff --git a/resources/js/components/prolang/LangGraphStore.ts b/resources/js/components/prolang/LangGraphStore.ts new file mode 100644 index 0000000..b2f226c --- /dev/null +++ b/resources/js/components/prolang/LangGraphStore.ts @@ -0,0 +1,45 @@ +import { atom, computed, type ReadableAtom } from "nanostores" +import type { ProLangLanguage } from "@/types/main" +import { getGraphData, isMemberOf } from "./LangGraphData" + +export class LangGraphStore { + private readonly prolangs = atom([]) + + private readonly hasName = atom(null) + + // computed + + private readonly $prolangs = computed([this.prolangs, this.hasName], (prolangs, hasName) => { + return prolangs.filter((l) => (hasName ? isMemberOf(hasName, l) : true)) + }) + + public readonly $graphData = computed(this.$prolangs, (langs) => { + return getGraphData(langs) + }) + + public get $hasName(): ReadableAtom { + return this.hasName + } + + // methods + + public initGraph(langs: ProLangLanguage[]) { + this.prolangs.set(langs) + } + + public searchByName(value: string) { + this.hasName.set(value) + } + + // instance + + private static instance?: LangGraphStore + + public static getInstance(): LangGraphStore { + if (!LangGraphStore.instance) { + LangGraphStore.instance = new LangGraphStore() + } + + return LangGraphStore.instance + } +} diff --git a/resources/js/components/prolang/LangNetworkFilter.vue b/resources/js/components/prolang/LangNetworkFilter.vue new file mode 100644 index 0000000..25cd98f --- /dev/null +++ b/resources/js/components/prolang/LangNetworkFilter.vue @@ -0,0 +1,34 @@ + + + + + diff --git a/resources/js/components/prolang/useLangGraph.ts b/resources/js/components/prolang/useLangGraph.ts new file mode 100644 index 0000000..b25e2c0 --- /dev/null +++ b/resources/js/components/prolang/useLangGraph.ts @@ -0,0 +1,14 @@ +import { useStore } from "@nanostores/vue" +import { LangGraphStore } from "./LangGraphStore" + +export function useLangGraph() { + const graphStore = LangGraphStore.getInstance() + const graphData = useStore(graphStore.$graphData) + const hasName = useStore(graphStore.$hasName) + + return { + graphStore, + graphData, + hasName, + } +} diff --git a/resources/js/pages/LangFamily.vue b/resources/js/pages/LangFamily.vue new file mode 100644 index 0000000..22b36ff --- /dev/null +++ b/resources/js/pages/LangFamily.vue @@ -0,0 +1,83 @@ + + + + + From 9dd16186ea4e05f3801f0989846a9bc531b50095 Mon Sep 17 00:00:00 2001 From: amiceli Date: Sat, 10 Jan 2026 23:17:52 +0100 Subject: [PATCH 12/12] fix: improve graph node color --- resources/js/pages/LangFamily.vue | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/resources/js/pages/LangFamily.vue b/resources/js/pages/LangFamily.vue index 22b36ff..c1ba4ee 100644 --- a/resources/js/pages/LangFamily.vue +++ b/resources/js/pages/LangFamily.vue @@ -26,7 +26,7 @@ import type { ProLangLanguage } from "@/types/main" const props = defineProps<{ langs: ProLangLanguage[] }>() -const { graphStore, graphData } = useLangGraph() +const { graphStore, graphData, hasName } = useLangGraph() onMounted(() => { graphStore.initGraph(props.langs) @@ -53,7 +53,10 @@ const configs = reactive( node: { normal: { color: (n) => { - return n.name === "Human" ? "#ff0000" : "#4466cc" + if (hasName.value && n.name?.includes(hasName.value)) { + return "#a45586" + } + return n.name === "Human" ? "#100d50" : "#08abff" }, }, label: { @@ -77,7 +80,5 @@ const configs = reactive( grid-template-columns: 300px 1fr; gap : 20px; height : calc(100vh - 80px); - - // &__graph {} }