Add support for additional edge cases to RuleLinkExpander.

* Add support for rules with capital letters, such as Fileset
* Add support for static page headings with periods.
* Run the expander on the HTML doc for the name attribute.
* Add functions to initial rule index.

--
MOS_MIGRATED_REVID=115925884
diff --git a/src/main/java/com/google/devtools/build/docgen/DocgenConsts.java b/src/main/java/com/google/devtools/build/docgen/DocgenConsts.java
index d50a299..da7a1da 100644
--- a/src/main/java/com/google/devtools/build/docgen/DocgenConsts.java
+++ b/src/main/java/com/google/devtools/build/docgen/DocgenConsts.java
@@ -100,7 +100,7 @@
    * (e.g. common-definitions.label-expansion).
    */
   public static final Pattern BLAZE_RULE_LINK = Pattern.compile(
-      "\\$\\{link (([a-z_-]+)(\\.([a-z_-]+))?)\\}");
+      "\\$\\{link (([a-zA-Z_-]+)(\\.([a-zA-Z_\\.-]+))?)\\}");
 
   /**
    * i.e. <!-- #BLAZE_RULE(NAME = RULE_NAME, TYPE = RULE_TYPE, FAMILY = RULE_FAMILY) -->
diff --git a/src/main/java/com/google/devtools/build/docgen/RuleDocumentation.java b/src/main/java/com/google/devtools/build/docgen/RuleDocumentation.java
index 2fec7c4..f173bdf 100644
--- a/src/main/java/com/google/devtools/build/docgen/RuleDocumentation.java
+++ b/src/main/java/com/google/devtools/build/docgen/RuleDocumentation.java
@@ -209,10 +209,18 @@
    * Returns a string containing any extra documentation for the name attribute for this
    * rule.
    */
-  public String getNameExtraHtmlDoc() {
-    return docVariables.containsKey(DocgenConsts.VAR_NAME)
+  public String getNameExtraHtmlDoc() throws BuildEncyclopediaDocException {
+    String expandedDoc = docVariables.containsKey(DocgenConsts.VAR_NAME)
         ? docVariables.get(DocgenConsts.VAR_NAME)
         : "";
+    if (linkExpander != null) {
+      try {
+        expandedDoc = linkExpander.expand(expandedDoc);
+      } catch (IllegalArgumentException e) {
+        throw new BuildEncyclopediaDocException(fileName, startLineCount, e.getMessage());
+      }
+    }
+    return expandedDoc;
   }
 
   /**
diff --git a/src/main/java/com/google/devtools/build/docgen/RuleLinkExpander.java b/src/main/java/com/google/devtools/build/docgen/RuleLinkExpander.java
index 8ac8cbc..65147d0 100644
--- a/src/main/java/com/google/devtools/build/docgen/RuleLinkExpander.java
+++ b/src/main/java/com/google/devtools/build/docgen/RuleLinkExpander.java
@@ -13,8 +13,10 @@
 // limitations under the License.
 package com.google.devtools.build.docgen;
 
+import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.ImmutableSet;
 
+import java.util.HashMap;
 import java.util.Map;
 import java.util.Set;
 import java.util.regex.Matcher;
@@ -28,16 +30,32 @@
 class RuleLinkExpander {
   private static final String EXAMPLES_SUFFIX = "_examples";
   private static final String ARGS_SUFFIX = "_args";
+  private static final String FUNCTIONS_PAGE = "functions";
 
   private static final Set<String> STATIC_PAGES = ImmutableSet.<String>of(
       "common-definitions",
       "make-variables",
       "predefined-python-variables");
+  private static final Map<String, String> FUNCTIONS = ImmutableMap.<String, String>builder()
+      .put("load", FUNCTIONS_PAGE)
+      .put("subinclude", FUNCTIONS_PAGE)
+      .put("PYTHON-PREPROCESSING-REQUIRED", FUNCTIONS_PAGE)
+      .put("package", FUNCTIONS_PAGE)
+      .put("package_group", FUNCTIONS_PAGE)
+      .put("description", FUNCTIONS_PAGE)
+      .put("distribs", FUNCTIONS_PAGE)
+      .put("licenses", FUNCTIONS_PAGE)
+      .put("exports_files", FUNCTIONS_PAGE)
+      .put("glob", FUNCTIONS_PAGE)
+      .put("select", FUNCTIONS_PAGE)
+      .put("workspace", FUNCTIONS_PAGE)
+      .build();
 
-  private final Map<String, String> ruleIndex;
+  private final Map<String, String> ruleIndex = new HashMap<>();
 
   RuleLinkExpander(Map<String, String> ruleIndex) {
-    this.ruleIndex = ruleIndex;
+    this.ruleIndex.putAll(ruleIndex);
+    this.ruleIndex.putAll(FUNCTIONS);
   }
 
   private void appendRuleLink(Matcher matcher, StringBuffer sb, String ruleName, String ref) {
diff --git a/src/test/java/com/google/devtools/build/docgen/RuleLinkExpanderTest.java b/src/test/java/com/google/devtools/build/docgen/RuleLinkExpanderTest.java
index 2694b0e..60e6377 100644
--- a/src/test/java/com/google/devtools/build/docgen/RuleLinkExpanderTest.java
+++ b/src/test/java/com/google/devtools/build/docgen/RuleLinkExpanderTest.java
@@ -32,6 +32,7 @@
         .put("cc_library", "c-cpp")
         .put("cc_binary", "c-cpp")
         .put("java_binary", "java")
+        .put("Fileset", "fileset")
         .put("proto_library", "protocol-buffer")
         .build());
   }
@@ -48,6 +49,12 @@
     assertEquals(expected, expander.expand(docs));
   }
 
+  @Test public void testUpperCaseRule() {
+    String docs = "<a href=\"${link Fileset.entries}\">entries</a>";
+    String expected = "<a href=\"fileset.html#Fileset.entries\">entries</a>";
+    assertEquals(expected, expander.expand(docs));
+  }
+
   @Test public void testRuleExamples() {
     String docs = "<a href=\"${link cc_binary_examples}\">examples</a>";
     String expected = "<a href=\"c-cpp.html#cc_binary_examples\">examples</a>";
@@ -72,6 +79,14 @@
     assertEquals(expected, expander.expand(docs));
   }
 
+  @Test public void testStaticPageWithPeriodsInHeading() {
+    String docs =
+        "<a href=\"${link make-variables.predefined_variables.genrule.cmd}\">genrule cmd</a>";
+    String expected =
+        "<a href=\"make-variables.html#predefined_variables.genrule.cmd\">genrule cmd</a>";
+    assertEquals(expected, expander.expand(docs));
+  }
+
   @Test(expected = IllegalArgumentException.class)
   public void testRefNotFound() {
     String docs = "<a href=\"${link foo.bar}\">bar</a>";