From 69601a085b9b45fae8f3105b0a5f4ae1af712d84 Mon Sep 17 00:00:00 2001 From: Daniel Alome Date: Wed, 1 Apr 2026 12:25:43 +0100 Subject: [PATCH] Add CLASS_NAME support and fix Pebble template rendering for plugin templates - Add CLASS_NAME token replacement in ZipRecipeExecutor for dynamic class naming in file paths and template content - Add KEY_CLASS_NAME constant to ZipTemplateConstants - Add defaultAppName field to TemplateJson for per-template project name defaults --- .../com/itsaky/androidide/templates/impl/zip/ZipJson.kt | 1 + .../androidide/templates/impl/zip/ZipRecipeExecutor.kt | 6 +++++- .../androidide/templates/impl/zip/ZipTemplateConstants.kt | 1 + .../androidide/templates/impl/zip/ZipTemplateReader.kt | 4 ++++ 4 files changed, 11 insertions(+), 1 deletion(-) diff --git a/templates-impl/src/main/java/com/itsaky/androidide/templates/impl/zip/ZipJson.kt b/templates-impl/src/main/java/com/itsaky/androidide/templates/impl/zip/ZipJson.kt index 3dc2b7859d..ec55aa7c2e 100644 --- a/templates-impl/src/main/java/com/itsaky/androidide/templates/impl/zip/ZipJson.kt +++ b/templates-impl/src/main/java/com/itsaky/androidide/templates/impl/zip/ZipJson.kt @@ -10,6 +10,7 @@ data class TemplateJson( val version: String?, val tooltipTag: String = "", val defaultSaveLocation: String? = null, + val defaultAppName: String? = null, val parameters: ParametersJson? = null, val system: SystemParametersJson? = null ) diff --git a/templates-impl/src/main/java/com/itsaky/androidide/templates/impl/zip/ZipRecipeExecutor.kt b/templates-impl/src/main/java/com/itsaky/androidide/templates/impl/zip/ZipRecipeExecutor.kt index a7975e7f81..e60e9ecca8 100644 --- a/templates-impl/src/main/java/com/itsaky/androidide/templates/impl/zip/ZipRecipeExecutor.kt +++ b/templates-impl/src/main/java/com/itsaky/androidide/templates/impl/zip/ZipRecipeExecutor.kt @@ -34,6 +34,7 @@ class ZipRecipeExecutor( companion object { private val log = LoggerFactory.getLogger(ZipRecipeExecutor::class.java) + private val CLASS_NAME_PATTERN = Regex("[^a-zA-Z0-9]") } override fun execute( @@ -70,7 +71,9 @@ class ZipRecipeExecutor( .syntax(customSyntax) .build() - val (identifiers, warnings) = metaJson.pebbleParams(data, defModule, params) + val className = data.name.replace(CLASS_NAME_PATTERN, "") + val (baseIdentifiers, warnings) = metaJson.pebbleParams(data, defModule, params) + val identifiers = baseIdentifiers + (KEY_CLASS_NAME to className) log.debug("identifiers warnings: ${warnings.joinToString(System.lineSeparator())}") val packageName = @@ -93,6 +96,7 @@ class ZipRecipeExecutor( val relativePath = normalized.removePrefix("$basePath/") .replace(packageName.value, defModule.packageName.replace(".", "/")) + .replace(KEY_CLASS_NAME, className) val outFile = File(projectDir, relativePath.removeSuffix(TEMPLATE_EXTENSION)).canonicalFile diff --git a/templates-impl/src/main/java/com/itsaky/androidide/templates/impl/zip/ZipTemplateConstants.kt b/templates-impl/src/main/java/com/itsaky/androidide/templates/impl/zip/ZipTemplateConstants.kt index 0afb7c77d8..9b4c69104a 100644 --- a/templates-impl/src/main/java/com/itsaky/androidide/templates/impl/zip/ZipTemplateConstants.kt +++ b/templates-impl/src/main/java/com/itsaky/androidide/templates/impl/zip/ZipTemplateConstants.kt @@ -17,6 +17,7 @@ const val DELIM_COMMENT_CLOSE = "#}" const val KEY_PACKAGE_NAME = "PACKAGE_NAME" const val KEY_APP_NAME = "APP_NAME" +const val KEY_CLASS_NAME = "CLASS_NAME" const val KEY_SAVE_LOCATION = "SAVE_LOCATION" const val KEY_AGP_VERSION = "AGP_VERSION" const val KEY_KOTLIN_VERSION = "KOTLIN_VERSION" diff --git a/templates-impl/src/main/java/com/itsaky/androidide/templates/impl/zip/ZipTemplateReader.kt b/templates-impl/src/main/java/com/itsaky/androidide/templates/impl/zip/ZipTemplateReader.kt index b619d7a5cb..730e5c60e7 100644 --- a/templates-impl/src/main/java/com/itsaky/androidide/templates/impl/zip/ZipTemplateReader.kt +++ b/templates-impl/src/main/java/com/itsaky/androidide/templates/impl/zip/ZipTemplateReader.kt @@ -13,6 +13,7 @@ import com.itsaky.androidide.templates.TextFieldWidget import com.itsaky.androidide.templates.Widget import com.itsaky.androidide.templates.base.baseZipProject import com.itsaky.androidide.templates.booleanParameter +import com.itsaky.androidide.templates.projectNameParameter import com.itsaky.androidide.templates.stringParameter import com.itsaky.androidide.utils.FeatureFlags import org.slf4j.LoggerFactory @@ -85,6 +86,9 @@ object ZipTemplateReader { } val project = baseZipProject( + projectName = projectNameParameter { + metaJson.defaultAppName?.let { default = it } + }, showLanguage = (metaJson.parameters?.optional?.language != null), showMinSdk = (metaJson.parameters?.optional?.minsdk != null), showPackageName = (metaJson.parameters?.required?.packageName != null),