From 72956bfd58f8b1095be88315ad1865a85228184d Mon Sep 17 00:00:00 2001 From: Matthias Gugel Date: Sun, 20 Jun 2021 05:46:58 +0200 Subject: [PATCH] Make current filename accessible to placeholders --- .../CreateFileWithFilenameTemplateAction.kt | 3 +- .../placeholders/PlaceholderContext.kt | 3 +- .../placeholders/PlaceholderProcessor.kt | 28 ++++++++----------- 3 files changed, 14 insertions(+), 20 deletions(-) diff --git a/src/main/kotlin/de/idetools/filename_template/CreateFileWithFilenameTemplateAction.kt b/src/main/kotlin/de/idetools/filename_template/CreateFileWithFilenameTemplateAction.kt index 899f50c..310ae8c 100644 --- a/src/main/kotlin/de/idetools/filename_template/CreateFileWithFilenameTemplateAction.kt +++ b/src/main/kotlin/de/idetools/filename_template/CreateFileWithFilenameTemplateAction.kt @@ -10,7 +10,6 @@ import com.intellij.openapi.project.Project import com.intellij.openapi.ui.InputValidatorEx import com.intellij.psi.PsiDirectory import com.intellij.psi.PsiElement -import de.idetools.filename_template.placeholders.PlaceholderContext import de.idetools.filename_template.placeholders.PlaceholderProcessor import java.awt.event.InputEvent import java.util.function.Consumer @@ -31,7 +30,7 @@ class CreateFileWithFilenameTemplateAction( val contentPanel = NewItemSimplePopupPanel() val nameField = contentPanel.textField - nameField.text = placeholderProcessor.processTemplate(PlaceholderContext(project, directory)) + nameField.text = placeholderProcessor.processTemplate(project, directory) val popup = NewItemPopupUtil.createNewItemPopup(IdeBundle.message("title.new.file"), contentPanel, nameField) contentPanel.setApplyAction { event: InputEvent? -> diff --git a/src/main/kotlin/de/idetools/filename_template/placeholders/PlaceholderContext.kt b/src/main/kotlin/de/idetools/filename_template/placeholders/PlaceholderContext.kt index 4bf2e1e..177db24 100644 --- a/src/main/kotlin/de/idetools/filename_template/placeholders/PlaceholderContext.kt +++ b/src/main/kotlin/de/idetools/filename_template/placeholders/PlaceholderContext.kt @@ -5,5 +5,6 @@ import com.intellij.psi.PsiDirectory data class PlaceholderContext( val project: Project, - val directory: PsiDirectory + val directory: PsiDirectory, + var filename: String = "" ) diff --git a/src/main/kotlin/de/idetools/filename_template/placeholders/PlaceholderProcessor.kt b/src/main/kotlin/de/idetools/filename_template/placeholders/PlaceholderProcessor.kt index 5476c6c..f521fc3 100644 --- a/src/main/kotlin/de/idetools/filename_template/placeholders/PlaceholderProcessor.kt +++ b/src/main/kotlin/de/idetools/filename_template/placeholders/PlaceholderProcessor.kt @@ -1,27 +1,17 @@ package de.idetools.filename_template.placeholders -import java.util.function.Consumer +import com.intellij.openapi.project.Project +import com.intellij.psi.PsiDirectory import kotlin.math.max class PlaceholderProcessor(private val template: String, private val placeholders: List) { - fun processTemplate(placeholderContext: PlaceholderContext): String { - var filename = "" - processTemplate( - template, - { filename += it }, - { x -> - filename += placeholders - .first { it.supports(x) } - .process(x, placeholderContext) - }) - return filename - } - - private fun processTemplate(template: String, onCharacter: Consumer, onPlaceholder: Consumer) { + fun processTemplate(project: Project, directory: PsiDirectory): String { var placeholderLevel = 0 var placeholder = "" + val context = PlaceholderContext(project, directory) + for (character in template) { when (character) { '{' -> { @@ -33,7 +23,9 @@ class PlaceholderProcessor(private val template: String, private val placeholder } '}' -> { if (placeholderLevel == 1) { - onPlaceholder.accept(placeholder) + context.filename += placeholders + .first { it.supports(placeholder) } + .process(placeholder, context) placeholder = "" } @@ -47,10 +39,12 @@ class PlaceholderProcessor(private val template: String, private val placeholder if (0 < placeholderLevel) { placeholder += character } else { - onCharacter.accept(character) + context.filename += character } } } } + + return context.filename } }