Feature: NeoConfigureFile interface
This commit is contained in:
parent
5de8771857
commit
bd4ea35ed9
@ -9,4 +9,9 @@ class AstVisitor(private val ast: NeoLangAst, private val visitorCallback: IVisi
|
|||||||
fun start() {
|
fun start() {
|
||||||
AstVisitorImpl.visitStartAst(ast, visitorCallback)
|
AstVisitorImpl.visitStartAst(ast, visitorCallback)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Suppress("UNCHECKED_CAST")
|
||||||
|
fun <T : IVisitorCallback> getCallback() : T {
|
||||||
|
return visitorCallback as T
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,8 +0,0 @@
|
|||||||
package io.neolang.runtime.context
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author kiva
|
|
||||||
*/
|
|
||||||
interface IContextMaker {
|
|
||||||
fun makeContext()
|
|
||||||
}
|
|
@ -15,4 +15,8 @@ class NeoLangContext(val contextName: String) {
|
|||||||
fun getAttribute(attributeName: String) : NeoLangValue {
|
fun getAttribute(attributeName: String) : NeoLangValue {
|
||||||
return attributes[attributeName] ?: NeoLangValue.UNDEFINED
|
return attributes[attributeName] ?: NeoLangValue.UNDEFINED
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun getAttributes() : Map<String, NeoLangValue> {
|
||||||
|
return attributes
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -16,6 +16,10 @@ class NeoLangValue(private val rawValue: Any) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun isValid() : Boolean {
|
||||||
|
return this != UNDEFINED
|
||||||
|
}
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
val UNDEFINED = NeoLangValue("<undefined>")
|
val UNDEFINED = NeoLangValue("<undefined>")
|
||||||
}
|
}
|
||||||
|
@ -57,4 +57,5 @@ dependencies {
|
|||||||
// compile 'com.ramotion.cardslider:card-slider:0.1.0'
|
// compile 'com.ramotion.cardslider:card-slider:0.1.0'
|
||||||
// compile 'com.github.igalata:Bubble-Picker:v0.2.4'
|
// compile 'com.github.igalata:Bubble-Picker:v0.2.4'
|
||||||
compile project(path: ':NeoLang')
|
compile project(path: ':NeoLang')
|
||||||
|
testCompile project(path: ':NeoLang')
|
||||||
}
|
}
|
||||||
|
@ -1,14 +1,7 @@
|
|||||||
package io.neoterm
|
package io.neoterm
|
||||||
|
|
||||||
import android.app.Application
|
import android.app.Application
|
||||||
import android.util.Log
|
import io.neoterm.frontend.NeoFrontend
|
||||||
import io.neoterm.customize.color.ColorSchemeManager
|
|
||||||
import io.neoterm.customize.completion.CompletionProviderManager
|
|
||||||
import io.neoterm.customize.eks.ExtraKeysManager
|
|
||||||
import io.neoterm.customize.font.FontManager
|
|
||||||
import io.neoterm.customize.pm.NeoPackageManager
|
|
||||||
import io.neoterm.customize.script.UserScriptManager
|
|
||||||
import io.neoterm.frontend.service.ServiceManager
|
|
||||||
import io.neoterm.preference.NeoPreference
|
import io.neoterm.preference.NeoPreference
|
||||||
import io.neoterm.utils.CrashHandler
|
import io.neoterm.utils.CrashHandler
|
||||||
|
|
||||||
@ -21,14 +14,7 @@ class App : Application() {
|
|||||||
app = this
|
app = this
|
||||||
NeoPreference.init(this)
|
NeoPreference.init(this)
|
||||||
CrashHandler.init()
|
CrashHandler.init()
|
||||||
|
NeoFrontend.initialize()
|
||||||
// ensure that we can access these any time
|
|
||||||
ServiceManager.registerService(ColorSchemeManager::class.java)
|
|
||||||
ServiceManager.registerService(FontManager::class.java)
|
|
||||||
ServiceManager.registerService(UserScriptManager::class.java)
|
|
||||||
ServiceManager.registerService(ExtraKeysManager::class.java)
|
|
||||||
ServiceManager.registerService(CompletionProviderManager::class.java)
|
|
||||||
ServiceManager.registerService(NeoPackageManager::class.java)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
|
@ -14,7 +14,6 @@ import java.util.*
|
|||||||
open class NeoColorScheme(val colorName: String) {
|
open class NeoColorScheme(val colorName: String) {
|
||||||
companion object {
|
companion object {
|
||||||
private const val COLOR_PREFIX = "color"
|
private const val COLOR_PREFIX = "color"
|
||||||
|
|
||||||
const val COLOR_DIM_BLACK = 0
|
const val COLOR_DIM_BLACK = 0
|
||||||
const val COLOR_DIM_RED = 1
|
const val COLOR_DIM_RED = 1
|
||||||
const val COLOR_DIM_GREEN = 2
|
const val COLOR_DIM_GREEN = 2
|
||||||
@ -64,7 +63,7 @@ open class NeoColorScheme(val colorName: String) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun createConfig(): Properties {
|
fun createConfig(): Properties {
|
||||||
// TODO: 设计新的配色方案语法,这个只是临时用一下
|
// TODO: 兼容旧版本的配置并且解析新版本的配置文件
|
||||||
validateColors()
|
validateColors()
|
||||||
val prop = Properties()
|
val prop = Properties()
|
||||||
prop.put("foreground", foregroundColor)
|
prop.put("foreground", foregroundColor)
|
||||||
@ -77,6 +76,7 @@ open class NeoColorScheme(val colorName: String) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun parseConfig(file: File): Boolean {
|
fun parseConfig(file: File): Boolean {
|
||||||
|
// TODO: 兼容旧版本的配置并且解析新版本的配置文件
|
||||||
try {
|
try {
|
||||||
return FileInputStream(file).use {
|
return FileInputStream(file).use {
|
||||||
val prop = Properties()
|
val prop = Properties()
|
||||||
|
27
app/src/main/java/io/neoterm/frontend/NeoFrontend.kt
Normal file
27
app/src/main/java/io/neoterm/frontend/NeoFrontend.kt
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
package io.neoterm.frontend
|
||||||
|
|
||||||
|
import io.neoterm.customize.color.ColorSchemeManager
|
||||||
|
import io.neoterm.customize.completion.CompletionProviderManager
|
||||||
|
import io.neoterm.customize.eks.ExtraKeysManager
|
||||||
|
import io.neoterm.customize.font.FontManager
|
||||||
|
import io.neoterm.customize.pm.NeoPackageManager
|
||||||
|
import io.neoterm.customize.script.UserScriptManager
|
||||||
|
import io.neoterm.frontend.logger.NLog
|
||||||
|
import io.neoterm.frontend.service.ServiceManager
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author kiva
|
||||||
|
*/
|
||||||
|
object NeoFrontend {
|
||||||
|
fun initialize() {
|
||||||
|
// ensure that we can access these any time
|
||||||
|
ServiceManager.registerService(ColorSchemeManager::class.java)
|
||||||
|
ServiceManager.registerService(FontManager::class.java)
|
||||||
|
ServiceManager.registerService(UserScriptManager::class.java)
|
||||||
|
ServiceManager.registerService(ExtraKeysManager::class.java)
|
||||||
|
ServiceManager.registerService(CompletionProviderManager::class.java)
|
||||||
|
ServiceManager.registerService(NeoPackageManager::class.java)
|
||||||
|
|
||||||
|
NLog.initialize()
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,49 @@
|
|||||||
|
package io.neoterm.frontend.config
|
||||||
|
|
||||||
|
import io.neolang.ast.visitor.IVisitorCallback
|
||||||
|
import io.neolang.runtime.context.NeoLangContext
|
||||||
|
import io.neolang.runtime.type.NeoLangValue
|
||||||
|
import java.util.*
|
||||||
|
|
||||||
|
class ConfigVisitor : IVisitorCallback {
|
||||||
|
private val emptyContext = NeoLangContext("<NeoTerm-Empty-Safety>")
|
||||||
|
private val contextStack = Stack<NeoLangContext>()
|
||||||
|
private val definedContext = mutableListOf<NeoLangContext>()
|
||||||
|
|
||||||
|
fun getContext(contextName: String) : NeoLangContext {
|
||||||
|
definedContext.forEach {
|
||||||
|
if (it.contextName == contextName) {
|
||||||
|
return it
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return emptyContext
|
||||||
|
}
|
||||||
|
|
||||||
|
fun getAttribute(contextName: String, attrName: String) : NeoLangValue {
|
||||||
|
return getContext(contextName).getAttribute(attrName)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onStart() {
|
||||||
|
onEnterContext("global")
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onFinish() {
|
||||||
|
while (contextStack.isNotEmpty()) {
|
||||||
|
onExitContext()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onEnterContext(contextName: String) {
|
||||||
|
val context = NeoLangContext(contextName)
|
||||||
|
contextStack.push(context)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onExitContext() {
|
||||||
|
val context = contextStack.pop()
|
||||||
|
definedContext.add(context)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun getCurrentContext(): NeoLangContext {
|
||||||
|
return contextStack.peek()
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,36 @@
|
|||||||
|
package io.neoterm.frontend.config
|
||||||
|
|
||||||
|
import io.neolang.parser.NeoLangParser
|
||||||
|
import io.neoterm.utils.FileUtils
|
||||||
|
import java.io.File
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author kiva
|
||||||
|
*/
|
||||||
|
class NeoConfigureFile(val configureFile: String) {
|
||||||
|
private val configParser = NeoLangParser()
|
||||||
|
private var configVisitor : ConfigVisitor? = null
|
||||||
|
|
||||||
|
fun getVisitor(): ConfigVisitor {
|
||||||
|
checkParsed()
|
||||||
|
return configVisitor!!
|
||||||
|
}
|
||||||
|
|
||||||
|
fun parseConfigure(): Boolean {
|
||||||
|
val configContent = FileUtils.readFile(File(configureFile)) ?: return false
|
||||||
|
val programCode = String(configContent)
|
||||||
|
configParser.setInputSource(programCode)
|
||||||
|
|
||||||
|
val ast = configParser.parse()
|
||||||
|
val astVisitor = ast.visit().getVisitor(ConfigVisitor::class.java) ?: return false
|
||||||
|
astVisitor.start()
|
||||||
|
configVisitor = astVisitor.getCallback()
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun checkParsed() {
|
||||||
|
if (configVisitor == null) {
|
||||||
|
throw IllegalStateException("Configure file not loaded.")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
9
app/src/main/java/io/neoterm/frontend/logger/NLog.kt
Normal file
9
app/src/main/java/io/neoterm/frontend/logger/NLog.kt
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
package io.neoterm.frontend.logger
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author kiva
|
||||||
|
*/
|
||||||
|
object NLog {
|
||||||
|
fun initialize() {
|
||||||
|
}
|
||||||
|
}
|
24
app/src/test/java/io/neoterm/ConfigureFileTest.kt
Normal file
24
app/src/test/java/io/neoterm/ConfigureFileTest.kt
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
package io.neoterm
|
||||||
|
|
||||||
|
import io.neoterm.frontend.config.ConfigVisitor
|
||||||
|
import io.neoterm.frontend.config.NeoConfigureFile
|
||||||
|
import org.junit.Test
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author kiva
|
||||||
|
*/
|
||||||
|
class ConfigureFileTest {
|
||||||
|
private fun printAttr(visitor: ConfigVisitor, contextName: String, attrName: String) {
|
||||||
|
println("attr [$contextName->$attrName]: ${visitor.getAttribute(contextName, attrName).asString()}")
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun configureFileTest() {
|
||||||
|
val config = NeoConfigureFile("NeoLang/example/color-scheme.nl")
|
||||||
|
if (config.parseConfigure()) {
|
||||||
|
println("Parsed!")
|
||||||
|
val visitor = config.getVisitor()
|
||||||
|
printAttr(visitor, "colors", "foreground")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user