private static String buildRolesText(final Set<String> roles) {
        final Function<String, String> hasRole = roleName ->
                roles.contains(roleName)
                        ? "Yes"
                        : "No";

        final List<Tuple2<String, String>> data = List.of(
                Tuple.of("Can be stepped:", hasRole.apply(PipelineElementType.VISABILITY_STEPPING)),
                Tuple.of("Transforms input:", hasRole.apply(PipelineElementType.ROLE_MUTATOR)),
                Tuple.of("Validates input:", hasRole.apply(PipelineElementType.ROLE_MUTATOR))
        );
        return "\n\n**Features**:\n\n" + AsciiTable.builder(data)
                .withColumn(Column.builder("Feature", (Tuple2<String, String> tuple) -> tuple._1()).build())
                .withColumn(Column.builder("Yes/No", (Tuple2<String, String> tuple) -> tuple._2).build())
                .build();
    }
This will modify the content of the file
{@code [this repo]/../stroom-docs/layouts/shortcodes/pipe-elm.html}
stroom-app/src/test/java/stroom/app/docs/GeneratePipelineElementsDoc.java