SectionEmitterFactory.java

package docsite;

import java.nio.file.Path;
import java.util.*;
import docsite.emitters.*;
import docsite.util.ImageResolver;
import org.jetbrains.annotations.NotNull;


public class SectionEmitterFactory {

    private final EmitterBuildParams buildParams;


    public SectionEmitterFactory(
        Docsite site,
        ImageResolver globalImages,
        ThemeColors themeColors,
        Path baseDir,
        Path outputFolder,
        boolean useCDN,
        Map<String, String> metadata,
        List<Script> scripts,
        List<SiteLanguage> availableLanguages,
        Map<String, Map<String, String>> localization
    ) {
        this.buildParams = new EmitterBuildParams()
            .site(site)
            .themeColors(themeColors)
            .baseDir(baseDir)
            .outputFolder(outputFolder)
            .globalImages(globalImages)
            .useCDN(useCDN)
            .metadata(metadata)
            .scripts(scripts)
            .availableLanguages(availableLanguages)
            .localization(localization)
        ;
    }


    SectionEmitter createEmitter(Section section, SiteLanguage siteLanguage) {
        return createEmitter(section,null,new ArrayList<>(), siteLanguage);
    }


    SectionEmitter createEmitter(
        Section section,
        SectionEmitter rootEmitter,
        List<SectionEmitter> ancestorEmitters,
        SiteLanguage siteLanguage
    ) {
        SectionEmitter newEmitter = newEmitterInstance(buildParams
            .withRootEmitter(rootEmitter)
            .withSection(section)
            .withAncestorEmitters(ancestorEmitters)
            .withSiteLanguage(siteLanguage)
        );
        SectionEmitter newRoot = Objects.requireNonNullElse(rootEmitter, newEmitter);
        List<SectionEmitter> newAncestors = new ArrayList<>(ancestorEmitters);
        newAncestors.add(newEmitter);
        for (Section subsection : section.subsections()) {
            newEmitter.addChildEmitter(createEmitter(subsection, newRoot, newAncestors, siteLanguage));
        }
        return newEmitter;
    }




    private SectionEmitter newEmitterInstance(EmitterBuildParams params) {
        switch (params.section().type()) {
            case copy:
                return new CopySectionEmitter(params);
            case link:
                return new LinkSectionEmitter(params);
            case group:
                return new GroupSectionEmitter(params);
            case embedded:
                return new EmbeddedSiteSectionEmitter(params);
            case generated:
                return newGeneratedSectionEmitter(params);
            default:
                throw new UnsupportedOperationException();
        }
    }


    @NotNull
    private GeneratedSectionEmitter newGeneratedSectionEmitter(EmitterBuildParams params) {

        if (params.section().template() != null) {
            return new TemplateSectionEmitter(params);
        }

        String source = params.section().source().toLowerCase();
        if (source.endsWith(".md")) {
            return new MarkdownGeneratedSectionEmitter(params);
        } else if (source.endsWith(".html") || source.endsWith(".htm")) {
            return new HtmlGeneratedSectionEmitter(params);
        } else if (source.endsWith(".adoc") || source.endsWith(".asciidoc") || source.endsWith(".asc")) {
            return new AsciidocGeneratedSectionEmitter(params);
        }else {
            return new TextGeneratedSectionEmitter(params);
        }
    }


}