diff --git a/setup.sh b/setup.sh
new file mode 100755
index 0000000000000000000000000000000000000000..65663d342b48b0ad8d5413495d38bf628261e8c5
--- /dev/null
+++ b/setup.sh
@@ -0,0 +1,926 @@
+#!/usr/bin/env bash
+# """Simply setup documentation configuration for the current folder.
+#
+# SYNOPSIS:
+#   `./setup.sh [-u|--upgrade] [-s|--subrepo] [-h|--help] -r|--repo-url REPO_URL`
+#
+# DESCRIPTION:
+#   This script will install/upgrade set of scripts and files to create and
+#   manage documentation rendered using mkdocs.
+#
+#   If directory is already using mkdocs and user does not provide
+#   `-u|--upgrade` options, an error will be shown and nothing will be done.
+#
+#   If user does not provide REPO_URL from which download the template, i.e.
+#   using option `-r|--repo-url REPO_URL`, then an error will be prompt and
+#   the script will exit.
+#
+# OPTIONS:
+#   Available options are:
+#
+#     * `-u,--upgrade`  : Upgrade the current mkdocs documentation to the latest
+#                         template version.
+#
+#     * `-s,--subrepo`  : Specify the current repo is a subrepo that will be
+#                         merge into another main project using mkdocs-monorepo
+#                         plugin.
+#
+#     * `-r,--repo-url` : URL of the repo from which the template will be
+#                         downloaded.
+#
+#     * `-h,--help`     : Print this help.
+#
+# """
+
+# Set constant variables
+UPGRADE="false"
+SUBREPO="false"
+
+MKDOCS_ROOT="${PWD}"
+MKDOCS_TMP="${MKDOCS_ROOT}/.tmp"
+MKDOCS_CLONE_ROOT="${MKDOCS_TMP}/mkdocs_template"
+MKDOCS_DEBUG_LEVEL="DEBUG"
+
+USER_POST_SETUP="false"
+
+SCRIPT_PATH="$( cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 || return 1 ; pwd -P )"
+SCRIPT_FULL_PATH="${SCRIPT_PATH}/$(basename "${BASH_SOURCE[0]}")"
+
+main()
+{
+  # """Setup folder to be able to use mkdocs documentation templates.
+  #
+  # Check if `git` is installed. Then check that folder is not already using
+  # mkdocs documentation.
+  #
+  # If directory already set to use mkdocs documentation, then check if user
+  # explicitly tell to upgrade and upgrade, otherwise, print a warning and exit.
+  #
+  # If directory not already set to use mkdocs documentation, clone user
+  # provided repo to a temporary folder, copy relevant scripts, files and
+  # folders to initiliaze a documentation rendered using mkdocs.
+  #
+  # Globals:
+  #   UPGRADE
+  #   SUBREPO
+  #   REPO_URL
+  #   MKDOCS_ROOT
+  #   MKDOCS_TMP
+  #   MKDOCS_CLONE_ROOT
+  #   SCRIPT_FULL_PATH
+  #
+  # Arguments:
+  #   -u,--upgrade           : Arguments to explicitly upgrade the documentation
+  #   -s,--subrepo           : Specify the current repo is a subrepo that will be merge into another main project using mkdocs-monorepo plugin.
+  #   -r,--repo-url REPO_URL : Arguments with the URL of the repo holding the template to setup/upgrade
+  #
+  # Output:
+  #   Log informations
+  #
+  # Returns:
+  #   0 if directory is correctly configure to start writing documentation
+  #   1 if something when wrong during the setup of documentation
+  #
+  # """
+
+  manpage()
+  {
+    # """Extract the script documentation from header and print it on stdout.
+    #
+    # Simply extract the docstring from the header of the script, format it with
+    # some output enhancement (such as bold), print it to stdout and exit.
+    #
+    # Globals:
+    #   SCRIPT_FULL_PATH
+    #
+    # Arguments:
+    #   None
+    #
+    # Output:
+    #   Help manpage from header docstring on stdout
+    #
+    # Returns:
+    #   0, always
+    #
+    # """
+
+    local e_normal="\\\e[0m"     # Normal (usually white fg & transparent bg)
+    local e_bold="\\\e[1m"       # Bold
+    # Extract module documentation and format it
+    help_content="$(\
+      sed -n -e "/^# \"\"\".*/,/^# \"\"\"/"p "${SCRIPT_FULL_PATH}" \
+        | sed -e "s/^# \"\"\"//g" \
+              -e "s/^# //g" \
+              -e "s/^#$//g" \
+              -e "s/DESCRIPTION[:]/${e_bold}DESCRIPTION${e_normal}\n/g" \
+              -e "s/COMMANDS[:]/${e_bold}COMMANDS${e_normal}\n/g" \
+              -e "s/OPTIONS[:]/${e_bold}OPTIONS${e_normal}\n/g" \
+              -e "s/SYNOPSIS[:]/${e_bold}SYNOPSIS${e_normal}\n/g")"
+    echo -e "${help_content}"
+    exit 0
+  }
+
+  #   - SC2034: var appears unused, Verify use (or export if used externally)
+  # shellcheck disable=SC2034
+  mkdocs_log()
+  {
+    # """Print debug message in colors depending on message severity on stderr.
+    #
+    # Echo colored log depending on user provided message severity. Message
+    # severity are associated to following color output:
+    #
+    #   - `DEBUG` print in the fifth color of the terminal (usually magenta)
+    #   - `INFO` print in the second color of the terminal (usually green)
+    #   - `WARNING` print in the third color of the terminal (usually yellow)
+    #   - `ERROR` print in the third color of the terminal (usually red)
+    #
+    # If no message severity is provided, severity will automatically be set to
+    # INFO.
+    #
+    # Globals:
+    #   ZSH_VERSION
+    #   MKDOCS_DEBUG_LEVEL
+    #
+    # Arguments:
+    #   $1 : string, message severity or message content
+    #   $@ : string, message content
+    #
+    # Output:
+    #   Colored log informations
+    #
+    # Returns:
+    #   None
+    #
+    # """
+
+    # Store color prefixes in variable to ease their use.
+    # Base on only 8 colors to ensure portability of color when in tty
+    local e_normal="\e[0m"     # Normal (usually white fg & transparent bg)
+    local e_bold="\e[1m"       # Bold
+    local e_underline="\e[4m"  # Underline
+    local e_debug="\e[0;35m"   # Fifth term color (usually magenta fg)
+    local e_info="\e[0;32m"    # Second term color (usually green fg)
+    local e_warning="\e[0;33m" # Third term color (usually yellow fg)
+    local e_error="\e[0;31m"   # First term color (usually red fg)
+
+    # Store preformated colored prefix for log message
+    local error="${e_bold}${e_error}[ERROR]${e_normal}${e_error}"
+    local warning="${e_bold}${e_warning}[WARNING]${e_normal}${e_warning}"
+    local info="${e_bold}${e_info}[INFO]${e_normal}${e_info}"
+    local debug="${e_bold}${e_debug}[DEBUG]${e_normal}${e_debug}"
+
+    local color_output="e_error"
+    local msg_severity
+    local msg
+
+    # Not using ${1^^} to ensure portability when using ZSH
+    msg_severity=$(echo "$1" | tr '[:upper:]' '[:lower:]')
+
+    if [[ "${msg_severity}" =~ ^(error|time|warning|info|debug)$ ]]
+    then
+      # Shift arguments by one such that $@ start from the second arguments
+      shift
+      # Place the content of variable which name is defined by ${msg_severity}
+      # For instance, if `msg_severity` is INFO, then `prefix` will have the same
+      # value as variable `info`.
+      if [[ -n "${ZSH_VERSION}" ]]
+      then
+        prefix="${(P)msg_severity}"
+      else
+        prefix="${!msg_severity}"
+      fi
+      color_output="e_${msg_severity}"
+    else
+      prefix="${info}"
+    fi
+
+    if [[ -n "${ZSH_VERSION}" ]]
+    then
+      color_output="${(P)color_output}"
+    else
+      color_output="${!color_output}"
+    fi
+
+    # Concat all remaining arguments in the message content and apply markdown
+    # like syntax.
+    msg_content=$(echo "$*" \
+      | sed -e "s/ \*\*/ \\${e_bold}/g" \
+            -e "s/\*\*\./\\${e_normal}\\${color_output}./g" \
+            -e "s/\*\* /\\${e_normal}\\${color_output} /g" \
+            -e "s/\*\*$/\\${e_normal}\\${color_output} /g" \
+            -e "s/ \_\_/ \\${e_underline}/g" \
+            -e "s/\_\_\./\\${e_normal}\\${color_output}./g" \
+            -e "s/\_\_ /\\${e_normal}\\${color_output} /g")
+    msg="${prefix} ${msg_content}${e_normal}"
+
+    # Print message or not depending on message severity and MKDOCS_DEBUG_LEVEL
+    if [[ -z "${MKDOCS_DEBUG_LEVEL}" ]] && [[ "${msg_severity}" == "error" ]]
+    then
+      echo -e "${msg}" 1>&2
+    elif [[ -n "${MKDOCS_DEBUG_LEVEL}" ]]
+    then
+      case ${MKDOCS_DEBUG_LEVEL} in
+        DEBUG)
+          echo "${msg_severity}" \
+            | grep -q -E "(debug|info|warning|error)" && echo -e "${msg}" 1>&2
+          ;;
+        INFO)
+          echo "${msg_severity}" \
+            | grep -q -E "(info|warning|error)" && echo -e "${msg}" 1>&2
+          ;;
+        WARNING)
+          echo "${msg_severity}" \
+            | grep -q -E "(warning|error)" && echo -e "${msg}" 1>&2
+          ;;
+        ERROR)
+          echo "${msg_severity}" \
+            | grep -q -E "error" && echo -e "${msg}" 1>&2
+          ;;
+      esac
+    fi
+  }
+
+  check_git()
+  {
+    # """Ensure command `git` exists.
+    #
+    # Simply ensure the command `git` exists.
+    #
+    # Globals:
+    #   None
+    #
+    # Arguments:
+    #   None
+    #
+    # Output:
+    #   Error message if commang `git` does not exists
+    #
+    # Returns:
+    #   0 if `git` command exists
+    #   1 if `git` command does not exist
+    #
+    # """
+
+    if ! command -v git > /dev/null 2>&1
+    then
+      mkdocs_log "ERROR" "**git** must be installed."
+      mkdocs_log "ERROR" "Please install **git** first."
+      return 1
+    fi
+  }
+
+  clone_mkdocs_template_repo()
+  {
+    # """Clone repo mkdocs_template to a temporary folder.
+    #
+    # Clone the repo mkdocs_template to a temporary folder using provided URL.
+    #
+    # Globals:
+    #   REPO_URL
+    #   MKDOCS_ROOT
+    #   MKDOCS_CLONE_ROOT
+    #   MKDOCS_TMP
+    #
+    # Arguments:
+    #   None
+    #
+    # Output:
+    #   Log messages
+    #
+    # Returns:
+    #   0 if clone of repo went right
+    #   1 if clone of repo went wrong
+    #
+    # """
+
+    if [[ -z "${REPO_URL}" ]]
+    then
+      mkdocs_log "ERROR" "You did not provide URL of the repo to clone"
+      mkdocs_log "ERROR" "To provide URL of the repo to clone, use option --repo-url|-r."
+      mkdocs_log "ERROR" "If you are using curl, use the following command
+          \`\`\`
+          curl -sfL \\
+            https://domain.tld/namespace/mkdocs_template/-/raw/master/setup.sh \\
+            | bash -s -- --repo-url https://git.domain.tld/namespace/repo
+          \`\`\`
+      "
+      return 1
+    fi
+
+    mkdocs_log "INFO" "Cloning mkdocs_template repo to **${MKDOCS_TMP##*${MKDOCS_ROOT}\/}/mkdocs_template**."
+    mkdir -p "${MKDOCS_TMP}"
+
+    git clone "${REPO_URL}" "${MKDOCS_CLONE_ROOT}" || return 1
+  }
+
+  check_upgrade()
+  {
+    # """Check if user specify to upgrade mkdocs documentation.
+    #
+    # Check if user specify to upgrade mkdocs documentation from the
+    # mkdocs_template provided as repo URL. This is done by the use of option
+    # `-u|--upgrade`.
+    #
+    # If user did not explicitly specify to upgrade, print a warning else,
+    # upgrade mkdocs documentation files.
+    #
+    # Globals:
+    #   UPGRADE
+    #
+    # Arguments:
+    #   None
+    #
+    # Output:
+    #   Warning messages.
+    #
+    # Returns:
+    #   0 if upgrade went right.
+    #   1 if user did not specify to upgrade or if upgrade went wrong.
+    #
+    # """
+
+    # If folder seems to already be set to use direnv but user did not specify
+    # to upgrade
+    if [[ "${UPGRADE}" == "false" ]]
+    then
+      mkdocs_log "WARNING" "This folder seems to already be set to build a mkdocs documentation."
+      mkdocs_log "WARNING" "Continuing might result in the loss of your configuration."
+      mkdocs_log "WARNING" "If you want to upgrade your configuration use the option \`--upgrade|-u\`."
+      mkdocs_log "WARNING" "Or if you used curl:
+        \`\`\`
+          curl -sfL \\
+            https://domain.tld/namespace/mkdocs_template/-/raw/master/setup.sh \\
+            | bash -s -- --upgrade
+        \`\`\`"
+      return 1
+    # If folder seems to already be set to use direnv and user not specify to
+    # upgrade
+    elif [[ "${UPGRADE}" == "true" ]]
+    then
+      # Clone last version of mkdocs_template to .tmp folder
+      if ! clone_mkdocs_template_repo
+      then
+        mkdocs_log "WARNING" "An error occurs when trying to get the last version of mkdocs_tempalte."
+        return 1
+      fi
+      setup_mkdocs
+    fi
+  }
+
+  upgrade_mkdocs_config_file()
+  {
+    # """Handle the upgrade of mkdocs.yml file.
+    #
+    # Depending on the type of documentation, i.e. `SUBREPO` set to `true` or
+    # `false`.
+    #
+    # If `SUBREPO` set to `true`, this will update `mkdocs.local.yml` else
+    # will update `mkdocs.yml` if needed.
+    #
+    # Globals:
+    #   MKDOCS_ROOT
+    #   MKDOCS_TMP
+    #   SUBREPO
+    #
+    # Arguments:
+    #   $1 : string, absolute path to the latest file version to be installed
+    #   $2 : string, absolute path to the location of the installation
+    #
+    # Output:
+    #   Log message
+    #
+    # Returns:
+    #   None
+    #
+    # """
+    local file_from=$1
+    local file_to=$2
+    local relative_file_to="${file_to##*${MKDOCS_ROOT}\/}"
+    local tmp_file_from="${MKDOCS_TMP}/new_mkdocs.yml"
+    local tmp_file_to="${MKDOCS_TMP}/old_mkdocs.yml"
+    local bak_file=${file_to//${MKDOCS_ROOT}/${MKDOCS_ROOT}\/.old}
+    local begin="### BEGIN MKDOCS TEMPLATE ###"
+    local end="### END MKDOCS TEMPLATE ###"
+    local bak_dir
+
+    bak_file=${bak_file}.$(date "+%Y-%m-%d-%H-%M")
+    bak_dir=$(dirname "${bak_file}")
+
+    if [[ "${SUBREPO}" == "false" ]]
+    then
+      file_to=${file_to//mkdocs.local.yml/mkdocs.yml}
+      relative_file_to=${file_to##*${MKDOCS_ROOT}\/}
+      bak_file=${file_to//${MKDOCS_ROOT}/${MKDOCS_ROOT}\/.old}.$(date "+%Y-%m-%d-%H-%M")
+    fi
+
+    sed -n -e "/${begin}/,/${end}/"p "${file_from}" > "${tmp_file_from}"
+    sed -n -e "/${begin}/,/${end}/"p "${file_to}" > "${tmp_file_to}"
+
+    if [[ "$(sha1sum "${tmp_file_from}" | cut -d " " -f 1 )" \
+       != "$(sha1sum "${tmp_file_to}"   | cut -d " " -f 1 )" ]]
+    then
+      mkdocs_log "INFO" "Backup file **${relative_file_to}** to **${bak_file##*${MKDOCS_ROOT}\/}.**"
+      if ! [[ -d "${bak_dir}" ]]
+      then
+        mkdir -p "${bak_dir}"
+      fi
+      cp "${file_to}" "${bak_file}"
+
+      content=$(grep -B 10000 "${begin}" "${file_to}" | sed -e "s/${begin}//g")
+      content+=$(sed -n -e "/${begin}/,/${end}/"p  "${file_from}")
+      content+=$(grep -A 10000 "${end}" "${file_to}" | sed -e "s/${end}//g")
+      mkdocs_log "INFO" "Upgrading file **${relative_file_to}**."
+      echo "${content}" > "${file_to}"
+    fi
+  }
+
+  setup_mkdocs_config_file()
+  {
+    # """Handle the configuration of mkdocs.yml file.
+    #
+    # Depending on the type of documentation, i.e. `SUBREPO` set to `true` or
+    # `false`.
+    #
+    # In the first case, `SUBREPO` set to `true`, will generate a basic
+    # `mkdocs.yml` to be included with mkdocs monorepo plugins and put the full
+    # configuration to `mkdocs.local.yml`.
+    # Else, `SUBREPO` set to `false`, write directly the full configuration to
+    # `mkdocs.yml`.
+    #
+    # Globals:
+    #   MKDOCS_ROOT
+    #   SUBREPO
+    #
+    # Arguments:
+    #   $1 : string, absolute path to the latest file version to be installed
+    #   $2 : string, absolute path to the location of the installation
+    #
+    # Output:
+    #   Log message
+    #
+    # Returns:
+    #   None
+    #
+    # """
+
+    local file_from=$1
+    local file_to=$2
+    local relative_file_to="${file_to##*${MKDOCS_ROOT}\/}"
+
+    if [[ "${SUBREPO}" == "false" ]]
+    then
+      file_to=${file_to//mkdocs.local.yml/mkdocs.yml}
+    else
+      if ! [[ -e ${file_to//mkdocs.local.yml/mkdocs.yml} ]]
+      then
+        mkdocs_log "INFO" "Creation of **${relative_file_to//mkdocs.local.yml/mkdocs.yml}**."
+        cat <<EOM > "${file_to//mkdocs.local.yml/mkdocs.yml}"
+# Website Information
+# ---------------------------------------------------------------------------
+# If this documentation is a subdocumentation and will be used by monorepo.
+# DO NOT FORGET TO UPDATE BELOW VALUE.
+site_name: "{{ repo_name.path_slug_with_namespace }}"
+
+# DO NOT FORGET TO ADD THE \`nav\` KEY BELOW.
+EOM
+      fi
+    fi
+
+    mkdocs_log "INFO" "Creation of **${relative_file_to}**."
+    cp "${file_from}" "${file_to}"
+  }
+
+  upgrade_file()
+  {
+    # """Upgrade latest version of script and files from mkdocs_template.
+    #
+    # Check if latest version of file is different from the old version. If
+    # yes, then move the old version to `${MKDOCS_ROOT}/.old` then upgrade to
+    # latest version.
+    #
+    # Globals:
+    #   MKDOCS_ROOT
+    #   MKDOCS_TMP
+    #
+    # Arguments:
+    #   $1 : string, absolute path to the latest file version to be installed
+    #   $2 : string, absolute path to the location of the installation
+    #
+    # Output:
+    #   Log messages
+    #
+    # Returns:
+    #   None
+    #
+    # """
+
+    local file_from="$1"
+    local file_to="$2"
+    local relative_file_to="${file_to##*${MKDOCS_ROOT}\/}"
+    local tmp_file_from="${MKDOCS_TMP}/${relative_file_to}.new"
+    local tmp_file_to="${MKDOCS_TMP}/${relative_file_to}.old"
+    local bak_file=${file_to//${MKDOCS_ROOT}/${MKDOCS_ROOT}\/.old}
+    local begin=""
+    local end=""
+    local begin_tag="BEGIN MKDOCS TEMPLATE"
+    local end_tag="END MKDOCS TEMPLATE"
+    local prefix=""
+    local suffix=""
+    local content=""
+    local bak_dir
+
+    bak_file=${bak_file}.$(date "+%Y-%m-%d-%H-%M")
+    bak_dir=$(dirname "${bak_file}")
+
+    if [[ "${relative_file_to}" =~ ^mkdocs.*yml$ ]]
+    then
+      upgrade_mkdocs_config_file "${file_from}" "${file_to}"
+    elif ! [[ -f "${file_to}" ]]
+    then
+      mkdocs_log "INFO" "Installing file **${relative_file_to}**."
+      cp "${file_from}" "${file_to}"
+    else
+      case "${file_to}" in
+        *.md|*.html|*LICENSE)
+            prefix="<!--"
+            suffix="-->"
+          ;;
+        *.css|*.js)
+            prefix="/*"
+            suffix="*/"
+          ;;
+        *.yaml|*.yml|*.gitignore|*.toml|*.in|*.txt)
+            prefix="###"
+            suffix="###"
+          ;;
+      esac
+      begin="${prefix} ${begin_tag} ${suffix}"
+      end="${prefix} ${end_tag} ${suffix}"
+      warning="${prefix} WARNING, DO NOT UPDATE CONTENT BETWEEN MKDOCS TEMPLATE TAG !${suffix}\n"
+      warning+="${prefix} Modified content will be overwritten when updating.${suffix}\n"
+
+      for i_file in "${tmp_file_from}" "${tmp_file_to}"
+      do
+        if ! [[ -d $(dirname "${i_file}") ]]
+        then
+          mkdir -p "$(dirname "${i_file}")"
+        fi
+      done
+
+      if [[ -n "${prefix}" ]]
+      then
+        if ! grep "${begin}" "${file_from}" &>/dev/null
+        then
+          content="${begin}\n"
+          content+="${warning}\n"
+          content+="$(cat "${file_from}")"
+          content+="\n\n${end}"
+          echo -e "${content}" > "${tmp_file_from}"
+        else
+          sed -n -e "/${begin_tag}/,/${end_tag}/"p "${file_from}" > "${tmp_file_from}"
+        fi
+        sed -n -e "/${begin_tag}/,/${end_tag}/"p "${file_to}" > "${tmp_file_to}"
+
+        if [[ "$(sha1sum "${tmp_file_from}" | cut -d " " -f 1 )" \
+           != "$(sha1sum "${tmp_file_to}"   | cut -d " " -f 1 )" ]]
+        then
+          mkdocs_log "INFO" "Backup file **${relative_file_to}** to **${bak_file##*${MKDOCS_ROOT}\/}.**"
+          if ! [[ -d "${bak_dir}" ]]
+          then
+            mkdir -p "${bak_dir}"
+          fi
+          cp "${file_to}" "${bak_file}"
+
+          grep -B 1000000 "${begin}" "${file_to}" | sed -e "s/${begin}//g" > "${tmp_file_to}"
+          cat "${tmp_file_from}" >> "${tmp_file_to}"
+          grep -A 1000000 "${end}" "${file_to}" | sed -e "s/${end}//g" >> "${tmp_file_to}"
+          cat "${tmp_file_to}" > "${file_to}"
+        fi
+      elif [[ "$(sha1sum "${file_from}" | cut -d " " -f 1 )" \
+           != "$(sha1sum "${file_to}"   | cut -d " " -f 1 )" ]]
+      then
+        mkdocs_log "INFO" "Backup file **${relative_file_to}** to **${bak_file##*${MKDOCS_ROOT}\/}.**"
+        if ! [[ -d "${bak_dir}" ]]
+        then
+          mkdir -p "${bak_dir}"
+        fi
+        cp "${file_to}" "${bak_file}"
+        mkdocs_log "INFO" "Upgrading file **${relative_file_to}**."
+        cp "${file_from}" "${file_to}"
+      fi
+    fi
+  }
+
+  setup_file()
+  {
+    # """Install latest version of script and files from mkdocs_template.
+    #
+    # Simply install file provided as argument from the mkdocs_template
+    # temporary repo to the right place in the folder currently setup to use
+    # mkdocs documentation.
+    #
+    # Globals:
+    #   MKDOCS_ROOT
+    #
+    # Arguments:
+    #   $1 : string, absolute path to the latest file version to be installed
+    #   $2 : string, absolute path to the location of the installation
+    #
+    # Output:
+    #   Log messages
+    #
+    # Returns:
+    #   None
+    #
+    # """
+
+    local file_from="$1"
+    local file_to="$2"
+    local relative_file_to="${file_to##*${MKDOCS_ROOT}\/}"
+    local begin=""
+    local end=""
+    local warning=""
+    local prefix=""
+    local suffix=""
+
+    if [[ "${relative_file_to}" =~ ^mkdocs.*yml$ ]]
+    then
+      setup_mkdocs_config_file "${file_from}" "${file_to}"
+    else
+      case "${file_to}" in
+        *.md|*.html|*LICENSE)
+            prefix="<!--"
+            suffix="-->"
+          ;;
+        *.css|*.js)
+            prefix="/*"
+            suffix="*/"
+          ;;
+        *.yaml|*.yml|*.gitignore|*.toml|*.in|*.txt)
+            prefix="###"
+            suffix="###"
+          ;;
+      esac
+      begin="${prefix} BEGIN MKDOCS TEMPLATE ${suffix}"
+      end="${prefix} END MKDOCS TEMPLATE ${suffix}"
+      warning="${prefix} WARNING, DO NOT UPDATE CONTENT BETWEEN MKDOCS TEMPLATE TAG !${suffix}\n"
+      warning+="${prefix} Modified content will be overwritten when updating.${suffix}\n"
+      if [[ -n "${prefix}" ]] && ! grep "${begin}" "${file_from}" &>/dev/null
+      then
+        content="${begin}\n"
+        content+="${warning}\n"
+        content+="$(cat "${file_from}")"
+        content+="\n\n${end}"
+        echo -e "${content}" > "${file_to}"
+      else
+        cp "${file_from}" "${file_to}"
+      fi
+    fi
+  }
+
+
+  build_file_list()
+  {
+    # """Recursively build a list of file from provided folder
+    #
+    # Recursively build a list of file from provided folder and store such list
+    # in a temporary bash array that must be set in parent method.
+    #
+    # Globals:
+    #   None
+    #
+    # Arguments:
+    #   $1 : string, absolute path to the folder which will be parsed
+    #
+    # Output:
+    #   None
+    #
+    # Returns:
+    #   None
+    #
+    # """
+
+    local folder=$1
+    for i_node in "$folder"/* "$folder"/.*
+    do
+      if ! [[ "${i_node}" =~ ^${folder}\/[\.]+$ ]] \
+        && ! [[ "${i_node}" =~ __pycache__ ]]
+      then
+        if [[ -f "${i_node}" ]]
+        then
+          tmp_nodes+=("${i_node}")
+        elif [[ -d "${i_node}" ]]
+        then
+          build_file_list "${i_node}"
+        fi
+      fi
+    done
+  }
+
+
+  build_final_file_list()
+  {
+    # """Build the merged list from `templates` and `user_config` folder.
+    #
+    # If there is the same file in `user_config` and `templates` folder, then
+    # replace the file to be installed from `templates` by the one in
+    # `user_config`. Finally, add remaining `user_config` files not in
+    # `templates` to the list of files to install or upgrade in a bash array set
+    # in parent method.
+    #
+    # Globals:
+    #   MKDOCS_ROOT
+    #
+    # Arguments:
+    #   None
+    #
+    # Output:
+    #   None
+    #
+    # Returns:
+    #   None
+    #
+    # """
+
+    for i_template_node in "${template_nodes[@]##*templates\/}"
+    do
+      found="false"
+      for i_user_node in "${user_nodes[@]##*user_config\/}"
+      do
+        if [[ ${i_template_node} =~ ^${i_user_node}$ ]]
+        then
+          found="true"
+        fi
+      done
+      if [[ "${found}" == "false" ]]
+      then
+        tmp_nodes+=("templates/${i_template_node}")
+      fi
+    done
+    for i_user_node in "${user_nodes[@]##*user_config\/}"
+    do
+      tmp_nodes+=("user_config/${i_user_node}")
+    done
+    tmp_nodes=("${tmp_nodes[@]##*${MKDOCS_ROOT}\/}")
+  }
+
+
+  setup_mkdocs()
+  {
+    # """Recursively install base folder and script to write mkdocs documentation.
+    #
+    # Build the list of files and folders, recursively copy all files to
+    # their right location from the temporary cloned repo to the folder which
+    # will host the mkdocs documentation.
+    #
+    # Globals:
+    #   MKDOCS_ROOT
+    #   MKDOCS_CLONE_ROOT
+    #
+    # Arguments:
+    #   None
+    #
+    # Output:
+    #   Log message
+    #
+    # Returns:
+    #   None
+    #
+    # """
+
+    local tmp_nodes=()
+    local template_nodes=()
+    local user_nodes=()
+    local file_from
+    local i_node
+    local file_from
+    local file_to
+    local curr_dirname
+    local last_dirname
+
+    build_file_list "${MKDOCS_CLONE_ROOT}/templates"
+    template_nodes=("${tmp_nodes[@]}")
+    tmp_nodes=()
+    build_file_list "${MKDOCS_CLONE_ROOT}/user_config"
+    user_nodes=("${tmp_nodes[@]}")
+    tmp_nodes=()
+
+    build_final_file_list
+
+    for i_node in "${tmp_nodes[@]}"
+    do
+      file_from="${MKDOCS_CLONE_ROOT}/${i_node}"
+      file_to="${MKDOCS_ROOT}/${i_node//user_config\/}"
+      file_to="${file_to//templates\/}"
+      curr_dirname="$(dirname "${file_to}")"
+      if ! [[ -d "${curr_dirname}" ]]
+      then
+        mkdocs_log "INFO" "Create dir **${curr_dirname##*${MKDOCS_ROOT}\/}**."
+        mkdir -p "${curr_dirname}"
+      fi
+      if [[ "${curr_dirname}" != "${last_dirname}" ]]
+      then
+        last_dirname=${curr_dirname}
+        if [[ "${UPGRADE}" == "true" ]]
+        then
+          mkdocs_log "INFO" "Check file to upgrade in **./${last_dirname##*${MKDOCS_ROOT}\/}**."
+        else
+          mkdocs_log "INFO" "Installing files in **./${last_dirname##*${MKDOCS_ROOT}\/}**."
+        fi
+      fi
+      if ! [[ "${file_to}" =~ \.gitkeep$ ]] \
+        && [[ "${file_to}" != "${MKDOCS_ROOT}/README.md" ]] \
+        && [[ "${file_to}" != "${MKDOCS_ROOT}/post_setup.sh" ]]
+      then
+        if [[ "${UPGRADE}" == "true" ]]
+        then
+          upgrade_file "${file_from}" "${file_to}"
+        else
+          setup_file "${file_from}" "${file_to}"
+        fi
+      elif [[ "${file_to}" == "README.md" ]] \
+           && ! [[ "${tmp_nodes[*]}" =~ user_config\/post_setup\.sh ]]
+      then
+        # If user has a `README.md` in user_config but not `post_setup.sh` file
+        if [[ "${UPGRADE}" == "true" ]]
+        then
+          upgrade_file "${file_from}" "${file_to}"
+        else
+          setup_file "${file_from}" "${file_to}"
+        fi
+      elif [[ "${file_to}" == "${MKDOCS_ROOT}/post_setup.sh" ]]
+      then
+        USER_POST_SETUP="true"
+        USER_POST_SETUP_FILE_PATH="${file_from}"
+      fi
+    done
+    if [[ "${USER_POST_SETUP}" == "true" ]]
+    then
+      # If user provide a post setup script, source it and execute
+      # main_post_setup
+      mkdocs_log "INFO" "Sourcing user post_setup.sh"
+      # - SC1090: Can't follow non-constant source. Use a directive to specify location.
+      # shellcheck disable=SC1090
+      source "${USER_POST_SETUP_FILE_PATH}"
+      mkdocs_log "INFO" "Executing main_post_setup"
+      main_post_setup
+    fi
+  }
+
+  # Set color prefix
+  local e_normal="\e[0m"      # normal (white fg & transparent bg)
+  local e_bold="\e[1m"        # bold
+  local e_warning="\e[0;33m"  # yellow fg
+  local e_error="\e[0;31m"    # red fg
+  local e_info="\e[0;32m"     # green fg
+
+  # Ensure git is installed
+  check_git || return 1
+
+  # Parse arguments
+  while [[ $# -gt 0 ]]
+  do
+    case "$1" in
+      --upgrade|-u)
+        UPGRADE="true"
+        shift
+        ;;
+      --subrepo|-s)
+        SUBREPO="true"
+        shift
+        ;;
+      --repo-url|-r)
+        shift
+        REPO_URL="$1"
+        shift
+        ;;
+      --help|-h)
+        manpage
+        ;;
+    esac
+  done
+
+  if [[ -f "${MKDOCS_ROOT}/mkdocs.yml" ]]
+  then
+    # Check if user specify want to upgrade
+    check_upgrade || return 1
+  else
+    # Clone last version of mkdocs_template to .tmp folder
+    if ! clone_mkdocs_template_repo
+    then
+      mkdocs_log "WARNING" "An error occurs when trying to get the last version of mkdocs_tempalte."
+      return 1
+    fi
+    setup_mkdocs
+  fi
+
+  mkdocs_log "INFO" "Removing temporary cloned files"
+  rm -rf "${MKDOCS_TMP}"
+}
+
+main "${@}"
+
+# ------------------------------------------------------------------------------
+# VIM MODELINE
+# vim: ft=bash: foldmethod=indent
+# ------------------------------------------------------------------------------
\ No newline at end of file