Created
November 4, 2025 05:04
-
-
Save lopesivan/b8aa0bf492eac33c61c1c8ce545b9b06 to your computer and use it in GitHub Desktop.
mkprojectionist
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #!/usr/bin/env bash | |
| set -euo pipefail | |
| FILE=".projections.json" | |
| need() { | |
| if ! command -v "$1" >/dev/null 2>&1; then | |
| echo "Falta o comando '$1'. Instale-o e tente novamente." | |
| exit 1 | |
| fi | |
| } | |
| need dialog | |
| need jq | |
| # Perguntas | |
| EXT=$(dialog --stdout --inputbox "Extensão (sem ponto):" 8 50 "awk") || exit 1 | |
| EXT=${EXT##.} # remove ponto se o usuário digitar com ponto | |
| SUG="model${EXT}" | |
| SKELETON=$(dialog --stdout --inputbox "Skeleton (ex.: ${SUG}):" 8 50 "$SUG") || exit 1 | |
| TYPE=$(dialog --stdout --inputbox "Type (padrão: ${EXT}):" 8 50 "${EXT}") || exit 1 | |
| KEY="*.$EXT" | |
| # Base mínima correta do arquivo, respeitando seu escopo | |
| BASE_JSON='{ | |
| "./.projections.json": { "type": "dit" }, | |
| "README.md": { "type": "doc" } | |
| }' | |
| # Se já existe, valida; se não, cria com base | |
| if [[ -f "$FILE" ]]; then | |
| if ! jq empty "$FILE" >/dev/null 2>&1; then | |
| dialog --msgbox "Arquivo existente inválido. Vou recriá-lo com base mínima." 8 60 | |
| printf '%s\n' "$BASE_JSON" | jq '.' >"$FILE" | |
| fi | |
| else | |
| printf '%s\n' "$BASE_JSON" | jq '.' >"$FILE" | |
| fi | |
| # Atualiza/insere a entrada "*.ext" | |
| TMP="$(mktemp)" | |
| jq --arg k "$KEY" \ | |
| --arg t "$TYPE" \ | |
| --arg s "$SKELETON" \ | |
| '.[$k] = { "type": $t, "skeleton": $s }' \ | |
| "$FILE" >"$TMP" | |
| # Ordena chaves opcionalmente para manter legibilidade (preserva conteúdo) | |
| jq 'to_entries | |
| | sort_by(.key) | |
| | from_entries' "$TMP" >"$FILE" | |
| rm -f "$TMP" | |
| dialog --msgbox "Entrada adicionada/atualizada:\n\n\"$KEY\": {\"type\": \"$TYPE\", \"skeleton\": \"$SKELETON\"}\n\nArquivo: $FILE" 12 70 | |
| clear | |
| # Mostra uma prévia no terminal | |
| echo "=== $FILE ===" | |
| jq '.' "$FILE" | |
| echo Snippets: | |
| echo ~/.config/nvim-ide/neovim-pde/UltiSnips/$TYPE.snippets | |
| echo | |
| echo | |
| echo snippet _${SKELETON} \"skeleton\" b | |
| echo code here ... | |
| echo endsnippet |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment