-
Notifications
You must be signed in to change notification settings - Fork 240
Custom member types
For member tags we derive our tag class from JsDuck::Tag::MemberTag class.
Lets implement a @hook tag to describe a special class of functions
that will provide a way to hook into the internals of a class and
extend it. For example:
/**
* @hook before
* Runs before the component is initialized.
* @param {Object} self The component itself.
* @param {Object} cfg Config options passed in constructor.
*/An implementation for this is quite simple:
require "jsduck/tag/member_tag"
class Hook < JsDuck::Tag::MemberTag
def initialize
@tagname = :hook
@pattern = "hook"
@member_type = {
:title => "Hooks",
:position => MEMBER_POS_CFG - 0.1,
:icon => File.dirname(__FILE__) + "/hook.png",
}
end
def parse_doc(scanner, position)
return {
:tagname => :hook,
:name => scanner.ident,
}
end
def process_doc(context, hook_tags, position)
context[:name] = hook_tags[0][:name]
end
def to_html(hook, cls)
member_link(hook) + member_params(hook[:params])
end
endThe thing that turns this tag into a new member type is the setting of
@member_type variable. There we set a few rendering options.
:position defines the ordering of member sections in the final
page. Here we position hooks at the very top - before configs. The
title is shown at the top of each members section and is also used as
a title for toolbar button.
:icon defines the icon file to use. It must be a transparent PNG file,
referenced with an absolute path - calling File.dirname(__FILE__)
gives us the directory where our Hook class is defined in.
parse_doc and process_doc are fairly trivial. We parse the name
of the hook using builtin scanner.ident method, and assign the value
to :name field in context hash.
to_html method is the one responsible for rendering the member signature
line. In out case we just render the hook name (using member_link method)
and its parameters (using member_params method).
The result will look like this:
