Как отформатировать возвращаемый встроенный файл в asciidoctorj InlineMacroProcessor

#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);