asciidoctor / asciidoctor-extensions-lab

A lab for testing and demonstrating Asciidoctor extensions. Please do not use this code in production. If you want to use one of these extensions in your application, create a new project, import the code, and distribute it as a RubyGem. You can then request to make it a top-level project under the Asciidoctor organization.
Other
104 stars 101 forks source link

Extension for Sign languages #45

Open edusantana opened 9 years ago

edusantana commented 9 years ago

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:

(...)
class SignBlockMacro < Extensions::BlockMacroProcessor
  use_dsl

  named :sign
(...)

sample.adoc

= Sign Block Macro Extension

.Guard setup to live preview AsciiDoc output
sign::mojavelinux/5546622[]
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'
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'
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?

mojavelinux commented 9 years ago

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.

edusantana commented 9 years ago
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>(...)
ggrossetie commented 9 years ago

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 
edusantana commented 9 years ago

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?

mojavelinux commented 9 years ago

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.

mojavelinux commented 9 years ago

Btw, Asciidoctor Diagram uses the first approach. See https://github.com/asciidoctor/asciidoctor-diagram/blob/master/lib/asciidoctor-diagram/extensions.rb#L132-L189

edusantana commented 9 years ago

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.

mojavelinux commented 9 years ago

:+1: