From d1640205ec14a1f50cbfddcec6a2ccb191837caf Mon Sep 17 00:00:00 2001
From: ManUtopiK <emmanuel.salomon@gmail.com>
Date: Fri, 18 Jun 2021 16:11:54 +0200
Subject: [PATCH] Added reading time + refactoring sidebar

---
 components/app/AppReadingTime.vue | 40 +++++++++++++++++++++++++++++++
 components/blog/BlogMeta.vue      |  2 +-
 components/page/PageContainer.vue |  5 ----
 nuxt.config.js                    |  6 +++++
 package.json                      |  2 ++
 pages/_slug.vue                   | 11 ++++++++-
 pages/blog/_slug.vue              |  7 ++++++
 pages/faq/_slug.vue               |  7 ++++++
 pages/lexique/_slug.vue           |  2 ++
 yarn.lock                         | 17 +++++++++++++
 10 files changed, 92 insertions(+), 7 deletions(-)
 create mode 100644 components/app/AppReadingTime.vue

diff --git a/components/app/AppReadingTime.vue b/components/app/AppReadingTime.vue
new file mode 100644
index 00000000..e31209a0
--- /dev/null
+++ b/components/app/AppReadingTime.vue
@@ -0,0 +1,40 @@
+<template>
+  <div class="flex items-center mb-8">
+    <fa :icon="['far', 'clock']" class="text-gray-400 text-lg mr-2" />
+
+    <div>
+      <span>{{ readingTimeToStr }}</span>
+      <span class="text-gray-400 text-sm pl-1">
+        {{ `(${readingTime.words} mots)` }}
+      </span>
+    </div>
+  </div>
+</template>
+
+<script>
+export default {
+  props: {
+    readingTime: {
+      type: Object,
+      required: true,
+    },
+  },
+  computed: {
+    readingTimeToStr() {
+      const minutes = this.readingTime.minutes
+      if (minutes > 1) {
+        return (
+          'Environ ' +
+          Math.round(minutes) +
+          ' minute' +
+          (Math.round(minutes) > 1 ? 's' : '')
+        )
+      }
+
+      return "Moins d'une minute"
+    },
+  },
+}
+</script>
+
+<style lang="scss" scoped></style>
diff --git a/components/blog/BlogMeta.vue b/components/blog/BlogMeta.vue
index 04114f71..18a126c1 100644
--- a/components/blog/BlogMeta.vue
+++ b/components/blog/BlogMeta.vue
@@ -1,5 +1,5 @@
 <template>
-  <div class="px-4 pt-3 pb-4 border-t border-gray-300">
+  <div class="pb-4 mb-4 border-b border-gray-300">
     <div class="text-xs uppercase font-bold text-gray-600 tracking-wide">
       AUTEUR
     </div>
diff --git a/components/page/PageContainer.vue b/components/page/PageContainer.vue
index 4f598b3e..0f851f16 100644
--- a/components/page/PageContainer.vue
+++ b/components/page/PageContainer.vue
@@ -10,7 +10,6 @@
       <div
         class="sticky h-full top-12 lg:w-1/4 lg:ml-12 mt-8 lg:mt-0 border-t pt-8 lg:pt-0 lg:border-none"
       >
-        <PageToc v-if="toc" :document="document" class="mb-8" />
         <slot name="sidebar" />
       </div>
     </div>
@@ -29,10 +28,6 @@ export default {
       type: Object,
       required: true,
     },
-    toc: {
-      type: Boolean,
-      default: true,
-    },
   },
 }
 </script>
diff --git a/nuxt.config.js b/nuxt.config.js
index a32fe199..b8a6c344 100644
--- a/nuxt.config.js
+++ b/nuxt.config.js
@@ -65,6 +65,7 @@ export default {
         component: 'fa', // component name
         addCss: false,
         icons: {
+          regular: ['faClock'],
           solid: [
             'faHome',
             'faSearch',
@@ -205,6 +206,11 @@ export default {
         return
       file.data = JSON.stringify(JSON.parse(file.data).ressources)
     },
+    'content:file:beforeInsert': (document) => {
+      if (document.extension === '.md') {
+        document.readingTime = require('reading-time')(document.text)
+      }
+    },
   },
 
   /**
diff --git a/package.json b/package.json
index a6c5521e..d9469fe1 100644
--- a/package.json
+++ b/package.json
@@ -33,6 +33,7 @@
     "nuxt-i18n": "^6.19.0",
     "particles.vue": "^2.10.0",
     "postcss": "^7",
+    "reading-time": "^1.3.0",
     "remark-breaks": "^2.0.1",
     "tailwindcss": "npm:@tailwindcss/postcss7-compat",
     "tailwindcss-dark-mode": "^1.1.7",
@@ -41,6 +42,7 @@
   "devDependencies": {
     "@ava/babel": "^1.0.1",
     "@fortawesome/free-brands-svg-icons": "^5.15.2",
+    "@fortawesome/free-regular-svg-icons": "^5.15.3",
     "@fortawesome/free-solid-svg-icons": "^5.15.2",
     "@nuxtjs/eslint-config": "^5.0.0",
     "@nuxtjs/eslint-module": "^3.0.2",
diff --git a/pages/_slug.vue b/pages/_slug.vue
index a5203429..c9403237 100644
--- a/pages/_slug.vue
+++ b/pages/_slug.vue
@@ -1,5 +1,14 @@
 <template>
-  <PageContainer :document="document" />
+  <PageContainer :document="document">
+    <template #sidebar>
+      <AppReadingTime
+        v-if="document.readingTime"
+        :reading-time="document.readingTime"
+      />
+
+      <PageToc v-if="document.toc" :document="document" class="mb-8" />
+    </template>
+  </PageContainer>
 </template>
 
 <script>
diff --git a/pages/blog/_slug.vue b/pages/blog/_slug.vue
index 852afd03..b00cf005 100644
--- a/pages/blog/_slug.vue
+++ b/pages/blog/_slug.vue
@@ -21,6 +21,13 @@
 
     <template #sidebar>
       <BlogMeta />
+
+      <AppReadingTime
+        v-if="document.readingTime"
+        :reading-time="document.readingTime"
+      />
+
+      <PageToc v-if="document.toc" :document="document" class="mb-8" />
     </template>
 
     <template #footer>
diff --git a/pages/faq/_slug.vue b/pages/faq/_slug.vue
index a253b465..597b14ab 100644
--- a/pages/faq/_slug.vue
+++ b/pages/faq/_slug.vue
@@ -6,6 +6,13 @@
     </template>
 
     <template #sidebar>
+      <AppReadingTime
+        v-if="document.readingTime"
+        :reading-time="document.readingTime"
+      />
+
+      <PageToc v-if="document.toc" :document="document" class="mb-8" />
+
       <PageRelated :document="document" path="faq" />
     </template>
   </PageContainer>
diff --git a/pages/lexique/_slug.vue b/pages/lexique/_slug.vue
index a5c73a66..d3e09711 100644
--- a/pages/lexique/_slug.vue
+++ b/pages/lexique/_slug.vue
@@ -9,6 +9,8 @@
     </template>
 
     <template #sidebar>
+      <PageToc v-if="document.toc" :document="document" class="mb-8" />
+
       <aside v-if="pagesWithTerm.length" class="mb-8">
         <h1 class="text-2xl">Pages contenant "{{ document.title }}"</h1>
 
diff --git a/yarn.lock b/yarn.lock
index 978c6cdd..35531ca8 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -901,6 +901,11 @@
   resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-0.2.34.tgz#0a8c348bb23b7b760030f5b1d912e582be4ec915"
   integrity sha512-XcIn3iYbTEzGIxD0/dY5+4f019jIcEIWBiHc3KrmK/ROahwxmZ/s+tdj97p/5K0klz4zZUiMfUlYP0ajhSJjmA==
 
+"@fortawesome/fontawesome-common-types@^0.2.35":
+  version "0.2.35"
+  resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-0.2.35.tgz#01dd3d054da07a00b764d78748df20daf2b317e9"
+  integrity sha512-IHUfxSEDS9dDGqYwIW7wTN6tn/O8E0n5PcAHz9cAaBoZw6UpG20IG/YM3NNLaGPwPqgjBAFjIURzqoQs3rrtuw==
+
 "@fortawesome/fontawesome-svg-core@^1.2.27":
   version "1.2.34"
   resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-1.2.34.tgz#1d1a7c92537cbc2b8a83eef6b6d824b4b5b46b26"
@@ -915,6 +920,13 @@
   dependencies:
     "@fortawesome/fontawesome-common-types" "^0.2.34"
 
+"@fortawesome/free-regular-svg-icons@^5.15.3":
+  version "5.15.3"
+  resolved "https://registry.yarnpkg.com/@fortawesome/free-regular-svg-icons/-/free-regular-svg-icons-5.15.3.tgz#1ec4f2410ff638db549c5c5484fc60b66407dbe6"
+  integrity sha512-q4/p8Xehy9qiVTdDWHL4Z+o5PCLRChePGZRTXkl+/Z7erDVL8VcZUuqzJjs6gUz6czss4VIPBRdCz6wP37/zMQ==
+  dependencies:
+    "@fortawesome/fontawesome-common-types" "^0.2.35"
+
 "@fortawesome/free-solid-svg-icons@^5.15.2":
   version "5.15.2"
   resolved "https://registry.yarnpkg.com/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-5.15.2.tgz#25bb035de57cf85aee8072965732368ccc8e8943"
@@ -10135,6 +10147,11 @@ readdirp@~3.5.0:
   dependencies:
     picomatch "^2.2.1"
 
+reading-time@^1.3.0:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/reading-time/-/reading-time-1.3.0.tgz#d13e74431589a4a9038669f24d5acbc08bbb015d"
+  integrity sha512-RJ8J5O6UvrclfZpcPSPuKusrdRfoY7uXXoYOOdeswZNtSkQaewT3919yz6RyloDBR+iwcUyz5zGOUjhgvfuv3g==
+
 reduce-css-calc@^2.1.6, reduce-css-calc@^2.1.8:
   version "2.1.8"
   resolved "https://registry.yarnpkg.com/reduce-css-calc/-/reduce-css-calc-2.1.8.tgz#7ef8761a28d614980dc0c982f772c93f7a99de03"
-- 
GitLab