Asciidoctor: Creating a macro
I’ve been writing the TWIN4j blog for almost a year now and during that time I’ve written a few different asciidoc macros to avoid repetition.
The most recent one I wrote does the formatting around the Featured Community Member of the Week. I call it like this from the asciidoc, passing in the name of the person and a link to an image:
featured::https://s3.amazonaws.com/dev.assets.neo4j.com/wp-content/uploads/20180202004247/this-week-in-neo4j-3-february-2018.jpg[name="Suellen Stringer-Hye"]
The code for the macro has two parts. The first is some wiring code that registers the macro with Asciidoctor:
lib/featured-macro.rb
RUBY_ENGINE == 'opal' ? (require 'featured-macro/extension') : (require_relative 'featured-macro/extension')
Asciidoctor::Extensions.register do
if (@document.basebackend? 'html') && (@document.safe < SafeMode::SECURE)
block_macro FeaturedBlockMacro
end
end
And this is the code for the macro itself:
lib/featured-macro/extension.rb
require 'asciidoctor/extensions' unless RUBY_ENGINE == 'opal'
include ::Asciidoctor
class FeaturedBlockMacro < Extensions::BlockMacroProcessor
use_dsl
named :featured
def process parent, target, attrs
name = attrs["name"]
html = %(<div class="imageblock image-heading">
<div class="content">
<img src="#{target}" alt="#{name} - This Week’s Featured Community Member" width="800" height="400">
</div>
</div>
<p style="font-size: .8em; line-height: 1.5em;" align="center">
<strong>#{name} - This Week's Featured Community Member</strong>
</p>
)
create_pass_block parent, html, attrs, subs: nil
end
end
When we convert the asciidoc into HTML we need to tell asciidoctor about the macro, which we can do like this:
asciidoctor template.adoc \
-r ./lib/featured-macro.rb \
-o -
And that’s it!
About the author
I'm currently working on short form content at ClickHouse. I publish short 5 minute videos showing how to solve data problems on YouTube @LearnDataWithMark. I previously worked on graph analytics at Neo4j, where I also co-authored the O'Reilly Graph Algorithms Book with Amy Hodler.