anchor.diff:  ----
   Opal.hash2(['attributes'], {'attributes': ['notitle!']})
   ----
  +
  +=== Back-end development
  +
  +For back-end development, we use *NPM*.
  +
  +Start by install *asciidoctor.js* module:
  +
  +[source, javascript]
  +----
  +npm install asciidoctor.js --save
  +----
  +
  +You need to load file into your application. For instance, in a Javascript file, add these line :
  +[source, javascript]
  +----
  +var asciidoctorObject = require('asciidoctor.js')();
  +
  +// You can get Opal
  +var opal = asciidoctorObject.Opal;
  +
  +// You can get Asciidoctor with Extensions ...
  +var asciidoctorWithExtensions = asciidoctorObject.Asciidoctor(true);
  +// ... or without extensions
  +var asciidoctorWithoutExtensions = asciidoctorObject.Asciidoctor();
  +
  +// Now you can use it
  +var html = Asciidoctor.$convert('== Test', opal.hash2(['attributes'], {'attributes': ['notitle!']}));
  +
  +// And for example log it
  +console.log(html);
  +
  +/*
  +// Should return
  +<div class="sect1">
  +<h2 id="_test">Test</h2>
  +<div class="sectionbody">
  +
  +</div>
  +</div>
  +*/
  +----
  +
   
   == Changes to Asciidoctor (from upstream)
   
  
positive.code: 
  If you choose, you may use the Asciidoctor class that Opal generates directly from Ruby.
  
  All Opal-compiled classes are stored under the Opal namespace.
  Ruby variables and methods on a class or object get prefixed with +$+.
  Thus, where you would execute +Asciidoctor.render+ in Ruby, you execute +Opal.Asciidoctor.$render+ in JavaScript.
  
negative.code: - *asciidoctor-extensions.js* (extensions API only)
  - *asciidoctor-all.js* (core, extension and Opal)
  
  * *dist/NPM* (to use with NPM)
  - *asciidoctor-core.js* (no extensions API)
  - *asciidoctor-extensions.js* (extensions API only)
  
  Each file has a +minified+ and +gz+ version.
  
  You'll see these scripts in action when you run the examples, described next.
  
  