Shell Scripting
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:
1 | 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
1 2 3 4 5 6 7 | 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
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | 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:
1 2 3 | asciidoctor template.adoc \ -r . /lib/featured-macro .rb \ -o - |
And that’s it!
Published on System Code Geeks with permission by Mark Needham, partner at our SCG program. See the original article here: Asciidoctor: Creating a macro Opinions expressed by System Code Geeks contributors are their own. |