Skip to content

Instantly share code, notes, and snippets.

@gregopet
Last active August 29, 2015 14:00
Show Gist options
  • Save gregopet/11254861 to your computer and use it in GitHub Desktop.
Save gregopet/11254861 to your computer and use it in GitHub Desktop.
A very simple script that merges api docs from Groovy's GDK and Oracle's JDK using Geb
/**
* This script merges HTML from Groovy GDK docs with Oracle's Javadocs in a (stupid) straightforward way.
* It's meant as half joke, half GEB exercise.
*/
@Grab(group='org.seleniumhq.selenium', module='selenium-api', version='2.14.0')
@Grab(group='org.seleniumhq.selenium', module='selenium-htmlunit-driver', version='2.14.0')
@Grab(group='org.codehaus.geb', module='geb-core', version='0.7.2')
import geb.Browser
enum Section {
METHODS, CONSTRUCTORS, FIELDS
}
class DocMethod {
String indexHtml
String descriptionHtml
String methodName
Section section
}
/**
* Extracts the table row descriptor of an item (method/constructor/field) as well as
* the longer descriptor block. Works for both Groovy and Java doc pages.
*/
def extractItems(js, table, definitions, section) {
table.find('tr').findResults { row ->
def methodName = row.find('td strong a, td b a').text()
if (methodName) {
def href = row.find('td strong a, td b a').@href
def hrefLocal = href.substring(href.indexOf('#') + 1)
def methodDescriptionA = definitions.find('a', name: hrefLocal)
def descriptionHtml = outerHTML(js, methodDescriptionA) + outerHTML(js, methodDescriptionA.nextUntil("a"))
return new DocMethod(indexHtml: outerHTML(js, row), descriptionHtml: descriptionHtml, methodName: methodName, section: section)
}
}
}
/**
* Uses Javascript to reliably get the outer HTML of an element.
*/
def outerHTML(js, element) {
element.allElements().collect {
js.exec(it, "return arguments[0].outerHTML;")
}.join('')
}
/**
* Creates an HTML page from the description and items (methods, constructors..)
*/
def pageAsHTML(className, description, items) {
def html = new StringBuilder()
def groupedItems = items.groupBy { it.section }
def categories = groupedItems.keySet().toArray().sort { it.toString() }
//print out results!
html << "<html>"
html << """
<style type='text/css'>
/*td {
border: 1px solid black;
}*/
tr:nth-child(odd) td { background-color: #CCC;}
th { text-weight: bold; background-color: #DEE3E9; }
</style>
"""
html << "<body>"
html << "<h1>${className}</h1>"
html << description
categories.each { category ->
html << "<h2>${category}</h2>"
html << "<table>"
if (category == Section.CONSTRUCTORS) {
html << "<tr><th>Constructor and Description</th></tr>"
} else {
html << "<tr><th>Modifier and Type</th><th>Description</th></tr>"
}
groupedItems[category].sort{it.methodName}.each {
html << it.indexHtml
}
html << "</table>"
}
categories.each { category ->
html << "<h2>${category}</h2>"
groupedItems[category].sort{it.methodName}.each {
html << it.descriptionHtml
}
}
html << "</body></html>"
return html.toString()
}
/**
* Get both JDK and GDK apidocs and merge them, save to file
*/
def mergeDocPages(String className) {
def items = []
def description = ""
Browser.drive {
driver.javascriptEnabled = true
go "http://groovy.codehaus.org/groovy-jdk/" + className.tr('.', '/') + '.html'
items += extractItems(js, $('table'),$('body'),Section.METHODS)
go "http://docs.oracle.com/javase/7/docs/api/" + className.tr('.', '/') + '.html'
description = outerHTML(js, $('div.description'))
items += extractItems(js, $('table', summary: startsWith("Constructor")), $('div.details ul.blockList li.blockList'), Section.CONSTRUCTORS)
items += extractItems(js, $('table', summary: startsWith("Field")), $('div.details ul.blockList li.blockList'), Section.FIELDS)
items += extractItems(js, $('table', summary: startsWith("Method")), $('div.details ul.blockList li.blockList'), Section.METHODS)
}
def fileName = className.substring(className.lastIndexOf('.') + 1) + ".html"
new File(fileName).text = pageAsHTML(className, description, items)
println "Saved " + fileName
}
//GO
mergeDocPages("java.util.AbstractCollection")
mergeDocPages("java.util.AbstractMap")
mergeDocPages("java.lang.Appendable")
mergeDocPages("java.math.BigDecimal")
mergeDocPages("java.math.BigInteger")
mergeDocPages("java.util.BitSet")
mergeDocPages("java.util.concurrent.BlockingQueue")
mergeDocPages("java.lang.Boolean")
mergeDocPages("java.io.BufferedReader")
mergeDocPages("java.io.BufferedWriter")
mergeDocPages("javax.swing.ButtonGroup")
//mergeDocPages("java.lang.Byte[]")
mergeDocPages("java.util.Calendar")
mergeDocPages("java.lang.CharSequence")
mergeDocPages("java.lang.Character")
mergeDocPages("java.lang.Class")
mergeDocPages("java.lang.ClassLoader")
mergeDocPages("java.util.Collection")
mergeDocPages("java.lang.Comparable")
mergeDocPages("java.awt.Container")
mergeDocPages("java.io.DataInputStream")
mergeDocPages("java.util.Date")
mergeDocPages("java.sql.Date")
mergeDocPages("javax.swing.DefaultComboBoxModel")
mergeDocPages("javax.swing.DefaultListModel")
mergeDocPages("javax.swing.tree.DefaultMutableTreeNode")
mergeDocPages("javax.swing.table.DefaultTableModel")
mergeDocPages("java.lang.Double")
mergeDocPages("org.w3c.dom.Element")
mergeDocPages("java.lang.Enum")
mergeDocPages("java.util.Enumeration")
mergeDocPages("java.io.File")
mergeDocPages("java.lang.Float")
mergeDocPages("java.io.InputStream")
mergeDocPages("java.lang.Integer")
mergeDocPages("java.lang.Iterable")
mergeDocPages("java.util.Iterator")
mergeDocPages("javax.swing.JComboBox")
mergeDocPages("javax.swing.JMenu")
mergeDocPages("javax.swing.JMenuBar")
mergeDocPages("javax.swing.JPopupMenu")
mergeDocPages("javax.swing.JTabbedPane")
mergeDocPages("javax.swing.JToolBar")
mergeDocPages("java.util.List")
mergeDocPages("javax.swing.ListModel")
mergeDocPages("java.lang.Long")
mergeDocPages("java.util.Map")
mergeDocPages("java.util.regex.Matcher")
mergeDocPages("javax.swing.MutableComboBoxModel")
mergeDocPages("javax.swing.tree.MutableTreeNode")
mergeDocPages("org.w3c.dom.NodeList")
mergeDocPages("java.lang.Number")
mergeDocPages("java.lang.Object")
mergeDocPages("java.io.ObjectInputStream")
mergeDocPages("java.io.ObjectOutputStream")
//mergeDocPages("java.lang.Object[]")
mergeDocPages("java.io.OutputStream")
mergeDocPages("java.util.regex.Pattern")
mergeDocPages("java.io.PrintStream")
mergeDocPages("java.io.PrintWriter")
mergeDocPages("java.lang.Process")
mergeDocPages("java.io.Reader")
mergeDocPages("java.util.ResourceBundle")
mergeDocPages("java.sql.ResultSet")
mergeDocPages("java.sql.ResultSetMetaData")
mergeDocPages("java.net.ServerSocket")
mergeDocPages("java.util.Set")
mergeDocPages("java.net.Socket")
mergeDocPages("java.util.SortedMap")
mergeDocPages("java.util.SortedSet")
mergeDocPages("java.lang.String")
mergeDocPages("java.lang.StringBuffer")
mergeDocPages("java.lang.StringBuilder")
//mergeDocPages("java.lang.String[]")
mergeDocPages("javax.swing.table.TableColumnModel")
mergeDocPages("javax.swing.table.TableModel")
mergeDocPages("java.lang.Thread")
mergeDocPages("java.util.Timer")
mergeDocPages("java.sql.Timestamp")
mergeDocPages("javax.swing.tree.TreeNode")
mergeDocPages("javax.swing.tree.TreePath")
mergeDocPages("java.net.URL")
mergeDocPages("java.io.Writer")
//mergeDocPages("primitive-types.boolean[]")
//mergeDocPages("primitive-types.byte[]")
//mergeDocPages("primitive-types.char[]")
//mergeDocPages("primitive-types.double")
//mergeDocPages("primitive-types.double[]")
//mergeDocPages("primitive-types.float")
//mergeDocPages("primitive-types.float[]")
//mergeDocPages("primitive-types.int[]")
//mergeDocPages("primitive-types.long")
//mergeDocPages("primitive-types.long[]")
//mergeDocPages("primitive-types.short[]")
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment