From c0f9511d03ab687c3c748b00b0cbad7c5344d365 Mon Sep 17 00:00:00 2001 From: Curtis Rueden Date: Tue, 26 Aug 2025 11:30:51 -0500 Subject: [PATCH] WIP: Let scripts declare their language --- .../ScriptDirectiveScriptProcessor.java | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/scijava/script/process/ScriptDirectiveScriptProcessor.java b/src/main/java/org/scijava/script/process/ScriptDirectiveScriptProcessor.java index 40b905ede..634d4cbc4 100644 --- a/src/main/java/org/scijava/script/process/ScriptDirectiveScriptProcessor.java +++ b/src/main/java/org/scijava/script/process/ScriptDirectiveScriptProcessor.java @@ -38,6 +38,8 @@ import org.scijava.module.ModuleService; import org.scijava.plugin.Parameter; import org.scijava.plugin.Plugin; +import org.scijava.script.ScriptLanguage; +import org.scijava.script.ScriptService; /** * A {@link ScriptProcessor} which parses the {@code #@script} directive. @@ -97,7 +99,7 @@ public class ScriptDirectiveScriptProcessor extends DirectiveScriptProcessor { public ScriptDirectiveScriptProcessor() { - super(directive -> "script".equals(directive)); + super("script"::equals); } @Parameter @@ -106,6 +108,9 @@ public ScriptDirectiveScriptProcessor() { @Parameter private ModuleService moduleService; + @Parameter + private ScriptService scriptService; + // -- Internal DirectiveScriptProcessor methods -- @Override @@ -125,6 +130,10 @@ private void assignAttribute(final String k, final Object v) { if (is(k, "name")) info().setName(as(v, String.class)); else if (is(k, "label")) info().setLabel(as(v, String.class)); else if (is(k, "description")) info().setDescription(as(v, String.class)); + else if (is(k, "language")) { + ScriptLanguage lang = parseScriptLanguage(v.toString()); + if (lang != null) info().setLanguage(lang); + } else if (is(k, "menuPath")) { info().setMenuPath(new MenuPath(as(v, String.class))); } @@ -161,4 +170,12 @@ private Double priority(final Object p) { if (lString.matches("last")) return Priority.LAST; return null; } + + private ScriptLanguage parseScriptLanguage(final Object v) { + final String langHint = v.toString(); + ScriptLanguage lang = scriptService.getLanguageByName(langHint); + if (lang == null) lang = scriptService.getLanguageByExtension(langHint); + if (lang == null) log.warn("Unknown script language: " + langHint); + return lang; + } }