diff --git a/src/main/kotlin/com/lanyuanxiaoyao/bookstore/Helper.kt b/src/main/kotlin/com/lanyuanxiaoyao/bookstore/Helper.kt index c79b5b0..ca57717 100644 --- a/src/main/kotlin/com/lanyuanxiaoyao/bookstore/Helper.kt +++ b/src/main/kotlin/com/lanyuanxiaoyao/bookstore/Helper.kt @@ -5,6 +5,14 @@ data class PageResponse( val total: Long, ) +data class MapResponse( + val data: Map, +) + +data class ListResponse( + val data: List +) + data class SingleResponse( val data: Map, ) { diff --git a/src/main/kotlin/com/lanyuanxiaoyao/bookstore/Optimization.kt b/src/main/kotlin/com/lanyuanxiaoyao/bookstore/Optimization.kt new file mode 100644 index 0000000..f7c9022 --- /dev/null +++ b/src/main/kotlin/com/lanyuanxiaoyao/bookstore/Optimization.kt @@ -0,0 +1,103 @@ +package com.lanyuanxiaoyao.bookstore + +import cn.hutool.core.convert.Convert +import com.fasterxml.jackson.databind.JsonNode +import com.lanyuanxiaoyao.bookstore.Optimization.ArgumentType.LIST +import com.lanyuanxiaoyao.bookstore.Optimization.ArgumentType.MAP +import com.lanyuanxiaoyao.bookstore.Optimization.ArgumentType.NONE + +// @Configuration +// class ProcessorConfiguration { +// @Bean +// fun processors(): Map = listOf( +// CharWidthProcessor() +// ).associateBy { it.javaClass.name } +// } + +interface Optimization { + companion object { + fun process(root: JsonNode, optimizationMap: Map): List { + val text = root.get("text").asText() + val nodes = root.get("optimizations") ?: emptyList() + var lines = listOf(text) + for (node in nodes) { + val type = node.get("type").asText() + val optimization = optimizationMap[type] ?: throw IllegalArgumentException("Unknown optimization type: $type") + lines = when (optimization.argumentType()) { + NONE -> optimization.handle(lines, Unit) + LIST -> optimization.handle(lines, node.get("argument").map { it.asText() }) + MAP -> optimization.handle(lines, + node + .get("argument") + .fields() + .asSequence() + .map { (k, v) -> k to v.asText() } + .toMap() + ) + } + } + return lines + } + } + + enum class ArgumentType { + NONE, LIST, MAP + } + + fun key(): String + fun name(): String + fun handle(line: List, argument: Any): List + fun argumentType(): ArgumentType +} + +class SliceOptimization() : Optimization { + override fun key(): String = "slice-${argumentType()}" + + override fun name(): String = "切分" + + override fun handle(line: List, argument: Any): List { + val keys = argument as List + var result = line + for (key in keys) { + result = result.flatMap { it.split(key) } + } + return result + } + + override fun argumentType(): Optimization.ArgumentType = Optimization.ArgumentType.LIST +} + +abstract class AbstractOptimization(private val key: String, private val name: String) : Optimization { + override fun key(): String = "${key}-${argumentType()}" + override fun name(): String = name + + override fun handle(line: List, argument: Any): List { + return line.map { handle(it, argument) } + } + + override fun argumentType(): Optimization.ArgumentType = Optimization.ArgumentType.NONE + + abstract fun handle(line: String, argument: Any): String +} + +class TrimOptimization : AbstractOptimization("trim", "移除前后空白") { + override fun handle(line: String, argument: Any): String { + if (line.isBlank()) return line + return line.trim() + } +} + +class CharWidthOptimization : AbstractOptimization("char-width", "半角字符转全角字符") { + override fun handle(line: String, argument: Any): String { + if (line.isBlank()) return line + return Convert + .toDBC(line) + .replace(",", ",") + .replace("?", "?") + .replace("!", "!") + .replace(";", ";") + .replace(":", ":") + .replace("(", "(") + .replace(")", ")") + } +} diff --git a/src/main/kotlin/com/lanyuanxiaoyao/bookstore/Processor.kt b/src/main/kotlin/com/lanyuanxiaoyao/bookstore/Processor.kt deleted file mode 100644 index 89b6fab..0000000 --- a/src/main/kotlin/com/lanyuanxiaoyao/bookstore/Processor.kt +++ /dev/null @@ -1,52 +0,0 @@ -package com.lanyuanxiaoyao.bookstore - -import cn.hutool.core.convert.Convert - -// @Configuration -// class ProcessorConfiguration { -// @Bean -// fun processors(): Map = listOf( -// CharWidthProcessor() -// ).associateBy { it.javaClass.name } -// } - -interface Slicer { - fun slice(text: String): List -} - -open class RegexSlicer(private val regex: Regex) : Slicer { - override fun slice(text: String): List { - return text.split(regex) - } -} - -interface Optimization { - fun handle(line: String): String -} - -class TrimOptimization : Optimization { - override fun handle(line: String): String { - if (line.isBlank()) return line - return line.trim() - } -} - -class CharWidthOptimization : Optimization { - override fun handle(line: String): String { - if (line.isBlank()) return line - return Convert.toDBC(line) - } -} - -class QuoteCovertChineseOptimization : Optimization { - override fun handle(line: String): String { - return line - .replace(",", ",") - .replace("?", "?") - .replace("!", "!") - .replace(";", ";") - .replace(":", ":") - .replace("(", "(") - .replace(")", ")") - } -} diff --git a/src/main/kotlin/com/lanyuanxiaoyao/bookstore/controller/OptimizationController.kt b/src/main/kotlin/com/lanyuanxiaoyao/bookstore/controller/OptimizationController.kt new file mode 100644 index 0000000..affa98d --- /dev/null +++ b/src/main/kotlin/com/lanyuanxiaoyao/bookstore/controller/OptimizationController.kt @@ -0,0 +1,46 @@ +package com.lanyuanxiaoyao.bookstore.controller + +import com.fasterxml.jackson.databind.ObjectMapper +import com.lanyuanxiaoyao.bookstore.CharWidthOptimization +import com.lanyuanxiaoyao.bookstore.ListResponse +import com.lanyuanxiaoyao.bookstore.Optimization +import com.lanyuanxiaoyao.bookstore.Optimization.ArgumentType.LIST +import com.lanyuanxiaoyao.bookstore.Optimization.ArgumentType.MAP +import com.lanyuanxiaoyao.bookstore.Optimization.ArgumentType.NONE +import com.lanyuanxiaoyao.bookstore.SingleResponse +import com.lanyuanxiaoyao.bookstore.SliceOptimization +import com.lanyuanxiaoyao.bookstore.TrimOptimization +import java.awt.SystemColor.text +import org.slf4j.LoggerFactory +import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder +import org.springframework.web.bind.annotation.GetMapping +import org.springframework.web.bind.annotation.PostMapping +import org.springframework.web.bind.annotation.RequestBody +import org.springframework.web.bind.annotation.RequestMapping +import org.springframework.web.bind.annotation.RestController + +@RestController +@RequestMapping("optimization") +class OptimizationController(builder: Jackson2ObjectMapperBuilder) { + private val log = LoggerFactory.getLogger(javaClass) + + private val mapper: ObjectMapper = builder.build() + private val optimizations: List = listOf( + SliceOptimization(), + TrimOptimization(), + CharWidthOptimization(), + ) + private val optimizationMap: Map = optimizations.associateBy { it.key() } + + @GetMapping("optimizations") + fun optimizations(): ListResponse { + return ListResponse(optimizations.map { mapOf("value" to it.key(), "label" to it.name()) }) + } + + @PostMapping("execute") + fun execute(@RequestBody json: String): SingleResponse { + val root = mapper.readTree(json) + val lines = Optimization.process(root, optimizationMap) + return SingleResponse(lines.joinToString("\n")) + } +} \ No newline at end of file diff --git a/src/main/resources/static/components/helper.js b/src/main/resources/static/components/helper.js index eec46d9..4e93db2 100644 --- a/src/main/resources/static/components/helper.js +++ b/src/main/resources/static/components/helper.js @@ -36,3 +36,11 @@ function paginationOption() { total: '${total}' } } + +function arrayInCheck(array, field) { + return `\${ARRAYINCLUDES(['${array.join("','")}'], ${field})}` +} + +function arrayOutCheck(array, field) { + return `\${!ARRAYINCLUDES(['${array.join("','")}'], ${field})}` +} diff --git a/src/main/resources/static/index.html b/src/main/resources/static/index.html index e74dde6..d108bfb 100644 --- a/src/main/resources/static/index.html +++ b/src/main/resources/static/index.html @@ -27,105 +27,210 @@
+