anchor.diff:  
   NOTE: By default, Asciidoctor.js will determine the I/O module upon the runtime environment.
   
  -If you want to explicitly define the I/O module, you can specify the attribute `runtime.ioModule` when instantiating Asciidoctor.js: 
  +If you want to explicitly define the I/O module, you can specify the attribute `runtime.ioModule` when instantiating Asciidoctor.js:
   
   [source,javascript]
   ----
  
positive.code: 
  NOTE: By default, Asciidoctor.js will try his best to automatically detect the runtime environment.
  
  If you want to explicitly define the runtime environment, you can use a `runtime` configuration object when instantiating Asciidoctor.js: 
  
  [source,javascript]
  ----
  const asciidoctor = require('asciidoctor.js')({ 
    runtime: {
      platform: 'browser', 
      engine: 'v8', 
      framework: 'webextensions'
    }
  });
  
negative.code: 
  Both registry have a `[shout]` block extension registered with a specific implementation.
  
  The first block extension is registered in the `registryA` and will transform the text to uppercase.
  The other one is registered in the `registryB` and will replace `.` by `{nbsp}!!!`.
  
  === How to compile a Ruby extension to JavaScript (Node.js)
  
  Let's say you want to use the following Asciidoctor extension (written in Ruby) in your JavaScript based application.
  
  .lib/tel-inline-macro.rb
  ```ruby
  # An inline macro that turns URIs with the tel: URI scheme into links.
  #
  # Usage
  #
  #   tel:1-800-555-1212[]
  #
  Asciidoctor::Extensions.register do
    inline_macro do
      named :tel
      parse_content_as :text
      process do |parent, target, attrs|
        if (text = attrs['text']).empty?
          text = target
        end
        target = %(tel:#{target})
        (create_anchor parent, text, type: :link, target: target)
      end
    end
  end
  ```
  
  To compile this extension, you will need to install the `opal-compiler` package:
  
   npm install opal-compiler
  
  Once this package is installed, you can write the following Node script to compile the extension:
  
  .compile.js
  ```js
  const fs = require('fs');
  const Builder = require('opal-compiler').Builder;
  // Opal object will be available on the global scope
  
  const builder = Builder.$new();
  builder.$append_paths('lib'); // <1>
  const result = builder.$build('tel-inline-macro.rb'); // <2>
  fs.writeFileSync('tel-inline-macro.js', result.$to_s(), 'utf8'); // <3>
  ```
  <1> The extension file is in the `lib` directory
  <2> The extension file is named `tel-inline-macro.rb`
  <3> A file named `tel-inline-macro.js` will be written
  
  Then run it:
  
   node compile.js
  
  The above command will create a file named [.path]_tel-inline-macro.js_ containing the extension code in JavaScript.
  
  === How to use an Asciidoctor extension
  
  In the previous section, we showed how to compile a Ruby extension to JavaScript.
  In this section we will use this extension.
  
  Let's create a simple document:
  
  .document.adoc
  ```adoc
  = Contacts
  
  == Professional
  
  Guillaume Grossetie tel:1-800-555-1212[]
  ```
  
  Next we create a Node script to convert this document:
  
  .convert.js
  [source,javascript]
  ----
  const asciidoctor = require('asciidoctor.js')();
  require('./tel-inline-macro.js'); // <1>
  
  const html = asciidoctor.convertFile('document.adoc', { to_file: false }); // <2>
  console.log(html);
  ----
  <1> Load the local extension named [.path]_tel-inline-macro.js_
  <2> Convert the document with the `tel` inline macro extension enabled
  
  NOTE: Asciidoctor.js must be installed: `npm install asciidoctor.js`
  
  Then we run it:
  
   node convert.js
  
  ```
  <div class="sect1">
  <h2 id="_professional">Professional</h2>
  <div class="sectionbody">
  <div class="paragraph">
  <p>Guillaume Grossetie <a href="tel:1-800-555-1212">1-800-555-1212</a></p> // <1>
  </div>
  </div>
  </div>
  
  ```
  <1> The `tel` macro was converted to a link
  