asciidoctor / asciidoctor.js

:scroll: A JavaScript port of Asciidoctor, a modern implementation of AsciiDoc
https://asciidoctor.org
MIT License
719 stars 131 forks source link

Reusing extensions registry doesn't work in v3.0.2 #1709

Open saneef opened 11 months ago

saneef commented 11 months ago

When I reuse an registry, in subsequent calls to convert(), the registered extensions don't work.

See the sample code, which is based on an example from docs:

const asciidoctor = require("asciidoctor")();
const registry = asciidoctor.Extensions.create();
registry.block(function () {
  var self = this;
  self.named("shout");
  self.onContext("paragraph");
  self.process(function (parent, reader) {
    var lines = reader.getLines().map(function (l) {
      return l.toUpperCase();
    });
    return self.createBlock(parent, "paragraph", lines);
  });
});

const text = `[shout]\
\nSay it loud.\
\nSay it proud.`;

// 1
const htmlA = asciidoctor.convert(text, {
  extension_registry: registry,
});

// 2
const htmlB = asciidoctor.convert(text, {
  extension_registry: registry,
});

console.log(`Converted first:
${htmlA}`);
console.log(" ");
console.log(`Converted second:
${htmlB}`);

// 🚨 Output from v3.0.2
// Converted first:
// <div class="paragraph">
// <p>SAY IT LOUD.
// SAY IT PROUD.</p>
// </div>

// Converted second:
// <div class="paragraph">
// <p>Say it loud.
// Say it proud.</p>
// </div>

// ✅ Output from v2.2.6
// Converted first:
// <div class="paragraph">
// <p>SAY IT LOUD.
// SAY IT PROUD.</p>
// </div>

// Converted second:
// <div class="paragraph">
// <p>SAY IT LOUD.
// SAY IT PROUD.</p>
// </div>

The same code works fine in v2.2.x.

Is this a bug, or am I doing something wrong?

I encountered this issue when I was trying to find a fix for saneef/eleventy-plugin-asciidoc#10.

ggrossetie commented 4 months ago

@mojavelinux I vaguely remember a discussion about it but I don't recall what needs to be done? Does that ring a bell?

saneef commented 4 months ago

Based on this comment, I reworked the plugin in which I'm using asciidoctor.js. Now I'm creating new registry for each call to convert()

Should we close this issue? May we should add a note in documentation.

ggrossetie commented 4 months ago

Based on https://github.com/asciidoctor/asciidoctor-kroki/issues/421#issuecomment-1649374749, I reworked the plugin in which I'm using asciidoctor.js. Now I'm creating new registry for each call to convert()

Thanks that's the comment I was looking for!

Should we close this issue? May we should add a note in documentation.

Yes, we should add a callout/admonition in: https://docs.asciidoctor.org/asciidoctor.js/latest/extend/extensions/register/

mojavelinux commented 4 months ago

I vaguely remember a discussion about it but I don't recall what needs to be done? Does that ring a bell?

I think you're referring to https://github.com/asciidoctor/asciidoctor/issues/4256.