# frozen_string_literal: true

require 'uri'

class GitHubLinkInlineMacro < Asciidoctor::Extensions::InlineMacroProcessor
  use_dsl

  named :github
  name_positional_attributes 'caption'

  def process(parent, target, attrs)
    doc = parent.document

    default_caption = if attrs.key?('repo-option')
                        target.split('/').at(1)
                      else
                        target
                      end
    text = attrs['caption'] || default_caption
    uri = URI.parse %(https://github.com/#{target})

    if attrs.key? 'issue'
      uri.path += %(/issues/#{attrs['issue']})
      text << "##{attrs['issue']}" if text == target
    else
      uri.path += %(/tree/#{attrs['rev']}) if attrs.key? 'rev'
      uri.path += %(/#{attrs['path']}) if attrs.key? 'path'
      text << "@#{attrs['rev']}" if attrs.key?('rev') && text == target
    end

    target = uri.to_s

    doc.register :links, target
    create_anchor parent, text, type: :link, target: target
  end
end