# Creating New Functions for Live Templates

> For the complete documentation index, see [llms.txt](https://plugins.jetbrains.com/docs/intellij/llms.txt).

The [Predefined Functions](https://www.jetbrains.com/help/idea/template-variables.html#predefined_functions) are the building blocks for creating [Parameterized Templates and Surround Templates](https://www.jetbrains.com/help/idea/using-live-templates.html#live_templates_types). However, sometimes the Predefined Functions are not enough.

This tutorial illustrates how to add custom functions to an IntelliJ Platform plugin and make them available for use by Live Templates. As an example, a function is created to convert a selection to Title Case. Refer to the SDK code sample [live_templates](https://github.com/JetBrains/intellij-sdk-code-samples/tree/main/live_templates).

## Implementing a New Function

Under the hood, the predefined functions for Live Templates are called macros. A new custom function for Live Templates is implemented in `TitleCaseMacro`, which extends [MacroBase](https://github.com/JetBrains/intellij-community/tree/idea/262.10968.63/platform/lang-impl/src/com/intellij/codeInsight/template/macro/MacroBase.java). Three `TitleCaseMacro` methods are of particular interest:

* The `TitleCaseMacro()` constructor passes the name and description of the macro to the parent constructor.

* The `isAcceptableInContext()` method tests whether the macro is available in the current context. The test relies on the [MarkdownContext](providing-live-templates.html#implement-templatecontexttype) object previously defined in the `live_templates` plugin.

* The `calculateResult()` method gets invoked when the titleCase function is used in a Live Template. The text to be capitalized is retrieved from the Live Template and converted to Title Case.

```JAVA
final class TitleCaseMacro extends MacroBase {

  public TitleCaseMacro() {
    super("titleCase", "titleCase(String)");
  }

  /**
   * Strictly to uphold contract for constructors in base class.
   */
  private TitleCaseMacro(String name, String description) {
    super(name, description);
  }

  @Override
  protected Result calculateResult(Expression @NotNull [] params, ExpressionContext context, boolean quick) {
    // Retrieve the text from the macro or selection, if any is available.
    String text = getTextResult(params, context, true);
    if (text == null) {
      return null;
    }
    if (!text.isEmpty()) {
      // Capitalize the start of every word
      text = StringUtil.toTitleCase(text);
    }
    return new TextResult(text);
  }

  @Override
  public boolean isAcceptableInContext(TemplateContextType context) {
    // Might want to be less restrictive in future
    return (context instanceof MarkdownContext);
  }

}
```

## Adding a Live Template

Using the procedures previously discussed for [Template Creation](providing-live-templates.html#template-creation) and [Export the Live Template](providing-live-templates.html#export-the-live-template), add a Live Template to the [Markdown.xml](https://github.com/JetBrains/intellij-sdk-code-samples/tree/main/live_templates/src/main/resources/liveTemplates) file for the plugin. The XML representation of an example Live Template using the new `titleCase` function is listed below.

There is only one variable, `TITLE`. The expression for `TITLE` evaluates to the `titleCase` function provided by the plugin. The argument to the `titleCase` function is `SELECTION`, which tells the IntelliJ Platform to operate on the current selection.

```XML
<template
    name="mc"
    value="$TITLE$"
    description="SDK: Convert to title case"
    toReformat="true"
    toShortenFQNames="false">
  <variable
      name="TITLE"
      expression="titleCase(SELECTION)"
      defaultValue="the quick brown fox"
      alwaysStopAt="true"/>
  <context>
    <option name="MARKDOWN" value="true"/>
  </context>
</template>
```

## Register Extension Point

Using the [com.intellij.liveTemplateMacro](https://jb.gg/ipe?extensions=com.intellij.liveTemplateMacro) extension point , register the implementation with the IntelliJ Platform.

```XML
<extensions defaultExtensionNs="com.intellij">
  <liveTemplateMacro
      implementation="org.intellij.sdk.liveTemplates.TitleCaseMacro"/>
</extensions>
```

## Check Plugin

Now verify the plugin is working correctly.

* Run the plugin in a Development Instance.

* Create a new file `testing.md` and enter several words in lower case.

* Highlight the text and enter invoke `Code | Surround With...` to open the Surround With popup. Confirm that the SDK: Convert to title case is available in the popup, and select it.

* The selected text will change to have each word capitalized.

