-
Notifications
You must be signed in to change notification settings - Fork 240
Overriding built in tags
To change the behavior of existing tags, we can just override their class definitions.
For example we can look at the Template tag class definition and override the to_html method to put out different markup:
require "jsduck/tag/template"
class JsDuck::Tag::Template
def to_html(context)
"<p class='template-highlight'>It's a template!</p>"
end
endIn addition to the to_html we'd also like to change the @css instance variable. We could just override the initialize method:
class JsDuck::Tag::Template
def initialize
@pattern = "template"
@signature = {:long => "template", :short => "TMP"}
@html_position = POS_TEMPLATE
# Box with light gray background
@css = <<-EOCSS
.template-highlight {
font-weight: bold;
color: red;
}
EOCSS
super
end
...
endBut this way we end up duplicating a bunch of other unrelated code of which we're not at all interested. A better approach is to call the overridden method first and then apply some additional modifications on top of that:
class JsDuck::Tag::Template
alias_method :old_initialize, :initialize
def initialize
old_initialize
@css = <<-EOCSS
.template-highlight {
font-weight: bold;
color: red;
}
EOCSS
end
...
endHere we're using alias_method to give the old initialize method another name before we override it. It's not the cleanest approach, but unless you're going to override it several times (and I see no reason to) this should be good enough.