intellij-ideawebstormlive-templates

WebStorm Live Template, separate a string of inputs


I want to create a Live Template for createSelector:

export const someSelector = createSelector(getThis, getThat, getSomethingElse, (this, that, somethingElse) => 
  $END$
)

I can get it to work pretty well with a single argument (e.g., only getThis which then results in (this) in the arrow function args).

// template text
createSelector($someSelector$, ($variable$) => $END$)

// variables
// expression for "variable": 
decapitalize(regularExpression(someSelector, "get", ""))

This works correctly with a single argument as mentioned above, and almost works correctly with multiple arguments, except for the capitalization:

createSelector(getThis, getThat, getSomethingElse, (this, That, SomethingElse) => /* $end$ */)

I tried wrapping that whole thing in camelCase but then of course the commas and spaces are gone.

The issue is clearly that I'm processing the whole string at once so the whole string is run through whatever string formatting function. There doesn't appear to be any way to treat individual instances of "get" separately.

I tried capture groups which I really thought would work:

decapitalize(regularExpression(someSelector, "get(\w+)", "$1"))

But that doesn't replace anything, it just copies the whole thing:

createSelector(getThis, getThat, (getThis, getThat) => )

Is there any way to accomplish this?

UPDATE: I even learned Groovy script and wrote the following, which works in a groovy playground, but gets in WebStorm gets the same result as my final example above!

groovyScript("return _1.replaceAll(/get(\w+)/) { it[1].uncapitalize() };", someSelector)

Solution

  • This could be done with RegEx .. but Java does not seem to support \l replacement modifier (to be used as \l$1 instead of $1 in your initial regularExpression() code).

    Live example (works in PCRE2, e.g. in PHP): https://regex101.com/r/6faVqC/1

    Docs on replacement modifiers: https://www.regular-expressions.info/refreplacecase.html


    In any case: this whole thing is handled by Java and you are passing RegEx pattern or GrovyScript code inside double quotes. Therefore any \ symbols would need to be escaped.

    You need to replace get(\w+) by get(\\w+).

    The following seems to work just fine for me here (where someSelector is the Live Template variable):

    groovyScript("return _1.replaceAll(/get(\\w+)/) { it[1].uncapitalize() };", someSelector)