/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You 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. */ import com.vladsch.flexmark.ast.Heading; import com.vladsch.flexmark.ext.abbreviation.AbbreviationExtension; import com.vladsch.flexmark.ext.attributes.AttributesExtension; import com.vladsch.flexmark.ext.autolink.AutolinkExtension; import com.vladsch.flexmark.ext.tables.TablesExtension; import com.vladsch.flexmark.html.HtmlRenderer; import com.vladsch.flexmark.parser.Parser; import com.vladsch.flexmark.parser.ParserEmulationProfile; import com.vladsch.flexmark.util.ast.Document; import com.vladsch.flexmark.util.data.MutableDataSet; import com.vladsch.flexmark.util.sequence.Escaping; import groovy.text.SimpleTemplateEngine; buildscript { repositories { mavenCentral() } dependencies { classpath deps.flexmark.core classpath deps.flexmark.ext.abbreviation classpath deps.flexmark.ext.attributes classpath deps.flexmark.ext.autolink classpath deps.flexmark.ext.tables } } configure(project(':lucene:documentation')) { task markdownToHtml(type: Copy) { dependsOn copyDocumentationAssets filteringCharset = 'UTF-8' includeEmptyDirs = false into project.docroot rename(/\.md$/, '.html') filter(MarkdownFilter) } } configure(project(':lucene:documentation')) { markdownToHtml { from(project.parent.projectDir) { include 'MIGRATE.md' include 'JRE_VERSION_MIGRATION.md' include 'SYSTEM_REQUIREMENTS.md' } } task createDocumentationIndex(type: MarkdownTemplateTask) { dependsOn markdownToHtml outputFile = file("${project.docroot}/index.html") templateFile = file("${project.markdownSrc}/index.template.md") def defaultCodecFile = project(':lucene:core').file('src/java/org/apache/lucene/codecs/Codec.java') inputs.file(defaultCodecFile) // list all properties used by the template here to allow uptodate checks to be correct: inputs.property('version', project.version) binding.put('defaultCodecPackage', providers.provider { // static Codec defaultCodec = LOADER . lookup ( "LuceneXXX" ) ; def regex = ~/\bdefaultCodec\s*=\s*LOADER\s*\.\s*lookup\s*\(\s*"([^"]+)"\s*\)\s*;/ def matcher = regex.matcher(defaultCodecFile.getText('UTF-8')) if (!matcher.find()) { throw new GradleException("Cannot determine default codec from file ${defaultCodecFile}") } return matcher.group(1).toLowerCase(Locale.ROOT) }) withProjectList() } } // filter that can be used with the "copy" task of Gradle that transforms Markdown files // from source location to HTML (adding HTML header, styling,...) class MarkdownFilter extends FilterReader { public MarkdownFilter(Reader reader) throws IOException { // this is not really a filter: it reads whole file in ctor, // converts it and provides result downstream as a StringReader super(new StringReader(convert(reader.text))); } public static String convert(String markdownSource) { // first replace LUCENE and SOLR issue numbers with a markdown link markdownSource = markdownSource.replaceAll(/(?s)\b(LUCENE|SOLR)\-\d+\b/, '[$0](https://issues.apache.org/jira/browse/$0)'); markdownSource = markdownSource.replaceAll(/(?s)\b(GITHUB#|GH-)(\d+)\b/, '[$0](https://github.com/apache/lucene/issues/$2)'); // convert the markdown MutableDataSet options = new MutableDataSet(); options.setFrom(ParserEmulationProfile.MARKDOWN); options.set(Parser.EXTENSIONS, [ AbbreviationExtension.create(), AutolinkExtension.create(), AttributesExtension.create(), TablesExtension.create(), ]); options.set(HtmlRenderer.RENDER_HEADER_ID, true); options.set(HtmlRenderer.MAX_TRAILING_BLANK_LINES, 0); Document parsed = Parser.builder(options).build().parse(markdownSource); StringBuilder html = new StringBuilder('\n
\n'); CharSequence title = parsed.getFirstChildAny(Heading.class)?.getText(); if (title != null) { html.append('