给定一个语法(下面的简化版本),我可以在语法的一部分输入任意文本,是否可以格式化任意文本的内容?我理解如何格式化任意文本相对于其余语法的位置,但不知道是否可以格式化内容字符串本身?
示例语法
Model:
'content' content=RT
terminal RT: // (returns ecore::EString:)
'RT>>' -> '<<RT';
示例内容
content RT>>
# Some sample arbitrary text
which I would like to format
<<RT
答案 0 :(得分:1)
您可以将自定义ITextReplacer
添加到字符串的区域。
假设你有像
Model:
greetings+=Greeting*;
Greeting:
'Hello' name=STRING '!';
您可以执行格式化程序中的后续操作
def dispatch void format(Greeting model, extension IFormattableDocument document) {
model.prepend[newLine]
val region = model.regionFor.feature(MyDslPackage.Literals.GREETING__NAME)
val r = new AbstractTextReplacer(document, region) {
override createReplacements(ITextReplacerContext it) {
val text = region.text
var int index = text.indexOf(SPACE);
val offset = region.offset
while (index >=0){
it.addReplacement(region.textRegionAccess.rewriter.createReplacement(offset+index, SPACE.length, "\n"))
index = text.indexOf(SPACE, index+SPACE.length()) ;
}
it
}
}
addReplacer(r)
}
这会改变这个模型
Hello "A B C"!
到
Hello "A
B
C"!
当然,您需要提出更复杂的格式化逻辑。 另见How to define different indentation levels in the same document with Xtext formatter