Make current filename accessible to placeholders

This commit is contained in:
Matthias Gugel 2021-06-20 05:46:58 +02:00
parent b8bea349ba
commit 72956bfd58
3 changed files with 14 additions and 20 deletions

View File

@ -10,7 +10,6 @@ import com.intellij.openapi.project.Project
import com.intellij.openapi.ui.InputValidatorEx import com.intellij.openapi.ui.InputValidatorEx
import com.intellij.psi.PsiDirectory import com.intellij.psi.PsiDirectory
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import de.idetools.filename_template.placeholders.PlaceholderContext
import de.idetools.filename_template.placeholders.PlaceholderProcessor import de.idetools.filename_template.placeholders.PlaceholderProcessor
import java.awt.event.InputEvent import java.awt.event.InputEvent
import java.util.function.Consumer import java.util.function.Consumer
@ -31,7 +30,7 @@ class CreateFileWithFilenameTemplateAction(
val contentPanel = NewItemSimplePopupPanel() val contentPanel = NewItemSimplePopupPanel()
val nameField = contentPanel.textField 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) val popup = NewItemPopupUtil.createNewItemPopup(IdeBundle.message("title.new.file"), contentPanel, nameField)
contentPanel.setApplyAction { event: InputEvent? -> contentPanel.setApplyAction { event: InputEvent? ->

View File

@ -5,5 +5,6 @@ import com.intellij.psi.PsiDirectory
data class PlaceholderContext( data class PlaceholderContext(
val project: Project, val project: Project,
val directory: PsiDirectory val directory: PsiDirectory,
var filename: String = ""
) )

View File

@ -1,27 +1,17 @@
package de.idetools.filename_template.placeholders 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 import kotlin.math.max
class PlaceholderProcessor(private val template: String, private val placeholders: List<Placeholder>) { class PlaceholderProcessor(private val template: String, private val placeholders: List<Placeholder>) {
fun processTemplate(placeholderContext: PlaceholderContext): String { fun processTemplate(project: Project, directory: PsiDirectory): 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<Char>, onPlaceholder: Consumer<String>) {
var placeholderLevel = 0 var placeholderLevel = 0
var placeholder = "" var placeholder = ""
val context = PlaceholderContext(project, directory)
for (character in template) { for (character in template) {
when (character) { when (character) {
'{' -> { '{' -> {
@ -33,7 +23,9 @@ class PlaceholderProcessor(private val template: String, private val placeholder
} }
'}' -> { '}' -> {
if (placeholderLevel == 1) { if (placeholderLevel == 1) {
onPlaceholder.accept(placeholder) context.filename += placeholders
.first { it.supports(placeholder) }
.process(placeholder, context)
placeholder = "" placeholder = ""
} }
@ -47,10 +39,12 @@ class PlaceholderProcessor(private val template: String, private val placeholder
if (0 < placeholderLevel) { if (0 < placeholderLevel) {
placeholder += character placeholder += character
} else { } else {
onCharacter.accept(character) context.filename += character
} }
} }
} }
} }
return context.filename
} }
} }