import java.text.NumberFormat class TextRenderer { static final COLUMN_WIDTH = 15 private _text private f = NumberFormat.getInstance() def TextRenderer(counter) { _text = render(counter.project) } def render() { _text } protected render(project) { def sw = new StringWriter() def out = new PrintWriter(sw) out.println "Overall Project" writeHeaders(out) out.println "-".multiply(COLUMN_WIDTH * 5) out.println "${padRight('Paths')}${padLeft(f.format(project.pathCount))}" out.println "${padRight('Directories')}${padLeft(f.format(project.directoryCount))}" out.println "${padRight('Files')}${padLeft(f.format(project.fileCount))}${padLeft(f.format(project.lineCount))}${padLeft(f.format(project.realLineCount))}${padLeft(f.format(project.byteCount))}" renderTypeBreakdown(out, project) if (project.paths.size() > 1) { project.paths.each({ path -> out.println "" out.println "Path: ${path.path}" writeHeaders(out) out.println "-".multiply(COLUMN_WIDTH * 5) out.println "${padRight('Directories')}${padLeft(f.format(path.directoryCount))}" out.println "${padRight('Files')}${padLeft(f.format(path.fileCount))}${padLeft(f.format(path.lineCount))}${padLeft(f.format(path.realLineCount))}${padLeft(f.format(path.byteCount))}" renderTypeBreakdown(out, path) }) } sw.toString() } protected renderTypeBreakdown(out, item) { [text: item.textFiles, binary: item.binaryFiles].each({ key, value -> def isText = key == "text" buildAttributes(out, " ", key, value, isText) new TreeMap(value.groupBy({ it.extension })).each({k, v -> buildAttributes(out, " ", k, v, isText) }) }) } protected buildAttributes(out, indent, key, items, includeLineCount) { out.print "${padRight(indent + key)}${padLeft(f.format(items.size()))}" if (includeLineCount) { out.print "${padLeft(f.format(items.sum(0, { it.lineCount })))}" out.print "${padLeft(f.format(items.sum(0, { it.realLineCount })))}" } else { out.print " ".multiply(COLUMN_WIDTH * 2) } out.println "${padLeft(f.format(items.sum(0, { it.byteCount })))}" } protected writeHeaders(out) { out.println "${' '.multiply(COLUMN_WIDTH)}${padLeft('Count')}${padLeft('All Lines')}${padLeft('Real Lines')}${padLeft('Bytes')}" } protected padRight(s) { ("" + s).padRight(COLUMN_WIDTH) } def padLeft(s) { ("" + s).padLeft(COLUMN_WIDTH) } }