Skip to content

Instantly share code, notes, and snippets.

@lpe234
Last active June 21, 2024 10:18
Show Gist options
  • Save lpe234/2ba27dcf27fcfbd366acb0d3d19380de to your computer and use it in GitHub Desktop.
Save lpe234/2ba27dcf27fcfbd366acb0d3d19380de to your computer and use it in GitHub Desktop.
Ace.js 格式化代码 & Java ScriptEngine
data class EvalDTO(var script: String)
data class Keyword(
val name: String,
val value: String,
val caption: String,
val meta: String = "variable",
val type: String = "variable",
val docTooltip: String = "Inner Variable",
)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Script</title>
<style>
.content {
margin: 2em 4em 0 4em;
height: 100%;
}
#editor {
min-width: 50em;
min-height: 40em;
border: chocolate 1px solid;
}
.error {
color: orangered;
display: none;
}
</style>
</head>
<body>
<div class="content">
<div id="editor"></div>
<p>Result: <span id="result"></span></p>
<p class="error"></p>
<button id="eval">SUBMIT</button>
</div>
<script src="/static/jquery.3.7.1.js"></script>
<script src="/static/ace/src/ace.js"></script>
<script src="/static/ace/src/ext-language_tools.js"></script>
<script>
const editor = ace.edit('editor')
function init() {
editor.session.setMode('ace/mode/javascript')
editor.setOptions({
enableBasicAutocompletion: true,
enableSnippets: true,
enableLiveAutocompletion: true,
})
editor.setTheme('ace/theme/github')
}
function initExtLanguage() {
$.get('/script/keywordList', function (data) {
addExtKeyWord(data)
})
}
function addExtKeyWord(keyWorldList) {
const languageTools = ace.require("ace/ext/language_tools");
languageTools.addCompleter({
getCompletions: function (editor, session, pos, prefix, callback) {
callback(null, keyWorldList);
}
});
}
function evalScript() {
const script = editor.getValue()
const error = $('.error')
$.ajax('/script/eval', {
type: 'POST',
data: JSON.stringify({'script': script}),
contentType: 'application/json;charset=utf-8',
success: function (data) {
$('#result').text(data)
error.hide()
},
error: function (data) {
error.text(data.responseJSON.message)
error.show()
}
})
}
$(document).ready(function () {
init()
initExtLanguage()
//
$('#eval').click(function () {
evalScript()
})
})
</script>
</body>
</html>
import org.slf4j.LoggerFactory
import org.springframework.stereotype.Controller
import org.springframework.web.bind.annotation.*
import javax.script.ScriptEngine
import javax.script.ScriptEngineManager
import javax.script.SimpleBindings
/**
* @author lpe234
* @since 2024/6/21 13:51
*/
@Controller
@RequestMapping("script")
class ScriptController {
private val logger = LoggerFactory.getLogger(ScriptController::class.java)
private lateinit var engine: ScriptEngine
private val PARAMS = mapOf(Pair("a", 10), Pair("b", 20));
init {
val manager = ScriptEngineManager()
engine = manager.getEngineByName("nashorn")
}
@GetMapping
fun index(): String {
return "script"
}
@ResponseBody
@GetMapping("keywordList")
fun keywords(): List<Keyword> {
val wordList = PARAMS.keys.map {
Keyword(it, it, it)
}.toMutableList()
//
wordList.add(Keyword("logger", "logger", "logger", "object", "object"))
//
return wordList
}
@ResponseBody
@PostMapping("eval")
fun eval(@RequestBody dto: EvalDTO): Any {
val bindings = SimpleBindings()
bindings["logger"] = logger
//
PARAMS.entries.forEach {
bindings[it.key] = it.value
}
//
return engine.eval(dto.script, bindings)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment