You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@echarts.apache.org by sh...@apache.org on 2021/08/24 08:57:28 UTC

[echarts-handbook] branch master updated: remove nuxt-content. change live syntax

This is an automated email from the ASF dual-hosted git repository.

shenyi pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/echarts-handbook.git


The following commit(s) were added to refs/heads/master by this push:
     new 9cb609b  remove nuxt-content. change live syntax
9cb609b is described below

commit 9cb609be4acc90284a079fc67aab405ba47fdaaa
Author: pissang <bm...@gmail.com>
AuthorDate: Tue Aug 24 16:56:36 2021 +0800

    remove nuxt-content. change live syntax
    
    nuxt content will generate a large db.json which can't be avoided
---
 components/markdown/CodeBlock.vue                  |   13 +-
 components/markdown/Live.vue                       |   13 +-
 components/partials/PostContent.ts                 |   11 +
 .../en/application/chart-types/bar/bar-race.md     |   91 +-
 .../en/application/chart-types/bar/basic-bar.md    |   16 +-
 .../en/application/chart-types/bar/stacked-bar.md  |    2 +-
 .../en/application/chart-types/bar/waterfall.md    |   19 +-
 .../en/application/chart-types/line/area-line.md   |    2 +-
 .../en/application/chart-types/line/basic-line.md  |   10 +-
 .../en/application/chart-types/line/smooth-line.md |    2 +-
 .../application/chart-types/line/stacked-line.md   |    4 +-
 .../en/application/chart-types/line/step-line.md   |    2 +-
 .../en/application/chart-types/pie/basic-pie.md    |    8 +-
 .../en/application/chart-types/pie/doughnut.md     |    4 +-
 contents/en/application/chart-types/pie/rose.md    |    2 +-
 .../chart-types/scatter/basic-scatter.md           |    8 +-
 contents/en/application/label/rich-text.md         |    8 +-
 contents/en/concepts/axis.md                       |    2 +-
 contents/en/concepts/data-transform.md             |    4 +-
 contents/en/concepts/dataset.md                    |   12 +-
 contents/en/concepts/event.md                      |    2 +-
 contents/en/concepts/legend.md                     |    2 +-
 contents/en/concepts/style.md                      |    2 +-
 contents/en/meta/edit-guide.md                     |   16 +-
 .../zh/application/chart-types/bar/bar-race.md     |   92 +-
 .../zh/application/chart-types/bar/basic-bar.md    |   12 +-
 .../zh/application/chart-types/bar/stacked-bar.md  |    2 +-
 .../zh/application/chart-types/bar/waterfall.md    |   19 +-
 .../zh/application/chart-types/line/area-line.md   |    2 +-
 .../zh/application/chart-types/line/basic-line.md  |   10 +-
 .../zh/application/chart-types/line/smooth-line.md |    2 +-
 .../application/chart-types/line/stacked-line.md   |    4 +-
 .../zh/application/chart-types/line/step-line.md   |    2 +-
 .../zh/application/chart-types/pie/basic-pie.md    |    8 +-
 .../zh/application/chart-types/pie/doughnut.md     |    4 +-
 contents/zh/application/chart-types/pie/rose.md    |    2 +-
 .../chart-types/scatter/basic-scatter.md           |    8 +-
 contents/zh/application/label/rich-text.md         |    8 +-
 contents/zh/basics/release-note/5-2-0.md           |   36 +-
 contents/zh/best-practice/design/color-enhance.md  |    2 +-
 contents/zh/concepts/axis.md                       |    2 +-
 contents/zh/concepts/data-transform.md             |    4 +-
 contents/zh/concepts/dataset.md                    |   14 +-
 contents/zh/concepts/event.md                      |    4 +-
 contents/zh/concepts/legend.md                     |    2 +-
 contents/zh/concepts/style.md                      |    4 +-
 contents/zh/meta/edit-guide.md                     |   30 +-
 layouts/default.vue                                |    6 +-
 nuxt.config.js                                     |   86 +-
 package-lock.json                                  | 1591 ++++----------------
 package.json                                       |    8 +-
 pages/_.vue                                        |  107 +-
 52 files changed, 722 insertions(+), 1604 deletions(-)

diff --git a/components/markdown/CodeBlock.vue b/components/markdown/CodeBlock.vue
index b601c1f..0883826 100644
--- a/components/markdown/CodeBlock.vue
+++ b/components/markdown/CodeBlock.vue
@@ -30,6 +30,8 @@ import 'prismjs/plugins/diff-highlight/prism-diff-highlight'
 import 'prism-themes/themes/prism-material-oceanic.css'
 
 import { defineComponent, ref, onMounted, computed } from '@vue/composition-api'
+import * as base64 from 'js-base64'
+
 import CodeBlockCopyClipboard from './CodeBlockCopyClipboard.vue'
 
 const DIFF_HIGHLIGHT_SYNTAX = /^(diff)-([\w-]+)/i
