asciidoctor/asciidoctor-extensions-lab

Extension for Sign languages

Opened this issue · 8 comments

Hi,

I'm trying to write a extension for placing videos from a Sign Language. It would be some thing like this:

libras.yaml:

"casa": https://www.youtube.com/watch?v=xjxjTMBoNjE

sample.adoc:

:sign-lang: libras

sign::casa[]

It would read casa from libras.yaml and translate to:

video::https://www.youtube.com/watch?v=xjxjTMBoNjE[]

It would be more complex, but this would be a start.

Can someone help me?

Here's what I have done so far:

  • I think it would be a subclasse of BlockMacroProcessor, like gist-block-macro
  • A made a copy of gist-block-macro and replace gist to sign:
(...)
class SignBlockMacro < Extensions::BlockMacroProcessor
  use_dsl

  named :sign
(...)

sample.adoc

= Sign Block Macro Extension

.Guard setup to live preview AsciiDoc output
sign::mojavelinux/5546622[]
  • And I run it with -r:
asciidoctor-extensions-lab$ asciidoctor --trace -r lib/sign-languages/extension.rb lib/sign-languages/sample.adoc  
/home/santana/.rvm/rubies/ruby-2.2.1/lib/ruby/site_ruby/2.2.0/rubygems/core_ext/kernel_require.rb:54:in `require': cannot load such file -- lib/sign-languages/extension.rb (LoadError)
    from /home/santana/.rvm/rubies/ruby-2.2.1/lib/ruby/site_ruby/2.2.0/rubygems/core_ext/kernel_require.rb:54:in `require'

  • It didn't work. So I have tests gist alone:
asciidoctor-extensions-lab$ asciidoctor --trace -r lib/gist-block-macro/extension.rb lib/gist-block-macro/sample.adoc 
/home/santana/.rvm/rubies/ruby-2.2.1/lib/ruby/site_ruby/2.2.0/rubygems/core_ext/kernel_require.rb:54:in `require': cannot load such file -- lib/gist-block-macro/extension.rb (LoadError)
    from /home/santana/.rvm/rubies/ruby-2.2.1/lib/ruby/site_ruby/2.2.0/rubygems/core_ext/kernel_require.rb:54:in `require'
  • Since I don't know if gist is working, then I have tested an other BlockMacroProcessor extension, the TreeBlockMacro. I changed the sample file to directory of mine, and tested it:
asciidoctor-extensions-lab$ asciidoctor --trace -r lib/tree-block-macro/extension.rb lib/tree-block-macro/sample.adoc 
/home/santana/.rvm/rubies/ruby-2.2.1/lib/ruby/site_ruby/2.2.0/rubygems/core_ext/kernel_require.rb:54:in `require': cannot load such file -- lib/tree-block-macro/extension.rb (LoadError)
    from /home/santana/.rvm/rubies/ruby-2.2.1/lib/ruby/site_ruby/2.2.0/rubygems/core_ext/kernel_require.rb:54:in `require'

Can someone guide me? What I am doing wrong?

Fascinating idea!

I think that you need to start the require path with ./. It works in some environments without the ./, but safest is to use it. Just looks to me like Ruby isn't understanding where the extension is.

Of course, this would be partially solved by fixing #44, which we desperately need.

I'd say that the emoji inline macro is pretty close to this one as well, except that it is an inline macro instead of a block macro. So take a look at that one too.

asciidoctor-extensions-lab$ asciidoctor -r ./lib/gist-block-macro/extension.rb ./lib/gist-block-macro/sample.adoc 

With ./ it runs, but... here's the output:

sample.html:

(...)
<h1>Gist Block Macro Extension</h1>
</div>
<div id="content">
<div class="paragraph">
<div class="title">Guard setup to live preview AsciiDoc output</div>
<p>gist::mojavelinux/5546622[]</p>
</div>
</div>
(...)

I don't know... but for if I think it's missing the registration somewhere in the code. How does it know that we have an new extension available without it?

For me, the emoji isn't working ether:

(...)
<h1>Emoji Inline Macro Extension</h1>
</div>
<div id="content">
<div class="paragraph">
<p>Faster than a emoji:turtle[1x]!</p>
</div>
<div class="paragraph">
<p>This is an example of how you can emoji:heart[lg] Asciidoctor and Twitter Emoji.</p>
</div>(...)

Hello @edusantana

I don't know... but for if I think it's missing the registration somewhere in the code. How does it know that we have an new extension available without it?

The registration is done by the Ruby files in the root of the lib directory: https://github.com/asciidoctor/asciidoctor-extensions-lab/tree/master/lib

So the command line for gist-block-macro is:

asciidoctor -r ./lib/gist-block-macro.rb ./lib/gist-block-macro/sample.adoc 

If my extension returns video::https://www.youtube.com/watch?v=xjxjTMBoNjE[]it would no work. It's probably because it already processed the macros.

How can I call the code to produce the video after that?

There are two approaches you can inside the block processor. Before I mention them, it's important to understand that the purpose of the block processor is to contribute zero or more nodes to the AST tree during parsing.

The first approach is to return an AST node, in this case a video node. That code would look something like:

attrs['poster'] = 'youtube'
attrs['target'] = 'xjxjTMBoNjE'
return create_block parent, :video, nil, attrs, {}

The second approach is to parse the new content inside the processor. That code would look something like:

parse_content parent, 'video::https://www.youtube.com/watch?v=xjxjTMBoNjE[]'
return nil

parse_content is a helper method in the extension API. See https://github.com/asciidoctor/asciidoctor/blob/master/lib/asciidoctor/extensions.rb#L107-L119.

It's working...

Now the work will be to create and populate a nice repository, where users will be able no navigate and search for signs to use.

The inline macro will be used to create links, and the block to display videos.

👍