Skip to content

playframework/twirl

Twirl

Twitter Follow Discord GitHub Discussions StackOverflow YouTube Twitch Status OpenCollective

Build Status Maven Repository size Scala Steward badge Mergify Status

Twirl is the Play template engine.

Twirl is automatically available in Play projects and can also be used stand-alone without any dependency on Play.

See the Play documentation for the template engine for more information about the template syntax.

sbt-twirl

Twirl can also be used outside of Play. An sbt plugin is provided for easy integration with Scala or Java projects.

sbt-twirl requires sbt 1.3.0 or higher.

To add the sbt plugin to your project add the sbt plugin dependency in project/plugins.sbt:

// twirl 2.0 and newer:
addSbtPlugin("org.playframework.twirl" % "sbt-twirl" % "LATEST_VERSION")
// twirl 1.6:
addSbtPlugin("com.typesafe.play" % "sbt-twirl" % "1.6.1")
// twirl 1.5.1 and before:
addSbtPlugin("com.typesafe.sbt" % "sbt-twirl" % "1.5.1")

Replacing the LATEST_VERSION with the latest version published, which should be Latest version. And enable the plugin on projects using:

someProject.enablePlugins(SbtTwirl)

If you only have a single project and are using a build.sbt file, create a root project and enable the twirl plugin like this:

lazy val root = (project in file(".")).enablePlugins(SbtTwirl)

Template files

Twirl template files are expected to be placed under src/main/twirl or src/test/twirl, similar to scala or java sources. The source locations for template files can be configured.

Template files must be named {name}.scala.{ext} where ext can be html, js, xml, or txt.

The Twirl template compiler is automatically added as a source generator for both the main/compile and test configurations. When you run compile or Test/compile the Twirl compiler will generate Scala source files from the templates and then these Scala sources will be compiled along with the rest of your project.

Additional imports

To add additional imports for the Scala code in template files, use the templateImports key. For example:

TwirlKeys.templateImports += "org.example._"

Source directories

To configure the source directories where template files will be found, use the compileTemplates / sourceDirectories key. For example, to have template sources alongside Scala or Java source files:

Compile / TwirlKeys.compileTemplates / sourceDirectories := (Compile / unmanagedSourceDirectories).value

maven-twirl

To use the Twirl plugin in your project add the Maven plugin and Twirl API as a dependency into pom.xml:

<dependencies>
    <dependency>
        <groupId>org.playframework.twirl</groupId>
        <artifactId>twirl-api_${SCALA_VERSION}</artifactId>
        <version>${TWIRL_VERSION}</version>
    </dependency>
</dependencies>

<build>
    <plugins>
        <plugin>
            <groupId>org.playframework.twirl</groupId>
            <artifactId>twirl-maven-plugin_${SCALA_VERSION}</artifactId>
            <version>${TWIRL_VERSION}</version>
            <executions>
                <execution>
                    <goals>
                        <goal>compile</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

Replacing the TWIRL_VERSION with the latest version published, which should be Latest version.

Template files

Twirl template files are expected to be placed under src/main/twirl or src/test/twirl, similar to scala or java sources. The additional source locations for template files can be configured.

Template files must be named {name}.scala.{ext} where ext can be html, js, xml, or txt.

Additional imports

To add additional imports for the Scala code in template files, use the templateImports parameter. For example:

<plugin>
    <groupId>org.playframework.twirl</groupId>
    <artifactId>twirl-maven-plugin_${SCALA_VERSION}</artifactId>
    <version>${TWIRL_VERSION}</version>
    <configuration>
        <templateImports>
            <import>org.example._</import>
        </templateImports>
    </configuration>
</plugin>

Source directories

To configure the source directories where template files will be found, use the sourceDir parameter. For example:

