编辑:目前看来这是不可行的,因为所需的 impl 类不会被它们进来的包导出。感谢 Radu Cotescu 在评论中指出这一点。
我会在下面留下我原来的答案。如果有人真的需要或只是想要你可以在 github 上 fork Sling repo 并添加/部署你自己的插件或简单地导出必要的 impl 包并将插件添加到你自己的代码库中
查看 Sightly 源代码,您可以看到他们称之为 Plugins 的列表,它们提供了每个Sightly 块语句的实现。这些可以在这里找到:https://github.com/apache/sling/tree/trunk/bundles/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/impl/plugin
这只是一个猜测,我还没有尝试过, 但您似乎可以提供自己的类,该类扩展 org.apache.sling.scripting.sightly.impl.plugin.PluginComponent 并且是 Plugin OSGi服务。我会尝试复制现有插件之一,看看是否可以使用新名称。也许是TextPlugin,看起来很简单。
希望这将为您指明一个可以带来一些乐趣的方向:)
可能是这样的
@Component
@Service(Plugin.class)
@Properties({
@Property(name = Plugin.SCR_PROP_NAME_BLOCK_NAME, value = "foo"),
@Property(name = Plugin.SCR_PROP_NAME_PRIORITY, intValue = 9)
})
public class FooPlugin extends PluginComponent {
@Override
public PluginInvoke invoke(final Expression expression, PluginCallInfo callInfo, final CompilerContext compilerContext) {
return new DefaultPluginInvoke() {
@Override
public void beforeChildren(PushStream stream) {
String variable = compilerContext.generateVariable("fooContent");
stream.emit(new VariableBinding.Start(variable,
compilerContext.adjustToContext(expression, MarkupContext.TEXT, ExpressionContext.TEXT).getRoot()));
stream.emit(new OutVariable(variable));
stream.emit(VariableBinding.END);
Patterns.beginStreamIgnore(stream);
}
@Override
public void afterChildren(PushStream stream) {
Patterns.endStreamIgnore(stream);
}
};
}
}
然后在文件中使用它
<div data-sly-foo="${properties.jcr:description}">This text should get replaced</div>
如果我有空尝试一下,我会更新这个答案。
注意:但是,我会说,如果您尝试在实际场景中执行此操作,则可能有更好的方法来解决您尝试以这种方式解决的问题。 Sightly 团队已尝试为我们提供一切所需的一切,让我们能够做Sightly 打算做的事情。