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

com.varmateo.yawg.commonmark.CommonMarkPageBaker Maven / Gradle / Ivy

/**************************************************************************
 *
 * Copyright (c) 2019-2020 Yawg project contributors.
 *
 **************************************************************************/

package com.varmateo.yawg.commonmark;

import java.nio.file.Path;
import java.util.Optional;
import java.util.function.Function;
import java.util.regex.Pattern;

import io.vavr.Lazy;
import io.vavr.collection.List;
import io.vavr.control.Try;
import org.commonmark.Extension;
import org.commonmark.ext.front.matter.YamlFrontMatterExtension;
import org.commonmark.node.Node;
import org.commonmark.parser.Parser;
import org.commonmark.renderer.html.HtmlRenderer;

import com.varmateo.yawg.api.Result;
import com.varmateo.yawg.spi.PageBakeResult;
import com.varmateo.yawg.spi.PageBaker;
import com.varmateo.yawg.spi.PageContext;
import com.varmateo.yawg.spi.Template;
import com.varmateo.yawg.spi.TemplateContext;
import com.varmateo.yawg.util.FileUtils;
import com.varmateo.yawg.util.PageBakeResults;
import com.varmateo.yawg.util.Results;


/**
 * A Baker that translates text files in Markdown format
 * into HTML files.
 */
public final class CommonMarkPageBaker
        implements PageBaker {


    private static final String NAME = "markdown";

    private static final Pattern RE_ADOC = Pattern.compile(".*\\.md$");

    private static final String TARGET_EXTENSION = ".html";

    private final Lazy _markdownParser =
            Lazy.of(this::createMarkdownParser);

    private final Lazy _htmlRenderer =
            Lazy.of(this::createHtmlRenderer);

    private final Lazy _templateContextFactory =
            Lazy.of(this::createTemplateContextFactory);


    private CommonMarkPageBaker() {
        // Nothing to do.
    }


    /**
     *
     */
    public static PageBaker create() {

        return new CommonMarkPageBaker();
    }


    /**
     * {@inheritDoc}
     */
    @Override
    public String shortName() {

        return NAME;
    }


    /**
     * Checks if the given file name has one of the known extensions.
     *
     * 

The following extensions will be allowed:

* *
    *
  • .md
  • *
* * @return True if the given file name has one of the allowed * extensions. */ @Override public boolean isBakeable(final Path path) { return FileUtils.isNameMatch(path, RE_ADOC); } /** * Converts the given text file in Asciidoc format into an HTML * file. * *

The target directory must already exist. Otherwise an * exception will be thrown.

* * @param sourcePath The file to be baked. * * @param context Provides the template for generating the target * document. If no template is provided, then the default * AsciidoctorJ document generator will be used. * * @param targetDir The directory where the source file will be * copied to. * * @return A result signaling success of failure. */ @Override public PageBakeResult bake( final Path sourcePath, final PageContext context, final Path targetDir) { final Try result = doBake(sourcePath, context, targetDir); return PageBakeResults.fromTry(result); } /** * */ private Try doBake( final Path sourcePath, final PageContext context, final Path targetDir) { final Path targetPath = getTargetPath(sourcePath, targetDir); final Optional