From c8175142c18bf9311b4387d4e5d3da1bb1e9efc0 Mon Sep 17 00:00:00 2001
From: peter_rabbit <pierrejarriges@gmail.com>
Date: Mon, 25 Jan 2021 14:58:34 +0100
Subject: [PATCH] reorganize articles

---
 build.js                                      |   2 +-
 constants.js                                  |   4 +-
 .../games}/fantom_quest/fantom_quest.json     |   1 +
 .../games}/fantom_quest/fantom_quest.txt      |   0
 .../games}/fantom_quest/images/lucipix.png    | Bin
 .../games}/fantom_quest/images/pijarpix.png   | Bin
 .../images/screen_fantom_quest_1.jpg          | Bin
 .../images/screen_fantom_quest_2.jpg          | Bin
 .../images/screen_fantom_quest_3.jpg          | Bin
 .../images/screen_fantom_quest_4.jpg          | Bin
 .../images/screen_fantom_quest_5.jpg          | Bin
 .../games}/fantom_quest/lucie_ventadour.txt   |   2 +-
 .../games}/fantom_quest/pijar.txt             |   4 +-
 public/articles/games/index.json              |   3 +
 public/articles/news/index.json               |   3 +
 .../images/atelier_bureau.jpg                 | Bin
 .../images/local_entree.jpg                   | Bin
 .../installation-kuadrado.json                |   0
 .../installation-kuadrado.txt                 |   0
 public/articles/software/index.json           |   3 +
 .../images/watergun-overview-light.jpg        | Bin
 .../software}/watergun/watergun.json          |   2 +-
 .../software}/watergun/watergun.txt           |   0
 public/education/education.js                 |   4 +-
 public/game-articles/index.json               |   3 -
 public/games/games.js                         |  55 +++++++++++++-----
 public/main.js                                |  25 +++++---
 public/news-articles/index.json               |   3 -
 public/software-articles/index.json           |   3 -
 .../software-development.js                   |  31 ++++++----
 public/style/style.css                        |  41 +++++++++----
 src/home-page-components/news-articles.js     |   4 +-
 src/lib/article-utils.js                      |  17 +++++-
 src/pages/games/components/game-article.js    |  30 ++++++++--
 src/pages/games/components/game-articles.js   |   4 +-
 src/pages/games/games.scss                    |  38 +++++++-----
 .../components/software-articles.js           |  10 ++--
 .../software-development.scss                 |   8 ---
 src/style.scss                                |   3 +
 src/theme.scss                                |  14 +++++
 40 files changed, 214 insertions(+), 103 deletions(-)
 rename public/{game-articles => articles/games}/fantom_quest/fantom_quest.json (97%)
 rename public/{game-articles => articles/games}/fantom_quest/fantom_quest.txt (100%)
 rename public/{game-articles => articles/games}/fantom_quest/images/lucipix.png (100%)
 rename public/{game-articles => articles/games}/fantom_quest/images/pijarpix.png (100%)
 rename public/{game-articles => articles/games}/fantom_quest/images/screen_fantom_quest_1.jpg (100%)
 rename public/{game-articles => articles/games}/fantom_quest/images/screen_fantom_quest_2.jpg (100%)
 rename public/{game-articles => articles/games}/fantom_quest/images/screen_fantom_quest_3.jpg (100%)
 rename public/{game-articles => articles/games}/fantom_quest/images/screen_fantom_quest_4.jpg (100%)
 rename public/{game-articles => articles/games}/fantom_quest/images/screen_fantom_quest_5.jpg (100%)
 rename public/{game-articles => articles/games}/fantom_quest/lucie_ventadour.txt (63%)
 rename public/{game-articles => articles/games}/fantom_quest/pijar.txt (55%)
 create mode 100755 public/articles/games/index.json
 create mode 100755 public/articles/news/index.json
 rename public/{news-articles => articles/news}/installation-kuadrado/images/atelier_bureau.jpg (100%)
 rename public/{news-articles => articles/news}/installation-kuadrado/images/local_entree.jpg (100%)
 rename public/{news-articles => articles/news}/installation-kuadrado/installation-kuadrado.json (100%)
 rename public/{news-articles => articles/news}/installation-kuadrado/installation-kuadrado.txt (100%)
 create mode 100755 public/articles/software/index.json
 rename public/{software-articles => articles/software}/watergun/images/watergun-overview-light.jpg (100%)
 rename public/{software-articles => articles/software}/watergun/watergun.json (92%)
 rename public/{software-articles => articles/software}/watergun/watergun.txt (100%)
 delete mode 100755 public/game-articles/index.json
 delete mode 100755 public/news-articles/index.json
 delete mode 100755 public/software-articles/index.json

diff --git a/build.js b/build.js
index 616d21b..2d55391 100644
--- a/build.js
+++ b/build.js
@@ -3,7 +3,7 @@
 "use strict";
 
 const build_conf = {
-    protected_dirs: ["assets", "style", "news-articles", "game-articles", "software-articles"],
+    protected_dirs: ["assets", "style", "news-articles", "game-articles", "software-articles", "articles"],
 };
 
 const fs = require("fs");
