/**
* Copyright 2015-2017 Linagora, Université Joseph Fourier, Floralis
*
* The present code is developed in the scope of the joint LINAGORA -
* Université Joseph Fourier - Floralis research program and is designated
* as a "Result" pursuant to the terms and conditions of the LINAGORA
* - Université Joseph Fourier - Floralis research program. Each copyright
* holder of Results enumerated here above fully & independently holds complete
* ownership of the complete Intellectual Property rights applicable to the whole
* of said Results, and may freely exploit it in any manner which does not infringe
* the moral rights of the other copyright holders.
*
* 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 net.roboconf.doc.generator.internal.renderers;
import java.io.File;
import java.io.IOException;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.regex.Pattern;
import net.roboconf.core.model.beans.ApplicationTemplate;
import net.roboconf.core.utils.Utils;
import net.roboconf.doc.generator.DocConstants;
import net.roboconf.doc.generator.internal.AbstractStructuredRenderer;
/**
* A renderer that outputs markdown.
* @author Vincent Zurczak - Linagora
*/
public class MarkdownRenderer extends AbstractStructuredRenderer {
/**
* Constructor.
* @param outputDirectory
* @param applicationTemplate
* @param applicationDirectory
* @param typeAnnotations
*/
public MarkdownRenderer(
File outputDirectory,
ApplicationTemplate applicationTemplate,
File applicationDirectory,
Map<String,String> typeAnnotations ) {
super( outputDirectory, applicationTemplate, applicationDirectory, typeAnnotations );
}
/*
* (non-Javadoc)
* @see net.roboconf.doc.generator.internal.AbstractStructuredRenderer
* #renderTitle1(java.lang.String)
*/
@Override
protected String renderTitle1( String title ) {
return "\n# " + title + "\n\n";
}
/*
* (non-Javadoc)
* @see net.roboconf.doc.generator.internal.AbstractStructuredRenderer
* #renderTitle2(java.lang.String)
*/
@Override
protected String renderTitle2( String title ) {
return "\n## " + title + "\n\n";
}
/*
* (non-Javadoc)
* @see net.roboconf.doc.generator.internal.AbstractStructuredRenderer
* #renderTitle3(java.lang.String)
*/
@Override
protected String renderTitle3( String title ) {
return "\n### " + title + "\n\n";
}
/*
* (non-Javadoc)
* @see net.roboconf.doc.generator.internal.AbstractStructuredRenderer
* #renderParagraph(java.lang.String)
*/
@Override
protected String renderParagraph( String paragraph ) {
StringBuilder sb = new StringBuilder();
for( String s : paragraph.trim().split( "\n\n" )) {
sb.append( s.trim().replaceAll( "\n", " \n" ));
sb.append( "\n" );
}
return sb.toString();
}
/*
* (non-Javadoc)
* @see net.roboconf.doc.generator.internal.AbstractStructuredRenderer
* #renderList(java.util.Collection)
*/
@Override
protected String renderList( Collection<String> listItems ) {
StringBuilder sb = new StringBuilder();
sb.append( "\n" );
for( String s : listItems ) {
sb.append( "* " );
sb.append( s );
sb.append( "\n" );
}
sb.append( "\n" );
return sb.toString();
}
/*
* (non-Javadoc)
* @see net.roboconf.doc.generator.internal.AbstractStructuredRenderer
* #startSection(java.lang.String)
*/
@Override
protected StringBuilder startSection( String sectionName ) {
return new StringBuilder();
}
/*
* (non-Javadoc)
* @see net.roboconf.doc.generator.internal.AbstractStructuredRenderer
* #endSection(java.lang.String, java.lang.StringBuilder)
*/
@Override
protected StringBuilder endSection( String sectionName, StringBuilder sb ) {
sb.append( "<br />\n" );
return sb;
}
/*
* (non-Javadoc)
* @see net.roboconf.doc.generator.internal.AbstractStructuredRenderer
* #renderSections(java.util.List)
*/
@Override
protected String renderSections( List<String> sectionNames ) {
return "";
}
/*
* (non-Javadoc)
* @see net.roboconf.doc.generator.internal.AbstractStructuredRenderer
* #renderPageBreak()
*/
@Override
protected String renderPageBreak() {
return "";
}
/*
* (non-Javadoc)
* @see net.roboconf.doc.generator.internal.AbstractStructuredRenderer
* #renderImage(java.lang.String, net.roboconf.doc.generator.internal.AbstractStructuredRenderer.DiagramType, java.lang.String)
*/
@Override
protected String renderImage( String componentName, DiagramType type, String relativeImagePath ) {
String alt = componentName + " - " + type;
return "![" + alt + "](" + relativeImagePath + " \"" + componentName + "\")\n\n";
}
/*
* (non-Javadoc)
* @see net.roboconf.doc.generator.internal.AbstractStructuredRenderer
* #renderDocumentTitle()
*/
@Override
protected String renderDocumentTitle() {
return "# " + this.applicationTemplate.getName() + "\n\n";
}
/*
* (non-Javadoc)
* @see net.roboconf.doc.generator.internal.AbstractStructuredRenderer
* #renderDocumentIndex()
*/
@Override
protected String renderDocumentIndex() {
return "";
}
/*
* (non-Javadoc)
* @see net.roboconf.doc.generator.internal.AbstractStructuredRenderer
* #applyBoldStyle(java.lang.String, java.lang.String)
*/
@Override
protected String applyBoldStyle( String text, String keyword ) {
return text.replaceAll( Pattern.quote( keyword ), "**" + keyword + "**" );
}
/*
* (non-Javadoc)
* @see net.roboconf.doc.generator.internal.AbstractStructuredRenderer
* #applyLink(java.lang.String, java.lang.String)
*/
@Override
protected String applyLink( String text, String linkId ) {
String link;
if( this.options.containsKey( DocConstants.OPTION_HTML_EXPLODED ))
link = "components/" + linkId + ".md".replace( " ", "%20" );
else
link = "#" + linkId;
return text.replaceAll( Pattern.quote( text ), "[" + text + "](" + link + ")" );
}
/*
* (non-Javadoc)
* @see net.roboconf.doc.generator.internal.AbstractStructuredRenderer
* #startTable()
*/
@Override
protected String startTable() {
return "\n<table>\n";
}
/*
* (non-Javadoc)
* @see net.roboconf.doc.generator.internal.AbstractStructuredRenderer
* #endTable()
*/
@Override
protected String endTable() {
return "</table>\n\n";
}
/*
* (non-Javadoc)
* @see net.roboconf.doc.generator.internal.AbstractStructuredRenderer
* #addTableHeader(java.util.List)
*/
@Override
protected String addTableHeader( String... headerEntries ) {
StringBuilder sb = new StringBuilder();
sb.append( "<tr>\n" );
for( String s : headerEntries ) {
sb.append( "\t<th>" );
sb.append( s );
sb.append( "</th>\n" );
}
sb.append( "</tr>\n" );
return sb.toString();
}
/*
* (non-Javadoc)
* @see net.roboconf.doc.generator.internal.AbstractStructuredRenderer
* #addTableLine(java.util.List)
*/
@Override
protected String addTableLine( String... lineEntries ) {
StringBuilder sb = new StringBuilder();
sb.append( "<tr>\n" );
for( String s : lineEntries ) {
sb.append( "\t<td>" );
sb.append( s );
sb.append( "</td>\n" );
}
sb.append( "</tr>\n" );
return sb.toString();
}
/*
* (non-Javadoc)
* @see net.roboconf.doc.generator.internal.AbstractStructuredRenderer
* #indent()
*/
@Override
protected String indent() {
return " ";
}
/*
* (non-Javadoc)
* @see net.roboconf.doc.generator.internal.AbstractStructuredRenderer
* #writeFileContent(java.lang.String)
*/
@Override
protected File writeFileContent( String fileContent ) throws IOException {
File targetFile = new File( this.outputDirectory, "index.md" );
Utils.createDirectory( targetFile.getParentFile());
Utils.writeStringInto( fileContent.replaceAll( "\n{3,}", "\n\n" ), targetFile );
return targetFile;
}
}