|
| 1 | +#!/bin/bash |
| 2 | +set -e |
| 3 | + |
| 4 | +# --- CONFIGURATION --- |
| 5 | +REPO_SLUG=$1 |
| 6 | +if [[ -z "$REPO_SLUG" ]]; then |
| 7 | + printf "Error: Repository slug not provided. Exiting.\n" >&2; exit 1 |
| 8 | +fi |
| 9 | +BASE_URL="https://github.com/$REPO_SLUG" |
| 10 | +BASE_URL_RAW="https://raw.githubusercontent.com/$REPO_SLUG/main" |
| 11 | + |
| 12 | +SRC_DIR='userscripts/src' |
| 13 | +META_DIR='userscripts/meta' |
| 14 | +DIST_DIR='userscripts/dist' |
| 15 | +DOCS_DIR='userscripts/docs' |
| 16 | +SCREENSHOTS_DIR='userscripts/docs/screenshots' |
| 17 | + |
| 18 | +# --- SETUP --- |
| 19 | +printf "Initializing build environment...\n" |
| 20 | +npm install --save-dev esbuild cloc > /dev/null |
| 21 | + |
| 22 | +printf "Removing old build artifacts...\n" |
| 23 | +mkdir -p "$META_DIR" "$DIST_DIR" "$DOCS_DIR" "$SCREENSHOTS_DIR" |
| 24 | +find "$META_DIR" "$DIST_DIR" "$DOCS_DIR" -maxdepth 1 -type f -delete |
| 25 | + |
| 26 | +# --- README PREPARATION --- |
| 27 | +printf "Preparing README.md for update...\n" |
| 28 | +BEFORE_TABLE_FILE=$(mktemp) |
| 29 | +AFTER_TABLE_FILE=$(mktemp) |
| 30 | +TABLE_CONTENT_FILE=$(mktemp) |
| 31 | + |
| 32 | +start_line=$(grep -n -m 1 '## Userscripts' README.md | cut -d: -f1) |
| 33 | +head -n "$start_line" README.md > "$BEFORE_TABLE_FILE" |
| 34 | + |
| 35 | +end_line=$(tail -n +$((start_line + 1)) README.md | grep -n -m 1 -v '^|' | cut -d: -f1) |
| 36 | +if [[ -n "$end_line" ]]; then |
| 37 | + tail -n +$((start_line + end_line)) README.md > "$AFTER_TABLE_FILE" |
| 38 | +fi |
| 39 | + |
| 40 | +printf "| *NAME* | *VERSION* | *LOC* | *INSTALL* |\n" > "$TABLE_CONTENT_FILE" |
| 41 | +printf "|:---|:---|:---|:---|\n" >> "$TABLE_CONTENT_FILE" |
| 42 | + |
| 43 | +# --- MAIN PROCESSING LOOP --- |
| 44 | +printf "Starting to process userscripts in '%s'...\n" "$SRC_DIR" |
| 45 | +loc_count_total=0 |
| 46 | +for file in "$SRC_DIR"/*.user.js; do |
| 47 | + id="$(basename "$file" .user.js)" |
| 48 | + printf ">> Processing ID: %s\n" "$id" |
| 49 | + |
| 50 | + # --- 1. PARSE SOURCE FILE --- |
| 51 | + clean_content="$(tr -d '\r' < "$file")" |
| 52 | + script_name="$(grep -m 1 '// @name' <<< "$clean_content" | sed -E 's|// @name\s+||')" |
| 53 | + script_desc="$(grep -m 1 '// @description' <<< "$clean_content" | sed -E 's|// @description\s+||')" |
| 54 | + script_version="$(grep -m 1 '// @version' <<< "$clean_content" | sed -E 's|// @version\s+||')" |
| 55 | + script_namespace="$(grep -m 1 '// @namespace' <<< "$clean_content" | sed -E 's|// @namespace\s+||')" |
| 56 | + header="$(sed -n '\|^// ==UserScript==$|,\|^// ==/UserScript==$|p' <<< "$clean_content")" |
| 57 | + readme_comment="$(sed -n '\|^/\* README$|,\|^\*/$|p' <<< "$clean_content")" |
| 58 | + body="$(sed '\|^// ==UserScript==$|,\|^// ==/UserScript==$|d; \|^/\* README$|,\|^\*/$|d' <<< "$clean_content" | sed -n '\|[^\s]|,$p')" |
| 59 | + |
| 60 | + # --- 2. CHECK FOR ID MISMATCH --- |
| 61 | + if [ "$id" != "${script_namespace##*/}" ]; then |
| 62 | + printf "Error: Userscript ID from filename does not match ID from namespace. Exiting.\n" >&2; exit 1 |
| 63 | + fi |
| 64 | + |
| 65 | + # --- 3. GENERATE DIST AND META VERSIONS --- |
| 66 | + header="$(sed \ |
| 67 | + ${readme_comment:+-e '\|// @description| s|$| See README for details.|'} \ |
| 68 | + -e '\|// @namespace|d' \ |
| 69 | + -e '\|// @author|d' \ |
| 70 | + -e '\|// @homepageURL|d' \ |
| 71 | + -e '\|// @supportURL|d' \ |
| 72 | + -e '\|// @updateURL|d' \ |
| 73 | + -e '\|// @downloadURL|d' \ |
| 74 | + -e '\|// @version|a\ |
| 75 | +// @namespace '"${BASE_URL%/*}"'\ |
| 76 | +// @author '"${REPO_SLUG%/*}"'\ |
| 77 | +// @homepageURL '"$BASE_URL"'#readme\ |
| 78 | +// @supportURL '"$BASE_URL"'/issues\ |
| 79 | +// @updateURL '"$BASE_URL_RAW/$META_DIR/$id.meta.js" <<< "$header")" |
| 80 | + |
| 81 | + middle_content="${readme_comment:+$'\n\n'"$readme_comment"}"$'\n\n\n' |
| 82 | + |
| 83 | + printf "%s" "$header" > "$META_DIR/$id.meta.js" |
| 84 | + |
| 85 | + DOWNLOAD_URL_DIST="$BASE_URL_RAW/$DIST_DIR/$id.user.js" |
| 86 | + header_dist="$(sed "\|// @updateURL|a\// @downloadURL ${DOWNLOAD_URL_DIST}" <<< "$header")" |
| 87 | + printf "%s%s%s" "${header_dist}" "${middle_content}" "${body}" > "$DIST_DIR/$id.user.js" |
| 88 | + |
| 89 | + minified_body="$(npx esbuild --minify --loader=js <<< "$body")" |
| 90 | + DOWNLOAD_URL_DIST_MIN="$BASE_URL_RAW/$DIST_DIR/$id.min.user.js" |
| 91 | + header_dist_min="$(sed "\|// @updateURL|a\// @downloadURL ${DOWNLOAD_URL_DIST_MIN}" <<< "$header")" |
| 92 | + printf "%s%s%s" "${header_dist_min}" "${middle_content}" "${minified_body}" > "$DIST_DIR/$id.min.user.js" |
| 93 | + |
| 94 | + # --- 4. GENERATE DOCUMENTATION FILE --- |
| 95 | + doc_file="$DOCS_DIR/$id.md" |
| 96 | + printf "# %s\n%s\n\n" "$script_name" "$script_desc" > "$doc_file" |
| 97 | + |
| 98 | + loc_count=$(npx cloc --quiet --sum-one --stdin-name="$id.user.js" - <<< "$body" | grep -m 1 'SUM:' | awk '{print $5}') |
| 99 | + ((loc_count_total += loc_count)) |
| 100 | + |
| 101 | + install_badge="[]($DOWNLOAD_URL_DIST)" |
| 102 | + install_min_badge="[]($DOWNLOAD_URL_DIST_MIN)" |
| 103 | + version_badge="[](../../../../commits/main/$DIST_DIR/$id.user.js)" |
| 104 | + loc_count_badge="[](../../$DIST_DIR/$id.user.js)" |
| 105 | + printf "%s %s %s %s\n\n" "$install_badge" "$install_min_badge" "$version_badge" "$loc_count_badge" >> "$doc_file" |
| 106 | + |
| 107 | + if [[ -n "$readme_comment" ]]; then |
| 108 | + printf "## Info\n" >> "$doc_file" |
| 109 | + printf "%s" "$readme_comment" | sed '1d; $d; $s|$|\n\n|' >> "$doc_file" |
| 110 | + fi |
| 111 | + |
| 112 | + if [ -n "$(find "$SCREENSHOTS_DIR" -type f -iname "$id-*.*" 2>/dev/null)" ]; then |
| 113 | + printf "## Screenshots\n" >> "$doc_file" |
| 114 | + while IFS= read -r screenshot_path; do |
| 115 | + screenshot_filename="$(basename "$screenshot_path")" |
| 116 | + printf "\n" "$screenshot_filename" >> "$doc_file" |
| 117 | + done < <(find "$SCREENSHOTS_DIR" -type f -iname "$id-*.*" | sort) |
| 118 | + fi |
| 119 | + |
| 120 | + # --- 5. ADD ROW TO README TABLE --- |
| 121 | + escaped_script_name="$(sed 's#|#\\|#g' <<< "$script_name")" |
| 122 | + install_links="[Standard]($DOWNLOAD_URL_DIST) / [Minified]($DOWNLOAD_URL_DIST_MIN)" |
| 123 | + printf "| [%s](%s) | \`%s\` | \`%s\` | %s |\n" "$escaped_script_name" "$DOCS_DIR/$id.md" "$script_version" "$loc_count" "$install_links" >> "$TABLE_CONTENT_FILE" |
| 124 | +done |
| 125 | + |
| 126 | +# --- FINALIZE README --- |
| 127 | +printf "Finalizing README.md...\n" |
| 128 | +userscript_count=$(find "$SRC_DIR" -name "*.user.js" | wc -l) |
| 129 | +( |
| 130 | + cat "$BEFORE_TABLE_FILE" | sed -E "s|(/badge/loc-)[0-9]+|\1$loc_count_total|; s|(/badge/userscripts-)[0-9]+|\1$userscript_count|" |
| 131 | + head -n2 "$TABLE_CONTENT_FILE" |
| 132 | + tail -n +3 "$TABLE_CONTENT_FILE" | sort |
| 133 | + cat "$AFTER_TABLE_FILE" |
| 134 | +) > README.md |
| 135 | + |
| 136 | +# --- CLEANUP --- |
| 137 | +printf "Cleaning up temporary files...\n" |
| 138 | +rm -f "$BEFORE_TABLE_FILE" "$AFTER_TABLE_FILE" "$TABLE_CONTENT_FILE" |
| 139 | + |
| 140 | +printf "Build process completed successfully!\n" |
0 commit comments