@@ -84,23 +86,20 @@ export default defineComponent({
       type: String,
       default: 'js'
     },
+    code: {
+      type: String
+    },
     lineHighlights: String,
     fileName: String
   },
 
   setup(props, context) {
-    const rawCode = ref('')
+    const rawCode = ref(base64.decode(props.code!))
 
     const highlightResult = computed(() => {
       return highlight(props.lang, rawCode.value)
     })
 
-    // Update first time.
-    onMounted(() => {
-      const defaultSlot = context.slots.default && context.slots.default()
-      rawCode.value = ((defaultSlot && defaultSlot[0].text) || '').trim()
-    })
-
     return {
       rawCode,
       highlightResult
diff --git a/components/markdown/Live.vue b/components/markdown/Live.vue
index 4af5545..030042c 100644
--- a/components/markdown/Live.vue
+++ b/components/markdown/Live.vue
@@ -32,7 +32,7 @@ import {
   onMounted,
   onUnmounted
 } from '@vue/composition-api'
-
+import * as base64 from 'js-base64'
 import { createSandbox } from '../helper/sandbox'
 import CodeBlockCopyClipboard from './CodeBlockCopyClipboard.vue'
 
@@ -61,6 +61,10 @@ export default defineComponent({
       default: 'js'
     },
 
+    code: {
+      type: String
+    },
+
     layout: {
       type: String,
       default: 'tb',
@@ -71,7 +75,7 @@ export default defineComponent({
   },
 
   setup(props, context) {
-    const innerCode = ref('')
+    const innerCode = ref(base64.decode(props.code))
     const previewContainer = ref<HTMLElement | null>(null)
 
     let sandbox: ReturnType<typeof createSandbox>
@@ -105,10 +109,9 @@ export default defineComponent({
     watch(innerCode, () => {
       debouncedUpdate()
     })
-    // Update first time.
+
     onMounted(() => {
-      const defaultSlot = context.slots.default && context.slots.default()
-      innerCode.value = ((defaultSlot && defaultSlot[0].text) || '').trim()
+      debouncedUpdate()
     })
 
     onUnmounted(() => {
diff --git a/components/partials/PostContent.ts b/components/partials/PostContent.ts
new file mode 100644
index 0000000..9906f6c
--- /dev/null
+++ b/components/partials/PostContent.ts
@@ -0,0 +1,11 @@
+export default {
+  functional: true,
+  props: {
+    content: String
+  },
+  render(h, context) {
+    return h({
+      template: '<article>' + context.props.content + '</article>'
+    })
+  }
+}
diff --git a/contents/en/application/chart-types/bar/bar-race.md b/contents/en/application/chart-types/bar/bar-race.md
index 4951010..d09299d 100755
--- a/contents/en/application/chart-types/bar/bar-race.md
+++ b/contents/en/application/chart-types/bar/bar-race.md
@@ -10,7 +10,7 @@ Bar race is a chart that shows changes in the ranking of data over time and it i
 2. Set `yAxis.inverse` to be `true` to display longer bars at top
 3. `yAxis.animationDuration` is suggested to be set to be `300` for bar reordering animation for the first time
 4. `yAxis.animationDurationUpdate` is suggested to be set to be `300` for bar reordering animation for later times
-5. Set `yAxis.max` to be *n - 1* where *n* is the number of bars to be displayed; otherwise, all bars are displayed
+5. Set `yAxis.max` to be _n - 1_ where _n_ is the number of bars to be displayed; otherwise, all bars are displayed
 6. `xAxis.max` is suggested to be set to be `'dataMax'` so that the maximum of data is used as X maximum.
 7. If realtime label changing is required, set `series.label.valueAnimation` to be `true`
 8. Set `animationDuration` to be `0` so that the first animation doesn't start from 0; if you wish otherwise, set it to be the same value as `animationDurationUpdate`
@@ -21,61 +21,62 @@ Bar race is a chart that shows changes in the ranking of data over time and it i
 
 A complete demo:
 
-```js [live]
+```js live
 var data = [];
 for (let i = 0; i < 5; ++i) {
-    data.push(Math.round(Math.random() * 200));
+  data.push(Math.round(Math.random() * 200));
 }
 
 option = {
-    xAxis: {
-        max: 'dataMax',
-    },
-    yAxis: {
-        type: 'category',
-        data: ['A', 'B', 'C', 'D', 'E'],
-        inverse: true,
-        animationDuration: 300,
-        animationDurationUpdate: 300,
-        max: 2 // only the largest 3 bars will be displayed
-    },
-    series: [{
-        realtimeSort: true,
-        name: 'X',
-        type: 'bar',
-        data: data,
-        label: {
-            show: true,
-            position: 'right',
-            valueAnimation: true
-        }
-    }],
-    legend: {
-        show: true
-    },
-    animationDuration: 0,
-    animationDurationUpdate: 3000,
-    animationEasing: 'linear',
-    animationEasingUpdate: 'linear'
+  xAxis: {
+    max: 'dataMax'
+  },
+  yAxis: {
+    type: 'category',
+    data: ['A', 'B', 'C', 'D', 'E'],
+    inverse: true,
+    animationDuration: 300,
+    animationDurationUpdate: 300,
+    max: 2 // only the largest 3 bars will be displayed
+  },
+  series: [
+    {
+      realtimeSort: true,
+      name: 'X',
+      type: 'bar',
+      data: data,
+      label: {
+        show: true,
+        position: 'right',
+        valueAnimation: true
+      }
+    }
+  ],
+  legend: {
+    show: true
+  },
+  animationDuration: 0,
+  animationDurationUpdate: 3000,
+  animationEasing: 'linear',
+  animationEasingUpdate: 'linear'
 };
 
-function run () {
-    var data = option.series[0].data;
-    for (var i = 0; i < data.length; ++i) {
-        if (Math.random() > 0.9) {
-            data[i] += Math.round(Math.random() * 2000);
-        }
-        else {
-            data[i] += Math.round(Math.random() * 200);
-        }
+function run() {
+  var data = option.series[0].data;
+  for (var i = 0; i < data.length; ++i) {
+    if (Math.random() > 0.9) {
+      data[i] += Math.round(Math.random() * 2000);
+    } else {
+      data[i] += Math.round(Math.random() * 200);
     }
-    myChart.setOption(option);
+  }
+  myChart.setOption(option);
 }
 
 setTimeout(function() {
-    run();
+  run();
 }, 0);
-setInterval(function () {
-    run();
+setInterval(function() {
+  run();
 }, 3000);
 ```
diff --git a/contents/en/application/chart-types/bar/basic-bar.md b/contents/en/application/chart-types/bar/basic-bar.md
index 1d92a27..c2eca19 100755
--- a/contents/en/application/chart-types/bar/basic-bar.md
+++ b/contents/en/application/chart-types/bar/basic-bar.md
@@ -10,7 +10,11 @@ To set the bar chart, you need to set the `type` of `series` as `'bar'`.
 
 Let's begin with a basic bar chart:
 
-```js [live]
+```js
+/*
+live
+
+*/
 option = {
   xAxis: {
     data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
@@ -31,7 +35,7 @@ In this case, the x-axis is under the category type. Therefore, you should defin
 
 You may use a series to represent a group of related data. To show multiple series in the same chart, you need to add one more array under the `series`.
 
-```js [live]
+```js live
 option = {
   xAxis: {
     data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
@@ -64,7 +68,7 @@ It is a good idea to install the style of Bar Chart by using ['series.itemStyle'
 
 Here is a example:
 
-```js [live]
+```js live
 option = {
   xAxis: {
     data: ['A', 'B', 'C', 'D', 'E']
@@ -91,7 +95,7 @@ In this case, we defined the style of the bar chart by `'itemStyle'` of correspo
 
 You can use [`barWidth`](${optionPath}#series-bar.barWidth) to change the width of the bar. For instance, the `'barWidth'` in the following case was set to `'20%'`. It indicates that width of each bar is 20% of the category width. As there are 5 data in every series, 20% `'barWidth'` means 4% for the entire x-axis.
 
-```js [live]
+```js live
 option = {
   xAxis: {
     data: ['A', 'B', 'C', 'D', 'E']
@@ -118,7 +122,7 @@ In addition, [`barMaxWidth`](${optionPath}series-bar.barMaxWidth) has limited th
 
 There are two kinds of column spacing. One is the spacing between different series under the same category: [`barWidth`](${optionPath}series-bar.barWidth). The other is the spacing between categories: [`barCategoryGap`](${optionPath}series-bar.barCategoryGap).
 
-```js [live]
+```js live
 option = {
   xAxis: {
     data: ['A', 'B', 'C', 'D', 'E']
@@ -149,7 +153,7 @@ Usually, `barWidth` is not necessary to be clarified if `'barGap'` and `barCateg
 
 You might want to change the background color of bars sometimes. After ECharts v4.7.0, this function can be enabled by ['showBackground'](${optionPath}series-bar.showBackground) and configured by ['backgroundStyle'](${optionPath}series-bar.backgroundStyle).
 
-```js [live]
+```js live
 option = {
   xAxis: {
     type: 'category',
diff --git a/contents/en/application/chart-types/bar/stacked-bar.md b/contents/en/application/chart-types/bar/stacked-bar.md
index 46de9c0..ed4a532 100755
--- a/contents/en/application/chart-types/bar/stacked-bar.md
+++ b/contents/en/application/chart-types/bar/stacked-bar.md
@@ -4,7 +4,7 @@ Sometimes, we hope to not only figure series separately but also the trend of th
 
 There is a simple way to implement a stacked bar chart by ECharts. You need to set the same string type value for a group of series in `stack`. The series with the same `stack` value will be in the same category.
 
-```js [live]
+```js live
 option = {
   xAxis: {
     data: ['A', 'B', 'C', 'D', 'E']
diff --git a/contents/en/application/chart-types/bar/waterfall.md b/contents/en/application/chart-types/bar/waterfall.md
index e806327..fef9236 100755
--- a/contents/en/application/chart-types/bar/waterfall.md
+++ b/contents/en/application/chart-types/bar/waterfall.md
@@ -10,7 +10,7 @@ var data = [900, 345, 393, -108, -154, 135, 178, 286, -119, -361, -203];
 
 That is, the first data is `900` and the second data `345` represents the addition of `345` to `900`, etc. When presenting this data as a stepped waterfall chart, we can use three series: the first is a non-interactive transparent series to implement the suspension bar effect; the second series is used to represent positive numbers; and the second series is used to represent negative numbers.
 
-```js [live]
+```js live
 var data = [900, 345, 393, -108, -154, 135, 178, 286, -119, -361, -203];
 var help = [];
 var positive = [];
@@ -19,21 +19,18 @@ for (var i = 0, sum = 0; i < data.length; ++i) {
   if (data[i] >= 0) {
     positive.push(data[i]);
     negative.push('-');
-  }
-  else {
+  } else {
     positive.push('-');
     negative.push(-data[i]);
   }
 
   if (i === 0) {
     help.push(0);
-  }
-  else {
+  } else {
     sum += data[i - 1];
     if (data[i] < 0) {
       help.push(sum + data[i]);
-    }
-    else {
+    } else {
       help.push(sum);
     }
   }
@@ -51,17 +48,17 @@ option = {
   },
   xAxis: {
     type: 'category',
-    splitLine: {show:false},
-    data: function (){
+    splitLine: { show: false },
+    data: (function() {
       var list = [];
       for (var i = 1; i <= 11; i++) {
         list.push('Oct/' + i);
       }
       return list;
-    }()
+    })()
   },
   yAxis: {
-    type : 'value'
+    type: 'value'
   },
   series: [
     {
diff --git a/contents/en/application/chart-types/line/area-line.md b/contents/en/application/chart-types/line/area-line.md
index 5fa335d..0fd1d87 100755
--- a/contents/en/application/chart-types/line/area-line.md
+++ b/contents/en/application/chart-types/line/area-line.md
@@ -2,7 +2,7 @@
 
 The area chart fills the space between the line and axis with the background color, to express the data by the size of the area. Compared with the normal line chart, the area chart has more intuitive visual effects. It is especially suitable for the scenario with a few series.
 
-```js [live]
+```js live
 option = {
   xAxis: {
     data: ['A', 'B', 'C', 'D', 'E']
diff --git a/contents/en/application/chart-types/line/basic-line.md b/contents/en/application/chart-types/line/basic-line.md
index 686fc9a..867956a 100755
--- a/contents/en/application/chart-types/line/basic-line.md
+++ b/contents/en/application/chart-types/line/basic-line.md
@@ -4,7 +4,7 @@
 
 We can use the following code to build a line chart which has x-axis as `category`, y-axis as `value`:
 
-```js [live]
+```js live
 option = {
   xAxis: {
     type: 'category',
@@ -30,7 +30,7 @@ In this case, we set the type of axis to `category` and `value` under `xAxis` an
 
 How to implement if we want the line chart to be continuous? The answer is simple, as long as every value in `data` of the `series` is represented by an array containing two elements.
 
-```js [live]
+```js live
 option = {
   xAxis: {},
   yAxis: {},
@@ -55,7 +55,7 @@ Line style can be changed by `lineStyle` setting. You can specify color, line wi
 
 Here is an example of setting color, line width and type.
 
-```js [live]
+```js live
 option = {
   xAxis: {
     data: ['A', 'B', 'C', 'D', 'E']
@@ -87,7 +87,7 @@ Item style can be change by [`series.itemStyle`](${optionPath}series-line.itemSt
 
 In the series, the label of the item was specified by [`series.label`](${optionPath}series-line.label). If we change the `show` under `label` to `true`, the value will be displayed by default. Otherwise, if [`series.emphasis.label.show`](${optionPath}series-line.emphasis.label.show) is `true`, the label will show only if the mouse moved across the item.
 
-```js [live]
+```js live
 option = {
   xAxis: {
     data: ['A', 'B', 'C', 'D', 'E']
@@ -115,7 +115,7 @@ In a `series`, there are empty data. It has some difference with `0`. While ther
 
 In ECharts, we use `'-'` to represent null data, It is applicable for data in other series.
 
-```js [live]
+```js live
 option = {
   xAxis: {
     data: ['A', 'B', 'C', 'D', 'E']
diff --git a/contents/en/application/chart-types/line/smooth-line.md b/contents/en/application/chart-types/line/smooth-line.md
index b1e0a86..5816eb3 100755
--- a/contents/en/application/chart-types/line/smooth-line.md
+++ b/contents/en/application/chart-types/line/smooth-line.md
@@ -2,7 +2,7 @@
 
 The smooth line chart is also a variant of the basic line graph. It is a better choice for you to perform a comfort visual experience. While using the ECharts, you only need to change the `smooth` to `true` to achieve this effect.
 
-```js [live]
+```js live
 option = {
   xAxis: {
     data: ['A', 'B', 'C', 'D', 'E']
diff --git a/contents/en/application/chart-types/line/stacked-line.md b/contents/en/application/chart-types/line/stacked-line.md
index 7ebe56b..6c3dd9c 100755
--- a/contents/en/application/chart-types/line/stacked-line.md
+++ b/contents/en/application/chart-types/line/stacked-line.md
@@ -2,7 +2,7 @@
 
 Similar to the [Stacked Bar Chart](${lang}/application/chart-types/bar/stacked-bar), Stacked Line Chart use the `'stack'` in `series` to decide which series should be stacked together.
 
-```js [live]
+```js live
 option = {
   xAxis: {
     data: ['A', 'B', 'C', 'D', 'E']
@@ -25,7 +25,7 @@ option = {
 
 However, without clarification, it is hard for us to judge whether it is a stacked line chart or normal line chart. Therefore, filling color for the area under the line is recommended to indicate for a stacked bar chart.
 
-```js [live]
+```js live
 option = {
   xAxis: {
     data: ['A', 'B', 'C', 'D', 'E']
diff --git a/contents/en/application/chart-types/line/step-line.md b/contents/en/application/chart-types/line/step-line.md
index 7b02a66..a097f87 100755
--- a/contents/en/application/chart-types/line/step-line.md
+++ b/contents/en/application/chart-types/line/step-line.md
@@ -4,7 +4,7 @@ The normal line chart connects two points by straight line directly, while the s
 
 In ECharts, `step` is used to characterize the connection type of the step line chart. It has three available values: `'start'`, `'end'`, and `'middle'`. For item A and B, these values corresponded that the corner occurred at A, B, and mid-point between A and B.
 
-```js [live]
+```js live
 option = {
   legend: {},
   xAxis: {
diff --git a/contents/en/application/chart-types/pie/basic-pie.md b/contents/en/application/chart-types/pie/basic-pie.md
index 8042654..4936c89 100755
--- a/contents/en/application/chart-types/pie/basic-pie.md
+++ b/contents/en/application/chart-types/pie/basic-pie.md
@@ -6,7 +6,7 @@ Pie charts are mainly used to show the proportion of several categories compared
 
 The config of the pie chart is not completely the same as the line chart and bar chart. There is no need to configure the axis. The name and value of data need to be defined in the series. Let's begin with a basic pie chart:
 
-```js [live]
+```js live
 option = {
   series: [
     {
@@ -38,7 +38,7 @@ To be mentioned, the `value` here does not need to be percentage data. ECharts w
 
 The radius of pie chart can be defined by [`series.radius`](${optionPath}series-pie.radius). Both percent string(`'60%'`) and absolute pixel string(`'200'`) are available. While it is a percent string, it is proportional related to the shorter container(`'div'`) edge.
 
-```js [live]
+```js live
 option = {
   series: [
     {
@@ -67,7 +67,7 @@ option = {
 
 By default, if the data sum is 0, the series will divide the shape equally. For instance, if you don't want to show any shape while all 4 series have value equals 0, you could define [`series.stillShowZeroSum`](${optionPath}series-pie.stillShowZeroSum) to `false`.
 
-```js [live]
+```js live
 option = {
   series: [
     {
@@ -94,7 +94,7 @@ option = {
 
 If you are willing to hide the label as well, define the [`series.label.show`](${optionPath}series-pie.label.show) to `false` as well.
 
-```js [live]
+```js live
 option = {
     series: [{
         type: 'pie',
diff --git a/contents/en/application/chart-types/pie/doughnut.md b/contents/en/application/chart-types/pie/doughnut.md
index 7ca00b4..0e9bf4b 100755
--- a/contents/en/application/chart-types/pie/doughnut.md
+++ b/contents/en/application/chart-types/pie/doughnut.md
@@ -8,7 +8,7 @@ In ECharts, the radius of the pie chart could also be an array with 2 elements.
 
 The bar chart, from this perspective, is a subset of the doughnut chart that has inner radius equals to 0.
 
-```js [live]
+```js live
 option = {
   title: {
     text: 'A Case of Doughnut Chart',
@@ -44,7 +44,7 @@ If we set one radius to string of a percentage value, while the other to a value
 
 The previous case gives you a way to show fixed text in the middle of doughnut chart. The next case will show you how to display the corresponding text of the sector highlighted by the mouse. The general idea is to fix `label` in the middle of the chart while hiding `label` in default.
 
-```js [live]
+```js live
 option = {
   legend: {
     orient: 'vertical',
diff --git a/contents/en/application/chart-types/pie/rose.md b/contents/en/application/chart-types/pie/rose.md
index e0a58ee..f3e9b40 100755
--- a/contents/en/application/chart-types/pie/rose.md
+++ b/contents/en/application/chart-types/pie/rose.md
@@ -4,7 +4,7 @@ Rose Chart, which was also called the nightingale chart, usually indicates categ
 
 ECharts can implement Rose Chart by defining [`series.roseType`](${optionPath}series-pie.roseType) of pie chart to `'area'`. All other configs are the same as a basic pie chart.
 
-```js [live]
+```js live
 option = {
   series: [
     {
diff --git a/contents/en/application/chart-types/scatter/basic-scatter.md b/contents/en/application/chart-types/scatter/basic-scatter.md
index 7ff467a..e76f50e 100644
--- a/contents/en/application/chart-types/scatter/basic-scatter.md
+++ b/contents/en/application/chart-types/scatter/basic-scatter.md
@@ -6,7 +6,7 @@ Scatter Chart, a frequently used chart type, was constructed with several "point
 
 The following example is a basic scatter chart configuration with the x-axis as category and the y-axis as value:
 
-```js [live]
+```js live
 option = {
   xAxis: {
     data: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat']
@@ -25,7 +25,7 @@ option = {
 
 In the previous case, the x-axis of the scatter chart is a discrete category axis and the y-axis is a continuous value axis. However, the normal scene for the scatter chart is to have 2 continuous value axis (also called the cartesian coordinate system). The series type is different in that both x-axis and y-axis value are included in `data`, but not in `xAxis` and `yAxis`.
 
-```js [live]
+```js live
 option = {
   xAxis: {},
   yAxis: {},
@@ -69,7 +69,7 @@ Firstly, we need an `SVG` file of a heart. You can draw one by vector editing so
 
 In ECharts, define config `symbol` as a path of d:
 
-```js [live]
+```js live
 option = {
   xAxis: {
     data: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat']
@@ -101,7 +101,7 @@ Besides, it can be defined as a call back function. Here is an example of the fo
 
 The first argument is the data value, and the second argument included other arguments of the data item. In the following instance, we define the size of the item proportional related to the data value.
 
-```js [live]
+```js live
 option = {
   xAxis: {
     data: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat']
diff --git a/contents/en/application/label/rich-text.md b/contents/en/application/label/rich-text.md
index aeac2a3..f0612b2 100644
--- a/contents/en/application/label/rich-text.md
+++ b/contents/en/application/label/rich-text.md
@@ -91,7 +91,7 @@ Border style and background style can be set to text fragment too: `borderColor`
 
 For example:
 
-```js [live]
+```js live
 option = {
   series: [
     {
@@ -186,7 +186,7 @@ option = {
 
 Try to modify the `position` and `distance` option in the following example:
 
-```js [live]
+```js live
 option = {
   series: [
     {
@@ -234,7 +234,7 @@ option = {
 
 Sometimes label is needed to be rotated. For example:
 
-```js [live-lr]
+```js live {layout: 'lr'}
 const labelOption = {
   show: true,
   rotate: 90,
@@ -317,7 +317,7 @@ The position of text in a text fragment:
 
 See example:
 
-```js [live-lr]
+```js live {layout: 'lr'}
 option = {
   series: [
     {
diff --git a/contents/en/concepts/axis.md b/contents/en/concepts/axis.md
index b0cffbd..61e55b8 100644
--- a/contents/en/concepts/axis.md
+++ b/contents/en/concepts/axis.md
@@ -173,7 +173,7 @@ option = {
 
 The y-axis on the left side represents the monthly average temperature in Tokyo, the y-axis on the right side represents the precipitation of Tokyo. The x-axis represents the time. It reflects the trend and relation between the average temperature and precipitation.
 
-```js [live]
+```js live
 option = {
   tooltip: {
     trigger: 'axis',
diff --git a/contents/en/concepts/data-transform.md b/contents/en/concepts/data-transform.md
index 8d28cd9..9ae26d2 100644
--- a/contents/en/concepts/data-transform.md
+++ b/contents/en/concepts/data-transform.md
@@ -16,7 +16,7 @@ With the help of those transform methods, users can be implements the features l
 
 In echarts, data transform is implemented based on the concept of [dataset](~${optionPath}#dataset). A [dataset.transform](${optionPath}#dataset.transform) can be configured in a dataset instance to indicate that this dataset is to be generated from this `transform`. For example:
 
-```js [live]
+```js live
 var option = {
   dataset: [
     {
@@ -251,7 +251,7 @@ option = {
 
 Transform type "filter" is a built-in transform that provide data filter according to specified conditions. The basic option is like:
 
-```js [live]
+```js live
 option = {
   dataset: [
     {
diff --git a/contents/en/concepts/dataset.md b/contents/en/concepts/dataset.md
index 6548766..c203b80 100644
--- a/contents/en/concepts/dataset.md
+++ b/contents/en/concepts/dataset.md
@@ -6,7 +6,7 @@
 
 If data is defined under `series`, for example:
 
-```js [live]
+```js live
 option = {
   xAxis: {
     type: 'category',
@@ -48,7 +48,7 @@ Here are the advantages if you define `data` in `dataset`:
 
 Here is a simple `dataset` example:
 
-```js [live]
+```js live
 option = {
   legend: {},
   tooltip: {},
@@ -75,7 +75,7 @@ option = {
 
 Or try to use the "array of classes" format:
 
-```js [live]
+```js live
 option = {
   legend: {},
   tooltip: {},
@@ -122,7 +122,7 @@ You can use `seriesLayoutBy` to change the understanding of row and column of th
 
 Check this case:
 
-```js [live]
+```js live
 option = {
   legend: {},
   tooltip: {},
@@ -210,7 +210,7 @@ Dimension type can be the following values:
 
 After understand the concept of dimension, you can use [series.encode](${optionPath}#series.encode) to make a mapping:
 
-```js [live]
+```js live
 var option = {
   dataset: {
     source: [
@@ -390,7 +390,7 @@ Q: How to map the 3rd column to the size of the scatter chart?
 
 A:
 
-```js [live]
+```js live
 var option = {
   dataset: {
     source: [
diff --git a/contents/en/concepts/event.md b/contents/en/concepts/event.md
index 66cd1e4..07b0a1c 100644
--- a/contents/en/concepts/event.md
+++ b/contents/en/concepts/event.md
@@ -279,7 +279,7 @@ Commonly used behavior and corresponding parameters are listed in [action](${mai
 
 The following example shows how to highlight each sector one by one in the pie chart using `dispatchAction`.
 
-```js [live]
+```js live
 option = {
   tooltip: {
     trigger: 'item',
diff --git a/contents/en/concepts/legend.md b/contents/en/concepts/legend.md
index 79246a5..44334a0 100644
--- a/contents/en/concepts/legend.md
+++ b/contents/en/concepts/legend.md
@@ -6,7 +6,7 @@ Legends are used to annotate the content in the chart using different colors, sh
 
 Legend is always placed at the upper right corner of the chart. All legends in the same page need to be consistent, align horizontally or vertically by considering the layout of the overall chart space. When the chart have little vertical space or the content area is crowded, it is also a good choice to put legent on the bottom of the chart. Here are some layouts of the legend:
 
-```js [live]
+```js live
 option = {
   legend: {
     // Try 'horizontal'
diff --git a/contents/en/concepts/style.md b/contents/en/concepts/style.md
index 4eb3358..133084c 100644
--- a/contents/en/concepts/style.md
+++ b/contents/en/concepts/style.md
@@ -114,7 +114,7 @@ Generally speaking, all of the built-in components and series follow the naming
 
 In the following code we add shadow, gradient to bubble chart.
 
-```js [live]
+```js live
 var data = [
   [
     [28604, 77, 17096869, 'Australia', 1990],
diff --git a/contents/en/meta/edit-guide.md b/contents/en/meta/edit-guide.md
index 7295db7..e34122f 100644
--- a/contents/en/meta/edit-guide.md
+++ b/contents/en/meta/edit-guide.md
@@ -85,7 +85,7 @@ option = {
 
 <!-- prettier-ignore-start -->
 ```markdown
-```js [live]
+\```js live
 option = {
   xAxis: {
     data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
@@ -103,7 +103,7 @@ option = {
 
 <!-- prettier-ignore-end -->
 
-```js [live]
+```js live
 option = {
   xAxis: {
     data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
@@ -125,7 +125,7 @@ option = {
 <!-- prettier-ignore-start -->
 
 ```markdown
-```js [live-lr]
+```js live {layout: 'lr'}
 option = {
   ...
 };
@@ -134,7 +134,7 @@ option = {
 
 <!-- prettier-ignore-end -->
 
-```js [live-lr]
+```js live {layout: 'lr'}
 option = {
   xAxis: {
     data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
@@ -154,7 +154,7 @@ option = {
 <!-- prettier-ignore-start -->
 
 ```markdown
-```js [live-rl]
+```js live {layout: 'rl'}
 option = {
   ...
 };
@@ -163,7 +163,7 @@ option = {
 
 <!-- prettier-ignore-end -->
 
-```js [live-rl]
+```js live {layout: 'rl'}
 option = {
   xAxis: {
     data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
@@ -183,7 +183,7 @@ option = {
 <!-- prettier-ignore-start -->
 
 ```markdown
-```js [live-bt]
+```js live {layout: 'bt'}
 option = {
   ...
 };
@@ -192,7 +192,7 @@ option = {
 
 <!-- prettier-ignore-end -->
 
-```js [live-bt]
+```js live {layout: 'bt'}
 option = {
   xAxis: {
     data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
diff --git a/contents/zh/application/chart-types/bar/bar-race.md b/contents/zh/application/chart-types/bar/bar-race.md
index ff78a8b..a498774 100644
--- a/contents/zh/application/chart-types/bar/bar-race.md
+++ b/contents/zh/application/chart-types/bar/bar-race.md
@@ -10,7 +10,7 @@
 2. `yAxis.inverse` 设为 `true`,表示 Y 轴从下往上是从小到大的排列
 3. `yAxis.animationDuration` 建议设为 `300`,表示第一次柱条排序动画的时长
 4. `yAxis.animationDurationUpdate` 建议设为 `300`,表示第一次后柱条排序动画的时长
-5. 如果想只显示前 *n* 名,将 `yAxis.max` 设为 *n - 1*,否则显示所有柱条
+5. 如果想只显示前 _n_ 名,将 `yAxis.max` 设为 _n - 1_,否则显示所有柱条
 6. `xAxis.max` 建议设为 `'dataMax'` 表示用数据的最大值作为 X 轴最大值,视觉效果更好
 7. 如果想要实时改变标签,需要将 `series.label.valueAnimation` 设为 `true`
 8. `animationDuration` 设为 `0`,表示第一份数据不需要从 `0` 开始动画(如果希望从 `0` 开始则设为和 `animationDurationUpdate` 相同的值)
@@ -21,61 +21,59 @@
 
 完整的例子如下:
 
-```js [live]
+```js live
 var data = [];
 for (let i = 0; i < 5; ++i) {
-    data.push(Math.round(Math.random() * 200));
+  data.push(Math.round(Math.random() * 200));
 }
 
 option = {
-    xAxis: {
-        max: 'dataMax',
-    },
-    yAxis: {
-        type: 'category',
-        data: ['A', 'B', 'C', 'D', 'E'],
-        inverse: true,
-        animationDuration: 300,
-        animationDurationUpdate: 300,
-        max: 2 // only the largest 3 bars will be displayed
-    },
-    series: [{
-        realtimeSort: true,
-        name: 'X',
-        type: 'bar',
-        data: data,
-        label: {
-            show: true,
-            position: 'right',
-            valueAnimation: true
-        }
-    }],
-    legend: {
-        show: true
-    },
-    animationDuration: 0,
-    animationDurationUpdate: 3000,
-    animationEasing: 'linear',
-    animationEasingUpdate: 'linear'
+  xAxis: {
+    max: 'dataMax'
+  },
+  yAxis: {
+    type: 'category',
+    data: ['A', 'B', 'C', 'D', 'E'],
+    inverse: true,
+    animationDuration: 300,
+    animationDurationUpdate: 300,
+    max: 2 // only the largest 3 bars will be displayed
+  },
+  series: [
+    {
+      realtimeSort: true,
+      name: 'X',
+      type: 'bar',
+      data: data,
+      label: {
+        show: true,
+        position: 'right',
+        valueAnimation: true
+      }
+    }
+  ],
+  legend: {
+    show: true
+  },
+  animationDuration: 3000,
+  animationDurationUpdate: 3000,
+  animationEasing: 'linear',
+  animationEasingUpdate: 'linear'
 };
 
-function run () {
-    var data = option.series[0].data;
-    for (var i = 0; i < data.length; ++i) {
-        if (Math.random() > 0.9) {
-            data[i] += Math.round(Math.random() * 2000);
-        }
-        else {
-            data[i] += Math.round(Math.random() * 200);
-        }
+function update() {
+  var data = option.series[0].data;
+  for (var i = 0; i < data.length; ++i) {
+    if (Math.random() > 0.9) {
+      data[i] += Math.round(Math.random() * 2000);
+    } else {
+      data[i] += Math.round(Math.random() * 200);
     }
-    myChart.setOption(option);
+  }
+  myChart.setOption(option);
 }
 
-setTimeout(function() {
-    run();
-}, 0);
-setInterval(function () {
-    run();
+setInterval(function() {
+  update();
 }, 3000);
 ```
diff --git a/contents/zh/application/chart-types/bar/basic-bar.md b/contents/zh/application/chart-types/bar/basic-bar.md
index b65718b..b4b1e1b 100644
--- a/contents/zh/application/chart-types/bar/basic-bar.md
+++ b/contents/zh/application/chart-types/bar/basic-bar.md
@@ -10,7 +10,7 @@
 
 最简单的柱状图可以这样设置:
 
-```js [live]
+```js live
 option = {
   xAxis: {
     data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
@@ -31,7 +31,7 @@ option = {
 
 我们可以用一个系列表示一组相关的数据,如果需要实现多系列的柱状图,只需要在 `series` 多添加一项就可以了——
 
-```js [live]
+```js live
 option = {
   xAxis: {
     data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
@@ -62,7 +62,7 @@ option = {
 - 柱条透明度(`opacity`);
 - 阴影(`shadowBlur`、`shadowColor`、`shadowOffsetX`、`shadowOffsetY`)。
 
-```js [live]
+```js live
 option = {
   xAxis: {
     data: ['A', 'B', 'C', 'D', 'E']
@@ -89,7 +89,7 @@ option = {
 
 柱条宽度可以通过 [`barWidth`](${optionPath}#series-bar.barWidth) 设置。比如在下面的例子中,将 `barWidth` 设为 `'20%'`,表示每个柱条的宽度就是类目宽度的 20%。由于这个例子中,每个系列有 5 个数据,20% 的类目宽度也就是整个 x 轴宽度的 4%。
 
-```js [live]
+```js live
 option = {
   xAxis: {
     data: ['A', 'B', 'C', 'D', 'E']
@@ -116,7 +116,7 @@ option = {
 
 柱条间距分为两种,一种是不同系列在同一类目下的距离 [`barWidth`](${optionPath}series-bar.barWidth),另一种是类目与类目的距离 [`barCategoryGap`](${optionPath}series-bar.barCategoryGap)。
 
-```js [live]
+```js live
 option = {
   xAxis: {
     data: ['A', 'B', 'C', 'D', 'E']
@@ -147,7 +147,7 @@ option = {
 
 有时,我们希望能够为柱条添加背景色。从 ECharts 4.7.0 版本开始,这一功能可以简单地用 [`showBackground`](${optionPath}series-bar.showBackground) 开启,并且可以通过 [`backgroundStyle`](${optionPath}series-bar.backgroundStyle) 配置。
 
-```js [live]
+```js live
 option = {
   xAxis: {
     type: 'category',
diff --git a/contents/zh/application/chart-types/bar/stacked-bar.md b/contents/zh/application/chart-types/bar/stacked-bar.md
index 3bd8e75..fc8c5d8 100644
--- a/contents/zh/application/chart-types/bar/stacked-bar.md
+++ b/contents/zh/application/chart-types/bar/stacked-bar.md
@@ -4,7 +4,7 @@
 
 使用 EChart 实现堆积折线图的方法非常简单,只需要给一个系列的 `stack` 值设置一个字符串类型的值,这一个值表示该系列堆积的类别。也就是说,拥有同样 `stack` 值的系列将堆积在一组。
 
-```js [live]
+```js live
 option = {
   xAxis: {
     data: ['A', 'B', 'C', 'D', 'E']
diff --git a/contents/zh/application/chart-types/bar/waterfall.md b/contents/zh/application/chart-types/bar/waterfall.md
index ce995be..2abd7a1 100644
--- a/contents/zh/application/chart-types/bar/waterfall.md
+++ b/contents/zh/application/chart-types/bar/waterfall.md
@@ -10,7 +10,7 @@ var data = [900, 345, 393, -108, -154, 135, 178, 286, -119, -361, -203];
 
 也就是第一个数据是 `900`,第二个数据 `345` 表示的是在 `900` 的基础上增加了 `345`……将这个数据展示为阶梯瀑布图时,我们可以使用三个系列:第一个是不可交互的透明系列,用来实现“悬空”的柱状图效果;第二个系列用来表示正数;第二个系列用来表示负数。
 
-```js [live]
+```js live
 var data = [900, 345, 393, -108, -154, 135, 178, 286, -119, -361, -203];
 var help = [];
 var positive = [];
@@ -19,21 +19,18 @@ for (var i = 0, sum = 0; i < data.length; ++i) {
   if (data[i] >= 0) {
     positive.push(data[i]);
     negative.push('-');
-  }
-  else {
+  } else {
     positive.push('-');
     negative.push(-data[i]);
   }
 
   if (i === 0) {
     help.push(0);
-  }
-  else {
+  } else {
     sum += data[i - 1];
     if (data[i] < 0) {
       help.push(sum + data[i]);
-    }
-    else {
+    } else {
       help.push(sum);
     }
   }
@@ -51,17 +48,17 @@ option = {
   },
   xAxis: {
     type: 'category',
-    splitLine: {show:false},
-    data: function (){
+    splitLine: { show: false },
+    data: (function() {
       var list = [];
       for (var i = 1; i <= 11; i++) {
         list.push('Oct/' + i);
       }
       return list;
-    }()
+    })()
   },
   yAxis: {
-    type : 'value'
+    type: 'value'
   },
   series: [
     {
diff --git a/contents/zh/application/chart-types/line/area-line.md b/contents/zh/application/chart-types/line/area-line.md
index c14e796..b2230d4 100644
--- a/contents/zh/application/chart-types/line/area-line.md
+++ b/contents/zh/application/chart-types/line/area-line.md
@@ -2,7 +2,7 @@
 
 区域面积图将折线到坐标轴的空间设置背景色,用区域面积表达数据。相比普通的折线图,区域面积图的视觉效果更加饱满丰富,在系列不多的场景下尤其适用。
 
-```js [live]
+```js live
 option = {
   xAxis: {
     data: ['A', 'B', 'C', 'D', 'E']
diff --git a/contents/zh/application/chart-types/line/basic-line.md b/contents/zh/application/chart-types/line/basic-line.md
index 4b0e4c5..3bdfe06 100644
--- a/contents/zh/application/chart-types/line/basic-line.md
+++ b/contents/zh/application/chart-types/line/basic-line.md
@@ -6,7 +6,7 @@
 
 如果我们想建立一个横坐标是类目型(category)、纵坐标是数值型(value)的折线图,我们可以使用这样的方式:
 
-```js [live]
+```js live
 option = {
   xAxis: {
     type: 'category',
@@ -32,7 +32,7 @@ option = {
 
 如果我们希望折线图在横坐标和纵坐标上都是连续的,即在笛卡尔坐标系中,应该如何实现呢?答案也很简单,只要把 `series` 的 `data` 每个数据用一个包含两个元素的数组表示就行了。
 
-```js [live]
+```js live
 option = {
   xAxis: {},
   yAxis: {},
@@ -55,7 +55,7 @@ option = {
 
 折线图中折线的样式可以通过 `lineStyle` 设置。可以为其指定颜色、线宽、折线类型、阴影、不透明度等等,具体的可以参考配置项手册 [`series.lineStyle`](${optionPath}series-line.lineStyle) 了解。这里,我们以设置颜色(color)、线宽(width)和折线类型(type)为例说明。
 
-```js [live]
+```js live
 option = {
   xAxis: {
     data: ['A', 'B', 'C', 'D', 'E']
@@ -87,7 +87,7 @@ option = {
 
 在系列中,这数据点的标签通过 [`series.label`](${optionPath}series-line.label) 属性指定。如果将 `label` 下的 `show` 指定为`true`,则表示该数值默认时就显示;如果为 `false`,而 [`series.emphasis.label.show`](${optionPath}series-line.emphasis.label.show) 为 `true`,则表示只有在鼠标移动到该数据时,才显示数值。
 
-```js [live]
+```js live
 option = {
   xAxis: {
     data: ['A', 'B', 'C', 'D', 'E']
@@ -115,7 +115,7 @@ option = {
 
 在 ECharts 中,我们使用字符串 `'-'` 表示空数据,这对其他系列的数据也是适用的。
 
-```js [live]
+```js live
 option = {
   xAxis: {
     data: ['A', 'B', 'C', 'D', 'E']
diff --git a/contents/zh/application/chart-types/line/smooth-line.md b/contents/zh/application/chart-types/line/smooth-line.md
index b88e542..496cf1b 100644
--- a/contents/zh/application/chart-types/line/smooth-line.md
+++ b/contents/zh/application/chart-types/line/smooth-line.md
@@ -2,7 +2,7 @@
 
 平滑曲线图也是折线图的一种变形,这种更柔和的样式也是一种不错的视觉选择。使用时,只需要将折线图系列的 `smooth` 属性设置为 `true` 即可。
 
-```js [live]
+```js live
 option = {
   xAxis: {
     data: ['A', 'B', 'C', 'D', 'E']
diff --git a/contents/zh/application/chart-types/line/stacked-line.md b/contents/zh/application/chart-types/line/stacked-line.md
index c987699..27bc688 100644
--- a/contents/zh/application/chart-types/line/stacked-line.md
+++ b/contents/zh/application/chart-types/line/stacked-line.md
@@ -2,7 +2,7 @@
 
 与[堆叠柱状图](./zh/application/chart-types/bar/stacked-bar)类似,堆叠折线图也是用系列的 `stack` 设置哪些系列堆叠在一起。
 
-```js [live]
+```js live
 option = {
   xAxis: {
     data: ['A', 'B', 'C', 'D', 'E']
@@ -25,7 +25,7 @@ option = {
 
 但是不同的是,如果不加说明的话,我们很难判断出这是一个堆叠折线图,还是一个普通的折线图。所以,对于堆叠折线图而言,一般建议使用区域填充色以表明堆叠的情况。
 
-```js [live]
+```js live
 option = {
   xAxis: {
     data: ['A', 'B', 'C', 'D', 'E']
diff --git a/contents/zh/application/chart-types/line/step-line.md b/contents/zh/application/chart-types/line/step-line.md
index 7a0a8bb..96c4bd6 100644
--- a/contents/zh/application/chart-types/line/step-line.md
+++ b/contents/zh/application/chart-types/line/step-line.md
@@ -4,7 +4,7 @@
 
 在 ECharts 中,系列的 `step` 属性用来表征阶梯线图的连接类型,它共有三种取值:`'start'`、`'middle'` 和 `'end'`,分别表示在当前点,当前点与下个点的中间点,下个点拐弯。
 
-```js [live]
+```js live
 option = {
   xAxis: {
     type: 'category',
diff --git a/contents/zh/application/chart-types/pie/basic-pie.md b/contents/zh/application/chart-types/pie/basic-pie.md
index 8ef1873..54e17e4 100644
--- a/contents/zh/application/chart-types/pie/basic-pie.md
+++ b/contents/zh/application/chart-types/pie/basic-pie.md
@@ -6,7 +6,7 @@
 
 饼图的配置和折线图、柱状图略有不同,不再需要配置坐标轴,而是把数据名称和值都写在系列中。以下是一个最简单的饼图的例子。
 
-```js [live]
+```js live
 option = {
   series: [
     {
@@ -38,7 +38,7 @@ option = {
 
 饼图的半径可以通过 [`series.radius`](${optionPath}series-pie.radius) 设置,可以是诸如 `'60%'` 这样相对的百分比字符串,或是 `200` 这样的绝对像素数值。当它是百分比字符串时,它是相对于容器宽高中较小的一条边的。也就是说,如果宽度大于高度,则百分比是相对于高度的,反之则反;当它是数值型时,它表示绝对的像素大小。
 
-```js [live]
+```js live
 option = {
   series: [
     {
@@ -67,7 +67,7 @@ option = {
 
 在默认情况下,如果数据值和为 0,会显示平均分割的扇形。比如,如果有 4 个数据项,并且每个数据项都是 0,则每个扇形都是 90°。如果我们希望在这种情况下不显示任何扇形,可以将 [`series.stillShowZeroSum`](${optionPath}series-pie.stillShowZeroSum) 设为 `false`。
 
-```js [live]
+```js live
 option = {
   series: [
     {
@@ -94,7 +94,7 @@ option = {
 
 如果希望扇形对应的标签也不显示,可以将 [`series.label.show`](${optionPath}series-pie.label.show) 设为 `false`。
 
-```js [live]
+```js live
 option = {
   series: [
     {
diff --git a/contents/zh/application/chart-types/pie/doughnut.md b/contents/zh/application/chart-types/pie/doughnut.md
index 169d866..80c2f87 100644
--- a/contents/zh/application/chart-types/pie/doughnut.md
+++ b/contents/zh/application/chart-types/pie/doughnut.md
@@ -8,7 +8,7 @@
 
 从这个角度上来说,可以认为饼图是一个内半径为 0 的圆环图,也就是说,饼图是圆环图的特例。
 
-```js [live]
+```js live
 option = {
   title: {
     text: '圆环图的例子',
@@ -44,7 +44,7 @@ option = {
 
 上面的例子展现了在圆环图中间显示固定文字的例子,下面我们要介绍,如何在圆环图中间显示鼠标高亮的扇形对应的文字。实现这一效果的思路是,利用系列的 `label`(默认用扇形颜色显示数据的 `name`),显示在圆环图中间。在默认情况下不显示系列的 `label`,在高亮时显示。具体的代码如下:
 
-```js [live]
+```js live
 option = {
   legend: {
     orient: 'vertical',
diff --git a/contents/zh/application/chart-types/pie/rose.md b/contents/zh/application/chart-types/pie/rose.md
index 5e4e7f9..d1875af 100644
--- a/contents/zh/application/chart-types/pie/rose.md
+++ b/contents/zh/application/chart-types/pie/rose.md
@@ -4,7 +4,7 @@
 
 ECharts 可以通过将饼图的 [`series.roseType`](${optionPath}series-pie.roseType) 值设为 `'area'` 实现南丁格尔图,其他配置项和饼图是相同的。
 
-```js [live]
+```js live
 option = {
   series: [
     {
diff --git a/contents/zh/application/chart-types/scatter/basic-scatter.md b/contents/zh/application/chart-types/scatter/basic-scatter.md
index ec66ba9..a683f11 100644
--- a/contents/zh/application/chart-types/scatter/basic-scatter.md
+++ b/contents/zh/application/chart-types/scatter/basic-scatter.md
@@ -6,7 +6,7 @@
 
 下面是一个横坐标为类目轴、纵坐标为数值轴的最简单的散点图配置:
 
-```js [live]
+```js live
 option = {
   xAxis: {
     data: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat']
@@ -25,7 +25,7 @@ option = {
 
 在上文的例子中,散点图的横坐标都是离散的类目轴,而纵坐标都是连续的数值轴。而对于散点图而言,另一种常见的场景是,两个坐标轴均为连续的数值轴,也就是笛卡尔坐标系。这时的系列形式略有不同,数据的横坐标和纵坐标一同写在 `data` 中,而非坐标轴中。
 
-```js [live]
+```js live
 option = {
   xAxis: {},
   yAxis: {},
@@ -69,7 +69,7 @@ ECharts 内置形状包括:圆形、矩形、圆角矩形、三角形、菱形
 
 在 ECharts 的 `symbol` 配置项中,我们使用 `d` 的值作为路径。
 
-```js [live]
+```js live
 option = {
   xAxis: {
     data: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat']
@@ -103,7 +103,7 @@ option = {
 
 在下面的例子中,我们将散点图点的大小设置为与其数据值成正比。
 
-```js [live]
+```js live
 option = {
   xAxis: {
     data: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat']
diff --git a/contents/zh/application/label/rich-text.md b/contents/zh/application/label/rich-text.md
index 714d80a..fe4ad81 100644
--- a/contents/zh/application/label/rich-text.md
+++ b/contents/zh/application/label/rich-text.md
@@ -90,7 +90,7 @@ labelOption = {
 
 例如:
 
-```js [live]
+```js live
 option = {
   series: [
     {
@@ -185,7 +185,7 @@ option = {
 
 试试在下面例子中修改`position`和`distance` 属性:
 
-```js [live]
+```js live
 option = {
   series: [
     {
@@ -234,7 +234,7 @@ option = {
 
 某些图中,为了能有足够长的空间来显示标签,需要对标签进行旋转。例如:
 
-```js [live-lr]
+```js live {layout: 'lr'}
 const labelOption = {
   show: true,
   rotate: 90,
@@ -317,7 +317,7 @@ option = {
 
 看下面的例子:
 
-```js [live-lr]
+```js live {layout: 'lr'}
 option = {
   series: [
     {
diff --git a/contents/zh/basics/release-note/5-2-0.md b/contents/zh/basics/release-note/5-2-0.md
index 0eb4537..7421e5b 100644
--- a/contents/zh/basics/release-note/5-2-0.md
+++ b/contents/zh/basics/release-note/5-2-0.md
@@ -2,11 +2,11 @@
 
 ## 全局过渡动画 Universal Transition
 
-在 Apache ECharts 中我们一直把自然流畅的过渡动画作为我们的一个重要特性,我们希望能够动画去关联数据的变化,让整个数据的变化不会突兀的反应在图形上。
+在 Apache ECharts 中我们一直把自然流畅的过渡动画作为我们的一个重要特性,我们希望能够通过动画去关联数据的变化,让数据的变化不会突兀的反应在图形上。
 
-在之前的版本中,过渡动画主要应用在了相同类型的图形的位置,尺寸,形状上,而且只能作用在相同类型的系列上。比如下面例子就是通过饼图中扇区形状的变化反映了数据分布的变化:
+在之前的版本中,过渡动画主要应用在了相同类型的图形的位置、尺寸、形状上,而且只能作用在相同类型的系列上。比如,下面例子就是通过饼图中扇区形状的变化反映了数据分布的变化:
 
-```js [live-lr]
+```js live {layout: 'lr'}
 function makeRandomData() {
   return [
     {
@@ -42,15 +42,15 @@ setInterval(() => {
 }, 2000);
 ```
 
-### 跨系列的变形动画
+### 跨系列的形变动画
 
 这次从 5.2.0 开始,我们引入了更强大的全局过渡动画 Universal Transition,让过渡动画不再局限于相同类型的系列之间。
 
-在设置`universalTransition: true`开启全局过渡动画后,从饼图切换到柱状图,或者从柱状图切换成散点图,甚至旭日图和矩形树图这类复杂的图表之间,都可以通过形变的方式自然的通过动画过渡。
+在设置`universalTransition: true`开启全局过渡动画后,从饼图切换成柱状图,或者从柱状图切换成散点图,甚至旭日图和矩形树图这类复杂的图表之间,都可以通过形变的方式自然的进行动画过渡。
 
-饼图和柱状图之间的切换:
+如下,饼图和柱状图之间的切换:
 
-```js [live-bt]
+```js live {layout: 'bt'}
 const dataset = {
   dimensions: ['name', 'score'],
   source: [
@@ -110,11 +110,11 @@ setInterval(() => {
 
 ![](images/5-2-0/universal-transition.gif)
 
-这个动画过渡也不仅仅是局限在基础的折柱饼中,在柱状图和地图之间:
+这样的动画过渡不再仅仅局限于基础的折、柱、饼中,在柱状图和地图之间:
 
 ![](images/5-2-0/universal-transition-2.gif)
 
-或者旭日图和矩形树图之间,甚至非常灵活的自定义系列之间都可以进行动画的过渡
+或者旭日图和矩形树图之间,甚至非常灵活的自定义系列之间都可以进行动画的过渡。
 
 ![](images/5-2-0/universal-transition-3.gif)
 
@@ -128,7 +128,7 @@ setInterval(() => {
 
 比如我们要实现一个柱状图下钻的动画,可以将下钻后的整个系列的数据都设置同一个`groupId`,然后跟下钻前的数据对应起来:
 
-```js [live-lr]
+```js live {layout: 'lr'}
 option = {
   xAxis: {
     data: ['Animals', 'Fruits', 'Cars']
@@ -188,9 +188,9 @@ const drilldownData = [
   }
 ];
 
-myChart.on('click', function(event) {
+myChart.on('click', event => {
   if (event.data) {
-    const subData = drilldownData.find(function(data) {
+    const subData = drilldownData.find(data => {
       return data.dataGroupId === event.data.groupId;
     });
     if (!subData) {
@@ -198,7 +198,7 @@ myChart.on('click', function(event) {
     }
     myChart.setOption({
       xAxis: {
-        data: subData.data.map(function(item) {
+        data: subData.data.map(item => {
           return item[0];
         })
       },
@@ -206,7 +206,7 @@ myChart.on('click', function(event) {
         type: 'bar',
         id: 'sales',
         dataGroupId: subData.dataGroupId,
-        data: subData.data.map(function(item) {
+        data: subData.data.map(item => {
           return item[1];
         }),
         universalTransition: {
@@ -254,7 +254,7 @@ myChart.on('click', function(event) {
 
 而现在新增这个配置项后,我们可以在柱状图中给每个数据项都分配不同的颜色:
 
-```js [live-lr]
+```js live {layout: 'lr'}
 option = {
   xAxis: {
     type: 'category',
@@ -275,7 +275,7 @@ option = {
 
 或者在饼图中统一使用一个颜色:
 
-```js [live-lr]
+```js live {layout: 'lr'}
 option = {
   series: {
     type: 'pie',
@@ -309,7 +309,7 @@ option = {
 
 这个版本中我们给极坐标上的柱状图添加了标签的显示,并且支持丰富的标签定位配置。下面是一个最常见的标签显示在端点的进度图:
 
-```js [live-lr]
+```js live {layout: 'lr'}
 option = {
   angleAxis: {
     show: false,
@@ -349,7 +349,7 @@ option = {
 
 为了解决这个问题,这个版本我们会默认在无可显示数据的时候显示一个灰色的占位圆以防止画面中完全空白。我们可以通过`emptyCircleStyle`配置这个占位圆的样式。
 
-```js [live-lr]
+```js live {layout: 'lr'}
 option = {
   series: [
     {
diff --git a/contents/zh/best-practice/design/color-enhance.md b/contents/zh/best-practice/design/color-enhance.md
index 4f0465c..be91bf2 100644
--- a/contents/zh/best-practice/design/color-enhance.md
+++ b/contents/zh/best-practice/design/color-enhance.md
@@ -30,7 +30,7 @@
 
 视觉效果应该尽可能容易地解释,因此请尝试找到与观众的先入为主和文化联想相匹配的配色方案。如下示例中展示了猕猴桃、香蕉、橙子、草莓四种水果的销售数据,分别选择了与水果本身一致的颜色绿色、黄色、橙色、红色。这样,我们在辨别和记忆每个柱状所对应的水果时就轻而易举了。
 
-```js [live]
+```js live
 option = {
   color: ['#6E9D4E', '#EDDB4F', '#F7923A', '#F14747'],
   title: {
diff --git a/contents/zh/concepts/axis.md b/contents/zh/concepts/axis.md
index baa50a4..cd8434d 100644
--- a/contents/zh/concepts/axis.md
+++ b/contents/zh/concepts/axis.md
@@ -173,7 +173,7 @@ option = {
 
 图左侧的 y 轴代表东京月平均气温,右侧的 y 轴表示东京降水量,x 轴表示时间。两组 y 轴在一起,反映了平均气温和降水量间的趋势关系。
 
-```js [live]
+```js live
 option = {
   tooltip: {
     trigger: 'axis',
diff --git a/contents/zh/concepts/data-transform.md b/contents/zh/concepts/data-transform.md
index f081ef6..1c6e26f 100644
--- a/contents/zh/concepts/data-transform.md
+++ b/contents/zh/concepts/data-transform.md
@@ -17,7 +17,7 @@ Apache ECharts<sup>TM</sup> 5 开始支持了“数据转换”( data transfor
 
 下面是上述例子的效果,三个饼图分别显示了 2011、2012、2013 年的数据。
 
-```js [live]
+```js live
 var option = {
   dataset: [
     {
@@ -252,7 +252,7 @@ option = {
 
 echarts 内置提供了能起过滤作用的数据转换器。我们只需声明 `transform.type: "filter"`,以及给出数据筛选条件。如下例:
 
-```js [live]
+```js live
 option = {
   dataset: [
     {
diff --git a/contents/zh/concepts/dataset.md b/contents/zh/concepts/dataset.md
index c218fbf..9ac416b 100644
--- a/contents/zh/concepts/dataset.md
+++ b/contents/zh/concepts/dataset.md
@@ -6,7 +6,7 @@
 
 如果数据设置在 `系列`(`series`)中,例如:
 
-```js [live]
+```js live
 option = {
   xAxis: {
     type: 'category',
@@ -47,7 +47,7 @@ option = {
 
 下面是一个最简单的 `dataset` 的例子:
 
-```js [live]
+```js live
 option = {
   legend: {},
   tooltip: {},
@@ -72,7 +72,7 @@ option = {
 
 或者也可以使用常见的“对象数组”的格式:
 
-```js [live]
+```js live
 option = {
   legend: {},
   tooltip: {},
@@ -117,7 +117,7 @@ option = {
 
 看这个例子:
 
-```js [live]
+```js live
 option = {
   legend: {},
   tooltip: {},
@@ -207,7 +207,7 @@ var option2 = {
 
 了解了维度的概念后,我们就可以使用 [series.encode](${optionPath}#series.encode) 来做映射。总体是这样的感觉:
 
-```js [live]
+```js live
 var option = {
   dataset: {
     source: [
@@ -384,7 +384,7 @@ var option = {
 
 答:
 
-```js [live]
+```js live
 var option = {
   dataset: {
     source: [
@@ -490,7 +490,7 @@ var option = {
 
 ECharts 4 之前一直以来的数据声明方式仍然被正常支持,如果系列已经声明了 [series.data](${optionPath}#series.data), 那么就会使用 [series.data](${optionPath}#series.data) 而非 `dataset`。
 
-```js [live]
+```js live
 option = {
   xAxis: {
     type: 'category',
diff --git a/contents/zh/concepts/event.md b/contents/zh/concepts/event.md
index 2156fc7..7d92d82 100644
--- a/contents/zh/concepts/event.md
+++ b/contents/zh/concepts/event.md
@@ -17,7 +17,7 @@ myChart.on('click', function(params) {
 
 ECharts 支持常规的鼠标事件类型,包括 `'click'`、 `'dblclick'`、 `'mousedown'`、 `'mousemove'`、 `'mouseup'`、 `'mouseover'`、 `'mouseout'`、 `'globalout'`、 `'contextmenu'` 事件。下面先来看一个简单的点击柱状图后打开相应的百度搜索页面的示例。
 
-```js [live]
+```js live
 // 基于准备好的dom,初始化ECharts实例
 // var myChart = echarts.init(document.getElementById('main'));
 
@@ -266,7 +266,7 @@ myChart.on('legendselectchanged', function(params) {
 
 下面示例演示了如何通过 `dispatchAction` 去轮流高亮饼图的每个扇形。
 
-```js [live]
+```js live
 option = {
   title: {
     text: '饼图程序调用高亮示例',
diff --git a/contents/zh/concepts/legend.md b/contents/zh/concepts/legend.md
index 56f3e16..fb845f2 100644
--- a/contents/zh/concepts/legend.md
+++ b/contents/zh/concepts/legend.md
@@ -6,7 +6,7 @@
 
 图例一般放在图表的右上角、也可以放在图表的底部、同一页面中的所有图例位置保持一致,可以横排对齐也可以纵排对齐。还要综合考虑整体的图表空间是适合哪种摆放方式。当图表纵向空间紧张或者内容区量过大的时候、建议摆放在图表的下方。下面是几种图例的摆放方式:
 
-```js [live]
+```js live
 option = {
   legend: {
     // Try 'horizontal'
diff --git a/contents/zh/concepts/style.md b/contents/zh/concepts/style.md
index 0463637..b485226 100644
--- a/contents/zh/concepts/style.md
+++ b/contents/zh/concepts/style.md
@@ -2,7 +2,7 @@
 
 本文主要是大略概述,用哪些方法,可以在 Apache ECharts<sup>TM</sup> 中设置样式,改变图形元素或者文字的颜色、明暗、大小等。
 
-> 之所以用“样式”这种可能不很符合数据可视化思维的词,是因为,比较通俗易懂。
+> 为了让表述更通俗易懂,我们在这里用了“样式”这种可能不很符合数据可视化思维的词
 
 本文介绍这几种方式,他们的功能范畴可能会有交叉(即同一种细节的效果可能可以用不同的方式实现),但是他们各有各的场景偏好。
 
@@ -114,7 +114,7 @@ option = {
 
 在下面例子中我们给气泡图设置了阴影,渐变色等复杂的样式,你可以修改代码中的样式看修改后的效果:
 
-```js [live]
+```js live
 var data = [
   [
     [28604, 77, 17096869, 'Australia', 1990],
diff --git a/contents/zh/meta/edit-guide.md b/contents/zh/meta/edit-guide.md
index a42731d..d0b5cb2 100644
--- a/contents/zh/meta/edit-guide.md
+++ b/contents/zh/meta/edit-guide.md
@@ -83,7 +83,7 @@ option = {
 
 <!-- prettier-ignore-start -->
 ```markdown
-```js [live]
+\```js live
 option = {
   xAxis: {
     data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
@@ -100,7 +100,7 @@ option = {
 ```
 <!-- prettier-ignore-end -->
 
-```js [live]
+```js live
 option = {
   xAxis: {
     data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
@@ -121,7 +121,7 @@ option = {
 
 <!-- prettier-ignore-start -->
 ```markdown
-```js [live-lr]
+\```js live {layout: 'lr'}
 option = {
   ...
 };
@@ -129,7 +129,7 @@ option = {
 ```
 <!-- prettier-ignore-end -->
 
-```js [live-lr]
+```js live {layout: 'lr'}
 option = {
   xAxis: {
     data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
@@ -148,7 +148,7 @@ option = {
 
 <!-- prettier-ignore-start -->
 ```markdown
-```js [live-rl]
+\```js live {layout: 'rl'}
 option = {
   ...
 };
@@ -156,7 +156,7 @@ option = {
 ```
 <!-- prettier-ignore-end -->
 
-```js [live-rl]
+```js live {layout: 'rl'}
 option = {
   xAxis: {
     data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
@@ -175,7 +175,7 @@ option = {
 
 <!-- prettier-ignore-start -->
 ```markdown
-```js [live-bt]
+\```js live {layout: 'bt'}
 option = {
   ...
 };
@@ -183,7 +183,7 @@ option = {
 ```
 <!-- prettier-ignore-end -->
 
-```js [live-bt]
+```js live {layout: 'bt'}
 option = {
   xAxis: {
     data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
@@ -198,13 +198,13 @@ option = {
 };
 ```
 
-### 高亮代码行以及添加文件名
+### 高亮代码行
 
 使用:
 
 <!-- prettier-ignore-start -->
 ```markdown
-```js{1,3-5}[option.js]
+\```js {1,3-5}
 option = {
   series: [
     {
@@ -219,7 +219,7 @@ option = {
 
 效果:
 
-```js{1,3-5}[option.js]
+```js {1,3-5}
 option = {
   series: [
     {
@@ -253,22 +253,22 @@ option = {
 使用:
 
 ```markdown
-<md-example src="doc-example/getting-started" width="100%" height="300"></md-example>
+<md-example src="doc-example/getting-started" width="100%" height="300" />
 ```
 
 效果:
-<md-example src="doc-example/getting-started" width="100%" height="300"></md-example>
+<md-example src="doc-example/getting-started" width="100%" height="300" />
 
 ## 添加配置项链接
 
 使用:
 
 ```markdown
-<md-option link="series-bar.itemStyle.color"></md-option>
+<md-option link="series-bar.itemStyle.color" />
 ```
 
 效果:
-<md-option link="series-bar.itemStyle.color"></md-option>
+<md-option link="series-bar.itemStyle.color" />
 
 ## 更多组件使用
 
diff --git a/layouts/default.vue b/layouts/default.vue
index 9683598..509bd75 100644
--- a/layouts/default.vue
+++ b/layouts/default.vue
@@ -3,7 +3,9 @@
     <navbar />
 
     <div class="page-main">
-      <div class="page-content handbook-content single-page container-fluid row flex-xl-nowrap">
+      <div
+        class="page-content handbook-content single-page container-fluid row flex-xl-nowrap"
+      >
         <sidebar />
 
         <div class="bd-content col-sm-7 pl-sm-2 col-12">
@@ -50,7 +52,7 @@ export default {
 
 <style lang="postcss">
 body {
-  font-family: 'Open Sans', 'PingFang SC', Helvetica, Arial, sans-serif;;
+  font-family: 'Open Sans', 'PingFang SC', Helvetica, Arial, sans-serif;
 }
 
 .page-main {
diff --git a/nuxt.config.js b/nuxt.config.js
index 9925d2f..3cc5add 100644
--- a/nuxt.config.js
+++ b/nuxt.config.js
@@ -3,14 +3,6 @@ import config from './configs/config'
 if (process.env.NODE_ENV === 'production') {
   console.log('Deploying to ...', process.env.NUXT_ENV_DEPLOY)
 }
-function escapeHtml(unsafe) {
-  return unsafe
-    .replace(/&/g, '&amp;')
-    .replace(/</g, '&lt;')
-    .replace(/>/g, '&gt;')
-    .replace(/"/g, '&quot;')
-    .replace(/'/g, '&#039;')
-}
 
 export default {
   ssr: true,
@@ -37,28 +29,6 @@ export default {
       }
     }
   },
-  hooks: {
-    'content:file:beforeParse': file => {
-      // TODO better way to detect?
-      const lang = file.path.match('contents/zh') ? 'zh' : 'en'
-      if (file.extension === '.md') {
-        // Replace variables
-        ;[
-          'optionPath',
-          'mainSitePath',
-          'exampleViewPath',
-          'exampleEditorPath'
-        ].forEach(p => {
-          const val = config[p].replace('${lang}', lang)
-          file.data = file.data.replace(
-            new RegExp('\\$\\{' + p + '\\}', 'g'),
-            val
-          )
-        })
-      }
-      file.data = file.data.replace(/\$\{lang\}/g, lang)
-    }
-  },
   /*
    ** Headers of the page
    */
@@ -82,35 +52,6 @@ export default {
       }
     ]
   },
-  content: {
-    dir: 'contents',
-    markdown: {
-      tocDepth: 3,
-      prism: {
-        theme: 'prism-themes/themes/prism-material-oceanic.css'
-      },
-      highlighter(rawCode, lang, attrs) {
-        if (attrs.fileName === 'null') {
-          attrs.fileName = ''
-        }
-        if (attrs.lineHighlights === 'null') {
-          attrs.lineHighlights = ''
-        }
-        const liveMatch = /^live(-(lr|tb|bt|rl))?$/.exec(attrs.fileName || '')
-        if (liveMatch) {
-          return `<md-live lang="${lang}" layout="${liveMatch[2] ||
-            'tb'}">${escapeHtml(rawCode)}</md-live>`
-        } else {
-          return `<md-code-block lang="${lang}" line-highlights="${attrs.lineHighlights ||
-            ''}" file-name="${attrs.fileName || ''}" >${escapeHtml(
-            rawCode
-          )}</md-code-block>`
-        }
-      },
-      remarkPlugins: []
-    },
-    liveEdit: false
-  },
   tailwindcss: {},
   /*
    ** Customize the progress-bar color
@@ -127,11 +68,7 @@ export default {
   /*
    ** Nuxt.js dev-modules
    */
-  buildModules: [
-    '@nuxt/typescript-build',
-    '@nuxt/content',
-    '@nuxtjs/tailwindcss'
-  ],
+  buildModules: ['@nuxt/typescript-build', '@nuxtjs/tailwindcss'],
   /*
    ** Nuxt.js modules
    */
@@ -179,6 +116,8 @@ export default {
      ** You can extend webpack config here
      */
     extend(config, ctx) {
+      config.resolve.alias['vue'] = 'vue/dist/vue.common'
+
       config.module.rules.push({
         test: /\.md$/,
         use: ['raw-loader']
@@ -188,17 +127,16 @@ export default {
         test: /\.ya?ml$/,
         use: 'js-yaml-loader'
       })
-      if (ctx.isDev && ctx.isClient) {
-        config.module.rules.push({
-          enforce: 'pre',
-          test: /\.(js|vue)$/,
-          loader: 'eslint-loader',
-          exclude: /(node_modules)/,
-          options: { fix: true }
-        })
-      }
+      // if (ctx.isDev && ctx.isClient) {
+      //   config.module.rules.push({
+      //     enforce: 'pre',
+      //     test: /\.(js|vue)$/,
+      //     loader: 'eslint-loader',
+      //     exclude: /(node_modules)/,
+      //     options: { fix: true }
+      //   })
+      // }
     },
-
     filenames: {
       chunk: ({ isDev }) => (isDev ? '[name].js' : 'js/[contenthash].js')
     }
diff --git a/package-lock.json b/package-lock.json
index 5e91468..b9b47f6 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -2237,21 +2237,6 @@
         "path-to-regexp": "^6.1.0"
       }
     },
-    "@lokidb/full-text-search": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/@lokidb/full-text-search/-/full-text-search-2.1.0.tgz",
-      "integrity": "sha512-KZm8CV0tW/DE+ca4RF8/7kiZnMWqk4x6xrwOImOw1xgMQVzS3jtxHOhWIRk+valUlimDzNxhrstMjBWsdzgqFg==",
-      "dev": true,
-      "requires": {
-        "@lokidb/loki": "2.1.0"
-      }
-    },
-    "@lokidb/loki": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/@lokidb/loki/-/loki-2.1.0.tgz",
-      "integrity": "sha512-u2VH/4h4kZww23bak5I/oRai8VqIZCSuqiLbuSHpYXHB9Na5E9KNazh59prgUyvMzfooY7XKiHejbKVxFoAEOQ==",
-      "dev": true
-    },
     "@nodelib/fs.scandir": {
       "version": "2.1.4",
       "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz",
@@ -2731,101 +2716,6 @@
         }
       }
     },
-    "@nuxt/content": {
-      "version": "1.14.0",
-      "resolved": "https://registry.npmjs.org/@nuxt/content/-/content-1.14.0.tgz",
-      "integrity": "sha512-MYx+dTu2ZRUHWGp9EgVtFfXJHFeCKrzazaM4a9785OCipItp6zmm1hTlbfdCYenwa0HgaOXCxYAiN0h6tjyUZw==",
-      "dev": true,
-      "requires": {
-        "@lokidb/full-text-search": "^2.1.0",
-        "@lokidb/loki": "^2.1.0",
-        "@nuxt/types": "^2.15.2",
-        "@types/js-yaml": "^4.0.0",
-        "@types/xml2js": "^0.4.8",
-        "change-case": "^4.1.2",
-        "chokidar": "^3.5.1",
-        "consola": "^2.15.3",
-        "csvtojson": "^2.0.10",
-        "defu": "^3.2.2",
-        "detab": "^2.0.4",
-        "escape-html": "^1.0.3",
-        "graceful-fs": "^4.2.6",
-        "gray-matter": "^4.0.2",
-        "hasha": "^5.2.2",
-        "hookable": "^4.4.1",
-        "html-tags": "^3.1.0",
-        "js-yaml": "4.0.0",
-        "mdast-util-to-hast": "^10.2.0",
-        "mkdirp": "^1.0.4",
-        "node-req": "^2.1.2",
-        "node-res": "^5.0.1",
-        "p-queue": "6.6.2",
-        "prismjs": "^1.23.0",
-        "property-information": "^5.6.0",
-        "rehype-raw": "^5.0.0",
-        "rehype-sort-attribute-values": "^3.0.2",
-        "rehype-sort-attributes": "^3.0.2",
-        "remark-autolink-headings": "^6.0.1",
-        "remark-external-links": "^8.0.0",
-        "remark-footnotes": "^3.0.0",
-        "remark-gfm": "^1.0.0",
-        "remark-parse": "^9.0.0",
-        "remark-rehype": "^8.0.0",
-        "remark-slug": "^6.0.0",
-        "remark-squeeze-paragraphs": "^4.0.0",
-        "unified": "^9.2.1",
-        "unist-builder": "^2.0.3",
-        "ws": "^7.4.3",
-        "xml2js": "^0.4.23"
-      },
-      "dependencies": {
-        "argparse": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
-          "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
-          "dev": true
-        },
-        "consola": {
-          "version": "2.15.3",
-          "resolved": "https://registry.npmjs.org/consola/-/consola-2.15.3.tgz",
-          "integrity": "sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==",
-          "dev": true
-        },
-        "defu": {
-          "version": "3.2.2",
-          "resolved": "https://registry.npmjs.org/defu/-/defu-3.2.2.tgz",
-          "integrity": "sha512-8UWj5lNv7HD+kB0e9w77Z7TdQlbUYDVWqITLHNqFIn6khrNHv5WQo38Dcm1f6HeNyZf0U7UbPf6WeZDSdCzGDQ==",
-          "dev": true
-        },
-        "graceful-fs": {
-          "version": "4.2.6",
-          "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz",
-          "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==",
-          "dev": true
-        },
-        "html-tags": {
-          "version": "3.1.0",
-          "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.1.0.tgz",
-          "integrity": "sha512-1qYz89hW3lFDEazhjW0yVAV87lw8lVkrJocr72XmBkMKsoSVJCQx3W8BXsC7hO2qAt8BoVjYjtAcZ9perqGnNg==",
-          "dev": true
-        },
-        "js-yaml": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.0.0.tgz",
-          "integrity": "sha512-pqon0s+4ScYUvX30wxQi3PogGFAlUyH0awepWvwkj4jD4v+ova3RiYw8bmA6x2rDrEaj8i/oWKoRxpVNW+Re8Q==",
-          "dev": true,
-          "requires": {
-            "argparse": "^2.0.1"
-          }
-        },
-        "mkdirp": {
-          "version": "1.0.4",
-          "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
-          "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
-          "dev": true
-        }
-      }
-    },
     "@nuxt/core": {
       "version": "2.15.6",
       "resolved": "https://registry.npmjs.org/@nuxt/core/-/core-2.15.6.tgz",
@@ -4711,15 +4601,6 @@
         "@types/webpack": "^4"
       }
     },
-    "@types/hast": {
-      "version": "2.3.1",
-      "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.1.tgz",
-      "integrity": "sha512-viwwrB+6xGzw+G1eWpF9geV3fnsDgXqHG+cqgiHrvQfDUW5hzhCyV7Sy3UJxhfRFBsgky2SSW33qi/YrIkjX5Q==",
-      "dev": true,
-      "requires": {
-        "@types/unist": "*"
-      }
-    },
     "@types/html-minifier": {
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/@types/html-minifier/-/html-minifier-4.0.0.tgz",
@@ -4735,12 +4616,6 @@
       "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz",
       "integrity": "sha512-giAlZwstKbmvMk1OO7WXSj4OZ0keXAcl2TQq4LWHiiPH2ByaH7WeUzng+Qej8UPxxv+8lRTuouo0iaNDBuzIBA=="
     },
-    "@types/js-yaml": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.1.tgz",
-      "integrity": "sha512-xdOvNmXmrZqqPy3kuCQ+fz6wA0xU5pji9cd1nDrflWaAWtYLLGk5ykW0H6yg5TVyehHP1pfmuuSaZkhP+kspVA==",
-      "dev": true
-    },
     "@types/json-schema": {
       "version": "7.0.4",
       "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.4.tgz",
@@ -4752,15 +4627,6 @@
       "resolved": "https://registry.npmjs.org/@types/less/-/less-3.0.2.tgz",
       "integrity": "sha512-62vfe65cMSzYaWmpmhqCMMNl0khen89w57mByPi1OseGfcV/LV03fO8YVrNj7rFQsRWNJo650WWyh6m7p8vZmA=="
     },
-    "@types/mdast": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.3.tgz",
-      "integrity": "sha512-SXPBMnFVQg1s00dlMCc/jCdvPqdE4mXaMMCeRlxLDmTAEoegHT53xKtkDnzDTOcmMHUfcjyf36/YYZ6SxRdnsw==",
-      "dev": true,
-      "requires": {
-        "@types/unist": "*"
-      }
-    },
     "@types/mime": {
       "version": "1.3.2",
       "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz",
@@ -4799,12 +4665,6 @@
       "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==",
       "dev": true
     },
-    "@types/parse5": {
-      "version": "5.0.3",
-      "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-5.0.3.tgz",
-      "integrity": "sha512-kUNnecmtkunAoQ3CnjmMkzNU/gtxG8guhi+Fk2U/kOpIKjIMKnXGp4IJCgQJrXSgMsWYimYG4TGjz/UzbGEBTw==",
-      "dev": true
-    },
     "@types/pug": {
       "version": "2.0.4",
       "resolved": "https://registry.npmjs.org/@types/pug/-/pug-2.0.4.tgz",
@@ -4919,12 +4779,6 @@
         }
       }
     },
-    "@types/unist": {
-      "version": "2.0.3",
-      "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.3.tgz",
-      "integrity": "sha512-FvUupuM3rlRsRtCN+fDudtmytGO6iHJuuRKS1Ss0pG5z8oX0diNEw94UEL7hgDbpN94rgaK5R7sWm6RrSkZuAQ==",
-      "dev": true
-    },
     "@types/webpack": {
       "version": "4.41.10",
       "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-4.41.10.tgz",
@@ -4988,15 +4842,6 @@
         }
       }
     },
-    "@types/xml2js": {
-      "version": "0.4.8",
-      "resolved": "https://registry.npmjs.org/@types/xml2js/-/xml2js-0.4.8.tgz",
-      "integrity": "sha512-EyvT83ezOdec7BhDaEcsklWy7RSIdi6CNe95tmOAK0yx/Lm30C9K75snT3fYayK59ApC2oyW+rcHErdG05FHJA==",
-      "dev": true,
-      "requires": {
-        "@types/node": "*"
-      }
-    },
     "@typescript-eslint/eslint-plugin": {
       "version": "2.26.0",
       "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.26.0.tgz",
@@ -5546,6 +5391,14 @@
       "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz",
       "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4="
     },
+    "ansi-red": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/ansi-red/-/ansi-red-0.1.1.tgz",
+      "integrity": "sha1-jGOPnRCAgAo1PJwoyKgcpHBdlGw=",
+      "requires": {
+        "ansi-wrap": "0.1.0"
+      }
+    },
     "ansi-regex": {
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
@@ -5559,6 +5412,11 @@
         "color-convert": "^1.9.0"
       }
     },
+    "ansi-wrap": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz",
+      "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768="
+    },
     "any-promise": {
       "version": "1.3.0",
       "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz",
@@ -5762,6 +5620,14 @@
       "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz",
       "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg=="
     },
+    "autolinker": {
+      "version": "0.28.1",
+      "resolved": "https://registry.npmjs.org/autolinker/-/autolinker-0.28.1.tgz",
+      "integrity": "sha1-BlK0kYgYefB3XazgzcoyM5QqTkc=",
+      "requires": {
+        "gulp-header": "^1.7.1"
+      }
+    },
     "autoprefixer": {
       "version": "9.8.6",
       "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.6.tgz",
@@ -5956,12 +5822,6 @@
         "@babel/helper-define-polyfill-provider": "^0.2.2"
       }
     },
-    "bail": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/bail/-/bail-1.0.5.tgz",
-      "integrity": "sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==",
-      "dev": true
-    },
     "balanced-match": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
@@ -6612,37 +6472,12 @@
       "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001230.tgz",
       "integrity": "sha512-5yBd5nWCBS+jWKTcHOzXwo5xzcj4ePE/yjtkZyUV1BTUmrBaA9MRGC+e7mxnqXSA90CmCA8L3eKLaSUkt099IQ=="
     },
-    "capital-case": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/capital-case/-/capital-case-1.0.4.tgz",
-      "integrity": "sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==",
-      "dev": true,
-      "requires": {
-        "no-case": "^3.0.4",
-        "tslib": "^2.0.3",
-        "upper-case-first": "^2.0.2"
-      },
-      "dependencies": {
-        "tslib": {
-          "version": "2.2.0",
-          "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz",
-          "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==",
-          "dev": true
-        }
-      }
-    },
     "caseless": {
       "version": "0.12.0",
       "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
       "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=",
       "dev": true
     },
-    "ccount": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/ccount/-/ccount-1.1.0.tgz",
-      "integrity": "sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg==",
-      "dev": true
-    },
     "chalk": {
       "version": "2.4.2",
       "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
@@ -6653,52 +6488,6 @@
         "supports-color": "^5.3.0"
       }
     },
-    "change-case": {
-      "version": "4.1.2",
-      "resolved": "https://registry.npmjs.org/change-case/-/change-case-4.1.2.tgz",
-      "integrity": "sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A==",
-      "dev": true,
-      "requires": {
-        "camel-case": "^4.1.2",
-        "capital-case": "^1.0.4",
-        "constant-case": "^3.0.4",
-        "dot-case": "^3.0.4",
-        "header-case": "^2.0.4",
-        "no-case": "^3.0.4",
-        "param-case": "^3.0.4",
-        "pascal-case": "^3.1.2",
-        "path-case": "^3.0.4",
-        "sentence-case": "^3.0.4",
-        "snake-case": "^3.0.4",
-        "tslib": "^2.0.3"
-      },
-      "dependencies": {
-        "tslib": {
-          "version": "2.2.0",
-          "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz",
-          "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==",
-          "dev": true
-        }
-      }
-    },
-    "character-entities": {
-      "version": "1.2.4",
-      "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz",
-      "integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==",
-      "dev": true
-    },
-    "character-entities-legacy": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz",
-      "integrity": "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==",
-      "dev": true
-    },
-    "character-reference-invalid": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz",
-      "integrity": "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==",
-      "dev": true
-    },
     "chardet": {
       "version": "0.7.0",
       "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz",
@@ -7028,6 +6817,11 @@
       "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=",
       "dev": true
     },
+    "coffee-script": {
+      "version": "1.12.7",
+      "resolved": "https://registry.npmjs.org/coffee-script/-/coffee-script-1.12.7.tgz",
+      "integrity": "sha512-fLeEhqwymYat/MpTPUjSKHVYYl0ec2mOyALEMLmzr5i1isuG+6jfI2j2d5oBO3VIzgUXgBVIcOT9uH1TFxBckw=="
+    },
     "collection-visit": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz",
@@ -7082,12 +6876,6 @@
         "delayed-stream": "~1.0.0"
       }
     },
-    "comma-separated-tokens": {
-      "version": "1.0.8",
-      "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz",
-      "integrity": "sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==",
-      "dev": true
-    },
     "commander": {
       "version": "4.1.1",
       "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz",
@@ -7180,6 +6968,21 @@
         }
       }
     },
+    "concat-with-sourcemaps": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/concat-with-sourcemaps/-/concat-with-sourcemaps-1.1.0.tgz",
+      "integrity": "sha512-4gEjHJFT9e+2W/77h/DS5SGUgwDaOwprX8L/gl5+3ixnzkVJJsZWDSelmN3Oilw3LNDZjZV0yqH1hLG3k6nghg==",
+      "requires": {
+        "source-map": "^0.6.1"
+      },
+      "dependencies": {
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
+        }
+      }
+    },
     "connect": {
       "version": "3.7.0",
       "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz",
@@ -7230,34 +7033,6 @@
         "bluebird": "^3.1.1"
       }
     },
-    "constant-case": {
-      "version": "3.0.4",
-      "resolved": "https://registry.npmjs.org/constant-case/-/constant-case-3.0.4.tgz",
-      "integrity": "sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ==",
-      "dev": true,
-      "requires": {
-        "no-case": "^3.0.4",
-        "tslib": "^2.0.3",
-        "upper-case": "^2.0.2"
-      },
-      "dependencies": {
-        "tslib": {
-          "version": "2.2.0",
-          "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz",
-          "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==",
-          "dev": true
-        },
-        "upper-case": {
-          "version": "2.0.2",
-          "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-2.0.2.tgz",
-          "integrity": "sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg==",
-          "dev": true,
-          "requires": {
-            "tslib": "^2.0.3"
-          }
-        }
-      }
-    },
     "constants-browserify": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz",
@@ -7944,28 +7719,6 @@
         }
       }
     },
-    "csvtojson": {
-      "version": "2.0.10",
-      "resolved": "https://registry.npmjs.org/csvtojson/-/csvtojson-2.0.10.tgz",
-      "integrity": "sha512-lUWFxGKyhraKCW8Qghz6Z0f2l/PqB1W3AO0HKJzGIQ5JRSlR651ekJDiGJbBT4sRNNv5ddnSGVEnsxP9XRCVpQ==",
-      "dev": true,
-      "requires": {
-        "bluebird": "^3.5.1",
-        "lodash": "^4.17.3",
-        "strip-bom": "^2.0.0"
-      },
-      "dependencies": {
-        "strip-bom": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz",
-          "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=",
-          "dev": true,
-          "requires": {
-            "is-utf8": "^0.2.0"
-          }
-        }
-      }
-    },
     "cuint": {
       "version": "0.2.2",
       "resolved": "https://registry.npmjs.org/cuint/-/cuint-0.2.2.tgz",
@@ -8138,15 +7891,6 @@
       "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
       "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA="
     },
-    "detab": {
-      "version": "2.0.4",
-      "resolved": "https://registry.npmjs.org/detab/-/detab-2.0.4.tgz",
-      "integrity": "sha512-8zdsQA5bIkoRECvCrNKPla84lyoR7DSAyf7p0YgXzBO9PDJx8KntPUay7NS6yp+KdxdVtiE5SpHKtbp2ZQyA9g==",
-      "dev": true,
-      "requires": {
-        "repeat-string": "^1.5.4"
-      }
-    },
     "detect-indent": {
       "version": "5.0.0",
       "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-5.0.0.tgz",
@@ -8168,6 +7912,11 @@
       "resolved": "https://registry.npmjs.org/devalue/-/devalue-2.0.1.tgz",
       "integrity": "sha512-I2TiqT5iWBEyB8GRfTDP0hiLZ0YeDJZ+upDxjBfOC2lebO5LezQMv7QvIUTzdb64jQyAKLf1AHADtGN+jw6v8Q=="
     },
+    "diacritics-map": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/diacritics-map/-/diacritics-map-0.1.0.tgz",
+      "integrity": "sha1-bfwP+dAQAKLt8oZTccrDFulJd68="
+    },
     "didyoumean": {
       "version": "1.2.1",
       "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.1.tgz",
@@ -8887,6 +8636,15 @@
         "vue-eslint-parser": "^7.0.0"
       }
     },
+    "eslint-plugin-prettier": {
+      "version": "3.4.1",
+      "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.4.1.tgz",
+      "integrity": "sha512-htg25EUYUeIhKHXjOinK4BgCcDwtLHjqaxCDsMy5nbnUMkKFvIhMVCp+5GFUXQ4Nr8lBsPqtGAqBenbpFqAA2g==",
+      "dev": true,
+      "requires": {
+        "prettier-linter-helpers": "^1.0.0"
+      }
+    },
     "eslint-plugin-promise": {
       "version": "4.2.1",
       "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-4.2.1.tgz",
@@ -9156,12 +8914,6 @@
       "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
       "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc="
     },
-    "eventemitter3": {
-      "version": "4.0.7",
-      "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz",
-      "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==",
-      "dev": true
-    },
     "events": {
       "version": "3.1.0",
       "resolved": "https://registry.npmjs.org/events/-/events-3.1.0.tgz",
@@ -9257,6 +9009,52 @@
         }
       }
     },
+    "expand-range": {
+      "version": "1.8.2",
+      "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz",
+      "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=",
+      "requires": {
+        "fill-range": "^2.1.0"
+      },
+      "dependencies": {
+        "fill-range": {
+          "version": "2.2.4",
+          "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz",
+          "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==",
+          "requires": {
+            "is-number": "^2.1.0",
+            "isobject": "^2.0.0",
+            "randomatic": "^3.0.0",
+            "repeat-element": "^1.1.2",
+            "repeat-string": "^1.5.2"
+          }
+        },
+        "is-number": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz",
+          "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=",
+          "requires": {
+            "kind-of": "^3.0.2"
+          }
+        },
+        "isobject": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
+          "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
+          "requires": {
+            "isarray": "1.0.0"
+          }
+        },
+        "kind-of": {
+          "version": "3.2.2",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+          "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+          "requires": {
+            "is-buffer": "^1.1.5"
+          }
+        }
+      }
+    },
     "extend": {
       "version": "3.0.2",
       "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
@@ -9406,6 +9204,12 @@
       "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz",
       "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA=="
     },
+    "fast-diff": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz",
+      "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==",
+      "dev": true
+    },
     "fast-glob": {
       "version": "3.2.5",
       "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.5.tgz",
@@ -9905,12 +9709,6 @@
         "mime-types": "^2.1.12"
       }
     },
-    "forwarded": {
-      "version": "0.2.0",
-      "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
-      "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==",
-      "dev": true
-    },
     "fraction.js": {
       "version": "4.1.1",
       "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.1.1.tgz",
@@ -10676,23 +10474,6 @@
         "git-up": "^4.0.0"
       }
     },
-    "github-slugger": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-1.3.0.tgz",
-      "integrity": "sha512-gwJScWVNhFYSRDvURk/8yhcFBee6aFjye2a7Lhb2bUyRulpIoek9p0I9Kt7PT67d/nUlZbFu8L9RLiA0woQN8Q==",
-      "dev": true,
-      "requires": {
-        "emoji-regex": ">=6.0.0 <=6.1.1"
-      },
-      "dependencies": {
-        "emoji-regex": {
-          "version": "6.1.1",
-          "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-6.1.1.tgz",
-          "integrity": "sha1-xs0OwbBkLio8Z6ETfvxeeW2k+I4=",
-          "dev": true
-        }
-      }
-    },
     "glob": {
       "version": "7.1.6",
       "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
@@ -10804,25 +10585,45 @@
       "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ=="
     },
     "gray-matter": {
-      "version": "4.0.3",
-      "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz",
-      "integrity": "sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==",
-      "dev": true,
-      "requires": {
-        "js-yaml": "^3.13.1",
-        "kind-of": "^6.0.2",
-        "section-matter": "^1.0.0",
-        "strip-bom-string": "^1.0.0"
-      }
-    },
-    "gzip-size": {
-      "version": "6.0.0",
-      "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz",
-      "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==",
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-2.1.1.tgz",
+      "integrity": "sha1-MELZrewqHe1qdwep7SOA+KF6Qw4=",
       "requires": {
-        "duplexer": "^0.1.2"
-      }
-    },
+        "ansi-red": "^0.1.1",
+        "coffee-script": "^1.12.4",
+        "extend-shallow": "^2.0.1",
+        "js-yaml": "^3.8.1",
+        "toml": "^2.3.2"
+      },
+      "dependencies": {
+        "extend-shallow": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+          "requires": {
+            "is-extendable": "^0.1.0"
+          }
+        }
+      }
+    },
+    "gulp-header": {
+      "version": "1.8.12",
+      "resolved": "https://registry.npmjs.org/gulp-header/-/gulp-header-1.8.12.tgz",
+      "integrity": "sha512-lh9HLdb53sC7XIZOYzTXM4lFuXElv3EVkSDhsd7DoJBj7hm+Ni7D3qYbb+Rr8DuM8nRanBvkVO9d7askreXGnQ==",
+      "requires": {
+        "concat-with-sourcemaps": "*",
+        "lodash.template": "^4.4.0",
+        "through2": "^2.0.0"
+      }
+    },
+    "gzip-size": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz",
+      "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==",
+      "requires": {
+        "duplexer": "^0.1.2"
+      }
+    },
     "hable": {
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/hable/-/hable-3.0.0.tgz",
@@ -10967,133 +10768,11 @@
         "minimalistic-assert": "^1.0.1"
       }
     },
-    "hasha": {
-      "version": "5.2.2",
-      "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz",
-      "integrity": "sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==",
-      "dev": true,
-      "requires": {
-        "is-stream": "^2.0.0",
-        "type-fest": "^0.8.0"
-      },
-      "dependencies": {
-        "type-fest": {
-          "version": "0.8.1",
-          "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
-          "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==",
-          "dev": true
-        }
-      }
-    },
-    "hast-to-hyperscript": {
-      "version": "9.0.1",
-      "resolved": "https://registry.npmjs.org/hast-to-hyperscript/-/hast-to-hyperscript-9.0.1.tgz",
-      "integrity": "sha512-zQgLKqF+O2F72S1aa4y2ivxzSlko3MAvxkwG8ehGmNiqd98BIN3JM1rAJPmplEyLmGLO2QZYJtIneOSZ2YbJuA==",
-      "dev": true,
-      "requires": {
-        "@types/unist": "^2.0.3",
-        "comma-separated-tokens": "^1.0.0",
-        "property-information": "^5.3.0",
-        "space-separated-tokens": "^1.0.0",
-        "style-to-object": "^0.3.0",
-        "unist-util-is": "^4.0.0",
-        "web-namespaces": "^1.0.0"
-      }
-    },
-    "hast-util-from-parse5": {
-      "version": "6.0.1",
-      "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-6.0.1.tgz",
-      "integrity": "sha512-jeJUWiN5pSxW12Rh01smtVkZgZr33wBokLzKLwinYOUfSzm1Nl/c3GUGebDyOKjdsRgMvoVbV0VpAcpjF4NrJA==",
-      "dev": true,
-      "requires": {
-        "@types/parse5": "^5.0.0",
-        "hastscript": "^6.0.0",
-        "property-information": "^5.0.0",
-        "vfile": "^4.0.0",
-        "vfile-location": "^3.2.0",
-        "web-namespaces": "^1.0.0"
-      }
-    },
-    "hast-util-is-element": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-1.1.0.tgz",
-      "integrity": "sha512-oUmNua0bFbdrD/ELDSSEadRVtWZOf3iF6Lbv81naqsIV99RnSCieTbWuWCY8BAeEfKJTKl0gRdokv+dELutHGQ==",
-      "dev": true
-    },
-    "hast-util-parse-selector": {
-      "version": "2.2.5",
-      "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz",
-      "integrity": "sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ==",
-      "dev": true
-    },
-    "hast-util-raw": {
-      "version": "6.1.0",
-      "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-6.1.0.tgz",
-      "integrity": "sha512-5FoZLDHBpka20OlZZ4I/+RBw5piVQ8iI1doEvffQhx5CbCyTtP8UCq8Tw6NmTAMtXgsQxmhW7Ly8OdFre5/YMQ==",
-      "dev": true,
-      "requires": {
-        "@types/hast": "^2.0.0",
-        "hast-util-from-parse5": "^6.0.0",
-        "hast-util-to-parse5": "^6.0.0",
-        "html-void-elements": "^1.0.0",
-        "parse5": "^6.0.0",
-        "unist-util-position": "^3.0.0",
-        "unist-util-visit": "^2.0.0",
-        "vfile": "^4.0.0",
-        "web-namespaces": "^1.0.0",
-        "xtend": "^4.0.0",
-        "zwitch": "^1.0.0"
-      }
-    },
-    "hast-util-to-parse5": {
-      "version": "6.0.0",
-      "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-6.0.0.tgz",
-      "integrity": "sha512-Lu5m6Lgm/fWuz8eWnrKezHtVY83JeRGaNQ2kn9aJgqaxvVkFCZQBEhgodZUDUvoodgyROHDb3r5IxAEdl6suJQ==",
-      "dev": true,
-      "requires": {
-        "hast-to-hyperscript": "^9.0.0",
-        "property-information": "^5.0.0",
-        "web-namespaces": "^1.0.0",
-        "xtend": "^4.0.0",
-        "zwitch": "^1.0.0"
-      }
-    },
-    "hastscript": {
-      "version": "6.0.0",
-      "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-6.0.0.tgz",
-      "integrity": "sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w==",
-      "dev": true,
-      "requires": {
-        "@types/hast": "^2.0.0",
-        "comma-separated-tokens": "^1.0.0",
-        "hast-util-parse-selector": "^2.0.0",
-        "property-information": "^5.0.0",
-        "space-separated-tokens": "^1.0.0"
-      }
-    },
     "he": {
       "version": "1.2.0",
       "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
       "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw=="
     },
-    "header-case": {
-      "version": "2.0.4",
-      "resolved": "https://registry.npmjs.org/header-case/-/header-case-2.0.4.tgz",
-      "integrity": "sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q==",
-      "dev": true,
-      "requires": {
-        "capital-case": "^1.0.4",
-        "tslib": "^2.0.3"
-      },
-      "dependencies": {
-        "tslib": {
-          "version": "2.2.0",
-          "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz",
-          "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==",
-          "dev": true
-        }
-      }
-    },
     "hex-color-regex": {
       "version": "1.1.0",
       "resolved": "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz",
@@ -11109,12 +10788,6 @@
         "minimalistic-crypto-utils": "^1.0.1"
       }
     },
-    "hookable": {
-      "version": "4.4.1",
-      "resolved": "https://registry.npmjs.org/hookable/-/hookable-4.4.1.tgz",
-      "integrity": "sha512-KWjZM8C7IVT2qne5HTXjM6R6VnRfjfRlf/oCnHd+yFxoHO1DzOl6B9LzV/VqGQK/IrFewq+EG+ePVrE9Tpc3fg==",
-      "dev": true
-    },
     "hosted-git-info": {
       "version": "2.8.8",
       "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz",
@@ -11206,12 +10879,6 @@
       "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-2.0.0.tgz",
       "integrity": "sha1-ELMKOGCF9Dzt41PMj6fLDe7qZos="
     },
-    "html-void-elements": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-1.0.5.tgz",
-      "integrity": "sha512-uE/TxKuyNIcx44cIWnjr/rfIATDH7ZaOMmstu0CwhFG1Dunhlp4OC6/NMbhiwoq5BpW0ubi303qnEk/PZj614w==",
-      "dev": true
-    },
     "html-webpack-plugin": {
       "version": "4.5.2",
       "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-4.5.2.tgz",
@@ -11439,12 +11106,6 @@
       "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
       "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew=="
     },
-    "inline-style-parser": {
-      "version": "0.1.1",
-      "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz",
-      "integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==",
-      "dev": true
-    },
     "inquirer": {
       "version": "7.1.0",
       "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.1.0.tgz",
@@ -11555,12 +11216,6 @@
       "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz",
       "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo="
     },
-    "ipaddr.js": {
-      "version": "1.9.1",
-      "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
-      "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
-      "dev": true
-    },
     "is-absolute-url": {
       "version": "2.1.0",
       "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz",
@@ -11584,22 +11239,6 @@
         }
       }
     },
-    "is-alphabetical": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz",
-      "integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==",
-      "dev": true
-    },
-    "is-alphanumerical": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz",
-      "integrity": "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==",
-      "dev": true,
-      "requires": {
-        "is-alphabetical": "^1.0.0",
-        "is-decimal": "^1.0.0"
-      }
-    },
     "is-arrayish": {
       "version": "0.2.1",
       "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
@@ -11681,12 +11320,6 @@
       "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz",
       "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g=="
     },
-    "is-decimal": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz",
-      "integrity": "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==",
-      "dev": true
-    },
     "is-descriptor": {
       "version": "0.1.6",
       "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
@@ -11755,12 +11388,6 @@
         "is-extglob": "^2.1.1"
       }
     },
-    "is-hexadecimal": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz",
-      "integrity": "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==",
-      "dev": true
-    },
     "is-negative-zero": {
       "version": "2.0.1",
       "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz",
@@ -11931,10 +11558,9 @@
       "integrity": "sha512-qux9juDtAC8HlZxAk/fku73ak4TWNLigRFTNzFShE/kw4bXVFsVu538vLXAxvNyPszXgpX4YxkXfwTYEi+zf5A=="
     },
     "js-base64": {
-      "version": "2.5.2",
-      "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.5.2.tgz",
-      "integrity": "sha512-Vg8czh0Q7sFBSUMWWArX/miJeBWYBPpdU/3M/DKSaekLMqrqVPaedp+5mZhie/r0lgrcaYBfwXatEew6gwgiQQ==",
-      "dev": true
+      "version": "3.6.1",
+      "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-3.6.1.tgz",
+      "integrity": "sha512-Frdq2+tRRGLQUIQOgsIGSCd1VePCS2fsddTG5dTCqR0JHgltXWfsxnY0gIXPoMeRmdom6Oyq+UMOFg5suduOjQ=="
     },
     "js-cookie": {
       "version": "2.2.1",
@@ -12196,6 +11822,14 @@
         "launch-editor": "^2.2.1"
       }
     },
+    "lazy-cache": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz",
+      "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=",
+      "requires": {
+        "set-getter": "^0.1.0"
+      }
+    },
     "levn": {
       "version": "0.3.0",
       "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
@@ -12212,6 +11846,51 @@
       "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=",
       "dev": true
     },
+    "linkify-it": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-3.0.2.tgz",
+      "integrity": "sha512-gDBO4aHNZS6coiZCKVhSNh43F9ioIL4JwRjLZPkoLIY4yZFwg264Y5lu2x6rb1Js42Gh6Yqm2f6L2AJcnkzinQ==",
+      "requires": {
+        "uc.micro": "^1.0.1"
+      }
+    },
+    "list-item": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/list-item/-/list-item-1.1.1.tgz",
+      "integrity": "sha1-DGXQDih8tmPMs8s4Sad+iewmilY=",
+      "requires": {
+        "expand-range": "^1.8.1",
+        "extend-shallow": "^2.0.1",
+        "is-number": "^2.1.0",
+        "repeat-string": "^1.5.2"
+      },
+      "dependencies": {
+        "extend-shallow": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+          "requires": {
+            "is-extendable": "^0.1.0"
+          }
+        },
+        "is-number": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz",
+          "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=",
+          "requires": {
+            "kind-of": "^3.0.2"
+          }
+        },
+        "kind-of": {
+          "version": "3.2.2",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+          "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+          "requires": {
+            "is-buffer": "^1.1.5"
+          }
+        }
+      }
+    },
     "load-json-file": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz",
@@ -12427,12 +12106,6 @@
       "integrity": "sha1-7GZi5IlkCO1KtsVCo5kLcswIACA=",
       "dev": true
     },
-    "longest-streak": {
-      "version": "2.0.4",
-      "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-2.0.4.tgz",
-      "integrity": "sha512-vM6rUVCVUJJt33bnmHiZEvr7wPT78ztX7rojL+LW51bHtLh6HTjx84LA5W4+oa6aKEJA7jJu5LR6vQRBpA5DVg==",
-      "dev": true
-    },
     "loud-rejection": {
       "version": "1.6.0",
       "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz",
@@ -12516,173 +12189,79 @@
         "object-visit": "^1.0.0"
       }
     },
-    "markdown-table": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-2.0.0.tgz",
-      "integrity": "sha512-Ezda85ToJUBhM6WGaG6veasyym+Tbs3cMAw/ZhOPqXiYsr0jgocBV3j3nx+4lk47plLlIqjwuTm/ywVI+zjJ/A==",
-      "dev": true,
-      "requires": {
-        "repeat-string": "^1.0.0"
-      }
-    },
-    "md5.js": {
-      "version": "1.3.5",
-      "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz",
-      "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==",
-      "requires": {
-        "hash-base": "^3.0.0",
-        "inherits": "^2.0.1",
-        "safe-buffer": "^5.1.2"
-      }
-    },
-    "mdast-squeeze-paragraphs": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/mdast-squeeze-paragraphs/-/mdast-squeeze-paragraphs-4.0.0.tgz",
-      "integrity": "sha512-zxdPn69hkQ1rm4J+2Cs2j6wDEv7O17TfXTJ33tl/+JPIoEmtV9t2ZzBM5LPHE8QlHsmVD8t3vPKCyY3oH+H8MQ==",
-      "dev": true,
-      "requires": {
-        "unist-util-remove": "^2.0.0"
-      }
-    },
-    "mdast-util-definitions": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-4.0.0.tgz",
-      "integrity": "sha512-k8AJ6aNnUkB7IE+5azR9h81O5EQ/cTDXtWdMq9Kk5KcEW/8ritU5CeLg/9HhOC++nALHBlaogJ5jz0Ybk3kPMQ==",
-      "dev": true,
-      "requires": {
-        "unist-util-visit": "^2.0.0"
-      }
-    },
-    "mdast-util-find-and-replace": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-1.1.1.tgz",
-      "integrity": "sha512-9cKl33Y21lyckGzpSmEQnIDjEfeeWelN5s1kUW1LwdB0Fkuq2u+4GdqcGEygYxJE8GVqCl0741bYXHgamfWAZA==",
-      "dev": true,
+    "markdown-it": {
+      "version": "12.2.0",
+      "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-12.2.0.tgz",
+      "integrity": "sha512-Wjws+uCrVQRqOoJvze4HCqkKl1AsSh95iFAeQDwnyfxM09divCBSXlDR1uTvyUP3Grzpn4Ru8GeCxYPM8vkCQg==",
       "requires": {
-        "escape-string-regexp": "^4.0.0",
-        "unist-util-is": "^4.0.0",
-        "unist-util-visit-parents": "^3.0.0"
+        "argparse": "^2.0.1",
+        "entities": "~2.1.0",
+        "linkify-it": "^3.0.1",
+        "mdurl": "^1.0.1",
+        "uc.micro": "^1.0.5"
       },
       "dependencies": {
-        "escape-string-regexp": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
-          "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
-          "dev": true
+        "argparse": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+          "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="
+        },
+        "entities": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz",
+          "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w=="
         }
       }
     },
-    "mdast-util-footnote": {
-      "version": "0.1.7",
-      "resolved": "https://registry.npmjs.org/mdast-util-footnote/-/mdast-util-footnote-0.1.7.tgz",
-      "integrity": "sha512-QxNdO8qSxqbO2e3m09KwDKfWiLgqyCurdWTQ198NpbZ2hxntdc+VKS4fDJCmNWbAroUdYnSthu+XbZ8ovh8C3w==",
-      "dev": true,
-      "requires": {
-        "mdast-util-to-markdown": "^0.6.0",
-        "micromark": "~2.11.0"
-      }
-    },
-    "mdast-util-from-markdown": {
-      "version": "0.8.5",
-      "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-0.8.5.tgz",
-      "integrity": "sha512-2hkTXtYYnr+NubD/g6KGBS/0mFmBcifAsI0yIWRiRo0PjVs6SSOSOdtzbp6kSGnShDN6G5aWZpKQ2lWRy27mWQ==",
-      "dev": true,
-      "requires": {
-        "@types/mdast": "^3.0.0",
-        "mdast-util-to-string": "^2.0.0",
-        "micromark": "~2.11.0",
-        "parse-entities": "^2.0.0",
-        "unist-util-stringify-position": "^2.0.0"
-      }
-    },
-    "mdast-util-gfm": {
-      "version": "0.1.2",
-      "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-0.1.2.tgz",
-      "integrity": "sha512-NNkhDx/qYcuOWB7xHUGWZYVXvjPFFd6afg6/e2g+SV4r9q5XUcCbV4Wfa3DLYIiD+xAEZc6K4MGaE/m0KDcPwQ==",
-      "dev": true,
-      "requires": {
-        "mdast-util-gfm-autolink-literal": "^0.1.0",
-        "mdast-util-gfm-strikethrough": "^0.2.0",
-        "mdast-util-gfm-table": "^0.1.0",
-        "mdast-util-gfm-task-list-item": "^0.1.0",
-        "mdast-util-to-markdown": "^0.6.1"
-      }
-    },
-    "mdast-util-gfm-autolink-literal": {
-      "version": "0.1.3",
-      "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-0.1.3.tgz",
-      "integrity": "sha512-GjmLjWrXg1wqMIO9+ZsRik/s7PLwTaeCHVB7vRxUwLntZc8mzmTsLVr6HW1yLokcnhfURsn5zmSVdi3/xWWu1A==",
-      "dev": true,
-      "requires": {
-        "ccount": "^1.0.0",
-        "mdast-util-find-and-replace": "^1.1.0",
-        "micromark": "^2.11.3"
-      }
+    "markdown-it-anchor": {
+      "version": "8.1.2",
+      "resolved": "https://registry.npmjs.org/markdown-it-anchor/-/markdown-it-anchor-8.1.2.tgz",
+      "integrity": "sha512-9D58TKK4dakqmjcmVuqHoB3ntKBpQJ0Ld38B83aiHJcBD72IZIyPjNtihPA6ayRI5WD33e1W68mArliNLHCprg=="
     },
-    "mdast-util-gfm-strikethrough": {
-      "version": "0.2.3",
-      "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-0.2.3.tgz",
-      "integrity": "sha512-5OQLXpt6qdbttcDG/UxYY7Yjj3e8P7X16LzvpX8pIQPYJ/C2Z1qFGMmcw+1PZMUM3Z8wt8NRfYTvCni93mgsgA==",
-      "dev": true,
-      "requires": {
-        "mdast-util-to-markdown": "^0.6.0"
-      }
+    "markdown-it-table-of-contents": {
+      "version": "0.5.2",
+      "resolved": "https://registry.npmjs.org/markdown-it-table-of-contents/-/markdown-it-table-of-contents-0.5.2.tgz",
+      "integrity": "sha512-6o+rxSwzXmXCUn1n8QGTSpgbcnHBG6lUU8x7A5Cssuq5vbfzTfitfGPvQ5PZkp+gP1NGS/DR2rkYqJPn0rbZ1A=="
     },
-    "mdast-util-gfm-table": {
-      "version": "0.1.6",
-      "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-0.1.6.tgz",
-      "integrity": "sha512-j4yDxQ66AJSBwGkbpFEp9uG/LS1tZV3P33fN1gkyRB2LoRL+RR3f76m0HPHaby6F4Z5xr9Fv1URmATlRRUIpRQ==",
-      "dev": true,
-      "requires": {
-        "markdown-table": "^2.0.0",
-        "mdast-util-to-markdown": "~0.6.0"
-      }
+    "markdown-link": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/markdown-link/-/markdown-link-0.1.1.tgz",
+      "integrity": "sha1-MsXGUZmmRXMWMi0eQinRNAfIx88="
     },
-    "mdast-util-gfm-task-list-item": {
-      "version": "0.1.6",
-      "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-0.1.6.tgz",
-      "integrity": "sha512-/d51FFIfPsSmCIRNp7E6pozM9z1GYPIkSy1urQ8s/o4TC22BZ7DqfHFWiqBD23bc7J3vV1Fc9O4QIHBlfuit8A==",
-      "dev": true,
-      "requires": {
-        "mdast-util-to-markdown": "~0.6.0"
+    "markdown-toc": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/markdown-toc/-/markdown-toc-1.2.0.tgz",
+      "integrity": "sha512-eOsq7EGd3asV0oBfmyqngeEIhrbkc7XVP63OwcJBIhH2EpG2PzFcbZdhy1jutXSlRBBVMNXHvMtSr5LAxSUvUg==",
+      "requires": {
+        "concat-stream": "^1.5.2",
+        "diacritics-map": "^0.1.0",
+        "gray-matter": "^2.1.0",
+        "lazy-cache": "^2.0.2",
+        "list-item": "^1.1.1",
+        "markdown-link": "^0.1.1",
+        "minimist": "^1.2.0",
+        "mixin-deep": "^1.1.3",
+        "object.pick": "^1.2.0",
+        "remarkable": "^1.7.1",
+        "repeat-string": "^1.6.1",
+        "strip-color": "^0.1.0"
       }
     },
-    "mdast-util-to-hast": {
-      "version": "10.2.0",
-      "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-10.2.0.tgz",
-      "integrity": "sha512-JoPBfJ3gBnHZ18icCwHR50orC9kNH81tiR1gs01D8Q5YpV6adHNO9nKNuFBCJQ941/32PT1a63UF/DitmS3amQ==",
-      "dev": true,
-      "requires": {
-        "@types/mdast": "^3.0.0",
-        "@types/unist": "^2.0.0",
-        "mdast-util-definitions": "^4.0.0",
-        "mdurl": "^1.0.0",
-        "unist-builder": "^2.0.0",
-        "unist-util-generated": "^1.0.0",
-        "unist-util-position": "^3.0.0",
-        "unist-util-visit": "^2.0.0"
-      }
+    "math-random": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.4.tgz",
+      "integrity": "sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A=="
     },
-    "mdast-util-to-markdown": {
-      "version": "0.6.5",
-      "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-0.6.5.tgz",
-      "integrity": "sha512-XeV9sDE7ZlOQvs45C9UKMtfTcctcaj/pGwH8YLbMHoMOXNNCn2LsqVQOqrF1+/NU8lKDAqozme9SCXWyo9oAcQ==",
-      "dev": true,
+    "md5.js": {
+      "version": "1.3.5",
+      "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz",
+      "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==",
       "requires": {
-        "@types/unist": "^2.0.0",
-        "longest-streak": "^2.0.0",
-        "mdast-util-to-string": "^2.0.0",
-        "parse-entities": "^2.0.0",
-        "repeat-string": "^1.0.0",
-        "zwitch": "^1.0.0"
+        "hash-base": "^3.0.0",
+        "inherits": "^2.0.1",
+        "safe-buffer": "^5.1.2"
       }
     },
-    "mdast-util-to-string": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz",
-      "integrity": "sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==",
-      "dev": true
-    },
     "mdn-data": {
       "version": "2.0.4",
       "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz",
@@ -12691,8 +12270,7 @@
     "mdurl": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz",
-      "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=",
-      "dev": true
+      "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4="
     },
     "media-typer": {
       "version": "0.3.0",
@@ -12899,81 +12477,6 @@
       "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=",
       "dev": true
     },
-    "micromark": {
-      "version": "2.11.4",
-      "resolved": "https://registry.npmjs.org/micromark/-/micromark-2.11.4.tgz",
-      "integrity": "sha512-+WoovN/ppKolQOFIAajxi7Lu9kInbPxFuTBVEavFcL8eAfVstoc5MocPmqBeAdBOJV00uaVjegzH4+MA0DN/uA==",
-      "dev": true,
-      "requires": {
-        "debug": "^4.0.0",
-        "parse-entities": "^2.0.0"
-      }
-    },
-    "micromark-extension-footnote": {
-      "version": "0.3.2",
-      "resolved": "https://registry.npmjs.org/micromark-extension-footnote/-/micromark-extension-footnote-0.3.2.tgz",
-      "integrity": "sha512-gr/BeIxbIWQoUm02cIfK7mdMZ/fbroRpLsck4kvFtjbzP4yi+OPVbnukTc/zy0i7spC2xYE/dbX1Sur8BEDJsQ==",
-      "dev": true,
-      "requires": {
-        "micromark": "~2.11.0"
-      }
-    },
-    "micromark-extension-gfm": {
-      "version": "0.3.3",
-      "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-0.3.3.tgz",
-      "integrity": "sha512-oVN4zv5/tAIA+l3GbMi7lWeYpJ14oQyJ3uEim20ktYFAcfX1x3LNlFGGlmrZHt7u9YlKExmyJdDGaTt6cMSR/A==",
-      "dev": true,
-      "requires": {
-        "micromark": "~2.11.0",
-        "micromark-extension-gfm-autolink-literal": "~0.5.0",
-        "micromark-extension-gfm-strikethrough": "~0.6.5",
-        "micromark-extension-gfm-table": "~0.4.0",
-        "micromark-extension-gfm-tagfilter": "~0.3.0",
-        "micromark-extension-gfm-task-list-item": "~0.3.0"
-      }
-    },
-    "micromark-extension-gfm-autolink-literal": {
-      "version": "0.5.7",
-      "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-0.5.7.tgz",
-      "integrity": "sha512-ePiDGH0/lhcngCe8FtH4ARFoxKTUelMp4L7Gg2pujYD5CSMb9PbblnyL+AAMud/SNMyusbS2XDSiPIRcQoNFAw==",
-      "dev": true,
-      "requires": {
-        "micromark": "~2.11.3"
-      }
-    },
-    "micromark-extension-gfm-strikethrough": {
-      "version": "0.6.5",
-      "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-0.6.5.tgz",
-      "integrity": "sha512-PpOKlgokpQRwUesRwWEp+fHjGGkZEejj83k9gU5iXCbDG+XBA92BqnRKYJdfqfkrRcZRgGuPuXb7DaK/DmxOhw==",
-      "dev": true,
-      "requires": {
-        "micromark": "~2.11.0"
-      }
-    },
-    "micromark-extension-gfm-table": {
-      "version": "0.4.3",
-      "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-0.4.3.tgz",
-      "integrity": "sha512-hVGvESPq0fk6ALWtomcwmgLvH8ZSVpcPjzi0AjPclB9FsVRgMtGZkUcpE0zgjOCFAznKepF4z3hX8z6e3HODdA==",
-      "dev": true,
-      "requires": {
-        "micromark": "~2.11.0"
-      }
-    },
-    "micromark-extension-gfm-tagfilter": {
-      "version": "0.3.0",
-      "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-0.3.0.tgz",
-      "integrity": "sha512-9GU0xBatryXifL//FJH+tAZ6i240xQuFrSL7mYi8f4oZSbc+NvXjkrHemeYP0+L4ZUT+Ptz3b95zhUZnMtoi/Q==",
-      "dev": true
-    },
-    "micromark-extension-gfm-task-list-item": {
-      "version": "0.3.3",
-      "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-0.3.3.tgz",
-      "integrity": "sha512-0zvM5iSLKrc/NQl84pZSjGo66aTGd57C1idmlWmE87lkMcXrTxg1uXa/nXomxJytoje9trP0NDLvw4bZ/Z/XCQ==",
-      "dev": true,
-      "requires": {
-        "micromark": "~2.11.0"
-      }
-    },
     "micromatch": {
       "version": "3.1.10",
       "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
@@ -13476,20 +12979,6 @@
       "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.72.tgz",
       "integrity": "sha512-LLUo+PpH3dU6XizX3iVoubUNheF/owjXCZZ5yACDxNnPtgFuludV1ZL3ayK1kVep42Rmm0+R9/Y60NQbZ2bifw=="
     },
-    "node-req": {
-      "version": "2.1.2",
-      "resolved": "https://registry.npmjs.org/node-req/-/node-req-2.1.2.tgz",
-      "integrity": "sha512-zJqZ03vs0oHN8u+wn7kUT/vj63jQdQvNYWjbRMGNVu7ijV3mVz8UwX7pJl7LUugOT2x8vBKasKqbUqnh6GDKMQ==",
-      "dev": true,
-      "requires": {
-        "accepts": "^1.3.5",
-        "fresh": "^0.5.2",
-        "parseurl": "^1.3.2",
-        "proxy-addr": "^2.0.4",
-        "qs": "^6.5.2",
-        "type-is": "^1.6.16"
-      }
-    },
     "node-res": {
       "version": "5.0.1",
       "resolved": "https://registry.npmjs.org/node-res/-/node-res-5.0.1.tgz",
@@ -14198,12 +13687,6 @@
       "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz",
       "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww="
     },
-    "p-finally": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
-      "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=",
-      "dev": true
-    },
     "p-limit": {
       "version": "1.3.0",
       "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
@@ -14230,25 +13713,6 @@
         "aggregate-error": "^3.0.0"
       }
     },
-    "p-queue": {
-      "version": "6.6.2",
-      "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz",
-      "integrity": "sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==",
-      "dev": true,
-      "requires": {
-        "eventemitter3": "^4.0.4",
-        "p-timeout": "^3.2.0"
-      }
-    },
-    "p-timeout": {
-      "version": "3.2.0",
-      "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz",
-      "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==",
-      "dev": true,
-      "requires": {
-        "p-finally": "^1.0.0"
-      }
-    },
     "p-try": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
@@ -14340,20 +13804,6 @@
         "safe-buffer": "^5.1.1"
       }
     },
-    "parse-entities": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz",
-      "integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==",
-      "dev": true,
-      "requires": {
-        "character-entities": "^1.0.0",
-        "character-entities-legacy": "^1.0.0",
-        "character-reference-invalid": "^1.0.0",
-        "is-alphanumerical": "^1.0.0",
-        "is-decimal": "^1.0.0",
-        "is-hexadecimal": "^1.0.0"
-      }
-    },
     "parse-git-config": {
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/parse-git-config/-/parse-git-config-3.0.0.tgz",
@@ -14441,12 +13891,6 @@
         "protocols": "^1.4.0"
       }
     },
-    "parse5": {
-      "version": "6.0.1",
-      "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz",
-      "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==",
-      "dev": true
-    },
     "parseurl": {
       "version": "1.3.3",
       "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
@@ -14468,34 +13912,16 @@
         }
       }
     },
-    "pascalcase": {
-      "version": "0.1.1",
-      "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz",
-      "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ="
-    },
-    "path-browserify": {
-      "version": "0.0.1",
-      "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz",
-      "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ=="
-    },
-    "path-case": {
-      "version": "3.0.4",
-      "resolved": "https://registry.npmjs.org/path-case/-/path-case-3.0.4.tgz",
-      "integrity": "sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg==",
-      "dev": true,
-      "requires": {
-        "dot-case": "^3.0.4",
-        "tslib": "^2.0.3"
-      },
-      "dependencies": {
-        "tslib": {
-          "version": "2.2.0",
-          "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz",
-          "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==",
-          "dev": true
-        }
-      }
-    },
+    "pascalcase": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz",
+      "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ="
+    },
+    "path-browserify": {
+      "version": "0.0.1",
+      "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz",
+      "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ=="
+    },
     "path-dirname": {
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz",
@@ -17222,6 +16648,15 @@
       "integrity": "sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==",
       "optional": true
     },
+    "prettier-linter-helpers": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz",
+      "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==",
+      "dev": true,
+      "requires": {
+        "fast-diff": "^1.1.2"
+      }
+    },
     "pretty-bytes": {
       "version": "5.6.0",
       "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz",
@@ -17257,17 +16692,12 @@
     "prism-themes": {
       "version": "1.7.0",
       "resolved": "https://registry.npmjs.org/prism-themes/-/prism-themes-1.7.0.tgz",
-      "integrity": "sha512-D5EsUQXOY4W9pcGwrOXFJiT22RRUuxWaaxyVNMGHRGr96h86K1XLLWMhzc3tXL0Qri7BhRE8mJtEN/ZZSNau6w==",
-      "dev": true
+      "integrity": "sha512-D5EsUQXOY4W9pcGwrOXFJiT22RRUuxWaaxyVNMGHRGr96h86K1XLLWMhzc3tXL0Qri7BhRE8mJtEN/ZZSNau6w=="
     },
     "prismjs": {
-      "version": "1.23.0",
-      "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.23.0.tgz",
-      "integrity": "sha512-c29LVsqOaLbBHuIbsTxaKENh1N2EQBOHaWv7gkHN4dgRbxSREqDnDbtFJYdpPauS4YCplMSNCABQ6Eeor69bAA==",
-      "dev": true,
-      "requires": {
-        "clipboard": "^2.0.0"
-      }
+      "version": "1.24.1",
+      "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.24.1.tgz",
+      "integrity": "sha512-mNPsedLuk90RVJioIky8ANZEwYm5w9LcvCXrxHlwf4fNVSn8jEipMybMkWUyyF0JhnC+C4VcOVSBuHRKs1L5Ow=="
     },
     "process": {
       "version": "0.11.10",
@@ -17307,30 +16737,11 @@
         }
       }
     },
-    "property-information": {
-      "version": "5.6.0",
-      "resolved": "https://registry.npmjs.org/property-information/-/property-information-5.6.0.tgz",
-      "integrity": "sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA==",
-      "dev": true,
-      "requires": {
-        "xtend": "^4.0.0"
-      }
-    },
     "protocols": {
       "version": "1.4.8",
       "resolved": "https://registry.npmjs.org/protocols/-/protocols-1.4.8.tgz",
       "integrity": "sha512-IgjKyaUSjsROSO8/D49Ab7hP8mJgTYcqApOqdPhLoPxAplXmkp+zRvsrSQjFn5by0rhm4VH0GAUELIPpx7B1yg=="
     },
-    "proxy-addr": {
-      "version": "2.0.7",
-      "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
-      "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
-      "dev": true,
-      "requires": {
-        "forwarded": "0.2.0",
-        "ipaddr.js": "1.9.1"
-      }
-    },
     "prr": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz",
@@ -17469,6 +16880,23 @@
       "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==",
       "dev": true
     },
+    "randomatic": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.1.tgz",
+      "integrity": "sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==",
+      "requires": {
+        "is-number": "^4.0.0",
+        "kind-of": "^6.0.0",
+        "math-random": "^1.0.1"
+      },
+      "dependencies": {
+        "is-number": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz",
+          "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ=="
+        }
+      }
+    },
     "randombytes": {
       "version": "2.1.0",
       "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
@@ -17717,135 +17145,18 @@
         }
       }
     },
-    "rehype-raw": {
-      "version": "5.1.0",
-      "resolved": "https://registry.npmjs.org/rehype-raw/-/rehype-raw-5.1.0.tgz",
-      "integrity": "sha512-MDvHAb/5mUnif2R+0IPCYJU8WjHa9UzGtM/F4AVy5GixPlDZ1z3HacYy4xojDU+uBa+0X/3PIfyQI26/2ljJNA==",
-      "dev": true,
-      "requires": {
-        "hast-util-raw": "^6.1.0"
-      }
-    },
-    "rehype-sort-attribute-values": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/rehype-sort-attribute-values/-/rehype-sort-attribute-values-3.0.2.tgz",
-      "integrity": "sha512-6QGua2vM3DytGRJcL11UTYLP5w5ItRgaQI2PhS3zLhvgKFkO/sb+JgcYsLCnkli9MCTkSvuEYArkiA1txtAtPA==",
-      "dev": true,
-      "requires": {
-        "hast-util-is-element": "^1.0.0",
-        "unist-util-visit": "^2.0.0",
-        "x-is-array": "^0.1.0"
-      }
-    },
-    "rehype-sort-attributes": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/rehype-sort-attributes/-/rehype-sort-attributes-3.0.2.tgz",
-      "integrity": "sha512-roPtOHX6BfLXge161TnxOh+jr8JhZwUDVdqYI/qobYpfAkXgBfnftpWlwcShdsExa+nbUd5zU7z9A0nHBi35+A==",
-      "dev": true,
-      "requires": {
-        "unist-util-visit": "^2.0.0"
-      }
-    },
     "relateurl": {
       "version": "0.2.7",
       "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz",
       "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk="
     },
-    "remark-autolink-headings": {
-      "version": "6.0.1",
-      "resolved": "https://registry.npmjs.org/remark-autolink-headings/-/remark-autolink-headings-6.0.1.tgz",
-      "integrity": "sha512-LTV5G5NMjypHEr14tMNJ36yrP+xwT7mejJelZOPXKiF5WvRH9o36zXnr2QGqfms2yVASNpDaC9NBOwKlJJKuQw==",
-      "dev": true,
-      "requires": {
-        "extend": "^3.0.0",
-        "unist-util-visit": "^2.0.0"
-      }
-    },
-    "remark-external-links": {
-      "version": "8.0.0",
-      "resolved": "https://registry.npmjs.org/remark-external-links/-/remark-external-links-8.0.0.tgz",
-      "integrity": "sha512-5vPSX0kHoSsqtdftSHhIYofVINC8qmp0nctkeU9YoJwV3YfiBRiI6cbFRJ0oI/1F9xS+bopXG0m2KS8VFscuKA==",
-      "dev": true,
-      "requires": {
-        "extend": "^3.0.0",
-        "is-absolute-url": "^3.0.0",
-        "mdast-util-definitions": "^4.0.0",
-        "space-separated-tokens": "^1.0.0",
-        "unist-util-visit": "^2.0.0"
-      },
-      "dependencies": {
-        "is-absolute-url": {
-          "version": "3.0.3",
-          "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz",
-          "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==",
-          "dev": true
-        }
-      }
-    },
-    "remark-footnotes": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/remark-footnotes/-/remark-footnotes-3.0.0.tgz",
-      "integrity": "sha512-ZssAvH9FjGYlJ/PBVKdSmfyPc3Cz4rTWgZLI4iE/SX8Nt5l3o3oEjv3wwG5VD7xOjktzdwp5coac+kJV9l4jgg==",
-      "dev": true,
-      "requires": {
-        "mdast-util-footnote": "^0.1.0",
-        "micromark-extension-footnote": "^0.3.0"
-      }
-    },
-    "remark-gfm": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-1.0.0.tgz",
-      "integrity": "sha512-KfexHJCiqvrdBZVbQ6RopMZGwaXz6wFJEfByIuEwGf0arvITHjiKKZ1dpXujjH9KZdm1//XJQwgfnJ3lmXaDPA==",
-      "dev": true,
-      "requires": {
-        "mdast-util-gfm": "^0.1.0",
-        "micromark-extension-gfm": "^0.3.0"
-      }
-    },
-    "remark-parse": {
-      "version": "9.0.0",
-      "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-9.0.0.tgz",
-      "integrity": "sha512-geKatMwSzEXKHuzBNU1z676sGcDcFoChMK38TgdHJNAYfFtsfHDQG7MoJAjs6sgYMqyLduCYWDIWZIxiPeafEw==",
-      "dev": true,
-      "requires": {
-        "mdast-util-from-markdown": "^0.8.0"
-      }
-    },
-    "remark-rehype": {
-      "version": "8.1.0",
-      "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-8.1.0.tgz",
-      "integrity": "sha512-EbCu9kHgAxKmW1yEYjx3QafMyGY3q8noUbNUI5xyKbaFP89wbhDrKxyIQNukNYthzjNHZu6J7hwFg7hRm1svYA==",
-      "dev": true,
-      "requires": {
-        "mdast-util-to-hast": "^10.2.0"
-      }
-    },
-    "remark-slug": {
-      "version": "6.0.0",
-      "resolved": "https://registry.npmjs.org/remark-slug/-/remark-slug-6.0.0.tgz",
-      "integrity": "sha512-ln67v5BrGKHpETnm6z6adlJPhESFJwfuZZ3jrmi+lKTzeZxh2tzFzUfDD4Pm2hRGOarHLuGToO86MNMZ/hA67Q==",
-      "dev": true,
-      "requires": {
-        "github-slugger": "^1.0.0",
-        "mdast-util-to-string": "^1.0.0",
-        "unist-util-visit": "^2.0.0"
-      },
-      "dependencies": {
-        "mdast-util-to-string": {
-          "version": "1.1.0",
-          "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-1.1.0.tgz",
-          "integrity": "sha512-jVU0Nr2B9X3MU4tSK7JP1CMkSvOj7X5l/GboG1tKRw52lLF1x2Ju92Ms9tNetCcbfX3hzlM73zYo2NKkWSfF/A==",
-          "dev": true
-        }
-      }
-    },
-    "remark-squeeze-paragraphs": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/remark-squeeze-paragraphs/-/remark-squeeze-paragraphs-4.0.0.tgz",
-      "integrity": "sha512-8qRqmL9F4nuLPIgl92XUuxI3pFxize+F1H0e/W3llTk0UsjJaj01+RrirkMw7P21RKe4X6goQhYRSvNWX+70Rw==",
-      "dev": true,
+    "remarkable": {
+      "version": "1.7.4",
+      "resolved": "https://registry.npmjs.org/remarkable/-/remarkable-1.7.4.tgz",
+      "integrity": "sha512-e6NKUXgX95whv7IgddywbeN/ItCkWbISmc2DiqHJb0wTrqZIexqdco5b8Z3XZoo/48IdNVKM9ZCvTPJ4F5uvhg==",
       "requires": {
-        "mdast-squeeze-paragraphs": "^4.0.0"
+        "argparse": "^1.0.10",
+        "autolinker": "~0.28.0"
       }
     },
     "remove-trailing-separator": {
@@ -18325,6 +17636,12 @@
         "source-map": "^0.4.2"
       },
       "dependencies": {
+        "js-base64": {
+          "version": "2.6.4",
+          "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.6.4.tgz",
+          "integrity": "sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==",
+          "dev": true
+        },
         "source-map": {
           "version": "0.4.4",
           "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz",
@@ -18341,27 +17658,6 @@
       "resolved": "https://registry.npmjs.org/scule/-/scule-0.2.1.tgz",
       "integrity": "sha512-M9gnWtn3J0W+UhJOHmBxBTwv8mZCan5i1Himp60t6vvZcor0wr+IM0URKmIglsWJ7bRujNAVVN77fp+uZaWoKg=="
     },
-    "section-matter": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz",
-      "integrity": "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==",
-      "dev": true,
-      "requires": {
-        "extend-shallow": "^2.0.1",
-        "kind-of": "^6.0.0"
-      },
-      "dependencies": {
-        "extend-shallow": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
-          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
-          "dev": true,
-          "requires": {
-            "is-extendable": "^0.1.0"
-          }
-        }
-      }
-    },
     "select": {
       "version": "1.1.2",
       "resolved": "https://registry.npmjs.org/select/-/select-1.1.2.tgz",
@@ -18420,25 +17716,6 @@
         }
       }
     },
-    "sentence-case": {
-      "version": "3.0.4",
-      "resolved": "https://registry.npmjs.org/sentence-case/-/sentence-case-3.0.4.tgz",
-      "integrity": "sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg==",
-      "dev": true,
-      "requires": {
-        "no-case": "^3.0.4",
-        "tslib": "^2.0.3",
-        "upper-case-first": "^2.0.2"
-      },
-      "dependencies": {
-        "tslib": {
-          "version": "2.2.0",
-          "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz",
-          "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==",
-          "dev": true
-        }
-      }
-    },
     "serialize-javascript": {
       "version": "5.0.1",
       "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz",
@@ -18484,6 +17761,14 @@
       "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=",
       "dev": true
     },
+    "set-getter": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/set-getter/-/set-getter-0.1.1.tgz",
+      "integrity": "sha512-9sVWOy+gthr+0G9DzqqLaYNA7+5OKkSmcqjL9cBpDEaZrr3ShQlyX2cZ/O/ozE41oxn/Tt0LGEM/w4Rub3A3gw==",
+      "requires": {
+        "to-object-path": "^0.3.0"
+      }
+    },
     "set-value": {
       "version": "2.0.1",
       "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz",
@@ -18614,24 +17899,6 @@
         "is-fullwidth-code-point": "^2.0.0"
       }
     },
-    "snake-case": {
-      "version": "3.0.4",
-      "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz",
-      "integrity": "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==",
-      "dev": true,
-      "requires": {
-        "dot-case": "^3.0.4",
-        "tslib": "^2.0.3"
-      },
-      "dependencies": {
-        "tslib": {
-          "version": "2.2.0",
-          "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz",
-          "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==",
-          "dev": true
-        }
-      }
-    },
     "snapdragon": {
       "version": "0.8.2",
       "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz",
@@ -18799,12 +18066,6 @@
       "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz",
       "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM="
     },
-    "space-separated-tokens": {
-      "version": "1.1.5",
-      "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz",
-      "integrity": "sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==",
-      "dev": true
-    },
     "spdx-correct": {
       "version": "3.1.0",
       "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz",
@@ -19126,11 +18387,10 @@
       "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=",
       "dev": true
     },
-    "strip-bom-string": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz",
-      "integrity": "sha1-5SEekiQ2n7uB1jOi8ABE3IztrZI=",
-      "dev": true
+    "strip-color": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/strip-color/-/strip-color-0.1.0.tgz",
+      "integrity": "sha1-EG9l09PmotlAHKwOsM6LinArT3s="
     },
     "strip-final-newline": {
       "version": "2.0.0",
@@ -19205,15 +18465,6 @@
         }
       }
     },
-    "style-to-object": {
-      "version": "0.3.0",
-      "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.3.0.tgz",
-      "integrity": "sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA==",
-      "dev": true,
-      "requires": {
-        "inline-style-parser": "0.1.1"
-      }
-    },
     "stylehacks": {
       "version": "4.0.3",
       "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-4.0.3.tgz",
@@ -19931,6 +19182,11 @@
       "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz",
       "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw=="
     },
+    "toml": {
+      "version": "2.3.6",
+      "resolved": "https://registry.npmjs.org/toml/-/toml-2.3.6.tgz",
+      "integrity": "sha512-gVweAectJU3ebq//Ferr2JUY4WKSDe5N+z0FvjDncLGyHmIDoxgY/2Ie4qfEIDm4IS7OA6Rmdm7pdEEdMcV/xQ=="
+    },
     "totalist": {
       "version": "1.1.0",
       "resolved": "https://registry.npmjs.org/totalist/-/totalist-1.1.0.tgz",
@@ -19952,12 +19208,6 @@
       "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=",
       "dev": true
     },
-    "trough": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/trough/-/trough-1.0.5.tgz",
-      "integrity": "sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==",
-      "dev": true
-    },
     "true-case-path": {
       "version": "1.0.3",
       "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-1.0.3.tgz",
@@ -20200,6 +19450,11 @@
       "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.28.tgz",
       "integrity": "sha512-6Gurc1n//gjp9eQNXjD9O3M/sMwVtN5S8Lv9bvOYBfKfDNiIIhqiyi01vMBO45u4zkDE420w/e0se7Vs+sIg+g=="
     },
+    "uc.micro": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz",
+      "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA=="
+    },
     "ufo": {
       "version": "0.7.5",
       "resolved": "https://registry.npmjs.org/ufo/-/ufo-0.7.5.tgz",
@@ -20262,34 +19517,6 @@
       "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz",
       "integrity": "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg=="
     },
-    "unified": {
-      "version": "9.2.1",
-      "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.1.tgz",
-      "integrity": "sha512-juWjuI8Z4xFg8pJbnEZ41b5xjGUWGHqXALmBZ3FC3WX0PIx1CZBIIJ6mXbYMcf6Yw4Fi0rFUTA1cdz/BglbOhA==",
-      "dev": true,
-      "requires": {
-        "bail": "^1.0.0",
-        "extend": "^3.0.0",
-        "is-buffer": "^2.0.0",
-        "is-plain-obj": "^2.0.0",
-        "trough": "^1.0.0",
-        "vfile": "^4.0.0"
-      },
-      "dependencies": {
-        "is-buffer": {
-          "version": "2.0.5",
-          "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz",
-          "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==",
-          "dev": true
-        },
-        "is-plain-obj": {
-          "version": "2.1.0",
-          "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz",
-          "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==",
-          "dev": true
-        }
-      }
-    },
     "union-value": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz",
@@ -20327,69 +19554,6 @@
         "imurmurhash": "^0.1.4"
       }
     },
-    "unist-builder": {
-      "version": "2.0.3",
-      "resolved": "https://registry.npmjs.org/unist-builder/-/unist-builder-2.0.3.tgz",
-      "integrity": "sha512-f98yt5pnlMWlzP539tPc4grGMsFaQQlP/vM396b00jngsiINumNmsY8rkXjfoi1c6QaM8nQ3vaGDuoKWbe/1Uw==",
-      "dev": true
-    },
-    "unist-util-generated": {
-      "version": "1.1.6",
-      "resolved": "https://registry.npmjs.org/unist-util-generated/-/unist-util-generated-1.1.6.tgz",
-      "integrity": "sha512-cln2Mm1/CZzN5ttGK7vkoGw+RZ8VcUH6BtGbq98DDtRGquAAOXig1mrBQYelOwMXYS8rK+vZDyyojSjp7JX+Lg==",
-      "dev": true
-    },
-    "unist-util-is": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-4.1.0.tgz",
-      "integrity": "sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==",
-      "dev": true
-    },
-    "unist-util-position": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-3.1.0.tgz",
-      "integrity": "sha512-w+PkwCbYSFw8vpgWD0v7zRCl1FpY3fjDSQ3/N/wNd9Ffa4gPi8+4keqt99N3XW6F99t/mUzp2xAhNmfKWp95QA==",
-      "dev": true
-    },
-    "unist-util-remove": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/unist-util-remove/-/unist-util-remove-2.1.0.tgz",
-      "integrity": "sha512-J8NYPyBm4baYLdCbjmf1bhPu45Cr1MWTm77qd9istEkzWpnN6O9tMsEbB2JhNnBCqGENRqEWomQ+He6au0B27Q==",
-      "dev": true,
-      "requires": {
-        "unist-util-is": "^4.0.0"
-      }
-    },
-    "unist-util-stringify-position": {
-      "version": "2.0.3",
-      "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz",
-      "integrity": "sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==",
-      "dev": true,
-      "requires": {
-        "@types/unist": "^2.0.2"
-      }
-    },
-    "unist-util-visit": {
-      "version": "2.0.3",
-      "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.3.tgz",
-      "integrity": "sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==",
-      "dev": true,
-      "requires": {
-        "@types/unist": "^2.0.0",
-        "unist-util-is": "^4.0.0",
-        "unist-util-visit-parents": "^3.0.0"
-      }
-    },
-    "unist-util-visit-parents": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz",
-      "integrity": "sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==",
-      "dev": true,
-      "requires": {
-        "@types/unist": "^2.0.0",
-        "unist-util-is": "^4.0.0"
-      }
-    },
     "universal-user-agent": {
       "version": "6.0.0",
       "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.0.tgz",
@@ -20457,23 +19621,6 @@
       "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz",
       "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg="
     },
-    "upper-case-first": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/upper-case-first/-/upper-case-first-2.0.2.tgz",
-      "integrity": "sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==",
-      "dev": true,
-      "requires": {
-        "tslib": "^2.0.3"
-      },
-      "dependencies": {
-        "tslib": {
-          "version": "2.2.0",
-          "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz",
-          "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==",
-          "dev": true
-        }
-      }
-    },
     "uri-js": {
       "version": "4.2.2",
       "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz",
@@ -20643,42 +19790,6 @@
         "extsprintf": "^1.2.0"
       }
     },
-    "vfile": {
-      "version": "4.2.1",
-      "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz",
-      "integrity": "sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==",
-      "dev": true,
-      "requires": {
-        "@types/unist": "^2.0.0",
-        "is-buffer": "^2.0.0",
-        "unist-util-stringify-position": "^2.0.0",
-        "vfile-message": "^2.0.0"
-      },
-      "dependencies": {
-        "is-buffer": {
-          "version": "2.0.5",
-          "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz",
-          "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==",
-          "dev": true
-        }
-      }
-    },
-    "vfile-location": {
-      "version": "3.2.0",
-      "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-3.2.0.tgz",
-      "integrity": "sha512-aLEIZKv/oxuCDZ8lkJGhuhztf/BW4M+iHdCwglA/eWc+vtuRFJj8EtgceYFX4LRjOhCAAiNHsKGssC6onJ+jbA==",
-      "dev": true
-    },
-    "vfile-message": {
-      "version": "2.0.4",
-      "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz",
-      "integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==",
-      "dev": true,
-      "requires": {
-        "@types/unist": "^2.0.0",
-        "unist-util-stringify-position": "^2.0.0"
-      }
-    },
     "vm-browserify": {
       "version": "1.1.2",
       "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz",
@@ -20941,12 +20052,6 @@
         }
       }
     },
-    "web-namespaces": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-1.1.4.tgz",
-      "integrity": "sha512-wYxSGajtmoP4WxfejAPIr4l0fVh+jeMXZb08wNc0tMg6xsfZXj3cECqIK0G7ZAqUq0PP8WlMDtaOGVBTAWztNw==",
-      "dev": true
-    },
     "webpack": {
       "version": "4.42.1",
       "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.42.1.tgz",
@@ -21462,28 +20567,6 @@
       "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz",
       "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A=="
     },
-    "x-is-array": {
-      "version": "0.1.0",
-      "resolved": "https://registry.npmjs.org/x-is-array/-/x-is-array-0.1.0.tgz",
-      "integrity": "sha1-3lIBcdR7P0FvVYfWKbidJrEtwp0=",
-      "dev": true
-    },
-    "xml2js": {
-      "version": "0.4.23",
-      "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz",
-      "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==",
-      "dev": true,
-      "requires": {
-        "sax": ">=0.6.0",
-        "xmlbuilder": "~11.0.0"
-      }
-    },
-    "xmlbuilder": {
-      "version": "11.0.1",
-      "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz",
-      "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==",
-      "dev": true
-    },
     "xtend": {
       "version": "4.0.2",
       "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
@@ -21628,12 +20711,6 @@
       "version": "0.1.0",
       "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
       "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="
-    },
-    "zwitch": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-1.0.5.tgz",
-      "integrity": "sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==",
-      "dev": true
     }
   }
 }
diff --git a/package.json b/package.json
index e0ac357..4f366f4 100644
--- a/package.json
+++ b/package.json
@@ -15,16 +15,20 @@
     "@nuxt/types": "^2.15.6",
     "@vue/composition-api": "^1.0.0-rc.10",
     "clipboard": "^2.0.8",
+    "js-base64": "^3.6.1",
     "js-yaml-loader": "^1.2.2",
     "lodash": "^4.17.21",
+    "markdown-it": "^12.2.0",
+    "markdown-it-anchor": "^8.1.2",
     "nuxt": "^2.15.6",
     "nuxt-i18n": "^6.27.0",
+    "prism-themes": "^1.7.0",
+    "prismjs": "^1.24.1",
     "scroll-into-view": "^1.15.0",
     "vue-prism-editor": "^1.2.2"
   },
   "devDependencies": {
     "@jamesives/github-pages-deploy-action": "^4.1.3",
-    "@nuxt/content": "^1.14.0",
     "@nuxt/typescript-build": "^2.1.0",
     "@nuxtjs/eslint-config-typescript": "^1.0.0",
     "@nuxtjs/eslint-module": "^1.0.0",
@@ -34,11 +38,11 @@
     "child_process": "^1.0.2",
     "eslint": "^6.1.0",
     "eslint-plugin-nuxt": ">=0.4.2",
+    "eslint-plugin-prettier": "^3.4.1",
     "file-loader": "^6.0.0",
     "node-fetch": "^2.6.1",
     "node-sass": "^4.14.1",
     "postcss": "^8.3.0",
-    "prism-themes": "^1.7.0",
     "raw-loader": "^4.0.0",
     "resize-detector": "^0.3.0",
     "sass-loader": "^8.0.2",
diff --git a/pages/_.vue b/pages/_.vue
index 4ea863f..ca0f4c9 100644
--- a/pages/_.vue
+++ b/pages/_.vue
@@ -1,16 +1,16 @@
 <template>
   <div>
     <div class="post-inner">
-      <nuxt-content :document="article" />
+      <post-content :content="html"></post-content>
       <div class="table-of-contents">
         <h4 class="toc-container-header">{{ $t('inThisPage') }}</h4>
         <ul>
           <li
-            v-for="link of article.toc"
+            v-for="link of toc"
             :key="link.id"
             :class="{ toc2: link.depth === 2, toc3: link.depth === 3 }"
           >
-            <NuxtLink :to="`#${link.id}`">{{ link.text }}</NuxtLink>
+            <NuxtLink :to="`#${link.id}`">{{ link.title }}</NuxtLink>
           </li>
         </ul>
       </div>
@@ -22,20 +22,107 @@
 <script lang="ts">
 import Vue from 'vue'
 import '~/components/markdown/global'
-
+import markdown from 'markdown-it'
+import anchor from 'markdown-it-anchor'
 import Contributors from '~/components/partials/Contributors.vue'
+import PostContent from '~/components/partials/PostContent'
+import * as base64 from 'js-base64'
+import config from '~/configs/config'
+
+function parseLiveCodeBlocks(md: string) {
+  return md.replace(
+    /^```(\w+?)\s+live\s*({.*?})?\s*?\n([\s\S]+?)^```/gm,
+    (full, lang = 'js', options = '{}', code: string = '') => {
+      lang = lang.trim()
+      options = options.trim() || '{}'
+      const encoded = base64.encode(code.trim(), true)
+      return `<md-live lang="${lang}" code="'${encoded}'" v-bind="${options}" />`
+    }
+  )
+}
+
+function parseCodeBlocks(md: string) {
+  return md.replace(
+    /^```(\w+?)\s*({.*?})?\s*?\n([\s\S]+?)^```/gm,
+    (full, lang = 'js', lineHighlights = '', code: string = '') => {
+      lang = lang.trim()
+      const encoded = base64.encode(code.trim(), true)
+      return `<md-code-block lang="${lang}" code="'${encoded}'" line-highlights="'${lineHighlights}'" />`
+    }
+  )
+}
+
+function replaceVars(md: string, lang: string) {
+  // Replace variables
+  ;[
+    'optionPath',
+    'mainSitePath',
+    'exampleViewPath',
+    'exampleEditorPath'
+  ].forEach(p => {
+    const val = config[p].replace('${lang}', lang)
+    md = md.replace(new RegExp('\\$\\{' + p + '\\}', 'g'), val)
+  })
+  md = md.replace(/\$\{lang\}/g, lang)
+  return md
+}
+
+function slugify(s: string) {
+  return encodeURIComponent(
+    String(s)
+      .trim()
+      .toLowerCase()
+      .replace(/\s+/g, '-')
+  )
+}
 
 export default Vue.extend({
   components: {
-    Contributors
+    Contributors,
+    PostContent
   },
-  async asyncData({ $content, params, i18n }: any) {
-    const postPath = `${i18n.locale}/${params.pathMatch}`
-    const article = await $content(postPath).fetch()
+  data() {
     return {
-      article,
-      postPath
+      toc: [] as {
+        title: string
+        id: string
+        depth: number
+      }[]
+    }
+  },
+  mounted() {
+    this.toc = []
+    const headers =
+      this.$el.querySelector('.post-inner')?.querySelectorAll(' h2,h3') || []
+    for (let i = 0; i < headers.length; i++) {
+      const title = (headers[i] as HTMLHeadingElement).innerText
+      this.toc.push({
+        title,
+        depth: +headers[i].nodeName.replace(/\D/g, ''),
+        id: slugify(title)
+      })
     }
+  },
+  async asyncData({ $content, params, i18n, $el }: any) {
+    const postPath = `${i18n.locale}/${params.pathMatch}`
+    const fileContent = await import(`~/contents/${postPath}.md`)
+    const content = replaceVars(
+      parseCodeBlocks(parseLiveCodeBlocks(fileContent.default)),
+      i18n.locale
+    )
+
+    const md = markdown({
+      html: true,
+      linkify: true
+    }).use(anchor, {
+      // slugify,
+      permalink: false,
+      permalinkAfter: true,
+      permalinkSymbol: '#',
+      permalinkClass: 'permalink'
+    })
+
+    return { html: md.render(content), postPath }
   }
 })
 </script>

---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@echarts.apache.org
For additional commands, e-mail: commits-help@echarts.apache.org