RosettaCodeData/Task/Align-columns/Kotlin/align-columns.kotlin

64 lines
2.2 KiB
Text
Raw Permalink Normal View History

2015-11-18 06:14:39 +00:00
import java.nio.charset.StandardCharsets
import java.nio.file.Files
import java.nio.file.Paths
2017-09-23 10:01:46 +02:00
enum class AlignFunction {
2016-12-05 22:15:40 +01:00
LEFT { override fun invoke(s: String, l: Int) = ("%-" + l + 's').format(("%" + s.length + 's').format(s)) },
RIGHT { override fun invoke(s: String, l: Int) = ("%-" + l + 's').format(("%" + l + 's').format(s)) },
CENTER { override fun invoke(s: String, l: Int) = ("%-" + l + 's').format(("%" + ((l + s.length) / 2) + 's').format(s)) };
2015-11-18 06:14:39 +00:00
2016-12-05 22:15:40 +01:00
abstract operator fun invoke(s: String, l: Int): String
2015-11-18 06:14:39 +00:00
}
/** Aligns fields into columns, separated by "|".
* @constructor Initializes columns aligner from lines in a list of strings.
* @property lines Lines in a single string. Empty string does form a column.
*/
2017-09-23 10:01:46 +02:00
class ColumnAligner(val lines: List<String>) {
operator fun invoke(a: AlignFunction) : String {
2016-12-05 22:15:40 +01:00
var result = ""
2015-11-18 06:14:39 +00:00
for (lineWords in words) {
for (i in lineWords.indices) {
if (i == 0)
2016-12-05 22:15:40 +01:00
result += '|'
result += a(lineWords[i], column_widths[i])
result += '|'
2015-11-18 06:14:39 +00:00
}
2016-12-05 22:15:40 +01:00
result += '\n'
2015-11-18 06:14:39 +00:00
}
2016-12-05 22:15:40 +01:00
return result
2015-11-18 06:14:39 +00:00
}
private val words = arrayListOf<Array<String>>()
private val column_widths = arrayListOf<Int>()
init {
2016-12-05 22:15:40 +01:00
lines.forEach {
2015-11-18 06:14:39 +00:00
val lineWords = java.lang.String(it).split("\\$")
words += lineWords
2017-09-23 10:01:46 +02:00
for (i in lineWords.indices) {
if (i >= column_widths.size) {
2016-12-05 22:15:40 +01:00
column_widths += lineWords[i].length
2017-09-23 10:01:46 +02:00
} else {
2016-12-05 22:15:40 +01:00
column_widths[i] = Math.max(column_widths[i], lineWords[i].length)
2017-09-23 10:01:46 +02:00
}
}
2015-11-18 06:14:39 +00:00
}
}
}
fun main(args: Array<String>) {
2017-09-23 10:01:46 +02:00
if (args.isEmpty()) {
2015-11-18 06:14:39 +00:00
println("Usage: ColumnAligner file [L|R|C]")
2017-09-23 10:01:46 +02:00
return
}
val ca = ColumnAligner(Files.readAllLines(Paths.get(args[0]), StandardCharsets.UTF_8))
val alignment = if (args.size >= 2) args[1] else "L"
when (alignment) {
"L" -> print(ca(AlignFunction.LEFT))
"R" -> print(ca(AlignFunction.RIGHT))
"C" -> print(ca(AlignFunction.CENTER))
else -> System.err.println("Error! Unknown alignment: " + alignment)
2015-11-18 06:14:39 +00:00
}
}