diff --git a/.github/workflows/draw-keymaps.yml b/.github/workflows/draw-keymaps.yml index aa03e4c..7c74b3d 100644 --- a/.github/workflows/draw-keymaps.yml +++ b/.github/workflows/draw-keymaps.yml @@ -4,12 +4,8 @@ on: push: # automatically run on changes to following paths paths: - "**.lock" + - "drawer/**" - "config/**" -env: - km_dr_version: main - km_dr_config: config/keymap_drawer.yaml - keymap_path: config/*.keymap - output_folder: img jobs: draw: @@ -21,75 +17,24 @@ jobs: steps: - name: Checkout - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: - fetch-depth: 1 # Set to 2 if amending, or 1 if creating a new commit + # Set to 2 if amending, or 1 if creating a new commit + fetch-depth: 1 submodules: recursive - - name: Install python dependencies - run: | - pip install "git+https://github.com/caksoylar/keymap-drawer.git@${{ env.km_dr_version }}" - pip install pyyaml + - name: Install nix + uses: cachix/install-nix-action@v25 + - name: Setup nix cache + uses: DeterminateSystems/magic-nix-cache-action@main - # TODO get keyboads & configs dynamically - - name: Parse keymap - run: | - # TODO set generic vars in one place globally - CONFIG="${{ env.km_dr_config }}" - - for KEYMAP in ${{ env.keymap_path }}; do - KEYBOARD=$(basename -s .keymap "$KEYMAP") - OUTPUT="${{ env.output_folder }}/${KEYBOARD}.yaml" - - # TODO consider running through `parallel`? - echo "Parsing keymap for $KEYBOARD" - keymap -c "$CONFIG" parse -z "$KEYMAP" > "$OUTPUT" - done - - - name: Draw keymap for all layers - run: | - CONFIG="${{ env.km_dr_config }}" - - # FIXME can glob false positeves, e.g. previous keymaps - for KEYMAP in ${{ env.output_folder }}/*.yaml; do - KEYBOARD=$(basename -s .yaml "$KEYMAP") - OUTPUT="${{ env.output_folder }}/${KEYBOARD}.svg" - - echo "Drawing all layers for $KEYBOARD" - keymap -c "$CONFIG" draw "$KEYMAP" > "$OUTPUT" - done - - - - name: Draw seperate layer keymaps - run: | - # Ensure errors propagate when piping stdout - set -o pipefail - - export CONFIG="${{ env.km_dr_config }}" - - # Function to draw the given layer's keymap - draw() { - KEYMAP="$1" - LAYER="$2" - KEYBOARD=$(basename -s .yaml "$KEYMAP") - OUTPUT="${{ env.output_folder }}/${KEYBOARD}_${LAYER}.svg" - - echo "Drawing $LAYER layer for $KEYBOARD" - keymap -c "$CONFIG" draw "$KEYMAP" -s "$LAYER" > "$OUTPUT" - } - export -f draw # Ensure the draw function can be called by `parallel`'s subprocess - - # FIXME can glob false positeves, e.g. previous keymaps - for KEYMAP in ${{ env.output_folder }}/*.yaml; do - # Run `draw()` for each layer in the keymap. Up to 4 layers at a time... - echo "Drawing layers in parallel" - python3 .github/workflows/layers.py "$KEYMAP" \ - | parallel --jobs 4 draw "$KEYMAP" - done + - name: Draw keymaps + run: nix run . -- draw + # TODO print to $GITHUB_STEP_SUMMARY - name: Commit changes uses: stefanzweifel/git-auto-commit-action@v4 with: commit_message: "[Draw] ${{ github.event.head_commit.message || '(Manually triggered)' }}" - file_pattern: ${{ env.output_folder }}/*.svg ${{ env.output_folder }}/*.yaml + file_pattern: img/** diff --git a/.github/workflows/layers.py b/.github/workflows/layers.py deleted file mode 100644 index 8efc8fc..0000000 --- a/.github/workflows/layers.py +++ /dev/null @@ -1,16 +0,0 @@ -from sys import argv -import yaml - -if len(argv) < 2: - print(f'Usage: python {argv[0]} FILINAME') - exit(1) - -FILINAME = argv[1] - -with open(FILINAME, 'r') as file: - doc = yaml.safe_load(file) - if not 'layers' in doc: - print('Invalid file') - exit(2) - for layer in doc['layers'].keys(): - print(layer) diff --git a/drawer/default.nix b/drawer/default.nix index d0889ec..c65b70a 100644 --- a/drawer/default.nix +++ b/drawer/default.nix @@ -5,11 +5,15 @@ }: let in { perSystem = { + config, pkgs, system, ... }: let inherit (inputs.poetry2nix.lib.mkPoetry2Nix {inherit pkgs;}) mkPoetryApplication; + + exe = lib.getExe config.packages.keymap-drawer; + yq = lib.getExe pkgs.yq-go; in { packages = { keymap-drawer = mkPoetryApplication { @@ -21,4 +25,42 @@ in { }; }; }; + + devshells.default.commands = [ + { + name = "draw"; + command = /*bash*/ '' + set +e + + out="$PRJ_ROOT"/img + keymap_dir="$PRJ_ROOT"/config + cmd="${exe} --config $keymap_dir/keymap_drawer.yaml" + + echo "Removing previous images" + rm "$out"/* + + for file in "$keymap_dir"/*.keymap + do + name="$(basename --suffix=".keymap" "$file")" + config="$out/$name.yaml" + echo "Found $name keymap" + + echo "- Parsing keymap-drawer" + $cmd parse --zmk-keymap "$file" > "$config" + + echo "- Drawing all layers" + $cmd draw "$config" > "$out"/"$name".svg + + layers=$(${yq} '.layers | keys | .[]' "$config") + for layer in $layers + do + echo "- Drawing $layer layer" + $cmd draw "$config" --select-layers "$layer" > "$out"/"$name"_"$layer".svg + done + done + ''; + help = "Draw SVG images of the keymap"; + } + ]; + }; }