class Code2HTMLConverter : Component(), Injectable { fun convertCode(code : String) : String { var s = code s = s.replace("\t", " ") s = s.replace("<", "<") s = s.replace(">", ">") if( s.contains("\r\n") ) { // win s = s.lines().fold("") { result, elem -> result + formatLeadingSpaces(elem) + "\r\n" } s = s.replace("\r\n", "
\r\n") } else { // mac, linux s = s.lines().fold("") { result, elem -> result + formatLeadingSpaces(elem) + "\n" } s = s.replace("\n", "
\n", true) } return s } fun formatLeadingSpaces(input : String) : String { var retval = "" val numSpaces = calcNumSpaces( input ) (0..numSpaces-1).forEach { retval += " " } retval += input.trimStart() return retval } fun calcNumSpaces(input : String ) : Int { var retval = 0 val r = Regex("^([ ]+)").find( input ) if( r != null ) { retval = r.value.length } return retval } } class Code2HTMLViewModel : ViewModel() { val converter : Code2HTMLConverter by inject() val code = SimpleStringProperty() val html = SimpleStringProperty() fun convertCode() { html.set( converter.convertCode(code.get()) ) } } class Code2HTMLView : View("Code2HTML") { val viewModel : Code2HTMLViewModel by inject() override val root = tabpane { tab("Code") { textarea(viewModel.code) } tab("HTML") { textarea(viewModel.html) { isEditable = false } } selectionModel.selectedItemProperty().addListener { observableValue, ov, nv -> if (nv.text == "HTML") { viewModel.convertCode() } } } } class Code2HTMLApp : App(Code2HTMLView::class) { override fun createPrimaryScene(view: UIComponent) = Scene(view.root, 736.0, 414.0) }