To use font icons from FontAwesome we set the document attribute icons
with the value font
. The default link to the CSS location is https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.1.0/css/font-awesome.min.css
. We can change the location for the FontAwesome CSS with document attributes.
If we want to use a different CDN to serve the CSS we can set the document attribute iconfont-cdn
and set the URI as a value:
Continue reading →
When we define the document attribute icons
with the value font
the FontAwesome fonts are loaded in the generated HTML page. In the head
section of the HTML document a link
element to the FontAwesome CSS on https://cdnjs.cloudflare.com/ajax/libs
is added. Also when we use the highlight.js or Prettify source highlighter a link to the Javascript files on the cdnjs.cloudflare.com
server is generated. We can change the value of the scheme from https
to http
by setting the attribute asset-uri-scheme
to http
. Or we can leave out the scheme so a scheme-less URI is generated for the links. A scheme-less URI provides the benefit that the same protocol of the origin HTML page is used to get the CSS or Javascript files from the cdnjs.cloudflare.com
server. Remember this might provide a problem if the HTML page is opened locally.
In the next sample Asciidoc markup we change the scheme to http
:
Continue reading →
Gradle has some sophisticated progress logging on the console. For example we can see how much percentage of the building process is done. The percentage value is updated on the same console line. The following snippet is a sample of such output > Building 0% > :dependencies > Resolving dependencies ':compile'
. The information is updated on the same line, which is really nice. But sometimes we might need to run Gradle builds on a system that doesn't support this mechanism on the console or terminal, possibly an continuous integration server. To disable the progress logging we can set the environment variable TERM
to the value dumb
.
Written with Gradle 2.0.
Continue reading →
When we write technical documentation with Asciidoctor we can easily include source code listings. When we use the coderay
or pygments
source code highlighter we can also include line numbers. We must add the attribute linenums
to the listing block in our markup. This attribute is used by the source highlighters to create and format the line numbers. We can specify that the line numbers must be generated in table mode or inline mode. When the line numbers are in table mode we can select the source code without the line numbers and copy it to the clipboard. If we use inline
mode the line numbers are selectable and are copied together with the selected source code to the clipboard. To specify which mode we want to use for the line numbers we use the document attribute coderay-linenums-mode
or pygments-linenums-mode
depending on the source highlighter we use. We can use the values table
(default) or inline
.
= Source code listing
Code listings look cool with Asciidoctor and {source-highlighter}.
[source,groovy,linenums]
----
// File: User.groovy
class User {
String username
}
----
[source,asciidoc,linenums]
----
# Hello world
Asciidoc(tor) is aweseome!
----
Continue reading →
Asciidoctor is a great tool for writing technical documentation. If we have source code in the Asciidoc markup we can set the document attribute source-highlighter
to pigments
, coderay
, prettify
and highlightjs
. When we use highlight.js we can also add an extra document attribute highlightjs-theme
with the value of a highlight.js theme. If we do not specify the highlightjs-theme
the default theme github is used.
We use the following Asciidoc markup to see how the HTML output is when we transform the markup using the HTML backend:
Continue reading →
We can add comments to our Asciidoc markup. The comments will not be added to generated output. We can add both single and multiline comments in the markup. Single line comments start with a double slash (//
). Multiline comments are enclosed in a block of four forward slashes (////
).
The following sample markup defines Asciidoc markup with comments:
Continue reading →
Since Asciidoctor 1.5.0 we can use the document attribute hide-uri-scheme
to turn URLs into links, where the link text is displayed without the URI scheme. This can save typing when we simply want to add a URL without any special description.
In the next Asciidoc syntax we first define URLs without the hide-uri-scheme
attribute, followed by URLs after the attribute is set:
Continue reading →
The MarkupTemplateEngine
added in Groovy 2.3 is very powerful. We can define layout templates with common markup we want to be used in multiple other templates. In the layout template we define placeholders for variables and content blocks surrounded by shared markup. We define values for these variables and content blocks in the actual template. We even can choose to propagate model attributes from the template to the layout template. Let's first create a layout template with the name main.tpl
:
// File: main.tpl
html {
head {
// Use pageTitle layout property.
title(pageTitle)
}
body {
section(id: 'main') {
// Render mainContents layout property.
mainContents()
}
section(id: 'actions') {
// Render actions layout property.
actions()
}
footer {
// A template is also Groovy code, we can
// define new variables or methods.
// pubDate should be set via original template
// model.
def generatedOn = pubDate ?: new Date()
p("Generated on ${dateFormat(generatedOn)}")
}
}
}
def dateFormat(date) {
date.format('dd-MM-yyyy')
}
Continue reading →
In most of our projects we have dependencies on other code, like libraries or other projects. Gradle has a nice DSL to define dependencies. Dependencies are grouped in dependency configurations. These configuration can be created by ourselves or added via a plugin. Once we have defined our dependencies we get a nice overview of all dependencies in our project with the dependencies
task. We can add the optional argument --configuration
to only see dependencies for the given configuration. But we can even check for a specific dependency where it is used, any transitive dependencies and how the version is resolved.
In the following sample build we define a compile dependency on Spring Boot and SLF4J API. The SLF4J API is also a transitive dependency for the Spring Boot dependency, so we can see how the dependencyInsight
tasks shows a version conflict.
Continue reading →
Since Groovy 2.3 we can use the MarkupTemplateEngine
to generate XML/HTML. We can write our templates using a builder syntax. Inside our templates we can define nested templates. These nested templates contain builder syntax code and can use objects that are passed as attributes to the nested template. To invoke a nested template we must use the fragment
method and pass a Map
with attributes that is used in the nested template. We can re-use nested templates inside our template.
In the following sample code we define two nested templates: faIcon
and list
. Inside our template we use the fragment
method to call these nested templates and we set values to the attributes that are used in the nested templates:
Continue reading →
Since Groovy 2.3 we can use the new MarkupTemplateEngine
to generate XML/HTML content. The engine compiles the template for better performance and optionally provides type checking on model attributes used in the template. We can configure the template engine to use a custom base template class instead of the default BaseTemplate
. In our custom template class we can add new methods that can be invoked from our template content.
Let's create a new base template class with an icon
method to output valid FontAwesome markup:
Continue reading →
Since Groovy 2.3 the JSON parser has improved and is really a performant parser for JSON payload. JSON must be formatted in a strict way, for example all keys must be enclosed in double quotes. But what if we have JSON which not applies to the strict specification? For example a configuration file written in JSON and we want to add comments to this file. Or use single quotes for keys, or just leave all the quotes out. We can now specify the type JsonParseType.LAX
for our JSON parser and we can now parse JSON which doesn't apply to the strict specification.
import groovy.json.*
import static groovy.json.JsonParserType.LAX as RELAX
def jsonText = '''
{
message: {
/* Set header of message */
header: {
"from": 'mrhaki',
'to': ["Groovy Users", "Java Users"]
}
# Include a little body for the message.
'body': "Check out Groovy's gr8 JSON support."
}
}
'''
def json = new JsonSlurper().setType(RELAX).parseText(jsonText)
def header = json.message.header
assert header.from == 'mrhaki'
assert header.to[0] == 'Groovy Users'
assert header.to[1] == 'Java Users'
assert json.message.body == "Check out Groovy's gr8 JSON support."
Continue reading →