Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Select an option

  • Save krzemienski/35bd83b2f5b9881623f831f34bd18c84 to your computer and use it in GitHub Desktop.

Select an option

Save krzemienski/35bd83b2f5b9881623f831f34bd18c84 to your computer and use it in GitHub Desktop.

Revisions

  1. krzemienski created this gist May 23, 2024.
    181 changes: 181 additions & 0 deletions awesome-list-static-site-multi-frameworks.sh
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,181 @@
    #!/bin/bash

    # Function to check if a port is available
    check_port() {
    local port=$1
    if ! lsof -i:$port > /dev/null; then
    echo $port
    else
    while lsof -i:$port > /dev/null; do
    port=$((port+1))
    done
    echo $port
    fi
    }

    # Ensure required tools are installed
    install_dependencies() {
    echo "Installing necessary dependencies..."

    # Install pip if not installed
    if ! command -v pip &> /dev/null; then
    echo "pip not found. Installing pip..."
    curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
    python get-pip.py
    rm get-pip.py
    fi

    # Install mkdocs
    if ! command -v mkdocs &> /dev/null; then
    echo "mkdocs not found. Installing mkdocs..."
    pip install mkdocs
    fi

    # Install hugo
    if ! command -v hugo &> /dev/null; then
    echo "hugo not found. Installing hugo..."
    if [[ "$OSTYPE" == "darwin"* ]]; then
    brew install hugo
    else
    sudo snap install hugo
    fi
    fi

    # Install yarn if not installed
    if ! command -v yarn &> /dev/null; then
    echo "yarn not found. Installing yarn..."
    if [[ "$OSTYPE" == "darwin"* ]]; then
    brew install yarn
    else
    npm install -g yarn
    fi
    fi

    # Install docsify-cli
    if ! command -v docsify &> /dev/null; then
    echo "docsify not found. Installing docsify..."
    npm install -g docsify-cli
    fi

    echo "All dependencies are installed."
    }

    # Parse the title from README.md
    parse_title() {
    TITLE=$(grep -m 1 '^# ' $README_FILE | sed 's/^# //')
    echo "Parsed title: $TITLE"
    }

    # Function to set up MkDocs
    setup_mkdocs() {
    local dir="$1/mkdocs-site"
    local port=$2
    mkdir -p $dir
    cd $dir
    mkdocs new .
    mv $README_FILE docs/index.md
    sed -i "s/site_name:.*/site_name: $TITLE/" mkdocs.yml
    mkdocs build
    mkdocs serve -a 127.0.0.1:$port &
    cd - > /dev/null
    }

    # Function to set up Hugo
    setup_hugo() {
    local dir="$1/hugo-site"
    local port=$2
    mkdir -p $dir
    cd $dir
    hugo new site .
    git submodule add https://github.com/theNewDynamic/gohugo-theme-ananke.git themes/ananke
    echo 'theme = "ananke"' >> config.toml
    echo "title = \"$TITLE\"" >> config.toml
    cp $README_FILE content/_index.md
    hugo
    hugo server -D -p $port &
    cd - > /dev/null
    }

    # Function to set up VuePress
    setup_vuepress() {
    local dir="$1/vuepress-site"
    local port=$2
    mkdir -p $dir/docs
    cd $dir
    yarn add -D vuepress
    echo "module.exports = { title: \"$TITLE\", description: \"An Awesome List\" }" > docs/.vuepress/config.js
    cp $README_FILE docs/README.md
    npx vuepress build docs
    npx vuepress dev docs --port $port &
    cd - > /dev/null
    }

    # Function to set up Docsify
    setup_docsify() {
    local dir="$1/docsify-site"
    local port=$2
    mkdir -p $dir
    cd $dir
    echo "<!DOCTYPE html>
    <html>
    <head>
    <meta charset=\"UTF-8\">
    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">
    <title>$TITLE</title>
    <link rel=\"stylesheet\" href=\"//cdn.jsdelivr.net/npm/docsify/lib/themes/vue.css\">
    </head>
    <body>
    <div id=\"app\"></div>
    <script>
    window.\$docsify = {
    name: \"$TITLE\",
    repo: \"\",
    loadSidebar: true,
    subMaxLevel: 2,
    }
    </script>
    <script src=\"//cdn.jsdelivr.net/npm/docsify/lib/docsify.min.js\"></script>
    </body>
    </html>" > index.html
    cp $README_FILE .
    docsify serve --port $port &
    cd - > /dev/null
    }

    # Check if the correct number of arguments is provided
    if [ "$#" -ne 2 ]; then
    echo "Usage: $0 README_FILE OUTPUT_DIRECTORY"
    exit 1
    fi

    # Assign arguments to variables
    README_FILE=$1
    OUTPUT_DIR=$2

    # Parse the title from the README file
    parse_title

    # Create the main directory
    mkdir -p $OUTPUT_DIR

    # Install dependencies
    install_dependencies

    # Find available ports
    MKDOCS_PORT=$(check_port 8001)
    HUGO_PORT=$(check_port 8002)
    VUEPRESS_PORT=$(check_port 8003)
    DOCSIFY_PORT=$(check_port 8004)

    # Set up each framework
    setup_mkdocs $OUTPUT_DIR $MKDOCS_PORT
    setup_hugo $OUTPUT_DIR $HUGO_PORT
    setup_vuepress $OUTPUT_DIR $VUEPRESS_PORT
    setup_docsify $OUTPUT_DIR $DOCSIFY_PORT

    echo "Setup completed. You can now preview each framework by navigating to the respective URLs."

    echo "MkDocs: http://127.0.0.1:$MKDOCS_PORT"
    echo "Hugo: http://127.0.0.1:$HUGO_PORT"
    echo "VuePress: http://127.0.0.1:$VUEPRESS_PORT"
    echo "Docsify: http://127.0.0.1:$DOCSIFY_PORT"