package com.akjava.gwt.markdowneditor.client;
import java.util.ArrayList;
import java.util.List;
import com.akjava.gwt.lib.client.datalist.RichTitle;
import com.akjava.gwt.lib.client.datalist.SimpleTextData;
import com.akjava.lib.common.functions.StringFunctions;
import com.akjava.lib.common.functions.StringFunctions.StringToPreFixAndSuffix;
import com.akjava.lib.common.utils.FileNames;
import com.google.common.base.Function;
import com.google.common.base.Preconditions;
import com.google.common.base.Strings;
import com.google.common.base.Supplier;
import com.google.common.base.Suppliers;
import com.google.common.collect.FluentIterable;
public class MarkdownFunctions {
/*
* i use supplier for avoid initial create ConvertTitles
*/
private static Supplier<List<ConvertTitle>> titleSupplier=Suppliers.memoize(new ConvertTitleSupplier());
private static class ConvertTitleSupplier implements Supplier<List<ConvertTitle>>{
@Override
public List<ConvertTitle> get() {
List<ConvertTitle> titles=new ArrayList<ConvertTitle>();
for(int i=0;i<=6;i++){
titles.add(new ConvertTitle(i));
}
return titles;
}
}
public static StripTitleStart getStripTitleStart(){
return StripTitleStart.INSTANCE;
}
public enum StripTitleStart implements Function<String,String>{
INSTANCE;
@Override
public String apply(String line) {
while(line.startsWith("#")){
line=line.substring(1);
}
return line;
}
}
/**
* for multiple text
* @author aki
*
*/
public static class MarkdownToKeyAndUrlMarkdown implements Function<String,String>{
ExtractTextFromMarkdown extractTextFromMarkdown=new ExtractTextFromMarkdown();
List<KeyAndUrl> keyAndUrls;
private boolean eachKeyOnlyOnce;
public MarkdownToKeyAndUrlMarkdown(List<KeyAndUrl> keyAndUrls,boolean eachKeyOnlyOnce){
this.keyAndUrls=keyAndUrls;
this.eachKeyOnlyOnce=eachKeyOnlyOnce;
}
@Override
public String apply(String input) {
return MarkdownUtils.markdownToKeyAndUrlMarkdown(extractTextFromMarkdown,keyAndUrls,eachKeyOnlyOnce,input);
}
}
public static ConvertTitle getConvertTitle(int level){
Preconditions.checkArgument(level<=6,"level must be in 0-6");
return titleSupplier.get().get(level);
}
public static class ConvertTitle implements Function<String,String>{
private int level;
public ConvertTitle(int level){
this.level=level;
}
@Override
public String apply(String input) {
String stripped=getStripTitleStart().apply(input);
if(level==1){
if(!stripped.endsWith("\n")){
stripped+="\n";
}
return stripped+Strings.repeat("=", Math.max(4, stripped.length()-1))+"\n";
}else if(level==2){
if(!stripped.endsWith("\n")){
stripped+="\n";
}
return stripped+Strings.repeat("-", Math.max(4, stripped.length()-1))+"\n";
}else if(level>2){
String header=Strings.repeat("#",level);
return header+stripped;
}else{
return stripped;
}
}
}
public static class SimpleTextDataToTitleLinkTextFunction implements Function<SimpleTextData,String>{
private boolean fullPath;
private String basePath="";
private String linkExtension=".html";
private FileNames fileNames=FileNames.asSlash();
/**
*
* @param basePath set domain name or parent directory
* @param fullPath
* @param linkSuffix usually ".html" but you can set it ""
*/
public SimpleTextDataToTitleLinkTextFunction(String basePath,boolean fullPath,String linkSuffix){
this.basePath=basePath;
this.fullPath=fullPath;
this.linkExtension=linkSuffix;
}
@Override
public String apply(SimpleTextData input) {
String path=null;
if(fullPath){
path=input.getName();
}else{
path=fileNames.getFileName(input.getName());
}
path=FileNames.getRemovedExtensionName(path);
path=basePath+path+linkExtension;
String line=StringFunctions.getFirstLineOnly().apply(input.getData());
String title=getStripTitleStart().apply(line);
return MarkdownUtils.createLink(title, path);
}
}
/**
* usually used for keyword links
*
* from RichTitle
* RPG/Role Playing Game(pronounce)
* to
* RPG\tURL
* Role Playing Game\tURL
* pronounce\tURL
*
* @author aki
*
*/
public static class SimpleTextKeywordLinksFunction implements Function<SimpleTextData,List<String>>{
private boolean fullPath;
private String basePath="";
private String linkExtension=".html";
private FileNames fileNames=FileNames.asSlash();
/**
*
* @param basePath set domain name or parent directory
* @param fullPath
* @param linkSuffix usually ".html" but you can set it ""
*/
public SimpleTextKeywordLinksFunction(String basePath,boolean fullPath,String linkSuffix){
this.basePath=basePath;
this.fullPath=fullPath;
this.linkExtension=linkSuffix;
}
@Override
public List<String> apply(SimpleTextData input) {
String path=null;
if(fullPath){
path=input.getName();
}else{
path=fileNames.getFileName(input.getName());
}
path=FileNames.getRemovedExtensionName(path);
path=basePath+path+linkExtension;
String line=StringFunctions.getFirstLineOnly().apply(input.getData());
String title=getStripTitleStart().apply(line);
RichTitle richTitle=new RichTitle(title);
Iterable<String> bothTitles=richTitle.getBothTitles();
return FluentIterable.from(bothTitles).transform(new StringToPreFixAndSuffix("",","+path)).toList();
}
}
}