Sha256: 3ef77d1cf44b4281f8d77faa5b66057db3c440b91380b150cd87455b9563fd9d

Contents?: true

Size: 1.95 KB

Versions: 14

Compression:

Stored size: 1.95 KB

Contents

require 'jsduck/util/html'

module JsDuck
  module Inline

    # Renders HTML link to class or member.
    class LinkRenderer
      # Access to relations object, used by Inline::Link and
      # Inline::AutoLink.
      attr_reader :relations

      def initialize(relations={}, opts={})
        @relations = relations

        # Template HTML that replaces {@link Class#member anchor text}.
        # Can contain placeholders:
        #
        # %c - full class name (e.g. "Ext.Panel")
        # %m - class member name prefixed with member type (e.g. "method-urlEncode")
        # %# - inserts "#" if member name present
        # %- - inserts "-" if member name present
        # %a - anchor text for link
        @tpl = opts[:link_tpl] || '<a href="%c%#%m">%a</a>'
      end

      # Generates HTML link to class or member applying the link
      # template.
      def link(cls, member, anchor_text, type=nil, static=nil)
        # Use the canonical class name for link (not some alternateClassName)
        cls = @relations[cls][:name]
        # prepend type name to member name
        member = member && get_matching_member(cls, {:name => member, :tagname => type, :static => static})

        @tpl.gsub(/(%[\w#-])/) do
          case $1
          when '%c'
            cls
          when '%m'
            member ? member[:id] : ""
          when '%#'
            member ? "#" : ""
          when '%-'
            member ? "-" : ""
          when '%a'
            Util::HTML.escape(anchor_text||"")
          else
            $1
          end
        end
      end

      def get_matching_member(cls, query)
        ms = find_members(cls, query)
        if ms.length > 1
          instance_ms = ms.find_all {|m| !m[:static] }
          instance_ms.length > 0 ? instance_ms[0] : ms.find_all {|m| m[:static] }[0]
        else
          ms[0]
        end
      end

      def find_members(cls, query)
        @relations[cls] ? @relations[cls].find_members(query) : []
      end

    end

  end
end

Version data entries

14 entries across 14 versions & 1 rubygems

Version Path
jsduck-5.3.4 lib/jsduck/inline/link_renderer.rb
jsduck-5.3.3 lib/jsduck/inline/link_renderer.rb
jsduck-5.3.2 lib/jsduck/inline/link_renderer.rb
jsduck-5.3.1 lib/jsduck/inline/link_renderer.rb
jsduck-5.3.0 lib/jsduck/inline/link_renderer.rb
jsduck-5.2.0 lib/jsduck/inline/link_renderer.rb
jsduck-5.1.0 lib/jsduck/inline/link_renderer.rb
jsduck-5.0.1 lib/jsduck/inline/link_renderer.rb
jsduck-5.0.0 lib/jsduck/inline/link_renderer.rb
jsduck-5.0.0.beta5 lib/jsduck/inline/link_renderer.rb
jsduck-5.0.0.beta4 lib/jsduck/inline/link_renderer.rb
jsduck-5.0.0.beta3 lib/jsduck/inline/link_renderer.rb
jsduck-5.0.0.beta2 lib/jsduck/inline/link_renderer.rb
jsduck-5.0.0.beta01 lib/jsduck/inline/link_renderer.rb