diff --git a/.husky/pre-commit b/.husky/pre-commit index 0cd5fd7..553f74e 100644 --- a/.husky/pre-commit +++ b/.husky/pre-commit @@ -1,8 +1,17 @@ #!/bin/sh set -e -npx prettier --write "src/**/*.ts" "webviews/viewer/src/**/*.{ts,svelte}" "webviews/export/**/*.{js,css,html}" -git add -u +# Only format files staged for this commit, and re-stage only those files. +# A blanket `git add -u` would otherwise sweep unrelated tracked +# modifications into the commit. +staged_files=$(git diff --cached --name-only --diff-filter=ACMR | \ + grep -E '^(src/.*\.ts|webviews/viewer/src/.*\.(ts|svelte)|webviews/export/.*\.(js|css|html))$' || true) + +if [ -n "$staged_files" ]; then + echo "$staged_files" | tr '\n' '\0' | xargs -0 npx prettier --write + echo "$staged_files" | tr '\n' '\0' | xargs -0 git add +fi + npx eslint --max-warnings=0 src/ webviews/export/ npx svelte-check --tsconfig webviews/viewer/tsconfig.json --fail-on-warnings python3 -m ruff check python/lsp/ python/med2obj.py diff --git a/CHANGELOG.md b/CHANGELOG.md index c6662ce..add871c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,15 @@ All notable changes to the **VS Code Aster** extension will be documented in thi The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [1.5.4] - 2026-04-15 + +File icon improvements and language support for `.export` and MED files. + +### Added +- Dedicated file icons for `.export` files (blue rocket) and `.med` / `.mmed` / `.rmed` files (orange cube) +- Refreshed code_aster logo, now bundled with its SVG source +- `vs-code-aster.medFileExtensions` setting to register arbitrary extensions (e.g. `.21`, `.71`) as MED files, which code_aster writes under the I/O unit number + ## [1.5.3] - 2026-03-26 Comment toggle support and Windows debugging improvements. diff --git a/CITATION.cff b/CITATION.cff index e4e2a92..a3dffb4 100644 --- a/CITATION.cff +++ b/CITATION.cff @@ -1,4 +1,4 @@ -cff-version: 1.5.3 +cff-version: 1.5.4 title: VS Code Aster message: >- If you use this software, please cite it using the diff --git a/README.md b/README.md index 710c4b6..e072e84 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@

Simvia Logo

- Version + Version License

diff --git a/ROADMAP.md b/ROADMAP.md index 27711ee..949c6b7 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -4,7 +4,7 @@ The extension aims to reduce friction between modeling, validation, execution, and analysis by bringing **code_aster** native workflows into the editor. -## Current Capabilities (v1.5.3) +## Current Capabilities (v1.5.4) - `.export` file generator - 3D mesh viewer diff --git a/media/images/icone-code-aster.png b/media/images/icone-code-aster.png index a30eb7a..e676fde 100644 Binary files a/media/images/icone-code-aster.png and b/media/images/icone-code-aster.png differ diff --git a/media/images/icone-code-aster.svg b/media/images/icone-code-aster.svg new file mode 100755 index 0000000..baf0ec0 --- /dev/null +++ b/media/images/icone-code-aster.svg @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/media/images/icone-export-dark.svg b/media/images/icone-export-dark.svg new file mode 100644 index 0000000..a66c0e3 --- /dev/null +++ b/media/images/icone-export-dark.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/media/images/icone-export-light.svg b/media/images/icone-export-light.svg new file mode 100644 index 0000000..a66c0e3 --- /dev/null +++ b/media/images/icone-export-light.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/media/images/icone-med-dark.svg b/media/images/icone-med-dark.svg new file mode 100644 index 0000000..e113e74 --- /dev/null +++ b/media/images/icone-med-dark.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/media/images/icone-med-light.svg b/media/images/icone-med-light.svg new file mode 100644 index 0000000..e113e74 --- /dev/null +++ b/media/images/icone-med-light.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/package-lock.json b/package-lock.json index 8a8c731..f255755 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "vs-code-aster", - "version": "1.5.3", + "version": "1.5.4", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "vs-code-aster", - "version": "1.5.3", + "version": "1.5.4", "license": "GPL-3.0", "dependencies": { "@tailwindcss/cli": "^4.1.17", diff --git a/package.json b/package.json index 35f3e17..457bc47 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "vs-code-aster", "displayName": "VS Code Aster", - "version": "1.5.3", + "version": "1.5.4", "description": "VS Code extension for code_aster", "publisher": "simvia", "license": "GPL-3.0", @@ -78,10 +78,38 @@ ".com9" ], "icon": { - "light": "./media/images/icone-code-aster.png", - "dark": "./media/images/icone-code-aster.png" + "light": "./media/images/icone-code-aster.svg", + "dark": "./media/images/icone-code-aster.svg" }, "configuration": "./language-configuration.json" + }, + { + "id": "export", + "aliases": [ + "Aster Export" + ], + "extensions": [ + ".export" + ], + "icon": { + "light": "./media/images/icone-export-light.svg", + "dark": "./media/images/icone-export-dark.svg" + } + }, + { + "id": "med", + "aliases": [ + "MED" + ], + "extensions": [ + ".med", + ".mmed", + ".rmed" + ], + "icon": { + "light": "./media/images/icone-med-light.svg", + "dark": "./media/images/icone-med-dark.svg" + } } ], "grammars": [ @@ -143,6 +171,19 @@ ], "markdownDescription": "Specifies the file extensions to be recognized as Code Aster command files. Default includes `.comm`, `.com`, and `.com0`-`.com9`. You can customize this list as needed." }, + "vs-code-aster.medFileExtensions": { + "order": 0, + "type": "array", + "items": { + "type": "string" + }, + "default": [ + ".med", + ".mmed", + ".rmed" + ], + "markdownDescription": "Specifies the file extensions to be recognized as MED mesh/result files. code_aster may also write MED data under numeric extensions matching the I/O unit (e.g. `.21`, `.71`). Add such extensions here to apply the MED icon and language association. Extensions listed here are automatically written to `files.associations`." + }, "vs-code-aster.aliasForRun": { "order": 1, "type": "string", diff --git a/src/MedLanguageSync.ts b/src/MedLanguageSync.ts new file mode 100644 index 0000000..fc786d7 --- /dev/null +++ b/src/MedLanguageSync.ts @@ -0,0 +1,71 @@ +/** + * Keeps `files.associations` in sync with the `vs-code-aster.medFileExtensions` setting. + * + * VS Code's `contributes.languages[].extensions` is static (read once from package.json at + * load time). To let users dynamically map arbitrary extensions (e.g. `.71`, `.72`) to the + * `med` language — which gives them the MED icon and language ID — we programmatically + * write `files.associations` entries on activation and whenever the setting changes. + * + * Ownership tracking: we only ever touch `files.associations` entries whose value is `med`. + * Other entries (added by the user or other extensions) are left untouched. + */ +import * as vscode from 'vscode'; + +const MED_LANGUAGE_ID = 'med'; +const SETTING_KEY = 'medFileExtensions'; + +function normalizeExtension(ext: string): string | null { + const trimmed = ext.trim(); + if (!trimmed) { + return null; + } + const withDot = trimmed.startsWith('.') ? trimmed : `.${trimmed}`; + return withDot.toLowerCase(); +} + +async function syncAssociations(): Promise { + const asterConfig = vscode.workspace.getConfiguration('vs-code-aster'); + const raw = asterConfig.get(SETTING_KEY, ['.med', '.mmed', '.rmed']); + + const desiredPatterns = new Set( + raw + .map(normalizeExtension) + .filter((e): e is string => e !== null) + .map((ext) => `*${ext}`) + ); + + const filesConfig = vscode.workspace.getConfiguration('files'); + const current = filesConfig.get>('associations') ?? {}; + const next: Record = {}; + + for (const [pattern, language] of Object.entries(current)) { + if (language === MED_LANGUAGE_ID) { + continue; + } + next[pattern] = language; + } + + for (const pattern of desiredPatterns) { + next[pattern] = MED_LANGUAGE_ID; + } + + const before = JSON.stringify(current); + const after = JSON.stringify(next); + if (before === after) { + return; + } + + await filesConfig.update('associations', next, vscode.ConfigurationTarget.Global); +} + +export function activateMedLanguageSync(context: vscode.ExtensionContext): void { + void syncAssociations(); + + const listener = vscode.workspace.onDidChangeConfiguration((event) => { + if (event.affectsConfiguration(`vs-code-aster.${SETTING_KEY}`)) { + void syncAssociations(); + } + }); + + context.subscriptions.push(listener); +} diff --git a/src/extension.ts b/src/extension.ts index 15f77bd..0d63061 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -9,6 +9,7 @@ import { ExportEditor } from './ExportEditor'; import { RunAster } from './RunAster'; import { LspServer } from './LspServer'; import { StatusBar } from './StatusBar'; +import { activateMedLanguageSync } from './MedLanguageSync'; import { setTelemetryContext } from './telemetry'; /** @@ -39,6 +40,8 @@ export async function activate(context: vscode.ExtensionContext) { StatusBar.instance.activate(context); + activateMedLanguageSync(context); + context.subscriptions.push(runaster); context.subscriptions.push(createExportDoc); context.subscriptions.push(createMesh);