<plugin>
    <groupId>org.playframework.twirl</groupId>
    <artifactId>twirl-maven-plugin_${SCALA_VERSION}</artifactId>
    <version>${TWIRL_VERSION}</version>
    <configuration>
        <sourceDir>${project.basedir}/src/main/templates</sourceDir>
    </configuration>
    <executions>
        <execution>
            <id>additional-source-directory</id>
            <goals>
                <goal>compile</goal>
            </goals>
            <configuration>
                <sourceDir>${project.basedir}/src/main/other-templates</sourceDir>
            </configuration>
        </execution>
    </executions>
</plugin>

Scala version

To configure the Scala version just use the suffix in artifactId.

Other properties

Also, you can use the next parameters:

<plugin>
    <groupId>org.playframework.twirl</groupId>
    <artifactId>twirl-maven-plugin_${SCALA_VERSION}</artifactId>
    <version>${TWIRL_VERSION}</version>
    <configuration>
        <constructorAnnotations>
            <annotation>@org.example.MyAnnotation()</annotation>
        </constructorAnnotations>
        <templateFormats>
            <csv>play.twirl.api.TxtFormat</csv>
        </templateFormats>
        <sourceEncoding>UTF-8</sourceEncoding>
    </configuration>
</plugin>

Snapshots

To use a snapshot version add the Sonatype Snapshot repository into pom.xml:

<pluginRepositories>
    <pluginRepository>
        <id>sonatype-snapshots</id>
        <url>https://oss.sonatype.org/content/repositories/snapshots/</url>
        <releases>
            <enabled>false</enabled>
        </releases>
        <snapshots>
            <enabled>true</enabled>
        </snapshots>
    </pluginRepository>
</pluginRepositories>

gradle-twirl

⚠️ org.playframework.twirl plugin requires Gradle 7.1 or higher.

To use the Twirl plugin in your project add the gradle plugin and Twirl API as a dependency into build.gradle.kts:

plugins {
  ...
  id("org.playframework.twirl") version "LATEST_VERSION"
}

dependencies {
  implementation("org.playframework.twirl", "twirl-api_${scalaVersion}", "LATEST_VERSION")
}

Replacing the LATEST_VERSION with the latest version published, which should be Latest version.

Template files

Twirl template files are expected to be placed under src/main/twirl or src/test/twirl, similar to scala or java sources. The additional source locations for template files can be configured.

⚠️Please note that the output of the template compilation is Scala source code. If you use these templates in your Java source files, you must place them in a joint compilation folder (see the Gradle Scala Plugin documentation for details). The default location for this folder is src/main/scala, but it can be customized.

Template files must be named {name}.scala.{ext} where ext can be html, js, xml, or txt.

Additional imports

To add additional imports for the Scala code in template files, use the templateImports key. For example:

sourceSets {
  main {
    twirl {
      templateImports.add("org.example._")
    }
  }
}

Source directories

To configure the source directories where template files will be found, use the srcDir method for SourceDirectorySet. For example:

sourceSets {
  main {
    twirl {
      srcDir("app")
    }
  }
}

Scala version

To configure the Scala version use the scalaVersion property of TwirlExtension (2.13 by default). For example:

twirl {
  scalaVersion.set("3")
}

Other properties

Also, you can use the next properties:

sourceSets {
  main {
    twirl {
      // Annotations added to constructors in injectable templates
      constructorAnnotations.add("@org.example.MyAnnotation()")
      // Defined custom twirl template formats
      templateFormats.put("csv", "play.twirl.api.TxtFormat")
      // Source encoding for template files and generated scala files
      sourceEncoding.set("<enc>")
    }
  }
}

Snapshots

To use a snapshot version add the Sonatype Snapshot repository into settings.gradle.kts:

pluginManagement {
  repositories {
    maven {
      url = uri("https://oss.sonatype.org/content/repositories/snapshots")
    }
  }
}

Releasing a new version

See https://github.com/playframework/.github/blob/main/RELEASING.md

Credits

The name twirl was thought up by the Spray team and refers to the magic @ character in the template language, which is sometimes called "twirl".

The first stand-alone version of Twirl was created by the Spray team.

An optimized version of the Twirl parser was contributed by the Scala IDE team.