diff --git a/constants.js b/constants.js
index f8bd769..6d0ce28 100644
--- a/constants.js
+++ b/constants.js
@@ -2,7 +2,5 @@ const { server_url } = require("./config");
 
 module.exports = {
     images_url: `${server_url}assets/images`,
-    news_articles_url: `${server_url}news-articles`,
-    game_articles_url: `${server_url}game-articles`,
-    software_articles_url: `${server_url}software-articles`,
+    articles_url: `${server_url}articles/`,
 };
diff --git a/public/game-articles/fantom_quest/fantom_quest.json b/public/articles/games/fantom_quest/fantom_quest.json
similarity index 97%
rename from public/game-articles/fantom_quest/fantom_quest.json
rename to public/articles/games/fantom_quest/fantom_quest.json
index 62c6e4a..6aeadaa 100755
--- a/public/game-articles/fantom_quest/fantom_quest.json
+++ b/public/articles/games/fantom_quest/fantom_quest.json
@@ -2,6 +2,7 @@
     "title": "Fantom Quest",
     "subtitle": "Le labyrinthe de la quête d'identité",
     "tags": ["jeu web", "pixelart", "javascript", "labyrinthe"],
+    "status": "wip",
     "body": "<file>fantom_quest.txt",
     "images": [
         "screen_fantom_quest_1.jpg",
diff --git a/public/game-articles/fantom_quest/fantom_quest.txt b/public/articles/games/fantom_quest/fantom_quest.txt
similarity index 100%
rename from public/game-articles/fantom_quest/fantom_quest.txt
rename to public/articles/games/fantom_quest/fantom_quest.txt
diff --git a/public/game-articles/fantom_quest/images/lucipix.png b/public/articles/games/fantom_quest/images/lucipix.png
similarity index 100%
rename from public/game-articles/fantom_quest/images/lucipix.png
rename to public/articles/games/fantom_quest/images/lucipix.png
diff --git a/public/game-articles/fantom_quest/images/pijarpix.png b/public/articles/games/fantom_quest/images/pijarpix.png
similarity index 100%
rename from public/game-articles/fantom_quest/images/pijarpix.png
rename to public/articles/games/fantom_quest/images/pijarpix.png
diff --git a/public/game-articles/fantom_quest/images/screen_fantom_quest_1.jpg b/public/articles/games/fantom_quest/images/screen_fantom_quest_1.jpg
similarity index 100%
rename from public/game-articles/fantom_quest/images/screen_fantom_quest_1.jpg
rename to public/articles/games/fantom_quest/images/screen_fantom_quest_1.jpg
diff --git a/public/game-articles/fantom_quest/images/screen_fantom_quest_2.jpg b/public/articles/games/fantom_quest/images/screen_fantom_quest_2.jpg
similarity index 100%
rename from public/game-articles/fantom_quest/images/screen_fantom_quest_2.jpg
rename to public/articles/games/fantom_quest/images/screen_fantom_quest_2.jpg
diff --git a/public/game-articles/fantom_quest/images/screen_fantom_quest_3.jpg b/public/articles/games/fantom_quest/images/screen_fantom_quest_3.jpg
similarity index 100%
rename from public/game-articles/fantom_quest/images/screen_fantom_quest_3.jpg
rename to public/articles/games/fantom_quest/images/screen_fantom_quest_3.jpg
diff --git a/public/game-articles/fantom_quest/images/screen_fantom_quest_4.jpg b/public/articles/games/fantom_quest/images/screen_fantom_quest_4.jpg
similarity index 100%
rename from public/game-articles/fantom_quest/images/screen_fantom_quest_4.jpg
rename to public/articles/games/fantom_quest/images/screen_fantom_quest_4.jpg
diff --git a/public/game-articles/fantom_quest/images/screen_fantom_quest_5.jpg b/public/articles/games/fantom_quest/images/screen_fantom_quest_5.jpg
similarity index 100%
rename from public/game-articles/fantom_quest/images/screen_fantom_quest_5.jpg
rename to public/articles/games/fantom_quest/images/screen_fantom_quest_5.jpg
diff --git a/public/game-articles/fantom_quest/lucie_ventadour.txt b/public/articles/games/fantom_quest/lucie_ventadour.txt
similarity index 63%
rename from public/game-articles/fantom_quest/lucie_ventadour.txt
rename to public/articles/games/fantom_quest/lucie_ventadour.txt
index 33d4e8f..c0c017a 100755
--- a/public/game-articles/fantom_quest/lucie_ventadour.txt
+++ b/public/articles/games/fantom_quest/lucie_ventadour.txt
@@ -1,2 +1,2 @@
 Salut moi c'est Lu7, je suis une geek et je vois la vie en pixels >< !
-<a href="https://www.lucieventadour.com/" target="_blank">Site web</a> -- <a href="http://lucipix.canalblog.com/" target="_blank">Blog pix</a>
\ No newline at end of file
+<a href="https://www.lucieventadour.com/" target="_blank">Site web</a> | <a href="http://lucipix.canalblog.com/" target="_blank">Blog pix</a>
\ No newline at end of file
diff --git a/public/game-articles/fantom_quest/pijar.txt b/public/articles/games/fantom_quest/pijar.txt
similarity index 55%
rename from public/game-articles/fantom_quest/pijar.txt
rename to public/articles/games/fantom_quest/pijar.txt
index e301b6b..e9b1b47 100755
--- a/public/game-articles/fantom_quest/pijar.txt
+++ b/public/articles/games/fantom_quest/pijar.txt
@@ -1,5 +1,5 @@
 Salut moi c'est pijar. Je fais des trucs.
 J'aime bien le code et je fais du dessin et tout.
 
-<a href="https://pierrejarriges-dessins.blogspot.com" target="_blank">Blog Dessin</a> -- <a href="https://soundcloud.com/abstractobject" target="_blank">Soundcloud</a>
-<a href="https://gitlab.com/peter_rabbit" target="_blank">Gitlab</a> -- <a href=" https://github.com/codnpix" target="_blank">Github</a>
\ No newline at end of file
+<a href="https://pierrejarriges-dessins.blogspot.com" target="_blank">Blog Dessin</a> | <a href="https://soundcloud.com/abstractobject" target="_blank">Soundcloud</a>
+<a href="https://gitlab.com/peter_rabbit" target="_blank">Gitlab</a> | <a href=" https://github.com/codnpix" target="_blank">Github</a>
\ No newline at end of file
diff --git a/public/articles/games/index.json b/public/articles/games/index.json
new file mode 100755
index 0000000..a9d294c
--- /dev/null
+++ b/public/articles/games/index.json
@@ -0,0 +1,3 @@
+{
+    "articles": ["fantom_quest"]
+}
diff --git a/public/articles/news/index.json b/public/articles/news/index.json
new file mode 100755
index 0000000..0f654c8
--- /dev/null
+++ b/public/articles/news/index.json
@@ -0,0 +1,3 @@
+{
+    "articles": ["installation-kuadrado"]
+}
diff --git a/public/news-articles/installation-kuadrado/images/atelier_bureau.jpg b/public/articles/news/installation-kuadrado/images/atelier_bureau.jpg
similarity index 100%
rename from public/news-articles/installation-kuadrado/images/atelier_bureau.jpg
rename to public/articles/news/installation-kuadrado/images/atelier_bureau.jpg
diff --git a/public/news-articles/installation-kuadrado/images/local_entree.jpg b/public/articles/news/installation-kuadrado/images/local_entree.jpg
similarity index 100%
rename from public/news-articles/installation-kuadrado/images/local_entree.jpg
rename to public/articles/news/installation-kuadrado/images/local_entree.jpg
diff --git a/public/news-articles/installation-kuadrado/installation-kuadrado.json b/public/articles/news/installation-kuadrado/installation-kuadrado.json
similarity index 100%
rename from public/news-articles/installation-kuadrado/installation-kuadrado.json
rename to public/articles/news/installation-kuadrado/installation-kuadrado.json
diff --git a/public/news-articles/installation-kuadrado/installation-kuadrado.txt b/public/articles/news/installation-kuadrado/installation-kuadrado.txt
similarity index 100%
rename from public/news-articles/installation-kuadrado/installation-kuadrado.txt
rename to public/articles/news/installation-kuadrado/installation-kuadrado.txt
diff --git a/public/articles/software/index.json b/public/articles/software/index.json
new file mode 100755
index 0000000..b2212f7
--- /dev/null
+++ b/public/articles/software/index.json
@@ -0,0 +1,3 @@
+{
+    "articles": ["watergun"]
+}
diff --git a/public/software-articles/watergun/images/watergun-overview-light.jpg b/public/articles/software/watergun/images/watergun-overview-light.jpg
similarity index 100%
rename from public/software-articles/watergun/images/watergun-overview-light.jpg
rename to public/articles/software/watergun/images/watergun-overview-light.jpg
diff --git a/public/software-articles/watergun/watergun.json b/public/articles/software/watergun/watergun.json
similarity index 92%
rename from public/software-articles/watergun/watergun.json
rename to public/articles/software/watergun/watergun.json
index 03034ea..f87ffae 100755
--- a/public/software-articles/watergun/watergun.json
+++ b/public/articles/software/watergun/watergun.json
@@ -1,7 +1,7 @@
 {
     "title": "Watergun",
     "date": "2021/01/23",
-    "status": "Work in progress",
+    "status": "wip",
     "subtitle": "Un éditeur de site web ultra-light",
     "body": "<file>watergun.txt",
     "technical": {
diff --git a/public/software-articles/watergun/watergun.txt b/public/articles/software/watergun/watergun.txt
similarity index 100%
rename from public/software-articles/watergun/watergun.txt
rename to public/articles/software/watergun/watergun.txt
diff --git a/public/education/education.js b/public/education/education.js
index 00e5947..056d1e0 100644
--- a/public/education/education.js
+++ b/public/education/education.js
@@ -11,9 +11,7 @@ const { server_url } = require("./config");
 
 module.exports = {
     images_url: `${server_url}assets/images`,
-    news_articles_url: `${server_url}news-articles`,
-    game_articles_url: `${server_url}game-articles`,
-    software_articles_url: `${server_url}software-articles`,
+    articles_url: `${server_url}articles/`,
 };
 
 },{"./config":1}],3:[function(require,module,exports){
diff --git a/public/game-articles/index.json b/public/game-articles/index.json
deleted file mode 100755
index e1e7267..0000000
--- a/public/game-articles/index.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
-    "articles": ["fantom_quest/fantom_quest.json"]
-}
diff --git a/public/games/games.js b/public/games/games.js
index 8daf77a..93f4459 100644
--- a/public/games/games.js
+++ b/public/games/games.js
@@ -11,9 +11,7 @@ const { server_url } = require("./config");
 
 module.exports = {
     images_url: `${server_url}assets/images`,
-    news_articles_url: `${server_url}news-articles`,
-    game_articles_url: `${server_url}game-articles`,
-    software_articles_url: `${server_url}software-articles`,
+    articles_url: `${server_url}articles/`,
 };
 
 },{"./config":1}],3:[function(require,module,exports){
@@ -98,14 +96,24 @@ function getArticleDate(date) {
     return `${date.getDate()}-${date.getMonth() + 1}-${date.getFullYear()}`;
 }
 
+function getArticleStatus(status) {
+    switch (status) {
+        case "wip":
+            return "En développement";
+        case "released":
+            return "En production";
+    }
+}
+
 function loadArticles(dir_url) {
     return new Promise((resolve, reject) => {
         fetchjson(`${dir_url}/index.json`)
             .then(json => {
                 Promise.all(
-                    json.articles.map(async articlePath => {
-                        const art = await fetchjson(`${dir_url}/${articlePath}`);
-                        const tmpSplit = articlePath.split("/");
+                    json.articles.map(async artDir => {
+                        const artPath = `${artDir}/${artDir}.json`;
+                        const art = await fetchjson(`${dir_url}/${artPath}`);
+                        const tmpSplit = artPath.split("/");
                         tmpSplit.pop();
                         const absArtPath = `${dir_url}/${tmpSplit.join("/")}`;
                         return Object.assign(art, { path: absArtPath });
@@ -145,6 +153,7 @@ module.exports = {
     getArticleBody,
     getArticleDate,
     populateArticles,
+    getArticleStatus,
 };
 
 },{"./fetch":5}],5:[function(require,module,exports){
@@ -263,7 +272,7 @@ module.exports = {
 "use strict";
 
 const ImageCarousel = require("../../../generic-components/image-carousel");
-const { getArticleBody } = require("../../../lib/article-utils");
+const { getArticleBody, getArticleStatus } = require("../../../lib/article-utils");
 
 class TeamMember {
     constructor(props) {
@@ -313,7 +322,7 @@ class GameArticle {
     }
 
     render() {
-        const { title, tags, body, subtitle, images, path, team_subarticles } = this.props;
+        const { title, tags, body, subtitle, images, path, team_subarticles, status } = this.props;
         return {
             tag: "article",
             class: "game-article",
@@ -325,11 +334,29 @@ class GameArticle {
                 },
                 {
                     tag: "div",
-                    class: "game-tags",
-                    contents: tags.map(tag => {
-                        return { tag: "span", contents: tag };
-                    }),
+                    class: "game-infos",
+                    contents: [
+                        {
+                            tag: "div",
+                            class: "game-tags",
+                            contents: tags.map(tag => {
+                                return { tag: "span", contents: tag };
+                            }),
+                        },
+                        {
+                            tag: "div",
+                            class: "game-status",
+                            contents: [
+                                {
+                                    tag: "span",
+                                    class: `project-status ${status}`,
+                                    contents: getArticleStatus(status),
+                                },
+                            ],
+                        },
+                    ],
                 },
+
                 {
                     tag: "h3",
                     class: "game-subtitle",
@@ -368,7 +395,7 @@ module.exports = GameArticle;
 },{"../../../generic-components/image-carousel":3,"../../../lib/article-utils":4}],8:[function(require,module,exports){
 "use strict";
 
-const { game_articles_url } = require("../../../../constants");
+const { articles_url } = require("../../../../constants");
 const { loadArticles, populateArticles } = require("../../../lib/article-utils");
 const objectHtmlRenderer = require("../../../lib/object-html-renderer");
 const GameArticle = require("./game-article");
@@ -384,7 +411,7 @@ class GameArticles {
     }
 
     loadArticles() {
-        loadArticles(game_articles_url)
+        loadArticles(`${articles_url}/games`)
             .then(articles => {
                 Promise.all(
                     articles.map(async a => {
diff --git a/public/main.js b/public/main.js
index 26dba74..dcc30fb 100644
--- a/public/main.js
+++ b/public/main.js
@@ -11,9 +11,7 @@ const { server_url } = require("./config");
 
 module.exports = {
     images_url: `${server_url}assets/images`,
-    news_articles_url: `${server_url}news-articles`,
-    game_articles_url: `${server_url}game-articles`,
-    software_articles_url: `${server_url}software-articles`,
+    articles_url: `${server_url}articles/`,
 };
 
 },{"./config":1}],3:[function(require,module,exports){
@@ -88,7 +86,7 @@ module.exports = ImageCarousel;
 },{"../lib/object-html-renderer":9}],4:[function(require,module,exports){
 "use strict";
 
-const { news_articles_url } = require("../../constants");
+const { articles_url } = require("../../constants");
 const objectHtmlRenderer = require("../lib/object-html-renderer");
 const ImageCarousel = require("../generic-components/image-carousel");
 const { loadArticles, getArticleDate, getArticleBody } = require("../lib/article-utils");
@@ -105,7 +103,7 @@ class NewsArticles {
     }
 
     loadArticles() {
-        loadArticles(news_articles_url).then(articles => {
+        loadArticles(`${articles_url}/news`).then(articles => {
             this.state.articles = articles;
             this.state.showArticleIndex = this.state.articles.length - 1;
             this.refresh();
@@ -383,14 +381,24 @@ function getArticleDate(date) {
     return `${date.getDate()}-${date.getMonth() + 1}-${date.getFullYear()}`;
 }
 
+function getArticleStatus(status) {
+    switch (status) {
+        case "wip":
+            return "En développement";
+        case "released":
+            return "En production";
+    }
+}
+
 function loadArticles(dir_url) {
     return new Promise((resolve, reject) => {
         fetchjson(`${dir_url}/index.json`)
             .then(json => {
                 Promise.all(
-                    json.articles.map(async articlePath => {
-                        const art = await fetchjson(`${dir_url}/${articlePath}`);
-                        const tmpSplit = articlePath.split("/");
+                    json.articles.map(async artDir => {
+                        const artPath = `${artDir}/${artDir}.json`;
+                        const art = await fetchjson(`${dir_url}/${artPath}`);
+                        const tmpSplit = artPath.split("/");
                         tmpSplit.pop();
                         const absArtPath = `${dir_url}/${tmpSplit.join("/")}`;
                         return Object.assign(art, { path: absArtPath });
@@ -430,6 +438,7 @@ module.exports = {
     getArticleBody,
     getArticleDate,
     populateArticles,
+    getArticleStatus,
 };
 
 },{"./fetch":8}],8:[function(require,module,exports){
diff --git a/public/news-articles/index.json b/public/news-articles/index.json
deleted file mode 100755
index 42c50f0..0000000
--- a/public/news-articles/index.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
-    "articles": ["installation-kuadrado/installation-kuadrado.json"]
-}
diff --git a/public/software-articles/index.json b/public/software-articles/index.json
deleted file mode 100755
index b5f5003..0000000
--- a/public/software-articles/index.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
-    "articles": ["watergun/watergun.json"]
-}
diff --git a/public/software-development/software-development.js b/public/software-development/software-development.js
index 6af223e..3ecadce 100644
--- a/public/software-development/software-development.js
+++ b/public/software-development/software-development.js
@@ -11,9 +11,7 @@ const { server_url } = require("./config");
 
 module.exports = {
     images_url: `${server_url}assets/images`,
-    news_articles_url: `${server_url}news-articles`,
-    game_articles_url: `${server_url}game-articles`,
-    software_articles_url: `${server_url}software-articles`,
+    articles_url: `${server_url}articles/`,
 };
 
 },{"./config":1}],3:[function(require,module,exports){
@@ -98,14 +96,24 @@ function getArticleDate(date) {
     return `${date.getDate()}-${date.getMonth() + 1}-${date.getFullYear()}`;
 }
 
+function getArticleStatus(status) {
+    switch (status) {
+        case "wip":
+            return "En développement";
+        case "released":
+            return "En production";
+    }
+}
+
 function loadArticles(dir_url) {
     return new Promise((resolve, reject) => {
         fetchjson(`${dir_url}/index.json`)
             .then(json => {
                 Promise.all(
-                    json.articles.map(async articlePath => {
-                        const art = await fetchjson(`${dir_url}/${articlePath}`);
-                        const tmpSplit = articlePath.split("/");
+                    json.articles.map(async artDir => {
+                        const artPath = `${artDir}/${artDir}.json`;
+                        const art = await fetchjson(`${dir_url}/${artPath}`);
+                        const tmpSplit = artPath.split("/");
                         tmpSplit.pop();
                         const absArtPath = `${dir_url}/${tmpSplit.join("/")}`;
                         return Object.assign(art, { path: absArtPath });
@@ -145,6 +153,7 @@ module.exports = {
     getArticleBody,
     getArticleDate,
     populateArticles,
+    getArticleStatus,
 };
 
 },{"./fetch":5}],5:[function(require,module,exports){
@@ -262,9 +271,9 @@ module.exports = {
 },{}],7:[function(require,module,exports){
 "use strict";
 
-const { software_articles_url } = require("../../../../constants");
+const { articles_url } = require("../../../../constants");
 const ImageCarousel = require("../../../generic-components/image-carousel");
-const { loadArticles, getArticleBody, getArticleDate } = require("../../../lib/article-utils");
+const { loadArticles, getArticleBody, getArticleDate, getArticleStatus } = require("../../../lib/article-utils");
 const objectHtmlRenderer = require("../../../lib/object-html-renderer");
 
 class SoftwareArticle {
@@ -299,8 +308,8 @@ class SoftwareArticle {
                         },
                         {
                             tag: "span",
-                            class: "software-status",
-                            contents: status,
+                            class: `project-status ${status}`,
+                            contents: getArticleStatus(status),
                         },
                     ],
                 },
@@ -391,7 +400,7 @@ class SoftwareArticles {
     }
 
     loadArticles() {
-        loadArticles(software_articles_url)
+        loadArticles(`${articles_url}/software`)
             .then(articles => {
                 this.state.articles = articles;
                 this.refresh();
diff --git a/public/style/style.css b/public/style/style.css
index e4c3310..e392196 100644
--- a/public/style/style.css
+++ b/public/style/style.css
@@ -337,6 +337,19 @@ main #page-container .page-contents-center {
   max-width: 100%;
   margin: 0 auto;
 }
+main #page-container .project-status {
+  margin: 0 20px;
+  color: #3c4144;
+  padding: 10px 20px;
+  font-weight: bold;
+  border-radius: 20px;
+}
+main #page-container .project-status.wip {
+  background-color: #e5a002;
+}
+main #page-container .project-status.prod {
+  background-color: #368736;
+}
 main #page-container #home-page {
   display: flex;
   flex-direction: column;
@@ -849,7 +862,7 @@ main #page-container #games-page .game-articles article.game-article {
   grid-template-rows: repeat(6, auto);
   background-color: #3c4144;
 }
-main #page-container #games-page .game-articles article.game-article *:not(a) {
+main #page-container #games-page .game-articles article.game-article *:not(a, .project-status) {
   color: #d4d9dd;
 }
 main #page-container #games-page .game-articles article.game-article .game-title {
@@ -861,14 +874,19 @@ main #page-container #games-page .game-articles article.game-article .game-title
   font-size: 35px;
   font-style: italic;
 }
-main #page-container #games-page .game-articles article.game-article .game-tags {
+main #page-container #games-page .game-articles article.game-article .game-infos {
+  font-size: 13px;
   grid-column: 1;
+  display: grid;
+  grid-template-columns: auto auto;
+}
+main #page-container #games-page .game-articles article.game-article .game-infos .game-tags {
   display: flex;
   gap: 10px;
   flex-wrap: wrap;
   margin: 10px 20px;
 }
-main #page-container #games-page .game-articles article.game-article .game-tags span {
+main #page-container #games-page .game-articles article.game-article .game-infos .game-tags span {
   font-size: 12px;
   padding: 6px;
   background-color: #6b7880;
@@ -876,6 +894,12 @@ main #page-container #games-page .game-articles article.game-article .game-tags
   border-radius: 5px;
   font-weight: 600;
 }
+main #page-container #games-page .game-articles article.game-article .game-infos .game-status {
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  flex-direction: row;
+}
 main #page-container #games-page .game-articles article.game-article .game-subtitle {
   grid-column: 1;
   margin: 10px 20px 30px;
@@ -952,6 +976,9 @@ main #page-container #games-page .game-articles article.placeholder * {
     padding: 20px;
     font-size: 25px;
   }
+  main #page-container #games-page .game-articles article.game-article .game-infos {
+    grid-template-columns: 1fr;
+  }
   main #page-container #games-page .game-articles article.game-article .image-carousel {
     grid-column: 1;
     grid-row: 2;
@@ -1000,14 +1027,6 @@ main #page-container #software-page .software-articles article.software-article
   color: #96a5ae;
   font-style: italic;
 }
-main #page-container #software-page .software-articles article.software-article .software-infos .software-status {
-  margin: 0 20px;
-  background-color: #e5a002;
-  color: #3c4144;
-  padding: 10px 20px;
-  font-weight: bold;
-  border-radius: 20px;
-}
 main #page-container #software-page .software-articles article.software-article .software-subtitle {
   grid-column: 1;
   margin: 20px;
diff --git a/src/home-page-components/news-articles.js b/src/home-page-components/news-articles.js
index 57eacfb..9ec0219 100644
--- a/src/home-page-components/news-articles.js
+++ b/src/home-page-components/news-articles.js
@@ -1,6 +1,6 @@
 "use strict";
 
-const { news_articles_url } = require("../../constants");
+const { articles_url } = require("../../constants");
 const objectHtmlRenderer = require("../lib/object-html-renderer");
 const ImageCarousel = require("../generic-components/image-carousel");
 const { loadArticles, getArticleDate, getArticleBody } = require("../lib/article-utils");
@@ -17,7 +17,7 @@ class NewsArticles {
     }
 
     loadArticles() {
-        loadArticles(news_articles_url).then(articles => {
+        loadArticles(`${articles_url}/news`).then(articles => {
             this.state.articles = articles;
             this.state.showArticleIndex = this.state.articles.length - 1;
             this.refresh();
diff --git a/src/lib/article-utils.js b/src/lib/article-utils.js
index 29ac1e1..efde108 100644
--- a/src/lib/article-utils.js
+++ b/src/lib/article-utils.js
@@ -10,14 +10,24 @@ function getArticleDate(date) {
     return `${date.getDate()}-${date.getMonth() + 1}-${date.getFullYear()}`;
 }
 
+function getArticleStatus(status) {
+    switch (status) {
+        case "wip":
+            return "En développement";
+        case "released":
+            return "En production";
+    }
+}
+
 function loadArticles(dir_url) {
     return new Promise((resolve, reject) => {
         fetchjson(`${dir_url}/index.json`)
             .then(json => {
                 Promise.all(
-                    json.articles.map(async articlePath => {
-                        const art = await fetchjson(`${dir_url}/${articlePath}`);
-                        const tmpSplit = articlePath.split("/");
+                    json.articles.map(async artDir => {
+                        const artPath = `${artDir}/${artDir}.json`;
+                        const art = await fetchjson(`${dir_url}/${artPath}`);
+                        const tmpSplit = artPath.split("/");
                         tmpSplit.pop();
                         const absArtPath = `${dir_url}/${tmpSplit.join("/")}`;
                         return Object.assign(art, { path: absArtPath });
@@ -57,4 +67,5 @@ module.exports = {
     getArticleBody,
     getArticleDate,
     populateArticles,
+    getArticleStatus,
 };
diff --git a/src/pages/games/components/game-article.js b/src/pages/games/components/game-article.js
index edd332a..afca661 100644
--- a/src/pages/games/components/game-article.js
+++ b/src/pages/games/components/game-article.js
@@ -1,7 +1,7 @@
 "use strict";
 
 const ImageCarousel = require("../../../generic-components/image-carousel");
-const { getArticleBody } = require("../../../lib/article-utils");
+const { getArticleBody, getArticleStatus } = require("../../../lib/article-utils");
 
 class TeamMember {
     constructor(props) {
@@ -51,7 +51,7 @@ class GameArticle {
     }
 
     render() {
-        const { title, tags, body, subtitle, images, path, team_subarticles } = this.props;
+        const { title, tags, body, subtitle, images, path, team_subarticles, status } = this.props;
         return {
             tag: "article",
             class: "game-article",
@@ -63,11 +63,29 @@ class GameArticle {
                 },
                 {
                     tag: "div",
-                    class: "game-tags",
-                    contents: tags.map(tag => {
-                        return { tag: "span", contents: tag };
-                    }),
+                    class: "game-infos",
+                    contents: [
+                        {
+                            tag: "div",
+                            class: "game-tags",
+                            contents: tags.map(tag => {
+                                return { tag: "span", contents: tag };
+                            }),
+                        },
+                        {
+                            tag: "div",
+                            class: "game-status",
+                            contents: [
+                                {
+                                    tag: "span",
+                                    class: `project-status ${status}`,
+                                    contents: getArticleStatus(status),
+                                },
+                            ],
+                        },
+                    ],
                 },
+
                 {
                     tag: "h3",
                     class: "game-subtitle",
diff --git a/src/pages/games/components/game-articles.js b/src/pages/games/components/game-articles.js
index 6f7fb85..e80d8c7 100644
--- a/src/pages/games/components/game-articles.js
+++ b/src/pages/games/components/game-articles.js
@@ -1,6 +1,6 @@
 "use strict";
 
-const { game_articles_url } = require("../../../../constants");
+const { articles_url } = require("../../../../constants");
 const { loadArticles, populateArticles } = require("../../../lib/article-utils");
 const objectHtmlRenderer = require("../../../lib/object-html-renderer");
 const GameArticle = require("./game-article");
@@ -16,7 +16,7 @@ class GameArticles {
     }
 
     loadArticles() {
-        loadArticles(game_articles_url)
+        loadArticles(`${articles_url}/games`)
             .then(articles => {
                 Promise.all(
                     articles.map(async a => {
diff --git a/src/pages/games/games.scss b/src/pages/games/games.scss
index 341bf60..2355abf 100644
--- a/src/pages/games/games.scss
+++ b/src/pages/games/games.scss
@@ -8,7 +8,7 @@
             &.game-article {
                 grid-template-rows: repeat(6, auto);
                 background-color: $dark_2;
-                *:not(a) {
+                *:not(a, .project-status) {
                     color: $light_0;
                 }
                 .game-title {
@@ -20,21 +20,30 @@
                     font-size: 35px;
                     font-style: italic;
                 }
-                .game-tags {
+                .game-infos {
+                    font-size: 13px;
                     grid-column: 1;
-                    display: flex;
-                    gap: 10px;
-                    flex-wrap: wrap;
-                    margin: 10px 20px;
-                    span {
-                        font-size: 12px;
-                        padding: 6px;
-                        background-color: $medium_grey;
-                        color: $light_0;
-                        border-radius: 5px;
-                        font-weight: 600;
+                    display: grid;
+                    grid-template-columns: auto auto;
+                    .game-tags {
+                        display: flex;
+                        gap: 10px;
+                        flex-wrap: wrap;
+                        margin: 10px 20px;
+                        span {
+                            font-size: 12px;
+                            padding: 6px;
+                            background-color: $medium_grey;
+                            color: $light_0;
+                            border-radius: 5px;
+                            font-weight: 600;
+                        }
+                    }
+                    .game-status {
+                        @include flex-center;
                     }
                 }
+
                 .game-subtitle {
                     grid-column: 1;
                     margin: 10px 20px 30px;
@@ -110,6 +119,9 @@
                         padding: 20px;
                         font-size: 25px;
                     }
+                    .game-infos {
+                        grid-template-columns: 1fr;
+                    }
 
                     .image-carousel {
                         grid-column: 1;
diff --git a/src/pages/software-development/components/software-articles.js b/src/pages/software-development/components/software-articles.js
index 15cb37c..0d0254d 100644
--- a/src/pages/software-development/components/software-articles.js
+++ b/src/pages/software-development/components/software-articles.js
@@ -1,8 +1,8 @@
 "use strict";
 
-const { software_articles_url } = require("../../../../constants");
+const { articles_url } = require("../../../../constants");
 const ImageCarousel = require("../../../generic-components/image-carousel");
-const { loadArticles, getArticleBody, getArticleDate } = require("../../../lib/article-utils");
+const { loadArticles, getArticleBody, getArticleDate, getArticleStatus } = require("../../../lib/article-utils");
 const objectHtmlRenderer = require("../../../lib/object-html-renderer");
 
 class SoftwareArticle {
@@ -37,8 +37,8 @@ class SoftwareArticle {
                         },
                         {
                             tag: "span",
-                            class: "software-status",
-                            contents: status,
+                            class: `project-status ${status}`,
+                            contents: getArticleStatus(status),
                         },
                     ],
                 },
@@ -129,7 +129,7 @@ class SoftwareArticles {
     }
 
     loadArticles() {
-        loadArticles(software_articles_url)
+        loadArticles(`${articles_url}/software`)
             .then(articles => {
                 this.state.articles = articles;
                 this.refresh();
diff --git a/src/pages/software-development/software-development.scss b/src/pages/software-development/software-development.scss
index e5a7886..d5549a3 100644
--- a/src/pages/software-development/software-development.scss
+++ b/src/pages/software-development/software-development.scss
@@ -27,14 +27,6 @@
                     color: $light_1;
                     font-style: italic;
                 }
-                .software-status {
-                    margin: 0 20px;
-                    background-color: $yellow_1;
-                    color: $dark_2;
-                    padding: 10px 20px;
-                    font-weight: bold;
-                    border-radius: 20px;
-                }
             }
 
             .software-subtitle {
diff --git a/src/style.scss b/src/style.scss
index 2bc18e6..79e008e 100644
--- a/src/style.scss
+++ b/src/style.scss
@@ -251,6 +251,9 @@ main {
         .page-contents-center {
             @include page-contents-center;
         }
+        .project-status {
+            @include project-status
+        }
         @import "./homepage.scss";
         @import "./pages/education/education.scss";
         @import "./pages/games/games.scss";
diff --git a/src/theme.scss b/src/theme.scss
index 5d4d057..627be84 100644
--- a/src/theme.scss
+++ b/src/theme.scss
@@ -134,6 +134,20 @@ $page_contents_center_width: 1300px;
     }
 }
 
+@mixin project-status {
+    margin: 0 20px;
+    color: $dark_2;
+    padding: 10px 20px;
+    font-weight: bold;
+    border-radius: 20px;
+    &.wip {
+        background-color: $yellow_1;
+    }
+    &.prod {
+        background-color: $kaki;
+    }
+}
+
 @mixin flex-center {
     display: flex;
     justify-content: center;
-- 
GitLab