#java #asciidoctor
#java #asciidoctor
Вопрос:
Учитывая этот пример встроенного макроса:
package some;
import java.util.Map;
import org.asciidoctor.ast.ContentNode;
import org.asciidoctor.extension.InlineMacroProcessor;
public class SomeMacro extends InlineMacroProcessor {
public SomeMacro(String macroName) {
super(macroName);
}
public SomeMacro(String macroName, Map<String, Object> config) {
super(macroName, config);
}
@Override
public Object process(ContentNode parent, String target, Map<String, Object> attributes) {
String text;
switch (target) {
case "test":
text = "this is *me* and `you` here";
break;
default:
text = "NOT DEFINED";
break;
}
return createPhraseNode(parent, "quoted", text, attributes);
}
}
На самом деле вычисление text
не жестко запрограммировано в коммутаторе, а является результатом более сложной логики.
Код для тестирования этого макроса (представлен в виде модульного теста):
package some;
import static org.assertj.core.api.Assertions.assertThat;
import org.asciidoctor.Asciidoctor;
import org.asciidoctor.Asciidoctor.Factory;
import org.asciidoctor.OptionsBuilder;
import org.asciidoctor.SafeMode;
import org.junit.jupiter.api.Test;
import com.unblu.asciidoctorj.config.InMemoryLogHandler;
public class Snippet {
@Test
public void someTest() {
String content = "This is some:test[] and some:other[] end.";
String expected = "<div class="paragraph">n"
"<p>This is this is *me* and `you` here and NOT DEFINED end.</p>n"
"</div>";
Asciidoctor asciidoctor = Factory.create();
asciidoctor.createGroup()
.inlineMacro("some", "some.SomeMacro")
.register();
OptionsBuilder optionsBuilder = OptionsBuilder.options()
.docType("article")
.safe(SafeMode.UNSAFE);
String html = asciidoctor.convert(content, optionsBuilder);
assertThat(html.trim()).isEqualTo(expected);
}
}
Если входные данные:
This is some:test[] and some:other[] end.
Результатом является:
<div class="paragraph">
<p>This is this is *me* and `you` here and NOT DEFINED end.</p>
</div>
Я бы хотел *me*
, чтобы и you
были преобразованы с использованием форматирования текста:
<div class="paragraph">
<p>This is this is <strong>me</strong> and <code>you</code> here and NOT DEFINED end.</p>
</div>
Ответ №1:
Дэн Аллен предоставил пояснения в Twitter
При вызове createPhraseNode(parent, "quoted", text, attributes)
можно активировать диалог, активировав normal
замены.
Map<String, Object> phraseNodeAttributes = new HashMap<>();
phraseNodeAttributes.put("subs", ":normal");
return createPhraseNode(parent, "quoted", text, phraseNodeAttributes);