}
}
-def hugoTemplateSubstitutions(String input) {
+def hugoTemplateSubstitutions(String input, Map extras=null) {
+ def replacements = [
+ DATE: getDate("yyyy-MM-dd"),
+ CHANNEL: propertiesChannelName,
+ APPLICATION_NAME: applicationName,
+ GIT_HASH: gitHash,
+ GIT_BRANCH: gitBranch,
+ VERSION: JALVIEW_VERSION,
+ JAVA_VERSION: JAVA_VERSION,
+ VERSION_UNDERSCORES: JALVIEW_VERSION_UNDERSCORES
+ ]
def output = input
- output = output.replaceAll("__DATE__", getDate("yyyy-MM-dd"))
- output = output.replaceAll("__CHANNEL__", propertiesChannelName)
- output = output.replaceAll("__APPLICATION_NAME__", applicationName)
- output = output.replaceAll("__GIT_HASH__", gitHash)
- output = output.replaceAll("__GIT_BRANCH__", gitBranch)
- output = output.replaceAll("__VERSION__", JALVIEW_VERSION)
- output = output.replaceAll("__JAVA_VERSION__", JAVA_VERSION)
- output = output.replaceAll("__VERSION_UNDERSCORES__", JALVIEW_VERSION_UNDERSCORES)
- return output
-}
-
-def ulToList(Element ul, int indent) {
- def list = ""
- ul.children().each { e ->
- if (e.tagName().toLowerCase() == "ul") {
- list += "\n"
- list += ulToList(e, indent+1)
- } else if (e.tagName().toLowerCase() == "li") {
- def issues = []
- def mdItem = " " * indent + "- "
- e.childNodes().any {n ->
- if (n.nodeName().equals("#comment")) {
- mdItem += "${n} "
- issues = n.getData().trim().split(/[,\s]+/)
- return true
- }
- }
- def issuesLink = (issues.size() > 0) ?
- " {{< jal issue=\"${issues.join(",")}\" >}}"
- : ""
- def addedIssues = false
- e.childNodes().each { node ->
- if (node.nodeName().toLowerCase() == "ul") {
- // add issues link before sub list
- mdItem += "${issuesLink}\n"
- addedIssues = true
- mdItem += ulToList(e, indent+1)
- } else if (node.nodeName() == "#text") {
- mdItem += node.text()
- }
- }
- if (!addedIssues) {
- mdItem += issuesLink
- }
- list += "${mdItem}\n"
+ if (extras != null) {
+ extras.each{ k, v ->
+ output = output.replaceAll("__${k}__", ((v == null)?"":v))
}
}
- return list
+ replacements.each{ k, v ->
+ output = output.replaceAll("__${k}__", ((v == null)?"":v))
+ }
+ return output
}
task hugoTemplates {
def hugoTemplatesDir = file("${jalviewDir}/${hugo_templates_dir}")
def hugoBuildDir = "${jalviewDir}/${hugo_build_dir}"
def templateFiles = fileTree(dir: hugoTemplatesDir)
+ def releaseMdFile = file("${jalviewDir}/${releases_dir}/release-${JALVIEW_VERSION_UNDERSCORES}.md")
+ def whatsnewMdFile = file("${jalviewDir}/${whatsnew_dir}/whatsnew-${JALVIEW_VERSION_UNDERSCORES}.md")
+ def releaseTemplateFile = file("${jalviewDir}/${releases_template}")
+ def releasesTemplateFile = file("${jalviewDir}/${releases_template}")
+ def whatsnewTemplateFile = file("${jalviewDir}/${whatsnew_template}")
doFirst {
// specific release template for version archive
- def summary = "${applicationName} ${JALVIEW_VERSION}"
def changes = ""
- def oldDate = null
+ def whatsnew = null
+ def givenDate = null
+ def givenChannel = null
+ def givenVersion = null
if (CHANNEL == "RELEASE") {
def releasesHtmlFile = file("${helpSourceDir}/${releases_html}")
- //HTMLPARSE
- def html = releasesHtmlFile.text
- def doc = Jsoup.parse(html)
- def table = doc.select("table").first()
- def headings = table.select("tr").first().select("th").collect { it.text() }
- def releaseRow = null
- def trs = table.select("tr")
- trs.any { tr ->
- def tds = tr.select("td")
- if (tds.size() == 0)
- return false
- def releaseTd = tds.first()
- if (releaseTd.text().startsWith("${JALVIEW_VERSION} ")) {
- releaseRow = tr
- return true
+ //MD_PARSE
+ if (releaseMdFile.exists()) {
+ def inFrontMatter = false
+ def itemComment = null
+ def firstLine = true
+ releaseMdFile.eachLine { line ->
+ if (line.matches("---")) {
+ def prev = inFrontMatter
+ inFrontMatter = firstLine
+ if (inFrontMatter != prev)
+ return
+ }
+ if (inFrontMatter) {
+ def m = null
+ if (m = line =~ /^date:\s*([0-9\-]+)/) {
+ givenDate = new Date().parse("yyyy-MM-dd", m[0][1])
+ } else if (m = line =~ /^channel:\s*(\S+)/) {
+ givenChannel = m[0][1]
+ } else if (m = line =~ /^version:\s*(\S+)/) {
+ givenVersion = m[0][1]
+ }
+ } else {
+ changes += line+"\n"
+ }
+ firstLine = false
}
+ if (givenVersion != null && givenVersion != JALVIEW_VERSION) {
+ throw new GradleException("'version' header (${givenVersion}) found in ${releaseMdFile} does not match JALVIEW_VERSION (${JALVIEW_VERSION})")
+ }
+ if (whatsnewMdFile.exists()) {
+ whatsnew = whatsnewMdFile.text
+ }
+ def content = releaseMdFile.text
}
+ }
- if (releaseRow != null && headings != null && headings.size() == 3) {
- def releaseTd = releaseRow.select("td").first()
- def spaceIndex = releaseTd.text().indexOf(" ")
- if (spaceIndex >= 0) {
- oldDate = new Date().parse("dd/MM/yyyy", releaseTd.text().substring(spaceIndex+1))
- }
- def releaseCells = releaseRow.select("td")
- if (releaseCells.size() == 3) {
- def title1 = headings[1]
- def title2 = headings[2]
-
- def lastDotIndex = JALVIEW_VERSION.lastIndexOf(".")
- if (lastDotIndex > 0) {
- def patchRelease = JALVIEW_VERSION.substring(lastDotIndex+1) as Integer
- def patchReleaseString = null
- if (patchRelease == 0) {
- patchReleaseString = "first minor"
- } else if (patchRelease == 1) {
- patchReleaseString = "first patch"
- } else if (patchRelease == 2) {
- patchReleaseString = "second patch"
- } else if (patchRelease == 3) {
- patchReleaseString = "third patch"
- } else if (patchRelease == 4) {
- patchReleaseString = "fourth patch"
- } else if (patchRelease == 5) {
- patchReleaseString = "fifth patch"
- } else if (patchRelease == 6) {
- patchReleaseString = "sixth patch"
- } else if (patchRelease == 7) {
- patchReleaseString = "seventh patch"
- } else if (patchRelease > 13 && (patchRelease % 10 == 1)) {
- patchReleaseString += "st"
- } else if (patchRelease > 13 && (patchRelease % 10 == 2)) {
- patchReleaseString += "nd"
- } else if (patchRelease > 13 && (patchRelease % 10 == 3)) {
- patchReleaseString += "rd"
- } else if (patchRelease != null) {
- patchReleaseString += "th"
- }
- summary += (patchReleaseString != null) ? " is the ${patchReleaseString} release in the ${JALVIEW_VERSION.substring(0,lastDotIndex)} series." : ""
+ def changesHugo = null
+ if (changes != null) {
+ changesHugo = '<div class="release_notes">\n\n'
+ def inSection = false
+ changes.eachLine { line ->
+ def m = null
+ if (m = line =~ /^##([^#].*)$/) {
+ if (inSection) {
+ changesHugo += "</div>\n\n"
}
-
- [1,2].each { col ->
- if (headings[col] != null && headings[col].size() > 0) {
- def noheadings = true
- releaseCells[col].children().each { e ->
- if (e.tagName().toLowerCase() == "ul") {
- def list = ulToList(e, 0)
- if (noheadings && list != "") {
- changes += "\n### ${headings[col]}\n\n"
- noheadings = false
- }
- changes += list
- } else if (e.tagName().toLowerCase() == "em") {
- changes += "\n#### ${e.text()}\n\n"
- noheadings = false
- }
- }
- }
+ def section = m[0][1].trim()
+ section = section.toLowerCase()
+ section = section.replaceAll(/ +/, "_")
+ section = section.replaceAll(/[^a-z0-9_\-]/, "")
+ changesHugo += "<div class=\"${section}\">\n\n"
+ inSection = true
+ } else if (m = line =~ /^(\s*-\s*)<!--([^>]+)-->(.*)/) {
+ def comment = m[0][2].trim()
+ if (comment != "") {
+ comment = comment.replaceAll('"', """)
+ def issuekeys = []
+ comment.eachMatch(/JAL-\d+/) { jal -> issuekeys += jal }
+ def newline = m[0][1]
+ if (comment.trim() != "")
+ newline += "{{<comment>}}${comment}{{</comment>}} "
+ newline += m[0][3].trim()
+ if (issuekeys.size() > 0)
+ newline += " {{< jal issue=\"${issuekeys.join(",")}\" alt=\"${comment}\" >}}"
+ line = newline
}
-
-
}
+ changesHugo += line+"\n"
+ }
+ if (inSection) {
+ changesHugo += "\n</div>\n\n"
}
+ changesHugo += '</div>'
}
templateFiles.each{ templateFile ->
def newRelPathName = hugoTemplateSubstitutions( relPath.toString() )
def outPathName = string("${hugoBuildDir}/$newRelPathName")
-
+
copy {
from templateFile
rename(templateFile.getName(), newFileName)
def newFile = file("${outPathName}/${newFileName}".toString())
def content = newFile.text
- content = content.replaceAll("__SUMMARY__", summary)
- content = content.replaceAll("__CHANGES__", changes)
- if (oldDate != null) {
- content = content.replaceAll("__DATE__", oldDate.format("yyyy-MM-dd"))
- }
- newFile.text = hugoTemplateSubstitutions(content)
+ newFile.text = hugoTemplateSubstitutions(content,
+ [
+ WHATSNEW: whatsnew,
+ CHANGES: changesHugo,
+ DATE: givenDate.format("yyyy-MM-dd")
+ ]
+ )
}
+
}
inputs.dir(hugoTemplatesDir)
+ inputs.file(releaseTemplateFile)
+ inputs.file(releasesTemplateFile)
+ inputs.file(whatsnewTemplateFile)
inputs.property("JALVIEW_VERSION", { JALVIEW_VERSION })
inputs.property("CHANNEL", { CHANNEL })
}