我想知道是否有办法创建自定义属性,例如:
<div data-sly-myAttribute="${whatever}"></div>
就像自定义JSP标记一样。
修改:
根据this blog,截至2014年5月4日,这是不可能的。 这有什么消息吗?
答案 0 :(得分:3)
不,由于该实现不符合规范[0],因此无法创建自己的块元素。与仅添加新插件相比,涉及更多细微之处,其中一个插件是在同一HTML元素上使用多个块时的块元素优先级;更不用说如果可能的话,没有什么可以阻止你覆盖所提供的插件。
但是,如果您认为需要新的块元素,请向规范发送拉取请求,并使用明确定义的用例。此外,如果您在Apache Sling开发邮件列表[1]上讨论您的用例,它可能会有所帮助 - 也许您需要的是其他开发人员也想到的东西,在这种情况下,协作肯定有助于找到这个问题的最佳解决方案。
[0] - https://github.com/Adobe-Marketing-Cloud/sightly-spec/blob/1.2/SPECIFICATION.md
[1] - https://sling.apache.org/project-information.html#mailing-lists
答案 1 :(得分:0)
编辑:此时看起来不可行,因为所需的impl
类不会被他们进来的包导出。感谢Radu Cotescu在评论中指出了这一点。 / p>
我将在下面留下原来的答案。如果有人真的需要或者只是想要你可以在github上分叉Sling repo并添加/部署你自己的插件或者只是导出必要的impl
包并将插件添加到你自己的代码库中
通过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
并且是{{ 1}} OSGi服务。我会尝试复制一个现有的插件,看看你是否可以使用新名称。也许是Plugin
,看起来很简单。
希望这会指向一个可以带来乐趣的方向:)
这样的事可能
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);
}
};
}
}
如果我想要尝试一下,我会更新这个答案。
注意:但是,我会说,如果您在实际情况中尝试这样做,可能有更好的方法来解决您尝试以这种方式解决的问题。那些有眼力的团队试图向我们提供我们需要做的所有事情。