Sha256: c0219c6386c28c102d78b2f07958c0638d6ddeb17812b9040899edc7a7813aff

Contents?: true

Size: 1.73 KB

Versions: 3

Compression:

Stored size: 1.73 KB

Contents

require "strscan"

module Lookbook
  class ParamTag < YardTag
    TAG_NAME = "param"

    def param_name
      parts[:param_name].to_sym
    end

    def value_type
      if parts[:value_types].any?
        parts[:value_types].first.strip.downcase.to_sym
      end
    end

    def input_type
      parts[:input_type]&.to_sym
    end

    def description
      parts[:description]
    end

    def options_str
      parts[:options] || super
    end

    def parts
      @parts ||= scan_text
    end

    def value
      raise "@param tags do not have a value"
    end

    private

    def scan_text
      parts = {}
      scanner = StringScanner.new(@text.strip)

      # Name
      scanner.scan(/^([\d\w]+)\s?|$?/)
      if scanner.matched?
        parts[:param_name] = scanner.captures.first.strip
        last_pos = scanner.pos
      else
        raise ArgumentError, "No name found for @param tag"
      end

      # Data types
      scanner.scan(/\[([a-zA-Z]+)\]/)
      if scanner.matched?
        parts[:value_types] = scanner.captures.first.split(",")
        last_pos = scanner.pos
      else
        parts[:value_types] = []
        scanner.pos = last_pos
      end

      # Input type
      scanner.scan(/\s?(\w+)\s?/)
      if scanner.matched?
        parts[:input_type] = scanner.captures.first
        last_pos = scanner.pos
      else
        scanner.pos = last_pos
      end

      # Description
      scanner.scan(/\s?(?:'(?<single>[^'\\]*(?:\\.[^'\\]*)*)'|"(?<double>[^"\\]*(?:\\.[^"\\]*)*)")\s?/i)
      if scanner.matched?
        parts[:description] = scanner.captures.first.presence || scanner.captures.last
      else
        scanner.pos = last_pos
      end

      # Options
      parts[:options] = scanner.rest.strip

      parts
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
lookbook-3.0.0.alpha.2 lib/lookbook/previews/tags/param_tag.rb
lookbook-3.0.0.alpha.1 lib/lookbook/previews/tags/param_tag.rb
lookbook-3.0.0.alpha.0 lib/lookbook/previews/tags/param_tag.rb