JAL-4004 Now generating hugo files from help/markdown/...
[jalview.git] / utils / hugo / old_task_to_extract_markdown_from_old_releases_html.txt
1
2 def ulToList(Element ul, int indent) {
3   def list = ""
4   ul.children().each { e ->
5     if (e.tagName().toLowerCase() == "ul") {
6       list = list.stripTrailing() + "\n"
7       list += ulToList(e, indent+1)
8     } else if (e.tagName().toLowerCase() == "li") {
9       def issues = []
10       def issuesText = ""
11       def mdItem = "  " * indent + "- "
12       e.childNodes().any {n ->
13         if (n.nodeName().equals("#comment")) {
14           mdItem += "{{<comment>}}${n.getData()}{{</comment>}} "
15           issuesText = n.getData().trim()
16           issues = n.getData().trim().split(/[,\s]+/).findAll { it.startsWith("JAL-") }
17           return true
18         }
19       }
20       def safeText = issuesText.replaceAll('"', '\"')
21       def joinedIssues = issues.join(",")
22       def issuesLink = (issues.size() > 0) ?
23         " {{< jal issue=\"${joinedIssues}\" alt=\"${safeText}\" >}}"
24         : ""
25       def addedIssues = false
26       e.childNodes().each { node ->
27         if (node.nodeName().toLowerCase() == "ul") {
28           // add issues link before sub list if it's last
29           if (node.nextSibling() == null) {
30             mdItem += "${issuesLink}"
31             addedIssues = true
32           }
33           mdItem = mdItem.stripTrailing() + "\n"
34           mdItem += ulToList(node, indent+1)
35         } else if (node.nodeName() == "#text") {
36           mdItem += node.text()
37         } else if (node.nodeName().toLowerCase() == "strong") {
38           mdItem += "**${node.text()}**"
39         } else if (node.nodeName().toLowerCase() == "em") {
40           // if (true || (node.text().length() > 50 && node.text().count(" ") > 10) || (!node.nextSibling().text().startsWith("\\s*\\n"))) {
41             mdItem += "*${node.text()}*"
42           // } else {
43           //   mdItem += "### "+node.text()
44           // }
45         } else if (node.nodeName().toLowerCase() == "br") {
46           mdItem += "<br/>\n"
47         } else if (node.nodeName().toLowerCase() == "a") {
48           mdItem += "[${node.text()}](${node.attr('href')})"
49         }
50       }
51       if (!addedIssues) {
52         mdItem += issuesLink
53       }
54       list += mdItem.stripTrailing()+"\n"
55     } else if (e.tagName().toLowerCase() == "div") {
56       e.children().each { eee ->
57         list += ulToList(eee, indent)
58       }
59     } else if (e.tagName().toLowerCase() == "strong") {
60       list += "**${e.text()}**"
61     } else if (e.tagName().toLowerCase() == "em") {
62       if (e.text().length() > 50 && e.text().count(" ") > 20) {
63         list += "*${e.text()}*"
64       } else {
65         list += "\n\n### ${e.text()}\n\n"
66       }
67     }
68   }
69   return list
70 }
71
72 task hugoTemplates {
73   group "website"
74   description "Create partially populated md pages for hugo website build"
75
76   def hugoTemplatesDir = file("${jalviewDir}/${hugo_templates_dir}")
77   def hugoBuildDir = "${jalviewDir}/${hugo_build_dir}"
78   def templateFiles = fileTree(dir: hugoTemplatesDir)
79
80   doFirst {
81     // specific release template for version archive
82     def summary = "${applicationName} ${JALVIEW_VERSION}"
83     def changes = ""
84     def oldDate = null
85     if (CHANNEL == "RELEASE") {
86       def releasesHtmlFile = file("${helpSourceDir}/${releases_html}")
87       //HTMLPARSE
88       def html = releasesHtmlFile.text
89       def doc = Jsoup.parse(html)
90       def table = doc.select("table").first()
91       def headings = table.select("tr").first().select("th").collect { it.text() }
92       def releaseRow = null
93       def trs = table.select("tr")
94       trs.any { tr ->
95         def tds = tr.select("td")
96         if (tds.size() == 0)
97           return false
98         def releaseTd = tds.first()
99         if (releaseTd.text().startsWith("${JALVIEW_VERSION} ")) {
100           releaseRow = tr
101           return true
102         }
103       }
104
105       if (releaseRow != null && headings != null && headings.size() == 3) {
106         def releaseTd = releaseRow.select("td").first()
107         def spaceIndex = releaseTd.text().indexOf(" ")
108         if (spaceIndex >= 0) {
109           oldDate = new Date().parse("dd/MM/yyyy", releaseTd.text().substring(spaceIndex+1))
110         }
111         def releaseCells = releaseRow.select("td")
112         if (releaseCells.size() == 3) {
113           def title1 = headings[1]
114           def title2 = headings[2]
115
116           def lastDotIndex = JALVIEW_VERSION.lastIndexOf(".")
117           if (lastDotIndex > 0) {
118             try {
119               def patchRelease = JALVIEW_VERSION.substring(lastDotIndex+1) as Integer
120               def patchReleaseString = null
121               if (patchRelease == 0) {
122                   patchReleaseString = "first minor"
123               } else if (patchRelease == 1) {
124                   patchReleaseString = "first patch"
125               } else if (patchRelease == 2) {
126                   patchReleaseString = "second patch"
127               } else if (patchRelease == 3) {
128                   patchReleaseString = "third patch"
129               } else if (patchRelease == 4) {
130                   patchReleaseString = "fourth patch"
131               } else if (patchRelease == 5) {
132                   patchReleaseString = "fifth patch"
133               } else if (patchRelease == 6) {
134                   patchReleaseString = "sixth patch"
135               } else if (patchRelease == 7) {
136                   patchReleaseString = "seventh patch"
137               } else if (patchRelease > 13 && (patchRelease % 10 == 1)) {
138                   patchReleaseString += "st"
139               } else if (patchRelease > 13 && (patchRelease % 10 == 2)) {
140                   patchReleaseString += "nd"
141               } else if (patchRelease > 13 && (patchRelease % 10 == 3)) {
142                   patchReleaseString += "rd"
143               } else if (patchRelease != null) {
144                   patchReleaseString += "th"
145               }
146               summary += (patchReleaseString != null) ? " is the ${patchReleaseString} release in the ${JALVIEW_VERSION.substring(0,lastDotIndex)} series." : ""
147             } catch(Exception e) {
148               summary = ""
149             }
150           }
151
152           [1,2].each { col ->
153             def colChanges = ""
154             if (headings[col] != null && headings[col].size() > 0) {
155               releaseCells[col].children().each { e ->
156                 if (e.tagName().toLowerCase() == "ul" || e.tagName().toLowerCase() == "div") {
157                   if (colChanges != "") {
158                     colChanges = colChanges.stripTrailing() + "\n"
159                   }
160                   colChanges += ulToList(e, 0)
161                 } else if (e.tagName().toLowerCase() == "em") {
162                   colChanges += "\n\n### ${e.text()}\n\n"
163                 }
164               }
165             }
166             if (colChanges != "") {
167               def className = headings[col].replaceAll(" ","_").toLowerCase().replaceAll("[^_a-z]","")
168               changes += "<div class=\"${className}\">\n\n## ${headings[col]}\n\n${colChanges}\n</div>\n\n"
169             }
170           }
171
172           if (changes != "") {
173             changes = "<div class=\"release_notes\">\n\n${changes}\n\n</div>"
174           }
175         }
176       }
177     }
178
179     templateFiles.each{ templateFile ->
180       def newFileName = string(hugoTemplateSubstitutions(templateFile.getName()))
181       def relPath = hugoTemplatesDir.toPath().relativize(templateFile.toPath()).getParent()
182       def newRelPathName = hugoTemplateSubstitutions( relPath.toString() )
183
184       def outPathName = string("${hugoBuildDir}/$newRelPathName")
185       
186       copy {
187         from templateFile
188         rename(templateFile.getName(), newFileName)
189         into outPathName
190       }
191
192       def newFile = file("${outPathName}/${newFileName}".toString())
193       def content = newFile.text
194       // summary in version archive release pages only appears from 2.10.2b2 onwards
195       if (oldDate.format("yyyy") as Integer >= 2019 || JALVIEW_VERSION.startsWith("2.10")) {
196         def summaryFile = file("${jalviewDir}/${whatsnew_dir}/whatsnew-${JALVIEW_VERSION_UNDERSCORES}.md")
197         if (summaryFile.exists()) {
198           summary = summaryFile.text
199         } else {
200           summary = ""
201         }
202         content = content.replaceAll("__SUMMARY__", summary)
203       } else {
204         content = content.replaceAll("__SUMMARY__", "")
205       }
206       content = content.replaceAll("__CHANGES__", changes)
207       if (oldDate != null) {
208         if (oldDate[java.util.Calendar.YEAR] < 90) {
209           oldDate[java.util.Calendar.YEAR] += 2000
210         }
211         content = content.replaceAll("__DATE__", oldDate.format("yyyy-MM-dd"))
212       }
213       newFile.text = hugoTemplateSubstitutions(content)
214     }
215   }
216
217   inputs.dir(hugoTemplatesDir)
218   inputs.property("JALVIEW_VERSION", { JALVIEW_VERSION })
219   inputs.property("CHANNEL", { CHANNEL })
220 }
221