Last active
August 29, 2015 14:00
-
-
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 file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* 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