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

com.metreeca.mark.tasks.Build Maven / Gradle / Ivy

/*
 * Copyright © 2019-2023 Metreeca srl
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.metreeca.mark.tasks;

import com.metreeca.mark.*;

import java.io.IOException;
import java.io.UncheckedIOException;
import java.nio.file.*;
import java.util.List;
import java.util.Optional;
import java.util.regex.Pattern;
import java.util.stream.Stream;

import static java.lang.String.format;
import static java.lang.System.currentTimeMillis;
import static java.nio.charset.StandardCharsets.UTF_8;
import static java.nio.file.StandardOpenOption.CREATE;
import static java.nio.file.StandardOpenOption.TRUNCATE_EXISTING;

/**
 * Site building task.
 *
 * 

Generates a processed version of the {@linkplain Opts#source() source} site folder in the * {@linkplain Opts#target() target} site folder.

*/ public final class Build implements Task { private static final String SiteURL="project.distributionManagement.site.url"; private static final Pattern ExpressionPattern=Pattern.compile("(? { try { final Path index=entry.getKey(); final Path readme=entry.getValue(); final String base=mark.global(String.class, SiteURL) .orElseGet(() -> readme.getParent().relativize(mark.target()).toString()); final String text=Optional.of(Files.readString(index, UTF_8)) // replace ${*} variables .map(s -> ExpressionPattern.matcher(s).replaceAll(result -> mark.global(String.class, result.group(1)).orElseGet(() -> DollarPattern.matcher(result.group()).replaceAll("\\\\\\$") ) )) // remove expression escapes .map(s -> EscapePattern.matcher(s).replaceAll("\\$")) // relocate relative links .map(s -> RelativePattern.matcher(s).replaceAll(result -> format( "[%s](%s)", result.group(1), base.startsWith("http") ? format(base.endsWith("/") ? "%s%s" : "%s/%s", base, result.group(2)) .replace("/./", "/") .replace(".md", ".html") .replace("/index.html", "/") : Paths.get(base, result.group(2)).normalize()) )) .orElseThrow(); Files.write(readme, List.of(text), CREATE, TRUNCATE_EXISTING); } catch ( final IOException e ) { throw new UncheckedIOException(e); } }); // copy bundled assets to target folder try ( final Stream assets=mark.assets().values().stream() ) { final long start=currentTimeMillis(); final long count=mark.process(assets).size(); final long stop=currentTimeMillis(); if ( count > 0 ) { mark.logger().info(format("processed ‹%,d› assets in ‹%,.3f› s", count, (stop-start)/1000.0f)); } } // process resources try ( final Stream sources=Files.walk(mark.source()) ) { final long start=currentTimeMillis(); final long count=mark.process(sources).size(); final long stop=currentTimeMillis(); if ( count > 0 ) { mark.logger().info(format("processed ‹%,d› files in ‹%,.3f› s", count, (stop-start)/1000.0f)); } } catch ( final IOException e ) { throw new UncheckedIOException(e); } } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy