原始 MediaWiki 页面

我知道编辑这个网站吗?
the ImageJ2 platform本页介绍与 the ImageJ2 platform 相关的内容。点击徽标查看详情。

脚本编辑器自动导入

自迁移出 MediaWiki 以来,本页内容尚未经过审查。如果您愿意帮忙,请查看帮助指南

#背景

原来的ImageJ脚本编辑器会自动导入许多有用的类。这为在 ImageJ 中编写的脚本提供了明显的好处,因为可以使用任何插件,而不需要编写者了解和枚举所需的类。

然而,这种方法也有缺点。由于导入不透明,用户无法知道实际导入的内容。在第§§3§§§的开发过程中,我们发现自动导入功能的广泛范围不够强,并且可能导致库之间的冲突。另外,由于可能未显式声明依赖项,因此可能会导致脚本无法执行。由于这些可能会导致用户无法解决的情况,没有自动导入的黑暗时期开始了。

因此,ImageJ2有一个灵活且可扩展的自动导入机制:ScriptHeader

ScriptHeaders 是如何工作的

ScriptHeaders 是 SciJava 插件,因此它们可以与 ImageJ2 或 Fiji 的任何部分一起分发,并且会自动发现。

当使用脚本编辑器为特定语言制作脚本时,所有与该语言兼容的ScriptHeader都会将其内容添加到脚本的开头。

添加的行可以是特定于语言的导入、@Parameter脚本参数、注释或任何其他可能合适的内容。例如,在第JRuby ScriptHeader中,我们导入一个外部文件。所以自动导入、额外的函数等……都在 imagej.rb 中处理。

结果是编剧可以准确地看到添加的内容。如果他们需要进行任何类型的更改,他们可以在编辑器中轻松完成。当脚本完成后,它就可以在任何上下文中运行,而不仅仅是自动导入的ImageJ。

如何:激活标头

1.开放Script Editor 2.从语言菜单中选择语言

就是这样!如果所选语言存在一个或多个ScriptHeader,它们将自动添加到脚本的顶部。

限制

默认情况下,仅当从 Language = None 切换时才会添加标头。 ScriptHeader 填充逻辑本身可以通过提供更高优先级的 ScriptHeaderService 来覆盖。

如何:添加新标题

下面提供了一个ScriptHeader框架。只需解决标记的TODO,你就可以根据需要分发标头。

  • 如果您正在编写脚本语言通用的ScriptHeader,则可以将其贡献给core scripting repositories
  • 如果您的ScriptHeader特定于您的项目,则它可以作为该项目的一部分进行分发。

原型脚本头

import org.scijava.plugin.Plugin;
import org.scijava.script.AbstractScriptHeader;
import org.scijava.script.ScriptHeader;
import org.scijava.script.ScriptLanguage;

//NB: The @Plugin annotation allows this ScriptHeader to be discovered
//TODO give this header class an appropriate name

@Plugin(type = ScriptHeader.class)
public class MyScriptHeader extends AbstractScriptHeader {

// -- ScriptHeader Methods --

  @Override
  public String getHeader() {
    // TODO Return the text you would like to enter at the top
    // of scripts of the target language.
    return null;
  }

  // NB: If AbstractScriptHeader is not extended you will not implement this section
  // but instead should override the public boolean supports(T) method.

  // -- AbstractScriptHeader methods --

  @Override
  protected Class<? extends ScriptLanguage> handledType() {
    // TODO return the ScriptLanguage class you would like to
    // receive this header string.
    return null;
  }
}