/* * Copyright (C) 2014 Civilian Framework. * * Licensed under the Civilian License (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.civilian-framework.org/license.txt * * 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 org.civilian.internal.build; import java.io.File; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.civilian.Version; import org.civilian.util.ClassUtil; public class VarConverter { private static final String GITHUB_REPO = "https://github.com/jdlib/civilian/"; private static final String GITHUB_REPO_RELEASES = GITHUB_REPO + "releases"; private static final String GITHUB_REPO_RELEASES_DOWNLOAD_LATEST = GITHUB_REPO_RELEASES + "/download/" + Version.VALUE + "/"; private static final String GITHUB_REPO_RELEASES_LATEST = GITHUB_REPO_RELEASES + "/tag/" + Version.VALUE; public VarConverter(File javaDocDir, File parentFile, File inputFile) { javaDocDir_ = javaDocDir; parentFile_ = parentFile; inputFile_ = inputFile; } public String convert(String line, int lineIndex) { lineIndex_ = lineIndex; Matcher matcher = VAR_PATTERN.matcher(line); if (matcher.find()) { buffer_.setLength(0); int start = 0; do { buffer_.append(line, start, matcher.start()); String key = matcher.group(1); String val = matcher.group(2); if ("javadoc".equals(key)) convertJavadoc(val); else if ("nav".equals(key)) convertNavItem(val); else if ("link".equals(key)) convertLink(val); else if ("download".equals(key)) convertDownload(val); else if ("downloadfile".equals(key)) convertDownloadFile(val); else if ("downloadarchive".equals(key)) convertDownloadArchive(val); else if ("source".equals(key)) convertSource(val); else if ("version".equals(key)) convertVersion(); else if ("repo".equals(key)) convertRepo(); else error("unknown variable '" + key + "'"); start = matcher.end(); } while(matcher.find(start)); buffer_.append(line, start, line.length()); return buffer_.toString(); } else return line; } private void convertLink(String param) { splitParam(param, false); if (paramPart2_ == null) paramPart2_ = paramPart1_; appendLink(paramPart1_, paramPart2_, true); } private void convertJavadoc(String param) { splitParam(param, false); if (paramPart2_ == null) { paramPart2_ = ClassUtil.cutPackageName(paramPart1_); paramPart2_ = paramPart2_.replace("#", ".").replace("*", "."); } String javadoc = paramPart1_.replace('.', '/'); javadoc = javadoc.replace('*', '.'); javadoc = javadoc.replace('$', ' '); String path; int hash = javadoc.indexOf('#'); if (hash >= 0) { path = javadoc.substring(0, hash) + ".html"; javadoc = javadoc.replace("#", ".html#"); } else { javadoc += ".html"; path = javadoc; } File javaDocFile = new File(javaDocDir_, "org/civilian/" + path); if (!javaDocFile.exists()) warning(javaDocFile.getAbsolutePath() + " not found"); String href = "javadoc/org/civilian/" + javadoc; appendLink(href, paramPart2_, "javadoc", true); } private void convertDownload(String param) { splitParam(param, false); if (paramPart2_ == null) paramPart2_ = param; appendLink(GITHUB_REPO_RELEASES_LATEST, paramPart2_, true); } private void convertDownloadFile(String param) { splitParam(param, false); String file; file = paramPart1_.replace("version", Version.VALUE); file = file.replace("civilian", "civilian-" + Version.VALUE); String text = paramPart2_ != null ? paramPart2_ : file; appendLink(GITHUB_REPO_RELEASES_DOWNLOAD_LATEST + file, text, true); } private void convertDownloadArchive(String param) { appendLink(GITHUB_REPO_RELEASES, param, true); } private void convertVersion() { buffer_.append(Version.VALUE); } private void convertRepo() { buffer_.append(GITHUB_REPO); } private void convertNavItem(String param) { splitParam(param, true); buffer_.append("<li"); if (paramPart1_.equals(parentFile_.getName())) buffer_.append(" class=\"active\""); buffer_.append("><a href=\""); buffer_.append(paramPart1_); buffer_.append('"'); buffer_.append(">"); buffer_.append(paramPart2_); buffer_.append("</a></li>"); } private void convertSource(String className) { boolean isSample = className.contains("samples"); String href = GITHUB_REPO + "blob/master/src/" + (isSample ? "samples" : "java") + "/" + className.replace('.', '/') + ".java"; appendLink(href, className, true); } private void appendLink(String href, String text, boolean external) { appendLink(href, text, external, external); } private void appendLink(String href, String text, boolean external, boolean blankTarget) { appendLink(href, text, external ? "extlink" : null, blankTarget); } private void appendLink(String href, String text, String classAttr, boolean blankTarget) { buffer_.append("<a"); appendAttr("href", href); if (blankTarget) appendAttr("target", "_blank"); if (classAttr != null) appendAttr("class", classAttr); buffer_.append(">"); buffer_.append(text); buffer_.append("</a>"); } private void appendAttr(String name, String value) { buffer_.append(" "); buffer_.append(name); buffer_.append("=\""); buffer_.append(value); buffer_.append("\""); } private void splitParam(String param, boolean needs2Parts) { int space = param.indexOf(' '); if (space != -1) { paramPart1_ = param.substring(0, space); paramPart2_ = param.substring(space + 1); } else if (needs2Parts) { error("param '" + param + "' needs two parts"); } else { paramPart1_ = param; paramPart2_ = null; } } private void error(String message) { throw new IllegalArgumentException(message + " (" + inputFile_.getName() + ", line " + (lineIndex_ + 1) + ")"); } private void warning(String message) { System.err.println(message + " (" + inputFile_.getName() + ", line " + (lineIndex_ + 1) + ")"); } private String paramPart1_; private String paramPart2_; private File parentFile_; private File inputFile_; private File javaDocDir_; private int lineIndex_; private StringBuilder buffer_ = new StringBuilder(); private static final Pattern VAR_PATTERN = Pattern.compile("\\{([a-z]+)\\:([^}]*)}"); }