diff --git a/lib/puppet-strings/markdown/base.rb b/lib/puppet-strings/markdown/base.rb
index f99adeacd..a98256ca9 100644
--- a/lib/puppet-strings/markdown/base.rb
+++ b/lib/puppet-strings/markdown/base.rb
@@ -95,7 +95,11 @@ def see
# @return [Array] parameter tag hashes
def params
- select_tags('param')
+ tags = @tags.select { |tag| tag[:tag_name] == 'param' }.map do |param|
+ param[:link] = clean_link("$#{name}::#{param[:name]}")
+ param
+ end
+ tags.empty? ? nil : tags
end
# @return [Array] example tag hashes
@@ -151,7 +155,7 @@ def toc_info
# @return [String] makes the component name suitable for a GitHub markdown link
def link
- name.delete('::').strip.gsub(' ','-').downcase
+ clean_link(name)
end
# Some return, default, or valid values need to be in backticks. Instead of fu in the handler or code_object, this just does the change on the front.
@@ -195,5 +199,17 @@ def select_tags(name)
tags = @tags.select { |tag| tag[:tag_name] == name }
tags.empty? ? nil : tags
end
+
+ # Convert an input into a string appropriate for an anchor name.
+ #
+ # This converts any character not suitable for an id attribute into a '-'. Generally we're running this on Puppet identifiers for types and
+ # variables, so we only need to worry about the special characters ':' and '$'. With namespaces Puppet variables this should always be produce a
+ # unique result from a unique input, since ':' only appears in pairs, '$' only appears at the beginning, and '-' never appears.
+ #
+ # @param [String] the input to convert
+ # @return [String] the anchor-safe string
+ def clean_link(input)
+ input.tr('^a-zA-Z0-9_-', '-')
+ end
end
end
diff --git a/lib/puppet-strings/markdown/resource_type.rb b/lib/puppet-strings/markdown/resource_type.rb
index f1b4393b3..1d959cb67 100644
--- a/lib/puppet-strings/markdown/resource_type.rb
+++ b/lib/puppet-strings/markdown/resource_type.rb
@@ -29,13 +29,19 @@ def checks
def properties_and_checks
return nil if properties.nil? && checks.nil?
- ((properties || []) + (checks || [])).sort_by { |p| p[:name] }
+ ((properties || []) + (checks || [])).sort_by { |p| p[:name] }.map do |prop|
+ prop[:link] = clean_link("$#{name}::#{prop[:name]}")
+ prop
+ end
end
def parameters
return nil unless @registry[:parameters]
- @registry[:parameters].sort_by { |p| p[:name] }
+ @registry[:parameters].sort_by { |p| p[:name] }.map do |param|
+ param[:link] = clean_link("$#{name}::#{param[:name]}")
+ param
+ end
end
def regex_in_data_type?(data_type)
diff --git a/lib/puppet-strings/markdown/templates/classes_and_defines.erb b/lib/puppet-strings/markdown/templates/classes_and_defines.erb
index e73993268..2b4f19b5d 100644
--- a/lib/puppet-strings/markdown/templates/classes_and_defines.erb
+++ b/lib/puppet-strings/markdown/templates/classes_and_defines.erb
@@ -50,11 +50,11 @@
The following parameters are available in the `<%= name %>` <%= @type %>:
<% params.each do |param| -%>
-* [`<%= param[:name] %>`](#<%= param[:name] %>)
+* [`<%= param[:name] %>`](#<%= param[:link] %>)
<% end -%>
<% params.each do |param| -%>
-##### `<%= param[:name] %>`
+##### `<%= param[:name] %>`
<% if param[:types] -%>
Data type: `<%= param[:types].join(', ') -%>`
diff --git a/lib/puppet-strings/markdown/templates/data_type.erb b/lib/puppet-strings/markdown/templates/data_type.erb
index eaf6e842e..160f17cdd 100644
--- a/lib/puppet-strings/markdown/templates/data_type.erb
+++ b/lib/puppet-strings/markdown/templates/data_type.erb
@@ -58,11 +58,11 @@ Alias of
The following parameters are available in the `<%= name %>` <%= @type %>:
<% params.each do |param| -%>
-* [`<%= param[:name] %>`](#<%= param[:name] %>)
+* [`<%= param[:name] %>`](#<%= param[:link] %>)
<% end -%>
<% params.each do |param| -%>
-##### `<%= param[:name] %>`
+##### `<%= param[:name] %>`
<% if param[:types] -%>
Data type: `<%= param[:types].join(', ') -%>`
diff --git a/lib/puppet-strings/markdown/templates/resource_type.erb b/lib/puppet-strings/markdown/templates/resource_type.erb
index e9f1be1ab..8490967be 100644
--- a/lib/puppet-strings/markdown/templates/resource_type.erb
+++ b/lib/puppet-strings/markdown/templates/resource_type.erb
@@ -98,11 +98,11 @@ Default value: `<%= prop[:default] %>`
The following parameters are available in the `<%= name %>` <%= @type %>.
<% parameters.each do |param| -%>
-* [`<%= param[:name] %>`](#<%= param[:name] %>)
+* [`<%= param[:name] %>`](#<%= param[:link] %>)
<% end -%>
<% parameters.each do |param| -%>
-##### `<%= param[:name] %>`
+##### `<%= param[:name] %>`
<% if param[:values] -%>
Valid values: `<%= param[:values].map { |value| value_string(value) }.join('`, `') %>`
diff --git a/spec/unit/puppet-strings/markdown/base_spec.rb b/spec/unit/puppet-strings/markdown/base_spec.rb
index b9723e762..d46aa63a0 100644
--- a/spec/unit/puppet-strings/markdown/base_spec.rb
+++ b/spec/unit/puppet-strings/markdown/base_spec.rb
@@ -141,7 +141,7 @@ class klass::yeah(
describe '#link' do
it 'returns a valid link' do
- expect(component.link).to eq 'klassyeah'
+ expect(component.link).to eq 'klass--yeah'
end
end
end