class GovukTechDocs::UniqueIdentifierGenerator

Constants

Anchor

Attributes

anchors[R]

Public Class Methods

new() click to toggle source
# File lib/govuk_tech_docs/unique_identifier_generator.rb, line 11
def initialize
  reset
end

Public Instance Methods

create(id, level) click to toggle source
# File lib/govuk_tech_docs/unique_identifier_generator.rb, line 15
def create(id, level)
  anchor = heading_slug(id)

  unless unique?(anchor)
    anchor = prefixed_by_parent(anchor, level)
  end

  unless unique?(anchor)
    anchor = suffixed_with_number(anchor)
  end

  @anchors << Anchor.new(anchor, level)

  anchor
end
reset() click to toggle source
# File lib/govuk_tech_docs/unique_identifier_generator.rb, line 31
def reset
  @anchors = []
end

Private Instance Methods

heading_slug(text) click to toggle source

github.com/vmg/redcarpet/blob/820dadb98b3720811cc20c5570a5d43c796c85fc/ext/redcarpet/html.c#L274-L305

# File lib/govuk_tech_docs/unique_identifier_generator.rb, line 63
def heading_slug(text)
  text
    .downcase
    .strip
    .gsub(%r{</?[^>]+?>}, '') # Remove HTML tags
    .gsub(/[^0-9a-z]+/, '-')  # Replace non-alphanumeric characters with dashes
    .gsub(/\A-+|-+\z/, '')    # Remove trailing dashes
end
prefixed_by_parent(anchor, level) click to toggle source
# File lib/govuk_tech_docs/unique_identifier_generator.rb, line 37
def prefixed_by_parent(anchor, level)
  closest_parent = @anchors.reverse.find { |a| a.level < level }
  if closest_parent.nil?
    anchor
  else
    [closest_parent.id, anchor].join("-")
  end
end
suffixed_with_number(text) click to toggle source
# File lib/govuk_tech_docs/unique_identifier_generator.rb, line 46
def suffixed_with_number(text)
  number = 2
  anchor = "#{text}-#{number}"

  until unique?(anchor)
    anchor = "#{text}-#{number}"
    number += 1
  end

  anchor
end
unique?(value) click to toggle source
# File lib/govuk_tech_docs/unique_identifier_generator.rb, line 58
def unique?(value)
  @anchors.none? { |a| a.id == value }
end