class Primer::Yard::LookbookPage

A single Lookbook page.

def common_args_from(params)

def common_args_from(params)
  params.select { |param| common_form_input_argument_names.include?(param.name) }
end

def common_form_input_argument_names

def common_form_input_argument_names
  @common_form_input_argument_names ||= begin
    macro = registry.yard_registry[".macro.form_input_arguments"]
    parser = ::YARD::Docstring.parser
    parser.parse(macro.macro_data)
    parser
      .tags
      .select { |tag| tag.tag_name == "param" }
      .map(&:name)
  end
end

def component

def component
  component_ref.klass
end

def generate

def generate
  path = File.expand_path(
    File.join(
      *%w[.. .. .. previews pages forms inputs],
      "#{docs.short_name.dasherize.underscore}.md.erb"
    ), __dir__
  )
  documented_methods = docs.non_slot_methods.select do |mtd|
    [component.name, "Primer::Forms::Dsl::InputMethods"].include?(mtd.parent.title)
  end
  preview_methods = PREVIEW_MAP[component]
  preview_erbs = preview_methods.map do |preview_method|
    if Primer::FormsPreview.instance_methods.exclude?(preview_method)
      raise "Preview '#{preview_method}' does not exist in Primer::FormsPreview"
    end
    # rubocop:enable Style/IfUnlessModifier
    "<%= embed Primer::FormsPreview, #{preview_method.inspect} %>"
  end
  # rubocop:enable Lint/UselessAssignment
  # rubocop:disable Security/Eval
  File.open(path, "w") do |f|
    f.write(eval(Erubi::Engine.new(<<~ERB, trim: true).src))
      ---
      title: <%= docs.title.underscore.titleize %>
      id: <%= page_id %>
      ---
      <%= docs.base_docstring %>
      ## Usage
      ```ruby
      <%= docs.tags(:form_usage).first.text %>
      ```
      <% specific_args = specific_args_from(docs.params) %>
      <% unless specific_args.empty? %>
      ## Arguments
      <%= generate_args_table(specific_args) %>
      <% end %>
      ## Common arguments
      <%= generate_args_table(common_args_from(docs.params)) %>
      <% unless documented_methods.empty? %>
      ## Methods
        <% documented_methods.each do |method_docs| %>
      ### `#<%= method_docs.signature.sub(/def /, "") %>`
      <%= method_docs.base_docstring %>
          <% param_tags = method_docs.tags(:param) %>
          <% if param_tags.any? %>
      <%= generate_args_table(param_tags) %>
          <% end %>
        <% end %>
      <% end %>
      <% unless preview_methods.empty? %>
      ## Examples
      <%= preview_erbs.join("\n") %>
      <% end %>
    ERB
  end
  # rubocop:enable Security/Eval
end

def generate_args_table(params)

def generate_args_table(params)
  rows = params.map do |tag|
    description = backend.view_context.render(inline: tag.text.squish)
    parts = [
      "`#{tag.name}`",
      tag.types.join(", "),
      description
    ]
    "| #{parts.join(' | ')} |"
  end
  <<~MARKDOWN
    | Name | Type | Description |
    | :- | :- | :- |
    #{rows.join("\n")}
  MARKDOWN
end

def initialize(component_ref, backend, docs)

def initialize(component_ref, backend, docs)
  @component_ref = component_ref
  @backend = backend
  @docs = docs
end

def page_id

def page_id
  @page_id ||= docs.short_name.dasherize.underscore.tap do |page_id|
    page_id << "_input" unless page_id.end_with?("_input")
  end
end

def registry

def registry
  backend.registry
end

def specific_args_from(params)

def specific_args_from(params)
  params.reject { |param| common_form_input_argument_names.include?(param.name) }
end