All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.github.cukedoctor.renderer.CukedoctorFeatureRenderer Maven / Gradle / Ivy

The newest version!
package com.github.cukedoctor.renderer;

import static com.github.cukedoctor.util.Assert.*;
import static com.github.cukedoctor.util.Constants.Markup.bold;
import static com.github.cukedoctor.util.Constants.newLine;
import static com.github.cukedoctor.util.StringUtil.trimAllLines;

import com.github.cukedoctor.api.CukedoctorDocumentBuilder;
import com.github.cukedoctor.api.DocumentAttributes;
import com.github.cukedoctor.api.model.Feature;
import com.github.cukedoctor.api.model.Scenario;
import com.github.cukedoctor.config.CukedoctorConfig;
import com.github.cukedoctor.spi.FeatureRenderer;
import com.github.cukedoctor.spi.ScenarioRenderer;
import com.github.cukedoctor.util.ServiceLoaderUtil;
import java.util.List;

/** Created by pestano on 27/02/16. */
public class CukedoctorFeatureRenderer extends AbstractBaseRenderer implements FeatureRenderer {

  ScenarioRenderer scenarioRenderer;

  public CukedoctorFeatureRenderer() {}

  public CukedoctorFeatureRenderer(DocumentAttributes documentAttributes) {
    setDocumentAttributes(documentAttributes);
  }

  public CukedoctorFeatureRenderer(CukedoctorConfig cukedoctorConfig) {
    this.cukedoctorConfig = cukedoctorConfig;
  }

  @Override
  public String renderFeature(Feature feature) {
    loadDependentRenderers();
    CukedoctorDocumentBuilder builder = docBuilder.createPeerBuilder();
    if (feature.hasIgnoreDocsTag()) {
      return "";
    }
    builder.textLine(renderFeatureSectionId(feature));
    builder.title(bold(feature.getName())).newLine();

    if (notNull(documentAttributes) && hasText(documentAttributes.getBackend())) {
      String backend = documentAttributes.getBackend();
      if ((backend.toLowerCase().contains("html") || backend.toLowerCase().contains("all"))
          && !cukedoctorConfig.isDisableMinMaxExtension()) {
        // used by minimax extension @see com.github.cukedoctor.extension.CukedoctorMinMaxExtension
        builder.append("ifndef::backend-pdf[]").append(newLine());
        builder.append("minmax::", renderFeatureId(feature)).append("[]").newLine();
        builder.append("endif::[]").append(newLine());
      }
    }
    if (hasText(feature.getDescription())) {
      final String description = trimAllLines(feature.getDescription()).replaceAll("\\\\", "");
      renderDescription(builder, description);
    }

    if (feature.hasScenarios()) {
      builder.append(renderFeatureScenarios(feature, builder));
    }

    return builder.toString();
  }

  protected void renderDescription(CukedoctorDocumentBuilder builder, String description) {
    builder.sideBarBlock(description);
  }

  @Override
  public String renderFeatures(List features) {
    loadDependentRenderers();
    docBuilder.clear();
    if (!cukedoctorConfig.isHideFeaturesSection()) {
      docBuilder.titleThenNest(bold(i18n.getMessage("title.features"))).newLine();
    }
    for (Feature feature : features) {
      docBuilder.append(renderFeature(feature));
    }
    return docBuilder.toString();
  }

  protected String renderFeatureScenarios(Feature feature, CukedoctorDocumentBuilder builder) {
    StringBuilder sb = new StringBuilder();
    for (Scenario scenario : feature.getScenarios()) {
      sb.append(renderFeatureScenario(scenario, feature, builder));
    }
    feature.setBackgroundRendered(false);
    return sb.toString();
  }

  protected String renderFeatureSectionId(Feature feature) {
    if (isNull(feature) || not(hasText(feature.getName()))) {
      return "";
    }
    return "[[" + renderFeatureId(feature) + ", " + feature.getName() + "]]";
  }

  protected String renderFeatureId(Feature feature) {
    // Anchor must not have blanks neither commas to work
    return feature.getName().replaceAll(",", "").replaceAll("'", "-").replaceAll(" ", "-");
  }

  protected String renderFeatureScenario(
      Scenario scenario, Feature feature, CukedoctorDocumentBuilder builder) {
    if (scenarioRenderer == null) {
      loadDependentRenderers();
    }
    return scenarioRenderer.renderScenario(scenario, feature, builder.createNestedBuilder());
  }

  private void loadDependentRenderers() {
    scenarioRenderer =
        new ServiceLoaderUtil()
            .initialise(
                ScenarioRenderer.class,
                CukedoctorScenarioRenderer.class,
                i18n,
                documentAttributes,
                cukedoctorConfig);
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy