When we define a table in Asciidoctor we might want to span a cell over multiple columns or rows, instead of just a single column or row. We can do this using a cell specifier with the following format: column-span.row-span+
. The values for column-span
and row-span
define the number of columns and rows the cell must span. We put the cell specifier before the pipe symbol (|
) in our table definition.
In the following example Asciidoctor markup we have three tables. In the first table we span a cell over 2 columns, the second table spans a cell over 2 rows and in the final table we span a cell over both 2 columns and rows.
Continue reading →
With Asciidoctor we can repeat cell contents if we prefix the cell separator pipe symbol (|
) with the number of times we want to repeat the cell followed by an asterisk (*
).
In the following example Asciidoctor source file we define two tables and add 2*
to cells that we want to repeat two times:
Continue reading →
When we transform our Asciidoc source files to HTML Asciidoctor will print the date and time the document was last updated in the footer. If we want to disable the Last updated text we disable the document attribute last-update-label
.
In the following example Asciidoc file we disable the Last update label in the footer:
Continue reading →
Since the latest Grails versions a Grails wrapper is automatically created when we execute the create-app
command. If we don't want the wrapper to be created we can use the command argument --skip-wrapper
. If later we changed our mind and want the Grails wrapper we can simply run the wrapper
command from our Grails application directory.
Let's run the create-app
command with the --skip-wrapper
argument. If we check the contents of the created directory we see that the wrapper files are not created:
Continue reading →
NOTE: Just released version 0.2.2 of ngImprovedTesting to fix issue #6 causing chained promises (i.e. .then(...).then(...)
) not to executed by a $q.tick(); also see README of the GitHub repo.
After quite a while I finally got round to creating version 0.2 of ngImprovedTesting. The ModuleBuilder
API is unchanged and still makes mock testing AngularJS code much easier (be sure to read this blog post if you are unfamiliar with ngImprovedTesting). Version 0.2 of ngImprovedTesting brings you the following interesting improvements:
Continue reading →
Normally all Asciidoc files are processed and transformed to output files by Asciidoctor. But if we start the file name with an underscore (_
) the file is not transformed to an output file. This is very useful, because we can define some Asciidoc document fragments and include them in other Asciidoc files, but in the output directory the document fragment is not generated.
Let's create two Asciidoc files. One is _attrs.adoc
which is a document fragment file that is used in sample.doc
:
Continue reading →
To get the current Gradle version we can use the gradleVersion
property of the Gradle
object. This returns a string value we can use for displaying the values. If we want to compare Gradle versions we can use the GradleVersion
object. With this class we can get the current version, but we can also compare Gradle versions. This can be useful in our build scripts if we have functionality based on a Gradle version.
In the following build file we first have a task that uses the gradleVersion
of Gradle
. Then inside the task we use the static method current
of the GradleVersion
class. We get an GradleVersion
instance and we display different properties from this instance. In the task compareGradleVersion
we create a GradleVersion
instance with the static version
method. We compare multiple GradleVersion
objects and have different functionality based on the Gradle version.
Continue reading →
To define a Copy
task we specify the files we want to copy and to which directory. This definition is a CopySpec
instance. It contains the rules that defines what we want to copy. The archive tasks Jar
, Zip
and Tar
also use a CopySpec
instance.
When we create a task of type Copy
we get a task object that implements the CopySpec
interface. We can use all the methods from this interface to extend our recipe for copying tasks. In the following build file we first define the task website
. We use CopySpec
methods to configure the task. Then we define a task deploy
of type Sync
that also implements the CopySpec
interface.
Continue reading →
We can change the frames and grid of tables we define in Asciidoctor. We use the frames
attribute to change the outside frame of a table. We can choose between topbot
for top and bottom, sides
for only a frame at the sides of the table, none
if we don't want a frame. The default value all
create a frame around our table with top, sides and bottom.
To change the inner grid of a table we use the grids
table attribute. The default value all
displays a grid for columns and rows inside the table. The value cols
only displays a grid between columns, value rows
display a grid between rows and with value none
there will be no grid inside our table.
Continue reading →
As you may already know web components consist out of a set of technologies which are combined to create a custom element for use in your HTML markup. The main additions, as described in several blogposts, are HTML imports, Shadow Dom and Templates combined with isolated scripts and styling. (If these concepts are new to you i suggest you read up on web components at WebComponents.org). This blog post has a living example on plnkr.co. If we look at Angular it already supports html imports and isolated scripts through it's directive approach. This means we can already create custom components by using directives. The downside of this approach however is that there is no true isolation of markup and styling. Meaning both markup and styling may be inadvertently influenced by an outside source. Let's start with a basic directive and template:
angular.module('shadow.app', ['component.api'])
.directive('simpleDirective', function() {
return {
restrict: 'E',
replace: false,
templateUrl: 'template.html',
transclude: true,
scope: {
dynamic: '='
},
link: function($scope, element) {
// your code here
}
};
})
Continue reading →