SectionEmitterFactory.java

  1. package docsite;

  2. import java.nio.file.Path;
  3. import java.util.*;
  4. import docsite.emitters.*;
  5. import docsite.util.ImageResolver;
  6. import org.jetbrains.annotations.NotNull;


  7. public class SectionEmitterFactory {

  8.     private final EmitterBuildParams buildParams;


  9.     public SectionEmitterFactory(
  10.         Docsite site,
  11.         ImageResolver globalImages,
  12.         ThemeColors themeColors,
  13.         Path baseDir,
  14.         Path outputFolder,
  15.         boolean useCDN,
  16.         Map<String, String> metadata,
  17.         List<Script> scripts,
  18.         List<SiteLanguage> availableLanguages,
  19.         Map<String, Map<String, String>> localization
  20.     ) {
  21.         this.buildParams = new EmitterBuildParams()
  22.             .site(site)
  23.             .themeColors(themeColors)
  24.             .baseDir(baseDir)
  25.             .outputFolder(outputFolder)
  26.             .globalImages(globalImages)
  27.             .useCDN(useCDN)
  28.             .metadata(metadata)
  29.             .scripts(scripts)
  30.             .availableLanguages(availableLanguages)
  31.             .localization(localization)
  32.         ;
  33.     }


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


  37.     SectionEmitter createEmitter(
  38.         Section section,
  39.         SectionEmitter rootEmitter,
  40.         List<SectionEmitter> ancestorEmitters,
  41.         SiteLanguage siteLanguage
  42.     ) {
  43.         SectionEmitter newEmitter = newEmitterInstance(buildParams
  44.             .withRootEmitter(rootEmitter)
  45.             .withSection(section)
  46.             .withAncestorEmitters(ancestorEmitters)
  47.             .withSiteLanguage(siteLanguage)
  48.         );
  49.         SectionEmitter newRoot = Objects.requireNonNullElse(rootEmitter, newEmitter);
  50.         List<SectionEmitter> newAncestors = new ArrayList<>(ancestorEmitters);
  51.         newAncestors.add(newEmitter);
  52.         for (Section subsection : section.subsections()) {
  53.             newEmitter.addChildEmitter(createEmitter(subsection, newRoot, newAncestors, siteLanguage));
  54.         }
  55.         return newEmitter;
  56.     }




  57.     private SectionEmitter newEmitterInstance(EmitterBuildParams params) {
  58.         switch (params.section().type()) {
  59.             case copy:
  60.                 return new CopySectionEmitter(params);
  61.             case link:
  62.                 return new LinkSectionEmitter(params);
  63.             case group:
  64.                 return new GroupSectionEmitter(params);
  65.             case embedded:
  66.                 return new EmbeddedSiteSectionEmitter(params);
  67.             case generated:
  68.                 return newGeneratedSectionEmitter(params);
  69.             default:
  70.                 throw new UnsupportedOperationException();
  71.         }
  72.     }


  73.     @NotNull
  74.     private GeneratedSectionEmitter newGeneratedSectionEmitter(EmitterBuildParams params) {

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

  78.         String source = params.section().source().toLowerCase();
  79.         if (source.endsWith(".md")) {
  80.             return new MarkdownGeneratedSectionEmitter(params);
  81.         } else if (source.endsWith(".html") || source.endsWith(".htm")) {
  82.             return new HtmlGeneratedSectionEmitter(params);
  83.         } else if (source.endsWith(".adoc") || source.endsWith(".asciidoc") || source.endsWith(".asc")) {
  84.             return new AsciidocGeneratedSectionEmitter(params);
  85.         }else {
  86.             return new TextGeneratedSectionEmitter(params);
  87.         }
  88.     }


  89. }