Remove a number of files related to legacy skydoc (#3)

diff --git a/.gitignore b/.gitignore
index 7c504ec..a7f7d95 100644
--- a/.gitignore
+++ b/.gitignore
@@ -8,7 +8,7 @@
 /.settings
 /WORKSPACE.user.bzl
 /base_workspace/*
-/bazel-skydoc
+/bazel-stardoc
 /bazel-bin
 /bazel-genfiles
 /bazel-out
diff --git a/CONTRIBUTORS b/CONTRIBUTORS
index e8e0f12..c186cc2 100644
--- a/CONTRIBUTORS
+++ b/CONTRIBUTORS
@@ -9,4 +9,7 @@
 # Names should be added to this file as:
 #     Name <email address>
 
-David Z. Chen <dzc@google.com>
+Jon Brandvein <brandjon@google.com>
+Chris Parsons <cparsons@google.com>
+Jingwen Chen <jingwen@google.com>
+Laurent Le Brun <laurentlb@google.com>
diff --git a/README.md b/README.md
index b9afc1d..a27ed44 100644
--- a/README.md
+++ b/README.md
@@ -1,31 +1,11 @@
 # [Stardoc](https://skydoc.bazel.build) - Starlark Documentation Generator
 
-[![Build status](https://badge.buildkite.com/c793ed98a3802393dba9813f524bfe28a87da2ab235df38c49.svg)](https://buildkite.com/bazel/skydoc-postsubmit)
-
 Stardoc is a documentation generator for [Bazel](https://bazel.build) build rules
 written in [Starlark](https://bazel.build/docs/skylark/index.html).
 
-Stardoc provides a Starlark rule (`stardoc`) that can be used to build documentation
-for Starlark rules in Markdown. Stardoc generates one documentation page per `.bzl` file.
-
-## Skydoc deprecation
-
-NOTE: Stardoc is a replacement for the **deprecated** "Skydoc" documentation generator.
-
-See [Skydoc Deprecation](https://skydoc.bazel.build/docs/skydoc_deprecation.html) for
-details on the deprecation, and for some migration tips.
-
-## Get Started
-
-* How to [set up Stardoc for your project](https://skydoc.bazel.build/docs/getting_started_stardoc.html)
-* Writing [docstrings](https://skydoc.bazel.build/docs/writing_stardoc.html)
-* How to [integrate Stardoc with your build](https://skydoc.bazel.build/docs/generating_stardoc.html).
-
-## About Stardoc
-
-* How to [contribute to Stardoc](https://skydoc.bazel.build/contributing.html)
-* See the [Stardoc roadmap](https://skydoc.bazel.build/roadmap.html)
-
-
-
+This repository is currently in a transitionary state as pieces of the 
+[bazelbuild/skydoc](https://github.com/bazelbuild/skydoc) repository
+ are being moved to this one. Use the
+[bazelbuild/skydoc](https://github.com/bazelbuild/skydoc) repository
+for the time being.
 
diff --git a/WORKSPACE b/WORKSPACE
index 1021b95..d4813e5 100644
--- a/WORKSPACE
+++ b/WORKSPACE
@@ -5,31 +5,11 @@
 
 skydoc_repositories()
 
-load("@io_bazel_rules_sass//:package.bzl", "rules_sass_dependencies")
-
-rules_sass_dependencies()
-
-load("@build_bazel_rules_nodejs//:defs.bzl", "node_repositories")
-
-node_repositories()
-
-load("@io_bazel_rules_sass//:defs.bzl", "sass_repositories")
-
-sass_repositories()
-
 #######################################################################
 ##### MOST USERS SHOULD NOT NEED TO COPY ANYTHING BELOW THIS LINE #####
 #######################################################################
 load("@bazel_tools//tools/build_defs/repo:git.bzl", "git_repository")
 
-# Needed for skydoc only (not Stardoc), which is deprecated. Users should include
-# this in their WORKSPACE only if they need skydoc.
-git_repository(
-    name = "com_google_protobuf",
-    commit = "7b28271a61a3da0a37f6fda399b0c4c86464e5b3",  # 2018-11-16
-    remote = "https://github.com/protocolbuffers/protobuf.git",
-)
-
 # Needed for generating the Stardoc release binary.
 git_repository(
     name = "io_bazel",
@@ -37,15 +17,6 @@
     remote = "https://github.com/bazelbuild/bazel.git",
 )
 
-git_repository(
-    name = "rules_python",
-    remote = "https://github.com/bazelbuild/rules_python.git",
-    commit = "4b84ad270387a7c439ebdccfd530e2339601ef27",
-)
-
-load("@rules_python//python:repositories.bzl", "py_repositories")
-py_repositories()
-
 # Needed only because of java_tools.
 http_archive(
     name = "rules_cc",
@@ -58,6 +29,20 @@
 )
 
 # Needed as a transitive dependency of @io_bazel
+git_repository(
+    name = "com_google_protobuf",
+    commit = "7b28271a61a3da0a37f6fda399b0c4c86464e5b3",  # 2018-11-16
+    remote = "https://github.com/protocolbuffers/protobuf.git",
+)
+
+# Needed as a transitive dependency of @io_bazel
+git_repository(
+    name = "rules_python",
+    remote = "https://github.com/bazelbuild/rules_python.git",
+    commit = "4b84ad270387a7c439ebdccfd530e2339601ef27",
+)
+
+# Needed as a transitive dependency of @io_bazel
 http_archive(
     name = "rules_pkg",
     sha256 = "5bdc04987af79bd27bc5b00fe30f59a858f77ffa0bd2d8143d5b31ad8b1bd71c",
diff --git a/serve-docs.sh b/serve-docs.sh
deleted file mode 100755
index 4674e03..0000000
--- a/serve-docs.sh
+++ /dev/null
@@ -1,103 +0,0 @@
-#!/usr/bin/env bash
-# Copyright 2016 The Bazel Authors. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#    http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-set -eu
-
-if [ "${1-}" == "help" ]; then
-  cat <<EOF
-Usage:
-$0 [port]
-     Builds docs and starts a web server serving docs on localhost:port
-     Default port is 12345.
-$0 <target directory> [<serving prefix>]
-     Builds docs as static web pages in <target directory>.
-     Replaces absolute paths in the resulting HTML with <serving prefix>,
-     or, if it is not specified, with <target directory>.
-EOF
-  exit 0
-fi
-
-if [[ "${1-}" == [0-9]* ]]; then
-  readonly PORT="$1"
-  readonly TARGET=''
-else
-  readonly PORT="${1-12345}"
-  readonly TARGET="${1-}"
-fi
-
-readonly WORKING_DIR=$(mktemp -d)
-readonly SERVING_PREFIX="${2-$TARGET}"
-
-function check {
-  which "$1" > /dev/null || (echo "$1 not installed. Please install $1."; exit 1)
-}
-
-function build_and_serve {
-  bazel build //site:jekyll-tree.tar
-  rm -rf "$WORKING_DIR/*"
-  tar -xf bazel-genfiles/site/jekyll-tree.tar -C "$WORKING_DIR"
-
-  pkill -9 jekyll || true
-
-  if [ -z "$TARGET" ]; then
-    echo "Serving skydoc.bazel.build site at port $PORT"
-    jekyll serve --detach --quiet --port "$PORT" --source "$WORKING_DIR"
-  else
-    TMP_TARGET=$(mktemp -d)
-    jekyll build --source "$WORKING_DIR" --destination "$TMP_TARGET"
-    REPLACEMENT=$(echo "$SERVING_PREFIX" | sed s/\\//\\\\\\//g)
-    find "$TMP_TARGET" -name '*.html' | xargs sed -i s/href=\\\"\\//href=\"$REPLACEMENT\\//g
-    find "$TMP_TARGET" -name '*.html' | xargs sed -i s/src=\\\"\\//src=\"$REPLACEMENT\\//g
-    cp -R $TMP_TARGET/* "$TARGET"
-    echo "Static pages copied to $TARGET"
-    echo "Should be served from $SERVING_PREFIX"
-  fi
-}
-
-function main {
-  check jekyll
-
-  old_version="Jekyll 0.11.2"
-  if expr match "$(jekyll --version)" "$old_version"; then
-    # The ancient version that apt-get has.
-    echo "ERROR: Running with an old version of Jekyll, update " \
-      "to 2.5.3 with \`sudo gem install jekyll -v 2.5.3\`"
-    exit 1
-  fi
-
-  build_and_serve
-
-  echo "Type q to quit, r to rebuild docs and restart jekyll"
-  while true; do
-
-    read -n 1 -s user_input
-    if [ "$user_input" == "q" ]; then
-      echo "Quitting"
-      exit 0
-    elif [ "$user_input" == "r" ]; then
-      echo "Rebuilding docs and restarting jekyll"
-      build_and_serve
-      echo "Rebuilt docs and restarted jekyll"
-    fi
-  done
-}
-
-function cleanup {
-  rm -rf "$WORKING_DIR"
-  pkill -9 jekyll
-}
-trap cleanup EXIT
-
-main
diff --git a/setup.bzl b/setup.bzl
index 60b787b..47a1df9 100644
--- a/setup.bzl
+++ b/setup.bzl
@@ -21,45 +21,6 @@
     if not native.existing_rule(name):
         repo_rule(name = name, **kwargs)
 
-JINJA2_BUILD_FILE = """
-py_library(
-    name = "jinja2",
-    srcs = glob(["jinja2/*.py"]),
-    srcs_version = "PY2AND3",
-    deps = [
-        "@markupsafe_archive//:markupsafe",
-    ],
-    visibility = ["//visibility:public"],
-)
-"""
-
-MARKUPSAFE_BUILD_FILE = """
-py_library(
-    name = "markupsafe",
-    srcs = glob(["markupsafe/*.py"]),
-    srcs_version = "PY2AND3",
-    visibility = ["//visibility:public"],
-)
-"""
-
-MISTUNE_BUILD_FILE = """
-py_library(
-    name = "mistune",
-    srcs = ["mistune.py"],
-    srcs_version = "PY2AND3",
-    visibility = ["//visibility:public"],
-)
-"""
-
-SIX_BUILD_FILE = """
-py_library(
-    name = "six",
-    srcs = ["six.py"],
-    srcs_version = "PY2AND3",
-    visibility = ["//visibility:public"],
-)
-"""
-
 def skydoc_repositories():
     """Adds the external repositories used by the skylark rules."""
     _include_if_not_defined(
@@ -69,63 +30,6 @@
         sha256 = "2ef429f5d7ce7111263289644d233707dba35e39696377ebab8b0bc701f7818e",
     )
     _include_if_not_defined(
-        git_repository,
-        name = "io_bazel_rules_sass",
-        remote = "https://github.com/bazelbuild/rules_sass.git",
-        commit = "8ccf4f1c351928b55d5dddf3672e3667f6978d60",
-    )
-    _include_if_not_defined(
-        http_archive,
-        name = "markupsafe_archive",
-        urls = ["https://pypi.python.org/packages/source/M/MarkupSafe/MarkupSafe-0.23.tar.gz#md5=f5ab3deee4c37cd6a922fb81e730da6e"],
-        sha256 = "a4ec1aff59b95a14b45eb2e23761a0179e98319da5a7eb76b56ea8cdc7b871c3",
-        build_file_content = MARKUPSAFE_BUILD_FILE,
-        strip_prefix = "MarkupSafe-0.23",
-    )
-    native.bind(
-        name = "markupsafe",
-        actual = "@markupsafe_archive//:markupsafe",
-    )
-
-    _include_if_not_defined(
-        http_archive,
-        name = "jinja2_archive",
-        urls = ["https://pypi.python.org/packages/source/J/Jinja2/Jinja2-2.8.tar.gz#md5=edb51693fe22c53cee5403775c71a99e"],
-        sha256 = "bc1ff2ff88dbfacefde4ddde471d1417d3b304e8df103a7a9437d47269201bf4",
-        build_file_content = JINJA2_BUILD_FILE,
-        strip_prefix = "Jinja2-2.8",
-    )
-    native.bind(
-        name = "jinja2",
-        actual = "@jinja2_archive//:jinja2",
-    )
-
-    _include_if_not_defined(
-        http_archive,
-        name = "mistune_archive",
-        urls = ["https://pypi.python.org/packages/source/m/mistune/mistune-0.7.1.tar.gz#md5=057bc28bf629d6a1283d680a34ed9d0f"],
-        sha256 = "6076dedf768348927d991f4371e5a799c6a0158b16091df08ee85ee231d929a7",
-        build_file_content = MISTUNE_BUILD_FILE,
-        strip_prefix = "mistune-0.7.1",
-    )
-    native.bind(
-        name = "mistune",
-        actual = "@mistune_archive//:mistune",
-    )
-
-    _include_if_not_defined(
-        http_archive,
-        name = "six_archive",
-        urls = ["https://pypi.python.org/packages/source/s/six/six-1.10.0.tar.gz#md5=34eed507548117b2ab523ab14b2f8b55"],
-        sha256 = "105f8d68616f8248e24bf0e9372ef04d3cc10104f1980f54d57b2ce73a5ad56a",
-        build_file_content = SIX_BUILD_FILE,
-        strip_prefix = "six-1.10.0",
-    )
-    native.bind(
-        name = "six",
-        actual = "@six_archive//:six",
-    )
-    _include_if_not_defined(
         http_archive,
         name = "rules_java",
         urls = [
diff --git a/site/BUILD b/site/BUILD
deleted file mode 100644
index 6259cba..0000000
--- a/site/BUILD
+++ /dev/null
@@ -1,36 +0,0 @@
-licenses(["notice"])  # Apache 2.0
-
-load("@bazel_tools//tools/build_defs/pkg:pkg.bzl", "pkg_tar")
-
-filegroup(
-    name = "jekyll-srcs",
-    srcs = glob(
-        ["**/*"],
-        exclude = [
-            "BUILD",
-            "jekyll-tree.sh",
-            "*.swp",
-        ],
-    ),
-)
-
-pkg_tar(
-    name = "jekyll-base",
-    srcs = [":jekyll-srcs"],
-    strip_prefix = ".",
-)
-
-genrule(
-    name = "jekyll-tree",
-    srcs = [
-        ":jekyll-base",
-        "//stardoc:stardoc_doc",
-        "//skylark:skylark-docs",
-    ],
-    outs = ["jekyll-tree.tar"],
-    cmd = ("$(location jekyll-tree.sh) $@ " +
-           "$(location jekyll-base) " +
-           "$(location //skylark:skylark-docs) " +
-           "$(location //stardoc:stardoc_doc) "),
-    tools = ["jekyll-tree.sh"],
-)
diff --git a/site/CNAME b/site/CNAME
deleted file mode 100644
index 9fce306..0000000
--- a/site/CNAME
+++ /dev/null
@@ -1 +0,0 @@
-skydoc.bazel.build
diff --git a/site/_config.yml b/site/_config.yml
deleted file mode 100755
index 288fa5c..0000000
--- a/site/_config.yml
+++ /dev/null
@@ -1,8 +0,0 @@
-destination: production
-markdown: redcarpet
-paginate: 10
-highlighter: pygments
-sass:
-  sass_dir: _sass
-  style: compressed
-
diff --git a/site/_includes/drawer.html b/site/_includes/drawer.html
deleted file mode 100644
index 880a6c9..0000000
--- a/site/_includes/drawer.html
+++ /dev/null
@@ -1,40 +0,0 @@
-      <div class="mdl-layout__drawer">
-        <span class="mdl-layout-title">
-          <a href="/">Skydoc</a>
-        </span>
-        <nav class="drawer-nav">
-          <ul>
-            <li><a href="/">Home</a></li>
-            <li>
-              <span class="drawer-nav-title">Stardoc Documentation</span>
-              <ul>
-                <li><a href="/docs/getting_started_stardoc.html">Getting Started</a></li>
-                <li><a href="/docs/writing_stardoc.html">Writing Documentation</a></li>
-                <li><a href="/docs/generating_stardoc.html">Generating Documentation</a></li>
-                <li><a href="/docs/stardoc_reference.html">Build Rule Reference</a></li>
-              </ul>
-            </li>
-            <li>
-              <span class="drawer-nav-title">Skydoc (deprecated)</span>
-              <ul>
-                <li><a href="/docs/skydoc_deprecation.html">About Skydoc Deprecation</a></li>
-                <li><a href="/docs/getting_started.html">Getting Started</a></li>
-                <li><a href="/docs/writing.html">Writing Documentation</a></li>
-                <li><a href="/docs/generating.html">Generating Documentation</a></li>
-                <li><a href="/docs/skylark.html">Build Rule Reference</a></li>
-                <li><a href="/docs/faq.html">FAQ</a></li>
-              </ul>
-            </li>
-            <li>
-              <span class="drawer-nav-title">Get Involved</span>
-              <ul>
-                <li><a href="/contributing.html">Contribute to Stardoc</a></li>
-                <li><a href="/roadmap.html">Roadmap</a></li>
-                <li><a href="https://groups.google.com/forum/#!forum/bazel-discuss">User mailing list</a></li>
-                <li><a href="https://github.com/bazelbuild/skydoc/issues">Issue tracker</a></li>
-                <li><a href="https://github.com/bazelbuild/skydoc">GitHub</a></li>
-              </ul>
-            </li>
-          </ul>
-        </nav>
-      </div>
diff --git a/site/_includes/footer.html b/site/_includes/footer.html
deleted file mode 100644
index b68b3e7..0000000
--- a/site/_includes/footer.html
+++ /dev/null
@@ -1,102 +0,0 @@
-    <footer class="mdl-mini-footer">
-      <div class="mdl-mini-footer__left-section">
-        <div class="mdl-logo">&copy; 2016 Google, Inc.</div>
-      </div>
-      <div class="mdl-mini-footer__right-section">
-        <a class="mdl-button mdl-js-button mdl-js-ripple-effect" href="#"
-          id="scroll-to-top">
-          Back to Top
-        </a>
-      </div>
-    </footer>
-
-    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script>
-    <script>
-      var shiftWindow = function() {
-        if (location.hash.length !== 0) {
-          window.scrollBy(0, -50);
-        }
-      };
-      window.addEventListener("hashchange", shiftWindow);
-
-      var highlightCurrentSidebarNav = function() {
-        var href = location.pathname;
-        var item = $('.drawer-nav [href$="' + href + '"]');
-        if (item) {
-          var li = item.parent();
-          li.addClass("active");
-        }
-      };
-
-      /**
-       * Creates a CSE search form and submits the search query.
-       *
-       * Since the Material Design Lite header expandable text field does not
-       * support having a <form> element around the <input> element, we need to
-       * capture the ENTER keypress and then submit the form using this handler.
-       */
-      var submitSearch = function(query) {
-        var form = document.createElement("form");
-        form.setAttribute("action", "/search.html");
-
-        var cseParams = {
-          "cx": "008327220137350982602:0mpaowwcmvg",
-          "cof": "FORID:10",
-          "ie": "UTF-8",
-        };
-        for (key in cseParams) {
-          var hidden = document.createElement("input");
-          hidden.setAttribute("type", "hidden");
-          hidden.setAttribute("name", key);
-          hidden.setAttribute("value", cseParams[key]);
-          form.appendChild(hidden);
-        }
-
-        var text = document.createElement("input");
-        text.setAttribute("type", "text");
-        text.setAttribute("name", "q");
-        text.setAttribute("value", query);
-        form.appendChild(text);
-
-        document.body.appendChild(form);
-        form.submit();
-      };
-
-      $(document).ready(function() {
-        // Scroll to anchor of location hash, adjusted for fixed navbar.
-        window.setTimeout(function() {
-          shiftWindow();
-        }, 1);
-
-        // Highlight the current item on the sidebar.
-        highlightCurrentSidebarNav();
-
-        // Handler to capture the ENTER keypress for the CSE search input
-        // in the page header and then call submitSearch() to submit the search
-        // query.
-        $("#cse-search-box").keyup(function(e) {
-          if (e.keyCode == 13) {
-            let query = $("#cse-search-box").val();
-            submitSearch(query);
-          }
-        });
-
-        // Handler for the Scroll to Top link in the page footer to scroll the
-        // main content back to the top.
-        $("#scroll-to-top").click(function() {
-          $(".mdl-layout__content").animate({ scrollTop: 0 }, "slow");
-          return false;
-        });
-      });
-    </script>
-
-    <!-- Google Analytics tracking code -->
-    <script>
-      (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
-      (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
-      m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
-      })(window,document,'script','https://www.google-analytics.com/analytics.js','ga');
-
-      ga('create', 'UA-61082125-2', 'auto');
-      ga('send', 'pageview');
-    </script>
diff --git a/site/_includes/head.html b/site/_includes/head.html
deleted file mode 100644
index 26824d4..0000000
--- a/site/_includes/head.html
+++ /dev/null
@@ -1,29 +0,0 @@
-  <head>
-    <meta charset="utf-8">
-    <meta http-equiv="X-UA-Compatible" content="IE=edge">
-    <meta name="viewport" content="width=device-width, initial-scale=1">
-    <title>{{ page.title }} - Skydoc</title>
-
-    <script>
-      var current_url = window.location.href;
-      var bad_url = new RegExp("^https?://bazelbuild.github.io/skydoc/");
-      if (bad_url.test(current_url)) {
-        window.location.replace(current_url.replace(bad_url, "https://skydoc.bazel.build/"));
-      }
-    </script>
-
-    <link rel="canonical" href="{{ page.url | replace:'index.html','' | prepend: site_root }}">
-
-    <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,400,500,600,700" type="text/css">
-    <link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons">
-    <link rel="stylesheet" href="https://code.getmdl.io/1.1.3/material.green-blue.min.css">
-    <script defer src="https://code.getmdl.io/1.1.3/material.min.js"></script>
-    <link rel="stylesheet" href="/css/{{ page.stylesheet }}.css">
-
-    <link rel="shortcut icon" type="image/png" href="/images/favicon.ico">
-
-    <!-- metadata -->
-    <meta name="og:title" content="Skydoc"/>
-    <meta name="og:description" content="Generate documentation for Bazel Skylark rules."/>
-  </head>
-
diff --git a/site/_includes/header.html b/site/_includes/header.html
deleted file mode 100644
index eab757f..0000000
--- a/site/_includes/header.html
+++ /dev/null
@@ -1,23 +0,0 @@
-      <header class="mdl-layout__header mdl-layout__header--waterfall">
-        <div class="mdl-layout__header-row">
-          <span class="mdl-layout-title">{{ page.title }}</span>
-          <div class="mdl-layout-spacer"></div>
-          <nav class="mdl-navigation mdl-layout--large-screen-only">
-            <a class="mdl-navigation__link" href="/docs/getting_started.html">Docs</a>
-            <a class="mdl-navigation__link" href="/contributing.html">Contributing</a>
-            <a class="mdl-navigation__link" href="https://github.com/bazelbuild/skydoc">GitHub</a>
-          </nav>
-          <div class="mdl-textfield mdl-js-textfield mdl-textfield--expandable
-            mdl-textfield--floating-label mdl-textfield--align-right">
-            <label class="mdl-button mdl-js-button mdl-button--icon"
-              for="cse-search-box">
-              <i class="material-icons">search</i>
-            </label>
-            <div class="mdl-textfield__expandable-holder">
-              <input class="mdl-textfield__input" type="text"
-                id="cse-search-box">
-            </div>
-          </div>
-        </div>
-      </header>
-      {% include drawer.html %}
diff --git a/site/_layouts/default.html b/site/_layouts/default.html
deleted file mode 100644
index 81cd665..0000000
--- a/site/_layouts/default.html
+++ /dev/null
@@ -1,25 +0,0 @@
----
-stylesheet: docs
----
-<!DOCTYPE html>
-<html lang="en" itemscope itemtype="https://schema.org/WebPage">
-  {% include head.html %}
-  <body>
-    <div class="mdl-layout mdl-js-layout mdl-layout--fixed-drawer
-      mdl-layout--fixed-header">
-      {% include header.html %}
-
-      <main class="mdl-layout__content">
-        <div class="page-content">
-          {% if page.title %}
-          <h1 class="page-title">{{ page.title }}</h1>
-          {% endif %}
-
-          {{ content }}
-        </div>
-        <div class="mdl-layout-spacer"></div>
-        {% include footer.html %}
-      </main>
-    </div>
-  </body>
-</html>
diff --git a/site/_layouts/home.html b/site/_layouts/home.html
deleted file mode 100644
index df98d18..0000000
--- a/site/_layouts/home.html
+++ /dev/null
@@ -1,23 +0,0 @@
----
-stylesheet: home
-title: Skydoc
----
-<!DOCTYPE html>
-<html lang="en" itemscope itemtype="https://schema.org/WebPage">
-  {% include head.html %}
-  <body class="body-home">
-    <div class="mdl-layout mdl-js-layout mdl-layout--fixed-header">
-      {% include header.html %}
-
-      <main class="mdl-layout__content">
-        <div class="page-content">
-
-        {{ content }}
-
-        </div>
-        <div class="mdl-layout-spacer"></div>
-        {% include footer.html %}
-      </main>
-    </div>
-  </body>
-</html>
diff --git a/site/_sass/base.scss b/site/_sass/base.scss
deleted file mode 100644
index a513a93..0000000
--- a/site/_sass/base.scss
+++ /dev/null
@@ -1,91 +0,0 @@
-// Copyright 2016 The Skydoc Authors. All rights reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//    http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-$primary-color: rgb(76,175,80);
-$body-bg-color: #fafafa;
-$code-bg-color: #fff;
-$code-dark-bg-color: #424242;
-$border-color: #f5f5f5;
-
-body {
-  background-color: $body-bg-color;
-}
-
-img.responsive {
-  max-width: 100%;
-  height: auto;
-  border: 1px solid $border-color;
-}
-
-a {
-  text-decoration: none;
-}
-
-pre,
-code {
-  font-family: 'Liberation Mono', Consolas, Monaco, 'Andale Mono', monospace;
-}
-
-pre,
-pre.term {
-  background-color: $code-bg-color;
-  padding: 20px;
-  overflow-x: auto;
-  word-wrap: normal;
-  border: 1px solid $border-color;
-
-  code {
-    overflow-wrap: normal;
-    white-space: pre;
-  }
-}
-
-pre.term {
-  background-color: $code-dark-bg-color;
-  color: $code-bg-color;
-  font-size: 90%;
-
-  span.info {
-    color: #81C784;
-  }
-}
-
-code {
-  display: inline-block;
-  font-size: 90%;
-  white-space: pre-wrap;
-}
-
-.mdl-layout__content {
-  display: -webkit-flex;
-  display: -ms-flexbox;
-  display: flex;
-  -webkit-flex-direction: column;
-  -ms-flex-flow: column;
-  flex-direction: column;
-}
-
-.mdl-layout__content > *:not(.mdl-layout-spacer) {
-  -webkit-flex: none;
-  -ms-flex: none;
-  flex: none;
-}
-
-$scroll-to-top-color: #fff;
-
-footer {
-  #scroll-to-top {
-    color: $scroll-to-top-color;
-  }
-}
diff --git a/site/_sass/docs.scss b/site/_sass/docs.scss
deleted file mode 100644
index a1008e9..0000000
--- a/site/_sass/docs.scss
+++ /dev/null
@@ -1,168 +0,0 @@
-// Copyright 2016 The Skydoc Authors. All rights reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//    http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-p.lead {
-  font-size: 20px;
-  line-height: 32px;
-}
-
-img {
-  margin: 20px 0;
-  max-width: 100%;
-  height: auto;
-}
-
-$table-bg-color: #fff;
-$table-border-color: #eee;
-$th-bg-color: #fafafa;
-$th-color: #757575;
-
-table {
-  border-collapse: collapse;
-  border-spacing: 0;
-  background-color: $table-bg-color;
-  table-layout: auto;
-
-  thead {
-    th {
-      background-color: $th-bg-color;
-      border: 1px solid $table-border-color;
-      color: $th-color;
-      padding: 12px 12px 12px 24px;
-      vertical-align: top;
-    }
-  }
-
-  tbody {
-    td {
-      border: 1px solid $table-border-color;
-      padding: 12px 12px 12px 24px;
-      vertical-align: top;
-    }
-  }
-}
-
-table.params-table {
-  width: 100%;
-
-  col.col-param {
-    width: 25%;
-  }
-
-  col.col-description {
-    width: 75%;
-  }
-}
-
-hr {
-  margin-top: 80px;
-  margin-bottom: 80px;
-}
-
-$toc-heading-color: #757575;
-
-nav.toc {
-  border-left: 5px solid $primary-color;
-  padding-left: 20px;
-  margin-bottom: 48px;
-
-  h1,
-  h2 {
-    font-size: 15px;
-    line-height: 16px;
-    padding-bottom: 12px;
-    margin-bottom: 0;
-    font-weight: 400;
-    color: $toc-heading-color;
-  }
-
-  ul {
-    list-style: none;
-    margin-top: 0;
-    padding-left: 0;
-
-    li {
-      font-size: 20px;
-      line-height: 40px;
-
-      a {
-        color: $primary-color;
-      }
-    }
-  }
-}
-
-$h3-color: #757575;
-
-.page-content {
-  margin-left: auto;
-  margin-right: auto;
-  padding-top: 60px;
-  padding-bottom: 60px;
-  width: 760px;
-
-  h1.page-title {
-    font-size: 34px;
-    font-weight: 400;
-    line-height: 40px;
-    margin-bottom: 30px;
-    color: $primary-color;
-  }
-
-  h1 {
-    font-size: 24px;
-    font-weight: 400;
-    line-height: 40px;
-    margin-bottom: 20px;
-    color: $primary-color;
-  }
-
-  h2 {
-    font-size: 20px;
-    font-weight: 400;
-    line-height: 32px;
-    margin-bottom: 20px;
-    color: $primary-color;
-  }
-
-  h3 {
-    font-size: 18px;
-    font-weight: 400;
-    line-height: 32px;
-    margin-bottom: 20px;
-    color: $h3-color;
-  }
-}
-
-@media (max-width: 768px) {
-  .page-content {
-    width: 360px;
-  }
-}
-
-@media (min-width: 768px) {
-  .page-content {
-    width: 760px;
-  }
-}
-
-@media (min-width: 1476px) {
-  .page-content {
-    width: 1160px;
-  }
-}
-
-.mdl-mini-footer {
-  padding-left: 40px;
-}
diff --git a/site/_sass/drawer.scss b/site/_sass/drawer.scss
deleted file mode 100644
index 89e7df4..0000000
--- a/site/_sass/drawer.scss
+++ /dev/null
@@ -1,89 +0,0 @@
-// Copyright 2016 The Skydoc Authors. All rights reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//    http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-$drawer-bg-color: #fff;
-$drawer-border-color: #e0e0e0;
-$drawer-heading-color: #757575;
-$drawer-hover-color: #f0f0f0;
-
-.mdl-layout__drawer {
-  background-color: $drawer-bg-color;
-
-  .mdl-layout-title {
-    border-bottom: 1px solid $drawer-border-color;
-    padding-left: 24px;
-
-    a {
-      text-decoration: none;
-      color: $drawer-heading-color;
-      font-weight: normal;
-    }
-  }
-}
-
-.drawer-nav {
-  ul {
-    list-style: none;
-    padding-left: 0;
-
-    li {
-      display: block;
-      padding: 0;
-
-      ul {
-        li {
-          a {
-            padding-left: 44px;
-            font-weight: 400;
-          }
-        }
-      }
-
-      span.drawer-nav-title {
-        display: block;
-        flex-shrink: 0;
-        padding: 15px 0 15px 22px;
-        margin: 0;
-        font-weight: 600;
-        color: $drawer-heading-color;
-        line-height: 1em;
-        text-decoration: none;
-      }
-
-      a {
-        display: block;
-        flex-shrink: 0;
-        padding: 15px 0 15px 22px;
-        margin: 0;
-        font-weight: 600;
-        color: $drawer-heading-color;
-        line-height: 1em;
-        text-decoration: none;
-        cursor: pointer;
-
-        &:active,
-        &:hover {
-          background-color: $drawer-hover-color;
-        }
-      }
-
-      &.active {
-        a {
-          color: $primary-color;
-          font-weight: 500;
-        }
-      }
-    }
-  }
-}
diff --git a/site/_sass/home.scss b/site/_sass/home.scss
deleted file mode 100644
index d01f3d7..0000000
--- a/site/_sass/home.scss
+++ /dev/null
@@ -1,57 +0,0 @@
-// Copyright 2016 The Skydoc Authors. All rights reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//    http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-$hero-bg-color: rgb(76,175,80);
-$hero-color: #fff;
-
-.hero {
-  background-color: $hero-bg-color;
-  color: $hero-color;
-  padding-top: 40px;
-  padding-bottom: 20px;
-
-  .mdl-cell {
-    text-align: center;
-  }
-
-  h1 {
-    font-size: 32px;
-    font-weight: 300;
-  }
-
-  p.lead {
-    font-size: 18px;
-    font-weight: 300;
-  }
-
-  .mdl-button {
-    margin-top: 10px;
-    background-color: $body-bg-color;
-  }
-}
-
-.feature {
-  .mdl-grid {
-    max-width: 1230px;
-  }
-
-  .mdl-cell {
-    padding: 10px;
-  }
-
-  h1 {
-    font-size: 28px;
-    font-weight: 300;
-  }
-}
diff --git a/site/_sass/syntax.scss b/site/_sass/syntax.scss
deleted file mode 100644
index 46dda20..0000000
--- a/site/_sass/syntax.scss
+++ /dev/null
@@ -1,89 +0,0 @@
-//
-// Copyright 2015 Google
-//
-// Generated using Base16 Builder
-// (https://github.com/chriskempson/base16-builder)
-
-$base00: #212121;  //  ----
-$base01: #424242;  //  ---
-$base02: #616161;  //  --
-$base03: #757575;  //  -
-$base04: #9e9e9e;  //  +
-$base05: #bdbdbd;  //  ++
-$base06: #e0e0e0;  //  +++
-$base07: #eee;     //  ++++
-
-$base08: #f44336;  //  red
-$base09: #ff9800;  //  orange
-$base0A: #ffc107;  //  yellow
-$base0B: #4caf50;  //  green
-$base0C: #009688;  //  aqua
-$base0D: #2196f3;  //  blue
-$base0E: #9c27b0;  //  purple
-$base0F: #795548;  //  brown
-
-.highlight .hll { background-color: $base06 }
-.highlight { background: $base07; color: $base00 }
-.highlight .c { color: $base03 }  // Comment
-.highlight .err { color: $base08 }  // Error
-.highlight .k { color: $base0E }  // Keyword
-.highlight .l { color: $base09 }  // Literal
-.highlight .n { color: $base00 }  // Name
-.highlight .o { color: $base0C }  // Operator
-.highlight .p { color: $base00 }  // Punctuation
-.highlight .cm { color: $base03 }  // Comment.Multiline
-.highlight .cp { color: $base03 }  // Comment.Preproc
-.highlight .c1 { color: $base03 }  // Comment.Single
-.highlight .cs { color: $base03 }  // Comment.Special
-.highlight .gd { color: $base08 }  // Generic.Deleted
-.highlight .ge { font-style: italic }  // Generic.Emph
-.highlight .gh { color: $base00; font-weight: bold }  // Generic.Heading
-.highlight .gi { color: $base0B }  // Generic.Inserted
-.highlight .gp { color: $base03; font-weight: bold }  // Generic.Prompt
-.highlight .gs { font-weight: bold }  // Generic.Strong
-.highlight .gu { color: $base0C; font-weight: bold }  // Generic.Subheading
-.highlight .kc { color: $base0E }  // Keyword.Constant
-.highlight .kd { color: $base0E }  // Keyword.Declaration
-.highlight .kn { color: $base0C }  // Keyword.Namespace
-.highlight .kp { color: $base0E }  // Keyword.Pseudo
-.highlight .kr { color: $base0E }  // Keyword.Reserved
-.highlight .kt { color: $base0A }  // Keyword.Type
-.highlight .ld { color: $base0B }  // Literal.Date
-.highlight .m { color: $base09 }  // Literal.Number
-.highlight .s { color: $base0B }  // Literal.String
-.highlight .na { color: $base0D }  // Name.Attribute
-.highlight .nb { color: $base00 }  // Name.Builtin
-.highlight .nc { color: $base0A }  // Name.Class
-.highlight .no { color: $base08 }  // Name.Constant
-.highlight .nd { color: $base0C }  // Name.Decorator
-.highlight .ni { color: $base00 }  // Name.Entity
-.highlight .ne { color: $base08 }  // Name.Exception
-.highlight .nf { color: $base0D }  // Name.Function
-.highlight .nl { color: $base00 }  // Name.Label
-.highlight .nn { color: $base0A }  // Name.Namespace
-.highlight .nx { color: $base0D }  // Name.Other
-.highlight .py { color: $base00 }  // Name.Property
-.highlight .nt { color: $base0C }  // Name.Tag
-.highlight .nv { color: $base08 }  // Name.Variable
-.highlight .ow { color: $base0C }  // Operator.Word
-.highlight .w { color: $base00 }  // Text.Whitespace
-.highlight .mf { color: $base09 }  // Literal.Number.Float
-.highlight .mh { color: $base09 }  // Literal.Number.Hex
-.highlight .mi { color: $base09 }  // Literal.Number.Integer
-.highlight .mo { color: $base09 }  // Literal.Number.Oct
-.highlight .sb { color: $base0B }  // Literal.String.Backtick
-.highlight .sc { color: $base00 }  // Literal.String.Char
-.highlight .sd { color: $base03 }  // Literal.String.Doc
-.highlight .s2 { color: $base0B }  // Literal.String.Double
-.highlight .se { color: $base09 }  // Literal.String.Escape
-.highlight .sh { color: $base0B }  // Literal.String.Heredoc
-.highlight .si { color: $base09 }  // Literal.String.Interpol
-.highlight .sx { color: $base0B }  // Literal.String.Other
-.highlight .sr { color: $base0B }  // Literal.String.Regex
-.highlight .s1 { color: $base0B }  // Literal.String.Single
-.highlight .ss { color: $base0B }  // Literal.String.Symbol
-.highlight .bp { color: $base00 }  // Name.Builtin.Pseudo
-.highlight .vc { color: $base08 }  // Name.Variable.Class
-.highlight .vg { color: $base08 }  // Name.Variable.Global
-.highlight .vi { color: $base08 }  // Name.Variable.Instance
-.highlight .il { color: $base09 }  // Literal.Number.Integer.Long
diff --git a/site/contributing.md b/site/contributing.md
deleted file mode 100644
index a17a523..0000000
--- a/site/contributing.md
+++ /dev/null
@@ -1,48 +0,0 @@
----
-layout: default
-title: Contributing
-stylesheet: docs
----
-
-We welcome your contributions! To contribute to Stardoc, fork the [Skydoc][repo]
-GitHub repository and start submitting pull requests.
-
-[repo]: https://github.com/bazelbuild/skydoc
-
-## Contributing to Skydoc
-
-In general, we prefer contributions that fix bugs or add features (as opposed to
-purely stylistic, refactoring, or "cleanup" changes). Please check with us on
-the [bazel-dev][bazel-dev] mailing list or open a GitHub Issue before investing
-a lot of time in a patch.
-
-[bazel-dev]: https://groups.google.com/forum/#!forum/bazel-dev
-
-To submit a patch to Skydoc:
-
-* Skydoc is part of the Bazel project. Read the [Bazel governance
-  plan](https://www.bazel.build/governance.html) and Skydoc's [contribution
-  guidelines](https://github.com/bazelbuild/skydoc/blob/master/CONTRIBUTING.md).
-* Open an [Issue](https://github.com/bazelbuild/skydoc/issues) or discuss your
-  plan or design on the [bazel-dev][bazel-dev] mailing list.
-* Prepare a Git commit that implements your feature or bug fix. Don't forget to
-  add tests and reference the corresponding bug, if any.
-* Open a [Pull Request][pull-request] on the Skydoc repository. This will
-  require that you have signed a [Contributor License Agreement][cla].
-* Complete a code review a [core contributor](#core-contributors). Amend your
-  patch by making additional commits or rebasing with HEAD if there are
-  conflicts with new commits on the master branch.
-* Once the code review is complete, your reviewer will squash/merge your pull
-  request to the master branch.
-
-[pull-request]: https://github.com/bazelbuild/skydoc/pulls
-[cla]: https://cla.developers.google.com/
-
-## Core Contributors
-
-The current group of Stardoc core contributors are:
-
-* [cparsons](https://github.com/c-parsons)
-* [laurentlb](https://github.com/laurentlb)
-
-
diff --git a/site/css/docs.scss b/site/css/docs.scss
deleted file mode 100644
index 7d244a1..0000000
--- a/site/css/docs.scss
+++ /dev/null
@@ -1,7 +0,0 @@
----
----
-
-@import "base.scss";
-@import "docs.scss";
-@import "drawer.scss";
-@import "syntax.scss";
diff --git a/site/css/home.scss b/site/css/home.scss
deleted file mode 100644
index 520cd01..0000000
--- a/site/css/home.scss
+++ /dev/null
@@ -1,7 +0,0 @@
----
----
-
-@import "base.scss";
-@import "home.scss";
-@import "drawer.scss";
-@import "syntax.scss";
diff --git a/site/docs/faq.md b/site/docs/faq.md
deleted file mode 100644
index f73bbec..0000000
--- a/site/docs/faq.md
+++ /dev/null
@@ -1,39 +0,0 @@
----
-layout: default
-title: FAQ
-stylesheet: docs
----
-
-## Why am I getting `TypeError: unsupported operand type(s) for +: 'dict' and 'dict'`?
-
-Skylark currently defines the `+` operator for dictionaries. Because
-Skydoc evaluates `.bzl` files as Python code and because the `+` operator
-for dictionaries may be [removed][dict-op] from Skylark in the future, we
-suggest using the `dict(a.items() + b.items())` syntax instead.
-
-[dict-op]: https://github.com/bazelbuild/bazel/issues/1086
-
-## Is Skydoc used to generate the documentation on [bazel.build](https://bazel.build)?
-
-Not for now. The [Build Encyclopedia](https://bazel.build/docs/be/overview.html)
-documents the set of native Bazel build rules written in Java, and the
-[Skylark Library](https://bazel.build/docs/skylark/lib/globals.html) documents the
-built-in Skylark modules and functions. Because both of these sets of docs are
-generated from Bazel's Java source code, they are generated using a [separate
-documentation generation
-tool](https://github.com/bazelbuild/bazel/tree/master/src/main/java/com/google/devtools/build/docgen).
-
-We are planning to create a catalog of Skylark rule sets to make it easy to
-publish and discover Skylark rule sets and browse their documentation. See
-[bazelbuild/bazel#1046](https://github.com/bazelbuild/bazel/issues/1046) for
-more information.
-
-## Why do the docstrings for rules come after the rule definition?
-
-Unlike in other languages, [Python docstrings
-](https://www.python.org/dev/peps/pep-0257/) are special string literals rather
-than comments. Because Skylark is a subset of Python, we take the same approach
-for Skylark docstrings as well. Because rule declarations are basically global
-variables, we follow the same convention for variable docstrings used by Python
-documentation generation tools, such as
-[epydoc](http://epydoc.sourceforge.net/manual-docstring.html).
diff --git a/site/docs/generating.md b/site/docs/generating.md
deleted file mode 100644
index f27c5be..0000000
--- a/site/docs/generating.md
+++ /dev/null
@@ -1,117 +0,0 @@
----
-layout: default
-title: Generating Documentation
-stylesheet: docs
----
-
-<nav class="toc">
-  <h2>Contents</h2>
-  <ul>
-    <li><a href="#single-target">Single Target</a></li>
-    <li><a href="#multiple-targets">Multiple Targets</a></li>
-  </ul>
-</nav>
-
-The following are some examples of how to use Skydoc.
-
-<a name="single-target"></a>
-## Single Target
-
-Suppose you have a project containing Skylark rules you want to document:
-
-```
-[workspace]/
-    WORKSPACE
-    checkstyle/
-        BUILD
-        checkstyle.bzl
-```
-
-To generate documentation for the rules and macros in `checkstyle.bzl`, add the
-following target to `rules/BUILD`:
-
-```python
-load("@io_bazel_skydoc//skylark:skylark.bzl", "skylark_doc")
-
-skylark_doc(
-    name = "checkstyle-docs",
-    srcs = ["checkstyle.bzl"],
-)
-```
-
-Running `bazel build //checkstyle:checkstyle-docs` will generate a zip file
-containing documentation for the public rules and macros in `checkstyle.bzl`.
-
-By default, Skydoc will generate documentation in Markdown. To generate
-a set of HTML pages that is ready to be served, set `format = "html"`.
-
-<a name="multiple-targets"></a>
-## Multiple Targets
-
-If you would like to generate documentation for multiple .bzl files in various
-packages in your workspace, you can use the `skylark_library` rule to create
-logical collections of Skylark sources and add a single `skylark_doc` target for
-building documentation for all of the rule sets.
-
-Suppose your project has the following structure:
-
-```
-[workspace]/
-    WORKSPACE
-    BUILD
-    checkstyle/
-        BUILD
-        checkstyle.bzl
-    lua/
-        BUILD
-        lua.bzl
-        luarocks.bzl
-```
-
-In this case, you can have `skylark_library` targets in `checkstyle/BUILD` and
-`lua/BUILD`:
-
-`checkstyle/BUILD`:
-
-```python
-load("@bazel_skylib//:skylark_library.bzl", "skylark_library")
-
-skylark_library(
-    name = "checkstyle-rules",
-    srcs = ["checkstyle.bzl"],
-)
-```
-
-`lua/BUILD`:
-
-```python
-load("@bazel_skylib//:skylark_library.bzl", "skylark_library")
-
-skylark_library(
-    name = "lua-rules",
-    srcs = [
-        "lua.bzl",
-        "luarocks.bzl",
-    ],
-)
-```
-
-To build documentation for all the above `.bzl` files at once:
-
-`BUILD`:
-
-```python
-load("@io_bazel_skydoc//skylark:skylark.bzl", "skylark_doc")
-
-skylark_doc(
-    name = "docs",
-    srcs = [
-        "//checkstyle:checkstyle-rules",
-        "//lua:lua-rules",
-    ],
-)
-```
-
-Running `bazel build //:docs` would build a single zip containing documentation
-for all the `.bzl` files contained in the two `skylark_library` targets' `srcs`.
-
diff --git a/site/docs/generating_stardoc.md b/site/docs/generating_stardoc.md
deleted file mode 100644
index 81f4a5e..0000000
--- a/site/docs/generating_stardoc.md
+++ /dev/null
@@ -1,170 +0,0 @@
----
-layout: default
-title: Generating Documentation
-stylesheet: docs
----
-
-<nav class="toc">
-  <h2>Contents</h2>
-  <ul>
-    <li><a href="#single-file">Single File</a></li>
-    <li><a href="#files-with-deps">Files with Dependencies</a></li>
-    <li><a href="#multiple-files">Multiple Files</a></li>
-  </ul>
-</nav>
-
-The following are some examples of how to use Stardoc.
-
-<a name="single-file"></a>
-## Single File
-
-Suppose you have a project containing Stardoc rules you want to document:
-
-```
-[workspace]/
-    WORKSPACE
-    checkstyle/
-        BUILD
-        checkstyle.bzl
-```
-
-To generate documentation for the rules in `checkstyle.bzl`, add the
-following target to `rules/BUILD`:
-
-```python
-load("@io_bazel_skydoc//stardoc:stardoc.bzl", "stardoc")
-
-stardoc(
-    name = "checkstyle-docs",
-    input = "checkstyle.bzl",
-    out = "checkstyle_doc.md",
-)
-```
-
-Running `bazel build //checkstyle:checkstyle-docs` will generate a markdown file
-containing documentation for all Starlark rules defined in `checkstyle.bzl`.
-
-To generate a subset of rules defined in `checkstyle.bzl`, you may specify which
-rule names you specifically want documentation for using the `symbol_names` attribute
-of the `stardoc` rule. If `symbol_names` is specified, only rules matching a name
-in `symbol_names` will be documented:
-
-```python
-load("@io_bazel_skydoc//stardoc:stardoc.bzl", "stardoc")
-
-stardoc(
-    name = "checkstyle-docs",
-    input = "checkstyle.bzl",
-    out = "checkstyle_doc.md",
-    symbol_names = ["checkstyle_rule", "other_rule"],
-)
-```
-
-<a name="files-with-deps"></a>
-## Files with Dependencies
-
-If you would like to generate documentation for a `.bzl` with dependencies on
-other `.bzl` files, use the `bzl_library` rule to create logical collections of
-Starlark sources and depend on these libraries via the `deps` attribute of your
-`stardoc` target.
-
-Suppose your project has the following structure:
-
-```
-[workspace]/
-    WORKSPACE
-    BUILD
-    checkstyle/
-        BUILD
-        checkstyle.bzl
-    lua/
-        BUILD
-        lua.bzl
-        luarocks.bzl
-```
-
-...and suppose your target `.bzl` file depends on other `.bzl` files in your workspace:
-
-`checkstyle/checkstyle.bzl`:
-
-```python
-load("//lua:lua.bzl", "lua_utility")
-
-lua_utility()
-
-checkstyle_rule = rule(
-    ...
-)
-```
-
-In this case, you can have a `bzl_library` target in `lua/BUILD`:
-
-`lua/BUILD`:
-
-```python
-load("@bazel_skylib//:bzl_library.bzl", "bzl_library")
-
-bzl_library(
-    name = "lua-rules",
-    srcs = [
-        "lua.bzl",
-        "luarocks.bzl",
-    ],
-)
-```
-
-To build documentation for `checkstyle.bzl`, specify the `bzl_library` target
-as a dependency of the `stardoc` target:
-
-`checkstyle/BUILD`:
-
-```python
-load("@io_bazel_skydoc//stardoc:stardoc.bzl", "stardoc")
-
-stardoc(
-    name = "checkstyle-docs",
-    input = "checkstyle.bzl",
-    out = "checkstyle_doc.md",
-    deps = ["//lua:lua-rules"],
-)
-```
-
-<a name="multiple-files"></a>
-## Multiple Files
-
-If you would like to generate documentation for multiple .bzl files in various
-packages in your workspace, you will need to create a single `.bzl` file that depends
-on all those `.bzl` files. You can then explicitly whitelist rules for which you would
-like documentation to be generated.
-
-For example, you may want to generate documentation for `foo_rule`, `bar_rule`, and
-`baz_rule`, all in different `.bzl` files. First, you would create a single `.bzl` file
-which loads these files:
-
-`doc_hub.bzl`:
-
-```python
-load("//foo:foo.bzl", "foo_rule")
-load("//bar:bar.bzl", "bar_rule")
-load("//baz:baz.bzl", "baz_rule")
-
-# No need for any implementation here. The rules need only be loaded.
-```
-
-A single `skydoc` target can then be used to generate their documentation:
-
-`BUILD`:
-
-```python
-load("@io_bazel_skydoc//stardoc:stardoc.bzl", "stardoc")
-
-stardoc(
-    name = "my-docs",
-    input = "doc_hub.bzl",
-    out = "docs.md",
-    symbol_names = ["foo_rule", "bar_rule", "baz_rule"],
-)
-```
-
-
-
diff --git a/site/docs/getting_started.md b/site/docs/getting_started.md
deleted file mode 100644
index 96d6958..0000000
--- a/site/docs/getting_started.md
+++ /dev/null
@@ -1,73 +0,0 @@
----
-layout: default
-title: Getting started
-stylesheet: docs
----
-
-Skydoc is a documentation generator for [Bazel](https://bazel.build) build rules
-written in [Skylark](https://bazel.build/docs/skylark/index.html).
-
-Skydoc provides a set of Skylark rules (`skylark_library` and `skylark_doc`)
-that can be used to build documentation for Skylark rules in either Markdown or
-HTML. Skydoc generates one documentation page per `.bzl` file.
-
-If you are new to writing build rules for Bazel, please read the Bazel
-documentation on [writing
-extensions](https://www.bazel.build/docs/skylark/concepts.html)
-
-<img src="/images/screenshot.png" class="responsive"
-    alt="A screenshot of Skydoc generated HTML documentation">
-
-## Setup
-
-To use Skydoc, add the following to your `WORKSPACE` file:
-
-```python
-git_repository(
-    name = "io_bazel_rules_sass",
-    remote = "https://github.com/bazelbuild/rules_sass.git",
-    tag = "0.0.3",
-)
-load("@io_bazel_rules_sass//sass:sass.bzl", "sass_repositories")
-sass_repositories()
-
-git_repository(
-    name = "bazel_skylib",
-    remote = "https://github.com/bazelbuild/bazel-skylib.git",
-    tag = "0.3.0",
-)
-
-git_repository(
-    name = "io_bazel_skydoc",
-    remote = "https://github.com/bazelbuild/skydoc.git",
-    tag = "0.1.4",
-)
-load("@io_bazel_skydoc//skylark:skylark.bzl", "skydoc_repositories")
-skydoc_repositories()
-```
-
-Note that the Sass repositories also need to be loaded since Skydoc uses the
-Bazel Sass rules.
-
-If you would like to load all Skydoc rules by default using Bazel's prelude, add
-the following to the file `tools/build_rules/prelude_bazel` in your repository:
-
-```python
-load(
-    "@io_bazel_skydoc//skylark:skylark.bzl",
-    "skydoc_repositories",
-    "skylark_doc",
-)
-```
-
-## Next Steps
-
-Now you are ready to document your Skylark rules.
-
-* Learn about the [docstring format][format] used to document Skylark rules,
-  macros, and files.
-* Learn about how you can use Skydoc's [build rules][generate] to generate your
-  documentation in Markdown or HTML format.
-
-[format]: writing.md
-[generate]: generating.md
diff --git a/site/docs/getting_started_stardoc.md b/site/docs/getting_started_stardoc.md
deleted file mode 100644
index 6326be4..0000000
--- a/site/docs/getting_started_stardoc.md
+++ /dev/null
@@ -1,60 +0,0 @@
----
-layout: default
-title: Getting started
-stylesheet: docs
----
-
-Stardoc is a documentation generator for [Bazel](https://bazel.build) build rules
-written in [Starlark](https://bazel.build/docs/skylark/index.html).
-
-Stardoc provides a Starlark rule (`stardoc`)
-that can be used to build Markdown documentation for Starlark rules, providers,
-and functions.
-Starlark generates one documentation page per `stardoc` target.
-
-If you are new to writing build rules for Bazel, please read the Bazel
-documentation on [writing
-extensions](https://www.bazel.build/docs/skylark/concepts.html)
-
-<img src="/images/screenshot.png" class="responsive"
-    alt="A screenshot of Stardoc generated documentation">
-
-## Setup
-
-To use Stardoc, add the following to your `WORKSPACE` file:
-
-```python
-load("@bazel_tools//tools/build_defs/repo:git.bzl", "git_repository")
-
-git_repository(
-    name = "io_bazel_skydoc",
-    remote = "https://github.com/bazelbuild/skydoc.git",
-    tag = "0.3.0",
-)
-
-load("@io_bazel_skydoc//:setup.bzl", "skydoc_repositories")
-skydoc_repositories()
-
-load("@io_bazel_rules_sass//:package.bzl", "rules_sass_dependencies")
-rules_sass_dependencies()
-
-load("@build_bazel_rules_nodejs//:defs.bzl", "node_repositories")
-node_repositories()
-
-load("@io_bazel_rules_sass//:defs.bzl", "sass_repositories")
-sass_repositories()
-```
-
-The load statements and function calls after the `io_bazel_skydoc` repository
-definition ensure that this repository's dependencies are loaded.
-
-## Next Steps
-
-Now you are ready to document your Starlark rules.
-
-* Learn about the [docstring format][format] used to document Starlark rules.
-* Learn about how you can use Stardoc's [build rules][generate] to generate your
-  documentation in Markdown format.
-
-[format]: writing_stardoc.html
-[generate]: generating_stardoc.html
diff --git a/site/docs/skydoc_deprecation.md b/site/docs/skydoc_deprecation.md
deleted file mode 100644
index 0023661..0000000
--- a/site/docs/skydoc_deprecation.md
+++ /dev/null
@@ -1,141 +0,0 @@
----
-layout: default
-title: Skydoc Deprecation
-stylesheet: docs
----
-
-## Why was Skydoc deprecated?
-
-Skydoc functioned by evalutating Starlark files as if they were python. Unfortunately, while
-Starlark is **similar** to Python, there are some important syntactic differences between
-the languages. Assuming compatibility between the languages was inherently brittle, and resulted
-in a maintenance burden on the Starlark code. Specifically, if one of your transitive dependencies
-were to adopt a Starlark-compatible, python-incompatible construct, your Skydoc integration would
-break!
-
-Skydoc still exists as it's a nontrivial migration to Stardoc, but we plan on removing it
-in mid 2019.
-
-## How to migrate
-
-Stardoc is not a drop-in replacement for Skydoc. Its usage is slightly different, and it has some
-new features. It's recommended to take a look at the root Stardoc documentation, but here is
-a brief summary of some things to note for migration:
-
-### Docstring specification
-
-Stardoc uses inline documentation strings instead of python-style docstrings.
-For example, Skydoc documentation may have been specified with:
-
-```
-my_rule = rule(
-    implementation = _my_rule_impl,
-    attrs = {
-        "srcs": attr.label_list(),
-        "deps": attr.label_list(),
-    },
-)
-"""Example rule documentation.
-
-Example:
-  Here is an example of how to use this rule.
-
-Args:
-  srcs: Source files used to build this target.
-  deps: Dependencies for this target.
-"""
-```
-
-...the equivalent for Stardoc is:
-
-```
-my_rule = rule(
-    implementation = _my_rule_impl,
-    doc = """
-Example rule documentation.
-
-Example:
-  Here is an example of how to use this rule.
-""",
-    attrs = {
-        "srcs" : attr.label_list(
-            doc = "Source files used to build this target.",
-        ),
-        "deps" : attr.label_list(
-            doc = "Dependencies for this target.",
-        ),
-    }
-)
-```
-
-### Different Starlark Rule
-
-Stardoc uses a different Starlark rule than Skydoc with different attributes.
-
-See [Generating Documentation](https://skydoc.bazel.build/docs/generating_stardoc.html) for a
-tutorial on using the new rule, and the
-[Build Rule Reference](https://skydoc.bazel.build/docs/stardoc_reference.html) for information
-about the new `stardoc` rule itself.
-
-### Starlark Dependencies
-
-Stardoc depends on your `bzl` file, all of its dependencies, and all of its **transitive**
-dependencies, so that it can fully evaluate your Starlark code.
-`bazel-skylib`'s `bzl_library` is your "best friend" for tracking `bzl` dependencies.
-
-For example, suppose your `mypackage/foo.bzl` file depends on `other/package/bar.bzl`, which
-depends on `third/package/baz.bzl`.
-
-**BUILD**:
-
-```
-load("@io_bazel_skydoc//stardoc:stardoc.bzl", "stardoc")
-
-stardoc(
-    name = "foo_docs",
-    input = "foo.bzl",
-    out = "foo_doc.md",
-    deps = ["//other/package:bar"],
-)
-```
-
-**other/package/BUILD**:
-
-```
-load("@bazel_skylib//:bzl_library.bzl", "bzl_library")
-
-bzl_library(
-    name = "bar",
-    srcs = ["bar.bzl"],
-    deps = ["//third/package:baz"],
-)
-```
-
-**third/package/BUILD**:
-
-```
-load("@bazel_skylib//:bzl_library.bzl", "bzl_library")
-
-bzl_library(
-    name = "baz",
-    srcs = ["baz.bzl"],
-)
-```
-
-Thus, each `.bzl` file should appear in the `srcs` of a `bzl_library` target defined in the same
-package. The `deps` of this `bzl_library` should be (only) the `bzl_library` targets corresponding
-to the files that are _directly_ `load()`ed by the `srcs`. This structure mirrors that of other
-`<language>_library` rules in Bazel.
-
-This migration might involve creating a large number of new `bzl_library` targets,
-but this work is useful beyond Stardoc. For example, `bzl_library` can be also used to gather
-transitive Starlark dependencies for use in shell tests or other test frameworks.
-
-See [Generating Documentation](https://skydoc.bazel.build/docs/generating_stardoc.html) for
-a tutorial.
-
-## Migration Issues
-
-If you run into any issues migrating, please file a
-[github issue](https://github.com/bazelbuild/skydoc/issues).
-
diff --git a/site/docs/writing.md b/site/docs/writing.md
deleted file mode 100644
index f68c32d..0000000
--- a/site/docs/writing.md
+++ /dev/null
@@ -1,122 +0,0 @@
----
-layout: default
-title: Writing Documentation
-stylesheet: docs
----
-
-<nav class="toc">
-  <h2>Contents</h2>
-  <ul>
-    <li><a href="#rule-documentation">Rule Documentation</a></li>
-    <li><a href="#macro-documentation">Macro Documentation</a></li>
-    <li><a href="#file-documentation">File Documentation</a></li>
-  </ul>
-</nav>
-
-Since Skylark is a subset of Python, it uses Python docstrings for inline
-documentation for Skylark rules and macros as well as file (module) docstrings
-for documenting `.bzl` files.  Skydoc supports Markdown for all inline
-documentation.
-
-When generating documentation, Skydoc parses the `.bzl` file to extract the
-inline documentation as well as evaluates the Skylark code to determine the
-types for rule attributes. Skydoc will generate documentation for all public
-rules and macros. For undocumented rules and macros, Skydoc will still generate
-the rule signature and table of attributes.
-
-Private rules and macros (i.e. those whose names begin with `_`) will not
-appear in generated documentation.
-
-<a name="rule-documentation"></a>
-## Rule Documentation
-
-[Skylark Rules](https://bazel.build/docs/skylark/rules.html) are declared using
-the `rule()` function as global variables. As a result, they are documented
-using variable docstrings, similar to those supported by
-[epydoc](http://epydoc.sourceforge.net/manual-docstring.html).
-
-Attributes are documented in a special `Args:` section. Begin the documentation
-for each attribute on an indented line with the attribute name followed by a
-colon `:`. The documentation for an attribute can span multiple lines as long as
-each line is indented from the first line:
-
-```python
-checkstyle = rule(
-    implementation = _impl,
-    attrs = {
-        "srcs": attr.label_list(allow_files = FileType([".java"]),
-        "config": attr.label(),
-    },
-)
-"""Runs checkstyle on the given source files.
-
-This rule runs [Checkstyle](http://checkstyle.sourceforge.net/) on a set of
-Java source files.
-
-Args:
-  srcs: The Java source files to run checkstyle against.
-  config: The checkstyle configuration file to use.
-
-    If no configuration file is provided, then the default `checkstyle.xml` will
-    be used.
-"""
-```
-
-The `name` attribute that is common to all rules is documented by default, but
-the default documentation can be overwridden by adding documentation for `name`
-in `Args`.
-
-<a name="macro-documentation"></a>
-## Macro Documentation
-
-[Skylark Macros](https://bazel.build/docs/skylark/macros.html) are Python
-functions and are thus documented using function docstrings:
-
-```python
-def rat_check(name, srcs=[], format, visibility):
-  """Runs Apache Rat license checks on the given source files.
-
-  This rule runs [Apache Rat](http://creadur.apache.org/rat/) license checks on
-  a given set of source files. Use `bazel build` to run the check.
-
-  Args:
-    name: A unique name for this rule.
-    srcs: Source files to run the Rat license checks against.
-
-      Note that the Bazel glob() function can be used to specify which source
-      files to include and which to exclude.
-    format: The format to write the Rat check report in.
-    visibility: The visibility of this rule.
-  """
-  if format not in ['text', 'html', 'xml']:
-    fail('Invalid format: %s' % format, 'format')
-
-  _rat_check(
-      name = name,
-      srcs = srcs,
-      format = format,
-      visibility = visibility,
-  )
-```
-
-Note that the format of the docstrings for rules and macros are identical.
-
-<a name="file-documentation"></a>
-## File Documentation
-
-Skydoc also supports file docstrings (similar to Python's module docstrings),
-which can be used to document a `.bzl` file, such as providing an overview of
-the rules and macros implemented in the file:
-
-```python
-"""Checkstyle Rules
-
-Skylark rules for running [Checkstyle](http://checkstyle.sourceforge.net/) on
-Java source files.
-"""
-```
-
-If a file docstring is provided, the short docstring will be used as the title
-on the generated documentation file, and the rest of the docstring (separated
-from the title with an empty line) will be used to generate an Overview section
-on the page.
diff --git a/site/docs/writing_stardoc.md b/site/docs/writing_stardoc.md
deleted file mode 100644
index c931744..0000000
--- a/site/docs/writing_stardoc.md
+++ /dev/null
@@ -1,127 +0,0 @@
----
-layout: default
-title: Writing Documentation
-stylesheet: docs
----
-
-<nav class="toc">
-  <h2>Contents</h2>
-  <ul>
-    <li><a href="#rule-documentation">Rule Documentation</a></li>
-    <li><a href="#provider-documentation">Provider Documentation</a></li>
-    <li><a href="#macro-documentation">Macro Documentation</a></li>
-  </ul>
-</nav>
-
-When generating documentation, Stardoc parses the `.bzl` file to extract the
-inline documentation as well as evaluates the Starlark code to determine the
-types for rule attributes. Stardoc will, by default, generate documentation for
-all rules, macros, and functions reachable from a target `.bzl` file.
-(See [Generating Stardoc][geenrating_stardoc.html] for details on limiting the
-symbols for which stardoc generates documentation.)
-
-<a name="rule-documentation"></a>
-## Rule Documentation
-
-When generating documentation, Stardoc parses the `.bzl` file to extract the
-inline documentation as well as evaluates the Starlark code to determine the
-types for rule attributes.
-
-Private rule attributes (attributes with names that begin with `_`) will not
-appear in generated documentation.
-
-[Starlark Rules](https://bazel.build/docs/skylark/rules.html) are declared using
-the `rule()` function as global variables.
-
-General rule documentation should be supplied in the `doc` parameter of the
-`rule()` function.
-
-Likewise, supply attribute documentation in the `doc` parameter of attribute
-schema-defining functions, such as `attr.label()`.
-
-```python
-my_rule = rule(
-    implementation = _my_rule_impl,
-    doc = """
-Example rule documentation.
-
-Example:
-  Here is an example of how to use this rule.
-""",
-    attrs = {
-        "srcs" : attr.label_list(
-            doc = "Source files used to build this target.",
-        ),
-        "deps" : attr.label_list(
-            doc = "Dependencies for this target.",
-        ),
-    }
-)
-```
-
-The `name` attribute that is common to all rules is documented by default.
-
-<a name="provider-documentation"></a>
-## Provider Documentation
-
-[Starlark Providers](https://docs.bazel.build/versions/master/skylark/rules.html#providers) 
-are documented similarly to rules: using docstrings specified as parameters during
-creation of the provider.
-
-General provider documentation can be specified using the `doc` parameter
-to the `provider()` function.
-
-Field-related documentation can be specified by passing a map to the
-`fields` parameter of the `provider()` function. Keys are required field
-names, and values are their corresponding docstrings.
-
-```
-MyInfo = provider(
-    doc = """
-A provider with some really neat documentation.
-
-Contains information about some of my favorite things.
-""",
-    fields = {'favorite_food' : 'A string representing my favorite food',
-              'favorite_color' : 'A string representing my favorite color'}
-)
-```
-
-<a name="macro-documentation"></a>
-## Macro Documentation
-
-[Starlark Macros](https://bazel.build/docs/skylark/macros.html) are documented
-using docstrings similar to Python docstring format:
-
-```python
-def rat_check(name, srcs=[], format, visibility):
-  """Runs Apache Rat license checks on the given source files.
-
-  This rule runs [Apache Rat](http://creadur.apache.org/rat/) license checks on
-  a given set of source files. Use `bazel build` to run the check.
-
-  Args:
-    name: A unique name for this rule.
-    srcs: Source files to run the Rat license checks against.
-
-      Note that the Bazel glob() function can be used to specify which source
-      files to include and which to exclude.
-    format: The format to write the Rat check report in.
-    visibility: The visibility of this rule.
-  """
-  if format not in ['text', 'html', 'xml']:
-    fail('Invalid format: %s' % format, 'format')
-
-  _rat_check(
-      name = name,
-      srcs = srcs,
-      format = format,
-      visibility = visibility,
-  )
-```
-
-Parameters are documented in a special `Args:` section. Begin the documentation
-for each parameter on an indented line with the parameter name followed by a
-colon `:`. The documentation for a parameter can span multiple lines as long as
-each line is indented from the first line.
-
diff --git a/site/images/favicon.ico b/site/images/favicon.ico
deleted file mode 100644
index 97fc067..0000000
--- a/site/images/favicon.ico
+++ /dev/null
Binary files differ
diff --git a/site/images/sample.png b/site/images/sample.png
deleted file mode 100644
index 2cc8941..0000000
--- a/site/images/sample.png
+++ /dev/null
Binary files differ
diff --git a/site/images/screenshot.png b/site/images/screenshot.png
deleted file mode 100644
index 31bbb24..0000000
--- a/site/images/screenshot.png
+++ /dev/null
Binary files differ
diff --git a/site/index.html b/site/index.html
deleted file mode 100644
index 2ef4874..0000000
--- a/site/index.html
+++ /dev/null
@@ -1,86 +0,0 @@
----
-layout: home
-title: Home
-stylesheet: home
----
-
-<div class="hero">
-  <div class="mdl-grid">
-    <div class="mdl-cell mdl-cell--12-col-desktop mdl-cell--8-col-tablet
-          mdl-cell--4-col-phone">
-      <h1>Beautiful Documentation for Build Rules</h1>
-      <p class="lead">
-        Stardoc is an easy-to-use documentation generator for Bazel build rules
-        written in Starlark.
-      </p>
-      <p class="lead">
-        (Stardoc is a recent replacement of the documentation generator tool named "Skydoc")
-      </p>
-      <a href="/docs/getting_started_stardoc.html" class="mdl-button mdl-js-button
-          mdl-button--raised mdl-js-ripple-effect">Get Started with Stardoc</a>
-      <a href="/docs/getting_started.html" class="mdl-button mdl-js-button
-          mdl-button--raised mdl-js-ripple-effect">Take me to Skydoc documentation instead</a>
-    </div>
-  </div>
-</div>
-<div class="feature">
-  <div class="mdl-grid">
-    <div class="mdl-cell mdl-cell--4-col-desktop mdl-cell--8-col-tablet
-        mdl-cell--4-col-phone">
-      <h1>Python docstrings</h1>
-      <p>
-        Document your Starlark rules
-        <a href="docs/writing_stardoc.html">alongside their definition</a>.
-      </p>
-{% highlight python %}
-my_rule = rule(
-    implementation = _my_rule_impl,
-    doc = """
-Example rule documentation.
-
-Example:
-  Here is an example of how to use this rule.
-""",
-    attrs = {
-        "srcs" : attr.label_list(
-            doc = "Source files used to build this target.",
-        ),
-        "deps" : attr.label_list(
-            doc = "Dependencies for this target.",
-        ),
-    }
-)
-{% endhighlight %}
-    </div>
-
-    <div class="mdl-cell mdl-cell--4-col-desktop mdl-cell--8-col-tablet
-        mdl-cell--4-col-phone">
-      <h1>Convenient Build Rules</h1>
-      <p>
-        Skydoc's own convenient Bazel <a href="docs/generating_stardoc.html">build
-        rules</a> making it to integrate Skydoc into your build or release
-        pipeline.
-      </p>
-{% highlight python %}
-load("@io_bazel_skydoc//stardoc:stardoc.bzl",
-     "stardoc")
-
-stardoc(
-    name = "checkstyle-docs",
-    input = "checkstyle.bzl",
-    out = "checkstyle_doc.md",
-)
-{% endhighlight %}
-<pre class="term">$ <span class="info">bazel</span> build :checkstyle-docs</pre>
-    </div>
-
-    <div class="mdl-cell mdl-cell--4-col-desktop mdl-cell--8-col-tablet
-        mdl-cell--4-col-phone">
-      <h1>Beautiful Documentation</h1>
-      <p>
-        Generate <a href="docs/skylark.html">documentation</a> in Markdown.
-      </p>
-      <img src="/images/sample.png" class="responsive">
-    </div>
-  </div>
-</div>
diff --git a/site/jekyll-tree.sh b/site/jekyll-tree.sh
deleted file mode 100755
index 10fa0a0..0000000
--- a/site/jekyll-tree.sh
+++ /dev/null
@@ -1,79 +0,0 @@
-#!/usr/bin/env bash
-# Copyright 2016 The Bazel Authors. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#    http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-set -eu
-
-readonly OUTPUT=${PWD}/$1
-shift
-readonly JEKYLL_BASE=${PWD}/$1
-shift
-readonly SKYLARK_DOCS=${PWD}/$1
-shift
-readonly STARDOC_DOC=${PWD}/$1
-
-# Create temporary directory that is removed when this script exits.
-readonly TMP=$(mktemp -d "${TMPDIR:-/tmp}/tmp.XXXXXXXX")
-readonly OUT_DIR="$TMP/out"
-trap "rm -rf ${TMP}" EXIT
-
-function setup {
-  mkdir -p "$OUT_DIR"
-  cd "$OUT_DIR"
-  tar -xf "${JEKYLL_BASE}"
-}
-
-function unpack_skylark_doc {
-  local generated_dir="$TMP/skylark"
-  mkdir -p $generated_dir
-
-  # Unpack the generated documentation.
-  unzip -qq "$SKYLARK_DOCS" -d "$generated_dir"
-
-  for f in $(find "$generated_dir" -name "*.md"); do
-    ( cat <<EOF
----
-layout: default
-title: Build Rule Reference
-stylesheet: docs
----
-EOF
-      cat $f; ) > "$OUT_DIR/docs/$(basename $f)"
-  done
-}
-
-function include_skydoc_doc {
-  ( cat <<EOF
----
-layout: default
-title: Build Rule Reference
-stylesheet: docs
----
-EOF
-    cat $STARDOC_DOC; ) > "$OUT_DIR/docs/stardoc_reference.md"
-}
-
-function package_output {
-  cd "$OUT_DIR"
-  tar -hcf $OUTPUT $(find . -type f | sort)
-}
-
-function main {
-  setup
-  unpack_skylark_doc
-  include_skydoc_doc
-  package_output
-  cd "$(dirname ${TMP})"
-}
-main
diff --git a/site/roadmap.md b/site/roadmap.md
deleted file mode 100644
index 00c63f0..0000000
--- a/site/roadmap.md
+++ /dev/null
@@ -1,12 +0,0 @@
----
-layout: default
-title: Roadmap
-stylesheet: docs
----
-
-* Document default values for rule and macro attributes.
-* Enable greater customization of generated documentation, such as adding custom
-  HTML and CSS to the documentation pages.
-* Improve documentation for Skylark
-  [Aspects](https://www.bazel.build/docs/skylark/aspects.html) and
-  [Repository Rules](https://www.bazel.build/docs/skylark/repository_rules.html).
diff --git a/site/search.html b/site/search.html
deleted file mode 100644
index c455a81..0000000
--- a/site/search.html
+++ /dev/null
@@ -1,18 +0,0 @@
----
-layout: home
-title: Site Search
-stylesheet: home
----
-
-<script>
-  (function() {
-    var cx = '008327220137350982602:0mpaowwcmvg';
-    var gcse = document.createElement('script');
-    gcse.type = 'text/javascript';
-    gcse.async = true;
-    gcse.src = 'https://cse.google.com/cse.js?cx=' + cx;
-    var s = document.getElementsByTagName('script')[0];
-    s.parentNode.insertBefore(gcse, s);
-  })();
-</script>
-<gcse:search></gcse:search>
diff --git a/skydoc-screenshot.png b/skydoc-screenshot.png
deleted file mode 100644
index 31bbb24..0000000
--- a/skydoc-screenshot.png
+++ /dev/null
Binary files differ
diff --git a/skydoc/BUILD b/skydoc/BUILD
deleted file mode 100644
index d3c191b..0000000
--- a/skydoc/BUILD
+++ /dev/null
@@ -1,107 +0,0 @@
-licenses(["notice"])  # Apache 2.0
-
-package(default_visibility = ["//visibility:public"])
-
-load("@com_google_protobuf//:protobuf.bzl", "py_proto_library")
-load("@rules_python//python:defs.bzl", "py_binary", "py_library", "py_test")
-
-py_proto_library(
-    name = "build_pb_py",
-    srcs = ["build.proto"],
-    default_runtime = "@com_google_protobuf//:protobuf_python",
-    protoc = "@com_google_protobuf//:protoc",
-)
-
-py_library(
-    name = "common",
-    srcs = ["common.py"],
-)
-
-py_test(
-    name = "common_test",
-    srcs = ["common_test.py"],
-    python_version = "PY2",
-    deps = [
-        ":common",
-    ],
-)
-
-py_library(
-    name = "load_extractor",
-    srcs = ["load_extractor.py"],
-)
-
-py_test(
-    name = "load_extractor_test",
-    srcs = ["load_extractor_test.py"],
-    python_version = "PY2",
-    deps = [
-        ":load_extractor",
-    ],
-)
-
-py_library(
-    name = "macro_extractor",
-    srcs = ["macro_extractor.py"],
-    deps = [":common"],
-)
-
-py_test(
-    name = "macro_extractor_test",
-    srcs = ["macro_extractor_test.py"],
-    python_version = "PY2",
-    deps = [
-        ":build_pb_py",
-        ":macro_extractor",
-    ],
-)
-
-py_library(
-    name = "rule_extractor",
-    srcs = ["rule_extractor.py"],
-    deps = [
-        ":common",
-        ":load_extractor",
-        "//skydoc/stubs",
-    ],
-)
-
-py_test(
-    name = "rule_extractor_test",
-    srcs = ["rule_extractor_test.py"],
-    python_version = "PY2",
-    deps = [
-        ":build_pb_py",
-        ":load_extractor",
-        ":rule_extractor",
-    ],
-)
-
-py_library(
-    name = "rule",
-    srcs = ["rule.py"],
-    deps = [
-        ":build_pb_py",
-        "//external:mistune",
-    ],
-)
-
-py_binary(
-    name = "skydoc",
-    srcs = ["main.py"],
-    data = [
-        "//skydoc/sass:main.css",
-        "//skydoc/templates",
-    ],
-    # no py_binary launcher
-    main = "main.py",
-    python_version = "PY2",
-    deps = [
-        ":common",
-        ":macro_extractor",
-        ":rule",
-        ":rule_extractor",
-        "//external:jinja2",
-        "@bazel_tools//tools/python/runfiles",
-    ],
-)
diff --git a/skydoc/build.proto b/skydoc/build.proto
deleted file mode 100644
index 8d344fa..0000000
--- a/skydoc/build.proto
+++ /dev/null
@@ -1,112 +0,0 @@
-// Copyright 2014 The Bazel Authors. All rights reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//    http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-syntax = "proto2";
-
-package skydoc;
-
-// internal options
-
-message Attribute {
-  // Indicates the type of attribute.
-  enum Discriminator {
-    INTEGER = 1;             // int_value
-    STRING = 2;              // string_value
-    LABEL = 3;               // string_value
-    OUTPUT = 4;              // string_value
-    STRING_LIST = 5;         // string_list_value
-    LABEL_LIST = 6;          // string_list_value
-    OUTPUT_LIST = 7;         // string_list_value
-    DISTRIBUTION_SET = 8;    // string_list_value - order is unimportant
-    LICENSE = 9;             // license
-    STRING_DICT = 10;        // string_dict_value
-    FILESET_ENTRY_LIST = 11; // fileset_list_value
-    LABEL_LIST_DICT = 12;    // label_list_dict_value
-    STRING_LIST_DICT = 13;   // string_list_dict_value
-    BOOLEAN = 14;            // int, bool and string value
-    TRISTATE = 15;           // tristate, int and string value
-    INTEGER_LIST = 16;       // int_list_value
-    UNKNOWN = 18;            // unknown type, use only for build extensions
-    LABEL_DICT_UNARY = 19;   // label_dict_unary_value
-    SELECTOR_LIST = 20;      // selector_list
-    NAME = 21;               // name, use only for the name attribute
-    LABEL_KEYED_STRING_DICT = 22; // label_keyed_string_dict
-
-    // Deprecated.
-    DEPRECATED_STRING_DICT_UNARY = 17;
-  }
-}
-
-// Information about allowed rule classes for a specific attribute of a rule.
-message AllowedRuleClassInfo {
-  enum AllowedRuleClasses {
-    ANY = 1;  // Any rule is allowed to be in this attribute
-    SPECIFIED = 2;  // Only the explicitly listed rules are allowed
-  }
-
-  required AllowedRuleClasses policy = 1;
-
-  // Rule class names of rules allowed in this attribute, e.g "cc_library",
-  // "py_binary". Only present if the allowed_rule_classes field is set to
-  // SPECIFIED.
-  repeated string allowed_rule_class = 2;
-}
-
-// Information about an output target for a rule.
-message OutputTarget {
-  // The template name of the output target (e.g. %{name}.jar.
-  optional string template = 1;
-  // The documentation for the output target.
-  optional string documentation = 2;
-}
-
-// This message represents a single attribute of a single rule.
-message AttributeDefinition {
-  // Rule name, e.g. "cc_library"
-  required string name = 1;
-  required Attribute.Discriminator type = 2;
-  required bool mandatory = 3;
-
-  // Only present for attributes of type LABEL and LABEL_LIST.
-  optional AllowedRuleClassInfo allowed_rule_classes = 4;
-  // The documentation for the attribute.
-  optional string documentation = 5;
-  // The string representation of the default value of the attribute.
-  optional string default = 6;
-}
-
-message RuleDefinition {
-  required string name = 1;
-  // Only contains documented attributes
-  repeated AttributeDefinition attribute = 2;
-  // The documentation for the rule.
-  optional string documentation = 3;
-  // Documentation illustrating example usages of the rule.
-  optional string example_documentation = 4;
-
-  // The list of outputs for this rule.
-  repeated OutputTarget output = 5;
-
-  enum Type {
-    RULE = 1;
-    MACRO = 2;
-    REPOSITORY_RULE = 3;
-  }
-  optional Type type = 6;
-}
-
-message BuildLanguage {
-  // Only contains documented rule definitions
-  repeated RuleDefinition rule = 1;
-}
diff --git a/skydoc/common.py b/skydoc/common.py
deleted file mode 100644
index 8ec4bd5..0000000
--- a/skydoc/common.py
+++ /dev/null
@@ -1,176 +0,0 @@
-# Copyright 2016 The Bazel Authors. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#    http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-"""Common functions for skydoc."""
-
-import collections
-import re
-import textwrap
-from xml.sax.saxutils import escape
-
-
-ARGS_HEADING = "Args:"
-EXAMPLES_HEADING = "Examples:"
-EXAMPLE_HEADING = "Example:"
-OUTPUTS_HEADING = "Outputs:"
-
-
-class InputError(Exception):
-  pass
-
-
-class ExtractedDocs(object):
-  """Simple class to contain the documentation extracted from a docstring."""
-
-  def __init__(self, doc, attr_docs, example_doc, output_docs):
-    self.doc = doc
-    self.attr_docs = attr_docs
-    self.example_doc = example_doc
-    self.output_docs = output_docs
-
-
-def leading_whitespace(line):
-  """Returns the number of leading whitespace in the line."""
-  return len(line) - len(line.lstrip())
-
-
-def validate_strip_prefix(strip_prefix, bzl_files):
-  if not strip_prefix:
-    return strip_prefix
-  prefix = strip_prefix if strip_prefix.endswith('/') else strip_prefix + '/'
-  for path in bzl_files:
-    if not path.startswith(prefix):
-      raise InputError(
-          'Input file %s does not have path prefix %s. Directory prefix set '
-          'with --strip_prefix must be common to all input files.'
-          % (path, strip_prefix))
-  return prefix
-
-def _parse_attribute_docs(attr_docs, lines, index):
-  """Extracts documentation in the form of name: description.
-
-  This includes documentation for attributes and outputs.
-
-  Args:
-    attr_docs: A dict used to store the extracted documentation.
-    lines: List containing the input docstring split into lines.
-    index: The index in lines containing the heading that begins the
-        documentation, such as "Args:" or "Outputs:".
-
-  Returns:
-    Returns the next index after the documentation to resume processing
-    documentation in the caller.
-  """
-  attr = None  # Current attribute name
-  desc = None  # Description for current attribute
-  args_leading_ws = leading_whitespace(lines[index])
-  i = index + 1
-  while i < len(lines):
-    line = lines[i]
-    # If a blank line is encountered, we have finished parsing the "Args"
-    # section.
-    if line.strip() and leading_whitespace(line) == args_leading_ws:
-      break
-    # In practice, users sometimes add a "-" prefix, so we strip it even
-    # though it is not recommended by the style guide
-    pattern = re.compile(r"""
-        # Any amount of leading whitespace, plus an optional "-" prefix.
-        ^\s*-?\s*
-        # The attribute name, plus an optional "**" prefix for a **kwargs
-        # attribute.
-        ((?:\*\*)?[`\{\}\%\.\w\*]+)
-        # A colon plus any amount of whitespace to separate the attribute name
-        # from the description text.
-        :\s*
-        # The attribute description text.
-        (.*)
-    """, re.VERBOSE)
-    match = re.search(pattern, line)
-    if match:  # We have found a new attribute
-      if attr:
-        attr_docs[attr] = escape(desc)
-      attr, desc = match.group(1), match.group(2)
-    elif attr:
-      # Merge documentation when it is multiline
-      desc = desc + "\n" + line.strip()
-    i += + 1
-
-  if attr:
-    attr_docs[attr] = escape(desc).strip()
-
-  return i
-
-
-def _parse_example_docs(examples, lines, index):
-  """Extracts example documentation.
-
-  Args:
-    examples: A list to contain the lines containing the example documentation.
-    lines: List containing the input docstring split into lines.
-    index: The index in lines containing "Example[s]:", which begins the
-        example documentation.
-
-  Returns:
-    Returns the next index after the attribute documentation to resume
-    processing documentation in the caller.
-  """
-  heading_leading_ws = leading_whitespace(lines[index])
-  i = index + 1
-  while i < len(lines):
-    line = lines[i]
-    if line.strip() and leading_whitespace(line) == heading_leading_ws:
-      break
-    examples.append(line)
-    i += 1
-
-  return i
-
-
-def parse_docstring(doc):
-  """Analyzes the documentation string for attributes.
-
-  This looks for the "Args:" separator to fetch documentation for each
-  attribute. The "Args" section ends at the first blank line.
-
-  Args:
-    doc: The documentation string
-
-  Returns:
-    The new documentation string and a dictionary that maps each attribute to
-    its documentation
-  """
-  attr_docs = collections.OrderedDict() if hasattr(collections, 'OrderedDict') else {}
-  output_docs = collections.OrderedDict() if hasattr(collections, 'OrderedDict') else {}
-  examples = []
-  lines = doc.split("\n")
-  docs = []
-  i = 0
-  while i < len(lines):
-    line = lines[i]
-    if line.strip() == ARGS_HEADING:
-      i = _parse_attribute_docs(attr_docs, lines, i)
-      continue
-    elif line.strip() == EXAMPLES_HEADING or line.strip() == EXAMPLE_HEADING:
-      i = _parse_example_docs(examples, lines, i)
-      continue
-    elif line.strip() == OUTPUTS_HEADING:
-      i = _parse_attribute_docs(output_docs, lines, i)
-      continue
-
-    docs.append(line)
-    i += 1
-
-  doc = "\n".join(docs).strip()
-  examples_doc = textwrap.dedent("\n".join(examples)).strip()
-  return ExtractedDocs(doc, attr_docs, examples_doc, output_docs)
diff --git a/skydoc/common_test.py b/skydoc/common_test.py
deleted file mode 100644
index af12e5e..0000000
--- a/skydoc/common_test.py
+++ /dev/null
@@ -1,204 +0,0 @@
-# Copyright 2016 The Bazel Authors. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#    http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-import unittest
-# internal imports
-
-from skydoc import common
-
-
-class CommonTest(unittest.TestCase):
-  """Unit tests for common functions."""
-
-  def test_rule_doc_only(self):
-    docstring = 'Rule documentation only docstring.'
-    extracted_docs = common.parse_docstring(docstring)
-    self.assertEqual('Rule documentation only docstring.', extracted_docs.doc)
-    self.assertDictEqual({}, extracted_docs.attr_docs)
-    self.assertEqual('', extracted_docs.example_doc)
-    self.assertDictEqual({}, extracted_docs.output_docs)
-
-  def test_rule_and_attribute_doc(self):
-    docstring = (
-        'Rule and attribute documentation.\n'
-        '\n'
-        'Args:\n'
-        '  name: A unique name for this rule.\n'
-        '  visibility: The visibility of this rule.\n')
-    expected_attrs = {
-        'name': 'A unique name for this rule.',
-        'visibility': 'The visibility of this rule.'
-    }
-
-    extracted_docs = common.parse_docstring(docstring)
-    self.assertEqual('Rule and attribute documentation.', extracted_docs.doc)
-    self.assertDictEqual(expected_attrs, extracted_docs.attr_docs)
-    self.assertEqual('', extracted_docs.example_doc)
-    self.assertDictEqual({}, extracted_docs.output_docs)
-
-  def test_multi_line_doc(self):
-    docstring = (
-        'Multi-line rule and attribute documentation.\n'
-        '\n'
-        'Rule doc continued here.\n'
-        '\n'
-        'Args:\n'
-        '  name: A unique name for this rule.\n'
-        '\n'
-        '    Documentation for name continued here.\n'
-        '  visibility: The visibility of this rule.\n'
-        '\n'
-        '    Documentation for visibility continued here.\n')
-    expected_doc = (
-        'Multi-line rule and attribute documentation.\n'
-        '\n'
-        'Rule doc continued here.')
-    expected_attrs = {
-        'name': ('A unique name for this rule.\n\n'
-            'Documentation for name continued here.'),
-        'visibility': ('The visibility of this rule.\n\n'
-            'Documentation for visibility continued here.')
-    }
-
-    extracted_docs = common.parse_docstring(docstring)
-    self.assertEqual(expected_doc, extracted_docs.doc)
-    self.assertDictEqual(expected_attrs, extracted_docs.attr_docs)
-    self.assertEqual('', extracted_docs.example_doc)
-    self.assertDictEqual({}, extracted_docs.output_docs)
-
-  def test_invalid_args(self):
-    docstring = (
-        'Rule and attribute documentation.\n'
-        '\n'
-        'Foo:\n'
-        '  name: A unique name for this rule.\n'
-        '  visibility: The visibility of this rule.\n')
-
-    extracted_docs = common.parse_docstring(docstring)
-    self.assertEqual(docstring.strip(), extracted_docs.doc)
-    self.assertDictEqual({}, extracted_docs.attr_docs)
-    self.assertEqual('', extracted_docs.example_doc)
-    self.assertDictEqual({}, extracted_docs.output_docs)
-
-  def test_example(self):
-    docstring = (
-        'Documentation with example\n'
-        '\n'
-        'Examples:\n'
-        '  An example of how to use this rule:\n'
-        '\n'
-        '      example_rule()\n'
-        '\n'
-        '  Note about this example.\n'
-        '\n'
-        'Args:\n'
-        '  name: A unique name for this rule.\n'
-        '  visibility: The visibility of this rule.\n')
-    expected_attrs = {
-        'name': 'A unique name for this rule.',
-        'visibility': 'The visibility of this rule.'
-    }
-    expected_example_doc = (
-        'An example of how to use this rule:\n'
-        '\n'
-        '    example_rule()\n'
-        '\n'
-        'Note about this example.')
-
-    extracted_docs = common.parse_docstring(docstring)
-    self.assertEqual('Documentation with example', extracted_docs.doc)
-    self.assertDictEqual(expected_attrs, extracted_docs.attr_docs)
-    self.assertEqual(expected_example_doc, extracted_docs.example_doc)
-    self.assertDictEqual({}, extracted_docs.output_docs)
-
-  def test_example_after_attrs(self):
-    docstring = (
-        'Documentation with example\n'
-        '\n'
-        'Args:\n'
-        '  name: A unique name for this rule.\n'
-        '  visibility: The visibility of this rule.\n'
-        '\n'
-        'Examples:\n'
-        '  An example of how to use this rule:\n'
-        '\n'
-        '      example_rule()\n'
-        '\n'
-        '  Note about this example.\n')
-    expected_attrs = {
-        'name': 'A unique name for this rule.',
-        'visibility': 'The visibility of this rule.'
-    }
-    expected_example_doc = (
-        'An example of how to use this rule:\n'
-        '\n'
-        '    example_rule()\n'
-        '\n'
-        'Note about this example.')
-
-    extracted_docs = common.parse_docstring(docstring)
-    self.assertEqual('Documentation with example', extracted_docs.doc)
-    self.assertDictEqual(expected_attrs, extracted_docs.attr_docs)
-    self.assertEqual(expected_example_doc, extracted_docs.example_doc)
-    self.assertDictEqual({}, extracted_docs.output_docs)
-
-  def test_outputs(self):
-    docstring = (
-        'Documentation with outputs\n'
-        '\n'
-        'Args:\n'
-        '  name: A unique name for this rule.\n'
-        '  visibility: The visibility of this rule.\n'
-        '\n'
-        'Outputs:\n'
-        '  %{name}.jar: A Java archive.\n'
-        '  %{name}_deploy.jar: A Java archive suitable for deployment.\n'
-        '\n'
-        '      Only built if explicitly requested.\n')
-    expected_attrs = {
-        'name': 'A unique name for this rule.',
-        'visibility': 'The visibility of this rule.'
-    }
-    expected_outputs = {
-        '%{name}.jar': 'A Java archive.',
-        '%{name}_deploy.jar': ('A Java archive suitable for deployment.\n\n'
-                               'Only built if explicitly requested.'),
-    }
-
-    extracted_docs = common.parse_docstring(docstring)
-    self.assertEqual('Documentation with outputs', extracted_docs.doc)
-    self.assertDictEqual(expected_attrs, extracted_docs.attr_docs)
-    self.assertEqual('', extracted_docs.example_doc)
-    self.assertDictEqual(expected_outputs, extracted_docs.output_docs)
-
-  def _invalid_prefix(self, prefix, bzl_files):
-    self.assertRaises(common.InputError,
-                      common.validate_strip_prefix,
-                      prefix,
-                      bzl_files)
-
-  def test_strip_prefix(self):
-    bzl_files = ['foo/bar/bar.bzl', 'foo/bar/baz/baz.bzl']
-    self.assertEqual('', common.validate_strip_prefix('', bzl_files))
-    self.assertEqual('foo/', common.validate_strip_prefix('foo/', bzl_files))
-    self.assertEqual('foo/bar/',
-                     common.validate_strip_prefix('foo/bar', bzl_files))
-
-    self._invalid_prefix('bar', ['foo/bar.bzl'])
-    self._invalid_prefix('bar', ['foo/foo.bzl', 'bar/bar.bzl'])
-    self._invalid_prefix('bar', ['bar.bzl'])
-    self._invalid_prefix('bar', ['barfoo/bar.bzl'])
-
-if __name__ == '__main__':
-  unittest.main()
diff --git a/skydoc/load_extractor.py b/skydoc/load_extractor.py
deleted file mode 100644
index e083a3d..0000000
--- a/skydoc/load_extractor.py
+++ /dev/null
@@ -1,112 +0,0 @@
-# Copyright 2017 The Bazel Authors. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#    http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-"""Extracts information about symbols loaded from other .bzl files."""
-
-import ast
-from collections import namedtuple
-
-LoadSymbol = namedtuple('LoadSymbol', ['label', 'symbol', 'alias'])
-"""Information about a symbol loaded from another .bzl file."""
-
-
-class LoadExtractorError(Exception):
-  """Error raised by LoadExtractor"""
-  pass
-
-
-class LoadExtractor(object):
-  """Extracts information on symbols load()ed from other .bzl files."""
-
-  def _extract_loads(self, bzl_file):
-    """Walks the AST and extracts information on loaded symbols."""
-    load_symbols = []
-    try:
-      tree = None
-      with open(bzl_file) as f:
-        tree = ast.parse(f.read(), bzl_file)
-      key = None
-      for node in ast.iter_child_nodes(tree):
-        if not isinstance(node, ast.Expr):
-          continue
-        call = node.value
-        if (not isinstance(call, ast.Call) or
-            not isinstance(call.func, ast.Name) or
-            call.func.id != 'load'):
-          continue
-
-        args = []
-        for arg in call.args:
-          if not isinstance(arg, ast.Str):
-            raise LoadExtractorError(
-                'Only string literals in load statments are supported.')
-          args.append(arg.s)
-        kwargs = {}
-        for keyword in call.keywords:
-          if not isinstance(keyword.value, ast.Str):
-            raise LoadExtractorError(
-                'Only string literals in load statments are supported.')
-          kwargs[keyword.arg] = keyword.value.s
-
-        label = args[0]
-        for arg in args[1:]:
-          load_symbol = LoadSymbol(label, arg, None)
-          load_symbols.append(load_symbol)
-        for alias, symbol in kwargs.items():
-          load_symbol = LoadSymbol(label, symbol, alias)
-          load_symbols.append(load_symbol)
-
-    except IOError as e:
-      print("Failed to parse {0}: {1}".format(bzl_file, e.strerror))
-      pass
-
-    return load_symbols
-
-  def _validate_loads(self, load_symbols):
-    """Checks that there are no collisions from the extracted symbols."""
-    symbols = set()
-    for load in load_symbols:
-      if load.alias:
-        if load.alias in symbols:
-          raise LoadExtractorError(
-              "Load symbol conflict: %s (aliased from %s) loaded from %s" %
-              (load.alias, load.symbol, load.label))
-        else:
-          symbols.add(load.alias)
-      elif load.symbol in symbols:
-        raise LoadExtractorError(
-            "Load symbol conflict: %s loaded from %s" %
-            (load.alias, load.label))
-      else:
-        symbols.add(load.symbol)
-
-  def extract(self, bzl_file):
-    """Extracts symbols loaded from other .bzl files.
-
-    Walks the AST of the .bzl files and extracts information about symbols
-    loaded from other .bzl files from load() calls. Then, validate the
-    extracted symbols to check that all symbols are unique.
-
-    Note that only load() calls where all arguments are string literals
-    (ast.Str) are supported.
-
-    Args:
-      bzl_file: The .bzl file to extract load symbols from.
-
-    Returns:
-      List of LoadSymbol objects.
-    """
-    load_symbols = self._extract_loads(bzl_file)
-    self._validate_loads(load_symbols)
-    return load_symbols
diff --git a/skydoc/load_extractor_test.py b/skydoc/load_extractor_test.py
deleted file mode 100644
index a38172e..0000000
--- a/skydoc/load_extractor_test.py
+++ /dev/null
@@ -1,93 +0,0 @@
-# Copyright 2017 The Bazel Authors. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#    http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-import os
-import tempfile
-import textwrap
-import unittest
-
-from skydoc import load_extractor
-
-class LoadExtractorTest(unittest.TestCase):
-
-  def check_symbols(self, src, expected):
-    tf = tempfile.NamedTemporaryFile(mode='w+', delete=False)
-    tf.write(src)
-    tf.flush()
-    tf.close()
-    extractor = load_extractor.LoadExtractor()
-    load_symbols = extractor.extract(tf.name)
-    os.remove(tf.name)
-
-    self.assertEqual(expected, load_symbols)
-
-  def test_load(self):
-    src = textwrap.dedent("""\
-      load("//foo/bar:bar.bzl", "foo_library")
-      load("//foo/bar:baz.bzl", "foo_test", orig_foo_binary = "foo_binary")
-      """)
-    expected = [
-      load_extractor.LoadSymbol('//foo/bar:bar.bzl', 'foo_library', None),
-      load_extractor.LoadSymbol('//foo/bar:baz.bzl', 'foo_test', None),
-      load_extractor.LoadSymbol('//foo/bar:baz.bzl', 'foo_binary',
-                                'orig_foo_binary'),
-    ]
-    self.check_symbols(src, expected)
-
-  def raises_error(self, src):
-    tf = tempfile.NamedTemporaryFile(mode='w+', delete=False)
-    tf.write(src)
-    tf.flush()
-    tf.close()
-
-    extractor = load_extractor.LoadExtractor()
-    self.assertRaises(load_extractor.LoadExtractorError,
-                      extractor.extract, tf.name)
-    os.remove(tf.name)
-
-  def test_invalid_non_string_literal_in_label(self):
-    src = textwrap.dedent("""\
-      load(load_label, "foo_library")
-      """)
-    self.raises_error(src)
-
-  def test_invalid_non_string_literal_in_keywords(self):
-    src = textwrap.dedent("""\
-        load("//foo/bar:bar.bzl", loaded_symbol)
-      """)
-    self.raises_error(src)
-
-  def test_invalid_symbol_conflict(self):
-    src = textwrap.dedent("""\
-        load("//foo:bar.bzl", "foo_binary", "foo_library")
-        load("//foo:baz.bzl", "foo_library")
-      """)
-    self.raises_error(src)
-
-  def test_invalid_symbol_alias_conflict(self):
-    src = textwrap.dedent("""\
-        load("//foo:bar.bzl", foo_library="some_foo_library")
-        load("//foo:baz.bzl", "foo_library")
-      """)
-    self.raises_error(src)
-
-  def test_invalid_duplicate_symbol_loaded(self):
-    src = textwrap.dedent("""\
-        load("//foo:bar.bzl", "foo_library", "foo_library")
-      """)
-    self.raises_error(src)
-
-
-if __name__ == '__main__':
-  unittest.main()
diff --git a/skydoc/macro_extractor.py b/skydoc/macro_extractor.py
deleted file mode 100644
index 0be9709..0000000
--- a/skydoc/macro_extractor.py
+++ /dev/null
@@ -1,143 +0,0 @@
-# Copyright 2016 The Bazel Authors. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#    http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-"""Extractor for Skylark macro documentation."""
-
-import ast
-# internal imports
-
-from skydoc import build_pb2
-from skydoc import common
-
-
-def get_type(expr):
-  """Find the type of an expression.
-
-  Args:
-    expr: The expression to check.
-
-  Returns:
-    The type of the expression.
-  """
-  if isinstance(expr, ast.Num):
-    return build_pb2.Attribute.INTEGER
-  elif isinstance(expr, ast.Str):
-    return build_pb2.Attribute.STRING
-  elif isinstance(expr, ast.List):
-    return build_pb2.Attribute.STRING_LIST
-  elif isinstance(expr, ast.Name) and (expr.id == "True" or expr.id == "False"):
-    return build_pb2.Attribute.BOOLEAN
-  elif hasattr(ast, 'NameConstant') and isinstance(expr, ast.NameConstant) and (expr.value == True or expr.value == False):
-    return build_pb2.Attribute.BOOLEAN
-  else:
-    return build_pb2.Attribute.UNKNOWN
-
-class MacroDocExtractor(object):
-  """Extracts documentation for macros from a .bzl file"""
-
-  def __init__(self):
-    """Inits MacroDocExtractor with a new BuildLanguage proto"""
-    self.__language = build_pb2.BuildLanguage()
-    self.title = ""
-    self.description = ""
-
-  def _add_file_docs(self, tree):
-    """Extracts the file docstring of the .bzl file."""
-    docstring = ast.get_docstring(tree)
-    if docstring == None:
-      return
-    lines = docstring.split("\n")
-    i = 0
-    for line in lines:
-      if line != '':
-        i = i + 1
-      else:
-        break
-
-    self.title = " ".join(lines[:i])
-    self.description = "\n".join(lines[i + 1:])
-
-  def _add_macro_doc(self, stmt):
-    # The defaults array contains default values for the last arguments.
-    # The first shift arguments are mandatory.
-    shift = len(stmt.args.args) - len(stmt.args.defaults)
-
-    rule = self.__language.rule.add()
-    rule.name = stmt.name
-    rule.type = build_pb2.RuleDefinition.MACRO
-
-    doc = ast.get_docstring(stmt)
-    if doc:
-      extracted_docs = common.parse_docstring(doc)
-      rule.documentation = extracted_docs.doc
-      if extracted_docs.example_doc:
-        rule.example_documentation = extracted_docs.example_doc
-    else:
-      extracted_docs = common.ExtractedDocs(
-          doc="", attr_docs={}, example_doc="", output_docs={})
-
-    for i in range(len(stmt.args.args)):
-      attr = rule.attribute.add()
-      attr_name = stmt.args.args[i].id if hasattr(stmt.args.args[i], 'id') else stmt.args.args[i].arg
-      attr.name = attr_name
-
-      if attr_name in extracted_docs.attr_docs:
-        attr.documentation = extracted_docs.attr_docs[attr_name]
-
-      if i < shift:  # The first arguments are mandatory
-        attr.mandatory = True
-        attr.type = build_pb2.Attribute.UNKNOWN
-      else:
-        node = stmt.args.defaults[i - shift]
-        attr.mandatory = False
-        attr.type = get_type(node)
-        if attr.type == build_pb2.Attribute.BOOLEAN:
-          attr.default = str(node.value) if hasattr(node, 'value') else node.id
-
-    if stmt.args.kwarg:
-      attr = rule.attribute.add()
-      attr_name = '**' + (stmt.args.kwarg.arg if hasattr(stmt.args.kwarg, 'arg') else stmt.args.kwarg)
-      attr.name = attr_name
-      attr.mandatory = False
-      attr.type = build_pb2.Attribute.UNKNOWN
-      if attr_name in extracted_docs.attr_docs:
-        attr.documentation = extracted_docs.attr_docs[attr_name]
-
-    for template, doc in extracted_docs.output_docs.items():
-      output = rule.output.add()
-      output.template = template
-      output.documentation = doc
-
-  def parse_bzl(self, bzl_file):
-    """Extracts documentation for all public macros from the given .bzl file.
-
-    Args:
-      bzl_file: The .bzl file to extract macro documentation from.
-    """
-    try:
-      with open(bzl_file) as f:
-        tree = ast.parse(f.read(), bzl_file)
-      self._add_file_docs(tree)
-      for stmt in tree.body:
-        if isinstance(stmt, ast.FunctionDef) and not stmt.name.startswith("_"):
-          self._add_macro_doc(stmt)
-    except IOError as e:
-      # Ignore missing extension
-      print("Failed to parse {0}: {1}".format(bzl_file, e.strerror))
-      pass
-
-  def proto(self):
-    """Returns the proto containing the macro documentation."""
-    return self.__language
-
diff --git a/skydoc/macro_extractor_test.py b/skydoc/macro_extractor_test.py
deleted file mode 100644
index 5a488c7..0000000
--- a/skydoc/macro_extractor_test.py
+++ /dev/null
@@ -1,472 +0,0 @@
-# Copyright 2016 The Bazel Authors. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#    http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-
-
-import os
-import tempfile
-import textwrap
-import unittest
-# internal imports
-
-from google.protobuf import text_format
-from skydoc import build_pb2
-from skydoc import macro_extractor
-
-
-class MacroExtractorTest(unittest.TestCase):
-
-  def check_protos(self, src, expected):
-    tf = tempfile.NamedTemporaryFile(mode='w+', delete=False)
-    tf.write(src)
-    tf.flush()
-    tf.close()
-
-    expected_proto = build_pb2.BuildLanguage()
-    text_format.Merge(expected, expected_proto)
-
-    extractor = macro_extractor.MacroDocExtractor()
-    extractor.parse_bzl(tf.name)
-    proto = extractor.proto()
-    os.remove(tf.name)
-    self.assertEqual(expected_proto, proto)
-
-  def test_multi_line_description(self):
-    src = textwrap.dedent("""\
-        def multiline(name, foo=False, visibility=None):
-          \"\"\"A rule with multiline documentation.
-
-          Some more documentation about this rule here.
-
-          Args:
-            name: A unique name for this rule.
-            foo: A test argument.
-
-              Documentation for foo continued here.
-            visibility: The visibility of this rule.
-
-              Documentation for visibility continued here.
-          \"\"\"
-          native.genrule(
-              name = name,
-              out = ["foo"],
-              cmd = "touch $@",
-              visibility = visibility,
-          )
-        """)
-
-    expected = textwrap.dedent("""\
-        rule {
-          name: "multiline"
-          documentation: "A rule with multiline documentation.\\n\\nSome more documentation about this rule here."
-          attribute {
-            name: "name"
-            type: UNKNOWN
-            mandatory: true
-            documentation: "A unique name for this rule."
-          }
-          attribute {
-            name: "foo"
-            type: BOOLEAN
-            mandatory: false
-            default: "False"
-            documentation: "A test argument.\\n\\nDocumentation for foo continued here."
-          }
-          attribute {
-            name: "visibility"
-            type: UNKNOWN
-            mandatory: false
-            documentation: "The visibility of this rule.\\n\\nDocumentation for visibility continued here."
-          }
-          type: MACRO
-        }
-        """)
-
-    self.check_protos(src, expected)
-
-  def test_kwargs(self):
-    src = textwrap.dedent("""\
-        def with_keyword_args(name, foo=False, **kwargs):
-          \"\"\"A rule with keyword args.
-
-          Args:
-            name: A unique name for this rule.
-            foo: A test argument.
-            **kwargs: Keyword arguments.
-          \"\"\"
-          native.genrule(
-              name = name,
-              out = ["foo"],
-              cmd = "touch $@",
-              visibility = visibility,
-              **kwargs
-          )
-        """)
-
-    expected = textwrap.dedent("""\
-        rule {
-          name: "with_keyword_args"
-          documentation: "A rule with keyword args."
-          attribute {
-            name: "name"
-            type: UNKNOWN
-            mandatory: true
-            documentation: "A unique name for this rule."
-          }
-          attribute {
-            name: "foo"
-            type: BOOLEAN
-            mandatory: false
-            default: "False"
-            documentation: "A test argument."
-          }
-          attribute {
-            name: "**kwargs"
-            type: UNKNOWN
-            mandatory: false
-            documentation: "Keyword arguments."
-          }
-          type: MACRO
-        }
-        """)
-
-    self.check_protos(src, expected)
-
-  def test_undocumented(self):
-    src = textwrap.dedent("""\
-        def undocumented(name, visibility=None):
-          native.genrule(
-              name = name,
-              out = ["foo"],
-              cmd = "touch $@",
-              visibility = visibility,
-          )
-        """)
-
-    expected = textwrap.dedent("""\
-        rule {
-          name: "undocumented"
-          attribute {
-            name: "name"
-            type: UNKNOWN
-            mandatory: true
-          }
-          attribute {
-            name: "visibility"
-            type: UNKNOWN
-            mandatory: false
-          }
-          type: MACRO
-        }
-        """)
-
-    self.check_protos(src, expected)
-
-  def test_private_macros_skipped(self):
-    src = textwrap.dedent("""\
-        def _private(name, visibility=None):
-          \"\"\"A private macro that should not appear in docs.
-
-          Args:
-            name: A unique name for this rule.
-            visibility: The visibility of this rule.
-          \"\"\"
-          native.genrule(
-              name = name,
-              out = ["foo"],
-              cmd = "touch $@",
-              visibility = visibility,
-          )
-
-        def public(name, visibility=None):
-          \"\"\"A public macro that should appear in docs.
-
-          Args:
-            name: A unique name for this rule.
-            visibility: The visibility of this rule.
-          \"\"\"
-          native.genrule(
-              name = name,
-              out = ["foo"],
-              cmd = "touch $@",
-              visibility = visibility,
-          )
-        """)
-
-    expected = textwrap.dedent("""\
-        rule {
-          name: "public"
-          documentation: "A public macro that should appear in docs."
-          attribute {
-            name: "name"
-            type: UNKNOWN
-            mandatory: true
-            documentation: "A unique name for this rule."
-          }
-          attribute {
-            name: "visibility"
-            type: UNKNOWN
-            mandatory: false
-            documentation: "The visibility of this rule."
-          }
-          type: MACRO
-        }
-        """)
-
-    self.check_protos(src, expected)
-
-  def test_rule_macro_mix(self):
-    src = textwrap.dedent("""\
-        def _impl(ctx):
-          return struct()
-
-        example_rule = rule(
-            implementation = _impl,
-            attrs = {
-                "arg_label": attr.label(),
-                "arg_string": attr.string(),
-            },
-        )
-        \"\"\"An example rule.
-
-        Args:
-          name: A unique name for this rule.
-          arg_label: A label argument.
-          arg_string: A string argument.
-        \"\"\"
-
-        def example_macro(name, foo, visibility=None):
-          \"\"\"An example macro.
-
-          Args:
-            name: A unique name for this rule.
-            foo: A test argument.
-            visibility: The visibility of this rule.
-          \"\"\"
-          native.genrule(
-              name = name,
-              out = ["foo"],
-              cmd = "touch $@",
-              visibility = visibility,
-          )
-        """)
-
-    expected = textwrap.dedent("""\
-        rule {
-          name: "example_macro"
-          documentation: "An example macro."
-          attribute {
-            name: "name"
-            type: UNKNOWN
-            mandatory: true
-            documentation: "A unique name for this rule."
-          }
-          attribute {
-            name: "foo"
-            type: UNKNOWN
-            mandatory: true
-            documentation: "A test argument."
-          }
-          attribute {
-            name: "visibility"
-            type: UNKNOWN
-            mandatory: false
-            documentation: "The visibility of this rule."
-          }
-          type: MACRO
-        }
-        """)
-
-    self.check_protos(src, expected)
-
-  def test_macro_with_example_doc(self):
-    src = textwrap.dedent("""\
-        def macro_with_example(name, foo, visibility=None):
-          \"\"\"Macro with examples.
-
-          Args:
-            name: A unique name for this rule.
-            foo: A test argument.
-            visibility: The visibility of this rule.
-
-          Example:
-            Here is an example of how to use this rule.
-          \"\"\"
-          native.genrule(
-              name = name,
-              out = ["foo"],
-              cmd = "touch $@",
-              visibility = visibility,
-          )
-        """)
-
-    expected = textwrap.dedent("""\
-        rule {
-          name: "macro_with_example"
-          documentation: "Macro with examples."
-          example_documentation: "Here is an example of how to use this rule."
-          attribute {
-            name: "name"
-            type: UNKNOWN
-            mandatory: true
-            documentation: "A unique name for this rule."
-          }
-          attribute {
-            name: "foo"
-            type: UNKNOWN
-            mandatory: true
-            documentation: "A test argument."
-          }
-          attribute {
-            name: "visibility"
-            type: UNKNOWN
-            mandatory: false
-            documentation: "The visibility of this rule."
-          }
-          type: MACRO
-        }
-        """)
-
-    self.check_protos(src, expected)
-
-  def test_macro_with_output_doc(self):
-    src = textwrap.dedent("""\
-        def macro_with_outputs(name, foo, visibility=None):
-          \"\"\"Macro with output documentation.
-
-          Outputs:
-            %{name}.jar: A Java archive.
-            %{name}_deploy.jar: A Java archive suitable for deployment.
-
-                Only built if explicitly requested.
-
-          Args:
-            name: A unique name for this rule.
-            foo: A test argument.
-            visibility: The visibility of this rule.
-          \"\"\"
-          native.genrule(
-              name = name,
-              out = ["foo"],
-              cmd = "touch $@",
-              visibility = visibility,
-          )
-        """)
-
-    expected = textwrap.dedent("""\
-        rule {
-          name: "macro_with_outputs"
-          documentation: "Macro with output documentation."
-          attribute {
-            name: "name"
-            type: UNKNOWN
-            mandatory: true
-            documentation: "A unique name for this rule."
-          }
-          attribute {
-            name: "foo"
-            type: UNKNOWN
-            mandatory: true
-            documentation: "A test argument."
-          }
-          attribute {
-            name: "visibility"
-            type: UNKNOWN
-            mandatory: false
-            documentation: "The visibility of this rule."
-          }
-          output {
-            template: "%{name}.jar"
-            documentation: "A Java archive."
-          }
-          output {
-            template: "%{name}_deploy.jar"
-            documentation: "A Java archive suitable for deployment.\\n\\nOnly built if explicitly requested."
-          }
-          type: MACRO
-        }
-        """)
-
-    self.check_protos(src, expected)
-
-  def test_file_doc_title_only(self):
-    src = textwrap.dedent("""\
-        \"\"\"Example rules\"\"\"
-        """)
-    tf = tempfile.NamedTemporaryFile(mode='w+', delete=False)
-    tf.write(src)
-    tf.flush()
-    tf.close()
-
-    extractor = macro_extractor.MacroDocExtractor()
-    extractor.parse_bzl(tf.name)
-    os.remove(tf.name)
-    self.assertEqual('Example rules', extractor.title)
-    self.assertEqual('', extractor.description)
-
-  def test_file_doc_title_description(self):
-    src = textwrap.dedent("""\
-        \"\"\"Example rules
-
-        This file contains example Bazel rules.
-
-        Documentation continued here.
-        \"\"\"
-        """)
-    tf = tempfile.NamedTemporaryFile(mode='w+', delete=False)
-    tf.write(src)
-    tf.flush()
-    tf.close()
-
-    extractor = macro_extractor.MacroDocExtractor()
-    extractor.parse_bzl(tf.name)
-    os.remove(tf.name)
-    self.assertEqual('Example rules', extractor.title)
-    self.assertEqual('This file contains example Bazel rules.'
-                     '\n\nDocumentation continued here.',
-                     extractor.description)
-
-  def test_file_doc_title_multiline(self):
-    src = textwrap.dedent("""\
-        \"\"\"Example rules
-        for Bazel
-
-        This file contains example Bazel rules.
-
-        Documentation continued here.
-        \"\"\"
-        """)
-    tf = tempfile.NamedTemporaryFile(mode='w+', delete=False)
-    tf.write(src)
-    tf.flush()
-    tf.close()
-
-    extractor = macro_extractor.MacroDocExtractor()
-    extractor.parse_bzl(tf.name)
-    os.remove(tf.name)
-    self.assertEqual('Example rules for Bazel', extractor.title)
-    self.assertEqual('This file contains example Bazel rules.'
-                     '\n\nDocumentation continued here.',
-                     extractor.description)
-
-  def test_loads_ignored(self):
-    src = textwrap.dedent("""\
-      load("//foo/bar:baz.bzl", "foo_library")
-      load("//foo/bar:baz.bzl", "foo_test", orig_foo_binary = "foo_binary")
-      """)
-    expected = ''
-    self.check_protos(src, expected)
-
-if __name__ == '__main__':
-  unittest.main()
diff --git a/skydoc/main.py b/skydoc/main.py
deleted file mode 100755
index 408cd8e..0000000
--- a/skydoc/main.py
+++ /dev/null
@@ -1,334 +0,0 @@
-# Copyright 2016 The Bazel Authors. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#    http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-"""Documentation generator for Skylark"""
-
-from __future__ import print_function
-# internal imports
-import jinja2
-import mistune
-import os
-import posixpath
-import re
-import shutil
-import sys
-import tempfile
-import zipfile
-
-from optparse import OptionParser
-
-from bazel_tools.tools.python.runfiles import runfiles as runfiles_lib
-from skydoc import common
-from skydoc import load_extractor
-from skydoc import macro_extractor
-from skydoc import rule
-from skydoc import rule_extractor
-
-DEFAULT_OUTPUT_DIR = '.'
-DEFAULT_OUTPUT_FILE = 'skydoc.zip'
-
-WORKSPACE_DIR = 'io_bazel_skydoc'
-TEMPLATE_PATH = 'skydoc/templates'
-CSS_PATH = 'skydoc/sass'
-
-CSS_FILE = 'main.css'
-
-def _create_jinja_environment(runfiles, site_root, link_ext):
-  def _Load(path):
-    loc = runfiles.Rlocation(posixpath.join(WORKSPACE_DIR, TEMPLATE_PATH, path))
-    if loc:
-      with open(loc, "rb") as f:
-        return f.read().decode("utf-8")
-    return None
-
-  env = jinja2.Environment(
-      loader=jinja2.FunctionLoader(_Load),
-      keep_trailing_newline=True,
-      line_statement_prefix='%')
-  env.filters['markdown'] = lambda text: jinja2.Markup(mistune.markdown(text))
-  env.filters['doc_link'] = (
-      lambda fname: site_root + '/' + fname + '.' + link_ext)
-  env.filters['link'] = lambda fname: site_root + '/' + fname
-  return env
-
-
-# TODO(dzc): Remove this workaround once we switch to a self-contained Python
-# binary format such as PEX.
-def _runfile_path(runfiles, path):
-  return runfiles.Rlocation(posixpath.join(WORKSPACE_DIR, path))
-
-def merge_languages(macro_language, rule_language):
-  for rule in rule_language.rule:
-    new_rule = macro_language.rule.add()
-    new_rule.CopyFrom(rule)
-  return macro_language
-
-class WriterOptions(object):
-  def __init__(self, output_dir, output_file, output_zip, overview,
-               overview_filename, link_ext, site_root):
-    self.output_dir = output_dir
-    self.output_file = output_file
-    self.output_zip = output_zip
-    self.overview = overview
-    self.overview_filename = overview_filename
-    self.link_ext = link_ext
-
-    self.site_root = site_root
-    if len(self.site_root) > 0 and self.site_root.endswith('/'):
-        self.site_root = self.site_root[:-1]
-
-class MarkdownWriter(object):
-  """Writer for generating documentation in Markdown."""
-
-  def __init__(self, writer_options, runfiles):
-    self.__options = writer_options
-    self.__env = _create_jinja_environment(runfiles,
-                                           self.__options.site_root,
-                                           self.__options.link_ext)
-
-  def write(self, rulesets):
-    """Write the documentation for the rules contained in rulesets."""
-    try:
-      temp_dir = tempfile.mkdtemp()
-      output_files = []
-      for ruleset in rulesets:
-        if not ruleset.empty():
-          output_files.append(self._write_ruleset(temp_dir, ruleset))
-      if self.__options.overview:
-        output_files.append(self._write_overview(temp_dir, rulesets))
-
-      if self.__options.output_zip:
-        # We are generating a zip archive containing all the documentation.
-        # Write each documentation file generated in the temp directory to the
-        # zip file.
-        with zipfile.ZipFile(self.__options.output_file, 'w') as zf:
-          for output_file, output_path in output_files:
-            zf.write(output_file, output_path)
-      else:
-        # We are generating documentation in the output_dir directory. Copy each
-        # documentation file to output_dir.
-        for output_file, output_path in output_files:
-          dest_file = os.path.join(self.__options.output_dir, output_path)
-          dest_dir = os.path.dirname(dest_file)
-          if not os.path.exists(dest_dir):
-            os.makedirs(dest_dir)
-          shutil.copyfile(output_file, dest_file)
-
-    finally:
-      # Delete temporary directory.
-      shutil.rmtree(temp_dir)
-
-  def _write_ruleset(self, output_dir, ruleset):
-    # Load template and render Markdown.
-    template = self.__env.get_template('markdown.jinja')
-    out = template.render(ruleset=ruleset)
-
-    # Write output to file. Output files are created in a directory structure
-    # that matches that of the input file.
-    output_path = ruleset.output_file + '.md'
-    output_file = "%s/%s" % (output_dir, output_path)
-    file_dirname = os.path.dirname(output_file)
-    if not os.path.exists(file_dirname):
-      os.makedirs(file_dirname)
-    with open(output_file, "w") as f:
-      f.write(out)
-    return (output_file, output_path)
-
-  def _write_overview(self, output_dir, rulesets):
-    template = self.__env.get_template('markdown_overview.jinja')
-    out = template.render(rulesets=rulesets)
-
-    output_file = "%s/%s.md" % (output_dir, self.__options.overview_filename)
-    with open(output_file, "w") as f:
-      f.write(out)
-    return (output_file, "%s.md" % self.__options.overview_filename)
-
-class HtmlWriter(object):
-  """Writer for generating documentation in HTML."""
-
-  def __init__(self, options, runfiles):
-    self.__runfiles = runfiles
-    self.__options = options
-    self.__env = _create_jinja_environment(runfiles,
-                                           self.__options.site_root,
-                                           self.__options.link_ext)
-
-  def write(self, rulesets):
-    # Generate navigation used for all rules.
-    nav_template = self.__env.get_template('nav.jinja')
-    nav = nav_template.render(
-        rulesets=rulesets,
-        overview=self.__options.overview,
-        overview_filename=self.__options.overview_filename)
-
-    try:
-      temp_dir = tempfile.mkdtemp()
-      output_files = []
-      for ruleset in rulesets:
-        if not ruleset.empty():
-          output_files.append(self._write_ruleset(temp_dir, ruleset, nav))
-      if self.__options.overview:
-        output_files.append(self._write_overview(temp_dir, rulesets, nav))
-
-      if self.__options.output_zip:
-        with zipfile.ZipFile(self.__options.output_file, 'w') as zf:
-          for output_file, output_path in output_files:
-            zf.write(output_file, output_path)
-          zf.write(_runfile_path(self.__runfiles,
-                                 posixpath.join(CSS_PATH, CSS_FILE)),
-                   CSS_FILE)
-      else:
-        for output_file, output_path in output_files:
-          dest_file = os.path.join(self.__options.output_dir, output_path)
-          dest_dir = os.path.dirname(dest_file)
-          if not os.path.exists(dest_dir):
-            os.makedirs(dest_dir)
-          shutil.copyfile(output_file, dest_file)
-
-        # Copy CSS file.
-        shutil.copyfile(_runfile_path(self.__runfiles,
-                                      posixpath.join(CSS_PATH, CSS_FILE)),
-                        os.path.join(self.__options.output_dir, CSS_FILE))
-    finally:
-      # Delete temporary directory.
-      shutil.rmtree(temp_dir)
-
-  def _write_ruleset(self, output_dir, ruleset, nav):
-    # Load template and render markdown.
-    template = self.__env.get_template('html.jinja')
-    out = template.render(title=ruleset.title, ruleset=ruleset, nav=nav)
-
-    # Write output to file. Output files are created in a directory structure
-    # that matches that of the input file.
-    output_path = ruleset.output_file + '.html'
-    output_file = "%s/%s" % (output_dir, output_path)
-    file_dirname = os.path.dirname(output_file)
-    if not os.path.exists(file_dirname):
-      os.makedirs(file_dirname)
-    with open(output_file, "w") as f:
-      f.write(out)
-    return (output_file, output_path)
-
-  def _write_overview(self, output_dir, rulesets, nav):
-    template = self.__env.get_template('html_overview.jinja')
-    out = template.render(title='Overview', rulesets=rulesets, nav=nav)
-
-    output_file = "%s/%s.html" % (output_dir, self.__options.overview_filename)
-    with open(output_file, "w") as f:
-      f.write(out)
-    return (output_file, "%s.html" % self.__options.overview_filename)
-
-def main(argv):
-  parser = OptionParser()
-  parser.add_option('--output_dir', default='',
-      help='The directory to write the output generated documentation to if --zip=false')
-  parser.add_option('--output_file', default='',
-      help='The output zip archive file to write if --zip=true.')
-  parser.add_option('--format', default='markdown',
-      help='The output format. Possible values are markdown and html')
-  parser.add_option('--zip', action='store_true', default=True,
-      help='Whether to generate a ZIP arhive containing the output files. If '
-           '--zip is true, then skydoc will generate a zip file, skydoc.zip by '
-           'default or as specified by --output_file. If --zip is false, then '
-           'skydoc will generate documentation, either in Markdown or HTML as '
-           'specifed by --format, in the current directory or --output_dir if set.')
-  parser.add_option('--strip_prefix', default='',
-      help='The directory prefix to strip from all generated docs, which are '
-           'generated in subdirectories that match the package structure of the '
-           'input .bzl files. The prefix to strip must be common to all .bzl files; '
-           'otherwise, skydoc will raise an error.')
-  parser.add_option('--overview', action='store_true',
-      help='Whether to generate an overview page')
-  parser.add_option('--overview_filename', default='index',
-      help='The file name to use for the overview page.')
-  parser.add_option('--link_ext', default='html',
-      help='The file extension used for links in the generated documentation')
-  parser.add_option('--site_root', default='',
-      help='The site root to be prepended to all URLs in the generated documentation')
-  (options, args) = parser.parse_args(argv)
-
-  if options.output_dir and options.output_file:
-    sys.stderr.write('Only one of --output_dir or --output_file can be set.')
-    sys.exit(1)
-
-  if not options.output_dir:
-    options.output_dir = DEFAULT_OUTPUT_DIR
-  if not options.output_file:
-    options.output_file = DEFAULT_OUTPUT_FILE
-
-  bzl_files = args[1:]
-
-  try:
-    strip_prefix = common.validate_strip_prefix(options.strip_prefix, bzl_files)
-  except common.InputError as err:
-    print(err.message)
-    sys.exit(1)
-
-  runfiles = runfiles_lib.Create()
-  if not runfiles:
-    # TODO(laszlocsomor): fix https://github.com/bazelbuild/bazel/issues/6212
-    # and remove this if-block once Bazel is released with that bugfix.
-    if (not os.environ.get("RUNFILES_DIR") and
-        not os.environ.get("RUNFILES_MANIFEST_FILE")):
-      argv0 = sys.argv[0]
-      pos = argv0.rfind('%s%s%s' % (os.sep, WORKSPACE_DIR, os.sep))
-      if pos > -1:
-        dirpath = argv0[0:pos]
-        if not os.path.isdir(dirpath):
-          print("ERROR: Cannot access runfiles directory (%s)" % dirpath)
-          sys.exit(1)
-        runfiles = runfiles_lib.CreateDirectoryBased(dirpath)
-
-  if not runfiles:
-    print("ERROR: Cannot load runfiles")
-    sys.exit(1)
-
-  rulesets = []
-  load_sym_extractor = load_extractor.LoadExtractor()
-  for bzl_file in bzl_files:
-    load_symbols = []
-    try:
-      load_symbols = load_sym_extractor.extract(bzl_file)
-    except load_extractor.LoadExtractorError as e:
-      print("ERROR: Error extracting loaded symbols from %s: %s" %
-            (bzl_file, str(e)))
-      sys.exit(2)
-
-    # TODO(dzc): Make MacroDocExtractor and RuleDocExtractor stateless.
-    macro_doc_extractor = macro_extractor.MacroDocExtractor()
-    rule_doc_extractor = rule_extractor.RuleDocExtractor()
-    macro_doc_extractor.parse_bzl(bzl_file)
-    rule_doc_extractor.parse_bzl(bzl_file, load_symbols)
-    merged_language = merge_languages(macro_doc_extractor.proto(),
-                                      rule_doc_extractor.proto())
-    rulesets.append(
-        rule.RuleSet(bzl_file, merged_language, macro_doc_extractor.title,
-                     macro_doc_extractor.description, strip_prefix,
-                     options.format))
-  writer_options = WriterOptions(
-      options.output_dir, options.output_file, options.zip, options.overview,
-      options.overview_filename, options.link_ext, options.site_root)
-  if options.format == "markdown":
-    markdown_writer = MarkdownWriter(writer_options, runfiles)
-    markdown_writer.write(rulesets)
-  elif options.format == "html":
-    html_writer = HtmlWriter(writer_options, runfiles)
-    html_writer.write(rulesets)
-  else:
-    sys.stderr.write(
-        'Invalid output format: %s. Possible values are markdown and html'
-        % options.format)
-
-if __name__ == '__main__':
-  main(sys.argv)
diff --git a/skydoc/rule.py b/skydoc/rule.py
deleted file mode 100644
index b4a1ecc..0000000
--- a/skydoc/rule.py
+++ /dev/null
@@ -1,173 +0,0 @@
-# Copyright 2016 The Bazel Authors. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#    http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-"""Representations used for rendering documentation templates."""
-
-
-# internal imports
-import os
-from skydoc import build_pb2
-
-
-class Attribute(object):
-  """Representation of an attribute used to render documentation templates."""
-
-  NAME_LINK = (
-      '<a href="https://bazel.build/docs/build-ref.html#name">Name</a>')
-  LABEL_LINK = (
-      '<a href="https://bazel.build/docs/build-ref.html#labels">Label</a>')
-  LABELS_LINK = (
-      '<a href="https://bazel.build/docs/build-ref.html#labels">labels</a>')
-
-  def __init__(self, proto):
-    self.__proto = proto
-    self.name = proto.name
-    self.type = self._get_type_str(proto)
-    if proto.name == 'name' and not proto.documentation:
-      self.documentation = 'A unique name for this rule.'
-    else:
-      self.documentation = proto.documentation
-
-  def _get_type_str(self, proto):
-    type_str = ''
-    if proto.type == build_pb2.Attribute.INTEGER:
-      type_str = 'Integer'
-    elif proto.type == build_pb2.Attribute.STRING:
-      type_str = 'String'
-    elif proto.type == build_pb2.Attribute.LABEL:
-      type_str = self.LABEL_LINK
-    elif proto.type == build_pb2.Attribute.OUTPUT:
-      type_str = 'Output'
-    elif proto.type == build_pb2.Attribute.STRING_LIST:
-      type_str = 'List of strings'
-    elif proto.type == build_pb2.Attribute.LABEL_LIST:
-      type_str = 'List of %s' % self.LABELS_LINK
-    elif proto.type == build_pb2.Attribute.OUTPUT_LIST:
-      type_str = 'List of outputs'
-    elif proto.type == build_pb2.Attribute.DISTRIBUTION_SET:
-      type_str = 'Distribution Set'
-    elif proto.type == build_pb2.Attribute.LICENSE:
-      type_str = 'License'
-    elif proto.type == build_pb2.Attribute.STRING_DICT:
-      type_str = 'Dictionary mapping strings to string'
-    elif proto.type == build_pb2.Attribute.FILESET_ENTRY_LIST:
-      type_str = 'List of FilesetEntry'
-    elif proto.type == build_pb2.Attribute.LABEL_LIST_DICT:
-      type_str = 'Dictionary mapping strings to lists of %s' % self.LABELS_LINK
-    elif proto.type == build_pb2.Attribute.STRING_LIST_DICT:
-      type_str = 'Dictionary mapping strings to lists of strings'
-    elif proto.type == build_pb2.Attribute.BOOLEAN:
-      type_str = 'Boolean'
-    elif proto.type == build_pb2.Attribute.TRISTATE:
-      type_str = 'Tristate'
-    elif proto.type == build_pb2.Attribute.INTEGER_LIST:
-      type_str = 'List of integers'
-    elif proto.type == build_pb2.Attribute.LABEL_DICT_UNARY:
-      type_str = 'Label Dict Unary'
-    elif proto.type == build_pb2.Attribute.SELECTOR_LIST:
-      type_str = 'Selector List'
-    elif proto.type == build_pb2.Attribute.LABEL_KEYED_STRING_DICT:
-      type_str = 'Dictionary mapping %s to strings' % self.LABELS_LINK
-    else:
-      if proto.name == 'name':
-        type_str = self.NAME_LINK
-      else:
-        type_str = 'Unknown'
-
-    type_str += '; Required' if proto.mandatory else '; Optional'
-    if proto.HasField('default') and not proto.mandatory:
-      type_str += '; Default is ' + proto.default
-    return type_str
-
-
-class Output(object):
-  """Representation of an output used to render documentation templates."""
-
-  def __init__(self, proto):
-    self.__proto = proto
-    self.template = proto.template
-    self.documentation = proto.documentation
-
-class Rule(object):
-  """Representation of a rule used to render documentation templates."""
-
-  def __init__(self, proto):
-    self.__proto = proto
-    self.name = proto.name
-    self.type = proto.type
-    self.documentation = proto.documentation
-    self.example_documentation = proto.example_documentation
-    self.signature = self._get_signature(proto)
-    self.attributes = []
-    for attribute in proto.attribute:
-      self.attributes.append(Attribute(attribute))
-    self.outputs = []
-    for output in proto.output:
-      self.outputs.append(Output(output))
-
-    parts = proto.documentation.split("\n\n")
-    self.short_documentation = parts[0]
-
-  def _get_signature(self, proto):
-    """Returns the rule signature for this rule."""
-    signature = proto.name + '('
-    for i in range(len(proto.attribute)):
-      attr = proto.attribute[i]
-      signature += '<a href="#%s.%s">%s</a>' % (proto.name, attr.name,
-                                                attr.name)
-      if i < len(proto.attribute) - 1:
-        signature += ', '
-    signature += ')'
-    return signature
-
-
-class RuleSet(object):
-  """Representation of a rule set used to render documentation templates."""
-
-  def __init__(self, bzl_file, language, title, description, strip_prefix,
-               format):
-    self.bzl_file = bzl_file
-    file_basename = os.path.basename(bzl_file)
-    self.name = file_basename.replace('.bzl', '')
-    self.language = language
-    self.title = title if title else "%s Rules" % self.name
-    self.description = description
-
-    # Generate output file name.
-    file_extension = 'html' if format == 'html' else 'md'
-    assert self.bzl_file.startswith(strip_prefix)
-    output_path = self.bzl_file.replace('.bzl', '')
-    self.output_file = output_path[len(strip_prefix):]
-
-    # Populate all rules in this ruleset.
-    self.definitions = []
-    self.rules = []
-    self.repository_rules = []
-    self.macros = []
-    for rule_proto in language.rule:
-      definition = Rule(rule_proto)
-      self.definitions.append(definition)
-      if rule_proto.type == build_pb2.RuleDefinition.RULE:
-        self.rules.append(definition)
-      elif rule_proto.type == build_pb2.RuleDefinition.MACRO:
-        self.macros.append(definition)
-      else:
-        assert rule_proto.type == build_pb2.RuleDefinition.REPOSITORY_RULE
-        self.repository_rules.append(definition)
-
-  def empty(self):
-    """Return True if there is nothing to document."""
-    return not any([self.rules,
-                    self.macros,
-                    self.repository_rules])
diff --git a/skydoc/rule_extractor.py b/skydoc/rule_extractor.py
deleted file mode 100644
index abb6134..0000000
--- a/skydoc/rule_extractor.py
+++ /dev/null
@@ -1,259 +0,0 @@
-# Copyright 2016 The Bazel Authors. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#    http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-"""Extractor for Skylark rule documentation."""
-
-import ast
-import functools
-# internal imports
-
-from skydoc import build_pb2
-from skydoc import common
-from skydoc.stubs import attr
-from skydoc.stubs import skylark_globals
-
-
-SKYLARK_STUBS = {
-    "attr": attr,
-    "aspect": skylark_globals.aspect,
-    "DATA_CFG": skylark_globals.DATA_CFG,
-    "HOST_CFG": skylark_globals.HOST_CFG,
-    "PACKAGE_NAME": skylark_globals.PACKAGE_NAME,
-    "REPOSITORY_NAME": skylark_globals.REPOSITORY_NAME,
-    "provider": skylark_globals.provider,
-    "FileType": skylark_globals.FileType,
-    "Label": skylark_globals.Label,
-    "native": skylark_globals.native,
-    "select": skylark_globals.select,
-    "struct": skylark_globals.struct,
-    "repository_rule": skylark_globals.repository_rule,
-    "rule": skylark_globals.rule,
-    "load": skylark_globals.load,
-}
-"""Stubs for Skylark globals to be used to evaluate the .bzl file."""
-
-
-SKYLARK_GLOBAL_SYMBOLS = set(SKYLARK_STUBS.keys())
-
-
-def create_stubs(skylark_stubs, load_symbols):
-  """Combines Skylark stubs with loaded symbols.
-
-  This function creates a copy of the global Skylark stubs and combines them
-  with symbols from the list of load_extractor.LoadSymbol, which contain
-  information about symbols extracted from other .bzl files. The stubs created
-  for the loaded symbols are global variables set to the empty string.
-
-  Args:
-    skylark_stubs: Dict containing the Skylark global stubs.
-    load_symbols: List of load_extractor.LoadSymbol objects containing
-      information about symbols extracted from other .bzl files.
-
-  Returns:
-    Dictionary containing both the Skylark global stubs and stubs created for
-    the loaded symbols.
-  """
-  stubs = dict(skylark_stubs)
-  for load_symbol in load_symbols:
-    if load_symbol.alias:
-      stubs[load_symbol.alias] = ""
-    else:
-      stubs[load_symbol.symbol] = ""
-  return stubs
-
-
-class RuleDocExtractor(object):
-  """Extracts documentation for rules from a .bzl file."""
-
-  def __init__(self):
-    """Inits RuleDocExtractor with a new BuildLanguage proto"""
-    self.__language = build_pb2.BuildLanguage()
-    self.__extracted_rules = {}
-    self.__load_symbols = []
-
-  def _exec_code(self, compiled, global_stubs):
-    """Executes compiled code with a copy of the global stubs.
-
-    This has to be extracted into a separate function in order to be compatible
-    with the exec statement in older Python versions, which otherwise throws a
-    syntax error: "unqualified exec is not allowed in function".
-
-    Returns:
-      The modified environment after the execution is finished.
-    """
-    env = global_stubs.copy()
-    exec(compiled, env)
-    return env
-
-  def _process_skylark(self, bzl_file, load_symbols):
-    """Evaluates the Skylark code in the .bzl file.
-
-    This function evaluates the Skylark code in the .bzl file as Python against
-    Skylark stubs to extract the rules and attributes defined in the file. The
-    extracted rules are kept in the __extracted_rules map keyed by rule name.
-
-    Args:
-      bzl_file: The .bzl file to evaluate.
-      load_symbols: List of load_extractor.LoadSymbol objects containing info
-        about symbols load()ed from other .bzl files.
-    """
-    with open(bzl_file) as f:
-      compiled = compile(f.read(), bzl_file, 'exec')
-    global_stubs = create_stubs(SKYLARK_STUBS, load_symbols)
-    env = self._exec_code(compiled, global_stubs)
-
-    new_globals = (
-      defn for defn in env.items() if not defn[0] in global_stubs
-    )
-    for name, obj in new_globals:
-      if (isinstance(obj, skylark_globals.RuleDescriptor) and
-          not name.startswith('_')):
-        obj.attrs['name'] = attr.AttrDescriptor(
-            type=build_pb2.Attribute.UNKNOWN, mandatory=True, name='name')
-        self.__extracted_rules[name] = obj
-
-  def _add_rule_doc(self, name, doc):
-    """Parses the attribute documentation from the docstring.
-
-    Parses the attribute documentation in the given docstring and associates the
-    rule and attribute documentation with the corresponding rule extracted from
-    the .bzl file.
-
-    Args:
-      name: The name of the rule.
-      doc: The docstring extracted for the rule.
-    """
-    extracted_docs = common.parse_docstring(doc)
-    if name in self.__extracted_rules:
-      rule = self.__extracted_rules[name]
-      rule.doc = extracted_docs.doc
-      rule.example_doc = extracted_docs.example_doc
-      for attr_name, desc in extracted_docs.attr_docs.items():
-        if attr_name in rule.attrs:
-          rule.attrs[attr_name].doc = desc
-
-      # Match the output name from the docstring with the corresponding output
-      # template name extracted from rule() and store a mapping of output
-      # template name to documentation.
-      for output_name, desc in extracted_docs.output_docs.items():
-        if output_name in rule.outputs:
-          output_template = rule.outputs[output_name]
-          rule.output_docs[output_template] = desc
-
-  def _extract_docstrings(self, bzl_file):
-    """Extracts the docstrings for all public rules in the .bzl file.
-
-    This function parses the .bzl file and extracts the docstrings for all
-    public rules in the file that were extracted in _process_skylark. It calls
-    _add_rule_doc for to parse the attribute documentation in each docstring
-    and associate them with the extracted rules and attributes.
-
-    Args:
-      bzl_file: The .bzl file to extract docstrings from.
-    """
-    try:
-      tree = None
-      with open(bzl_file) as f:
-        tree = ast.parse(f.read(), bzl_file)
-      key = None
-      for node in ast.iter_child_nodes(tree):
-        if isinstance(node, ast.Assign):
-          name = node.targets[0].id
-          if not name.startswith("_"):
-            key = name
-          continue
-        elif isinstance(node, ast.Expr) and key:
-          # Python itself does not treat strings defined immediately after a
-          # global variable definition as a docstring. Only extract string and
-          # parse as docstring if it is defined.
-          if hasattr(node.value, 's'):
-            self._add_rule_doc(key, node.value.s.strip())
-        key = None
-    except IOError:
-      print("Failed to parse {0}: {1}".format(bzl_file, e.strerror))
-      pass
-
-  def _assemble_protos(self):
-    """Builds the BuildLanguage protos for the extracted rule documentation.
-
-    Iterates through the map of extracted rule documentation and builds a
-    BuildLanguage proto containing the documentation for public rules extracted
-    from the .bzl file.
-    """
-    rules = []
-    for rule_name, rule_desc in self.__extracted_rules.items():
-      rule_desc.name = rule_name
-      rules.append(rule_desc)
-    rules = sorted(rules, key=lambda rule_desc: rule_desc.name)
-
-    for rule_desc in rules:
-      rule = self.__language.rule.add()
-      rule.name = rule_desc.name
-      if rule_desc.type == 'rule':
-        rule.type = build_pb2.RuleDefinition.RULE
-      else:
-        rule.type = build_pb2.RuleDefinition.REPOSITORY_RULE
-      if rule_desc.doc:
-        rule.documentation = rule_desc.doc
-      if rule_desc.example_doc:
-        rule.example_documentation = rule_desc.example_doc
-
-      if hasattr(functools, 'cmp_to_key'):
-        # Python 2.7 and 3.x
-        attrs = sorted(rule_desc.attrs.values(), key=functools.cmp_to_key(attr.attr_compare))
-      else:
-        # Python <2.7
-        attrs = sorted(rule_desc.attrs.values(), cmp=attr.attr_compare)
-
-      for attr_desc in attrs:
-        if attr_desc.name.startswith("_"):
-          continue
-        attr_proto = rule.attribute.add()
-        attr_proto.name = attr_desc.name
-        if attr_desc.doc:
-          attr_proto.documentation = attr_desc.doc
-        attr_proto.type = attr_desc.type
-        attr_proto.mandatory = attr_desc.mandatory
-        if attr_desc.default != None:
-          attr_proto.default = attr_desc.default
-
-      for template, doc in rule_desc.output_docs.items():
-        output = rule.output.add()
-        output.template = template
-        output.documentation = doc
-
-    for load_symbol in self.__load_symbols:
-      load = self.__language.load.add()
-      load.label = load_symbol.label
-      load.symbol = load_symbol.symbol
-      load.alias = load_symbol.alias
-
-  def parse_bzl(self, bzl_file, load_symbols):
-    """Extracts the documentation for all public rules from the given .bzl file.
-
-    The Skylark code is first evaluated against stubs to extract rule and
-    attributes with complete type information. Then, the .bzl file is parsed
-    to extract the docstrings for each of the rules. Finally, the BuildLanguage
-    proto is assembled with the extracted rule documentation.
-
-    Args:
-      bzl_file: The .bzl file to extract rule documentation from.
-    """
-    self._process_skylark(bzl_file, load_symbols)
-    self._extract_docstrings(bzl_file)
-    self._assemble_protos()
-
-  def proto(self):
-    """Returns the proto containing the macro documentation."""
-    return self.__language
diff --git a/skydoc/rule_extractor_test.py b/skydoc/rule_extractor_test.py
deleted file mode 100644
index 230ee4e..0000000
--- a/skydoc/rule_extractor_test.py
+++ /dev/null
@@ -1,686 +0,0 @@
-# Copyright 2016 The Bazel Authors. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#    http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-
-import os
-import tempfile
-import textwrap
-import unittest
-# internal imports
-
-from google.protobuf import text_format
-from skydoc import build_pb2
-from skydoc import load_extractor
-from skydoc import rule_extractor
-
-
-class RuleExtractorTest(unittest.TestCase):
-
-  def test_create_stubs(self):
-    stubs = {
-        'foo': 'bar',
-        'bar': 'baz',
-    }
-    load_symbols = [
-        load_extractor.LoadSymbol('//foo:bar.bzl', 'bar_library', None),
-        load_extractor.LoadSymbol('//foo:bar.bzl', 'foo_bar_binary',
-                                  'bar_binary'),
-    ]
-    expected = {
-        'foo': 'bar',
-        'bar': 'baz',
-        'bar_library': '',
-        'bar_binary': '',
-        }
-    self.assertEqual(expected, rule_extractor.create_stubs(stubs, load_symbols))
-
-
-  def check_protos(self, src, expected, load_symbols=[]):
-    tf = tempfile.NamedTemporaryFile(mode='w+', delete=False)
-    tf.write(src)
-    tf.flush()
-    tf.close()
-
-    expected_proto = build_pb2.BuildLanguage()
-    text_format.Merge(expected, expected_proto)
-
-    extractor = rule_extractor.RuleDocExtractor()
-    extractor.parse_bzl(tf.name, load_symbols)
-    os.remove(tf.name)
-    proto = extractor.proto()
-    self.assertEqual(expected_proto, proto)
-
-  def test_all_types(self):
-    src = textwrap.dedent("""\
-        def impl(ctx):
-          return struct()
-
-        all_types = rule(
-            implementation = impl,
-            attrs = {
-                "arg_bool": attr.bool(default=True),
-                "arg_int": attr.int(default=10),
-                "arg_int_list": attr.int_list(default=[1, 2]),
-                "arg_label": attr.label(
-                    default=Label("//foo:bar",
-                                  relative_to_caller_repository=True)),
-                "arg_label_list": attr.label_list(
-                    default=[Label("//foo:bar"), Label("//bar:baz")]),
-                "arg_license": attr.license(),
-                "arg_output": attr.output(default=Label("//foo:bar")),
-                "arg_output_list": attr.output_list(
-                    default=[Label("//foo:bar"), Label("//bar:baz")]),
-                "arg_string": attr.string(default="foo"),
-                "arg_string_dict": attr.string_dict(default={"foo": "bar"}),
-                "arg_string_list": attr.string_list(default=["foo", "bar"]),
-                "arg_string_list_dict": attr.string_list_dict(
-                    default={"foo": ["bar", "baz"]}),
-            },
-        )
-        \"\"\"Test rule with all types.
-
-        Args:
-          name: A unique name for this rule.
-          arg_bool: A boolean argument.
-          arg_int: An integer argument.
-          arg_int_list: A list of integers argument.
-          arg_label: A label argument.
-          arg_label_list: A list of labels argument.
-          arg_license: A license argument.
-          arg_output: An output argument.
-          arg_output_list: A list of outputs argument.
-          arg_string: A string argument.
-          arg_string_dict: A dictionary mapping string to string argument.
-          arg_string_list: A list of strings argument.
-          arg_string_list_dict: A dictionary mapping string to list of string argument.
-        \"\"\"
-        """)
-
-    expected = textwrap.dedent("""
-        rule {
-          name: "all_types"
-          documentation: "Test rule with all types."
-          attribute {
-            name: "name"
-            type: UNKNOWN
-            mandatory: true
-            documentation: "A unique name for this rule."
-          }
-          attribute {
-            name: "arg_bool"
-            type: BOOLEAN
-            mandatory: false
-            documentation: "A boolean argument."
-            default: "True"
-          }
-          attribute {
-            name: "arg_int"
-            type: INTEGER
-            mandatory: false
-            documentation: "An integer argument."
-            default: "10"
-          }
-          attribute {
-            name: "arg_int_list"
-            type: INTEGER_LIST
-            mandatory: false
-            documentation: "A list of integers argument."
-            default: "[1, 2]"
-          }
-          attribute {
-            name: "arg_label"
-            type: LABEL
-            mandatory: false
-            documentation: "A label argument."
-            default: "//foo:bar"
-          }
-          attribute {
-            name: "arg_label_list"
-            type: LABEL_LIST
-            mandatory: false
-            documentation: "A list of labels argument."
-            default: "[\'//foo:bar\', \'//bar:baz\']"
-          }
-          attribute {
-            name: "arg_license"
-            type: LICENSE
-            mandatory: false
-            documentation: "A license argument."
-          }
-          attribute {
-            name: "arg_output"
-            type: OUTPUT
-            mandatory: false
-            documentation: "An output argument."
-            default: "//foo:bar"
-          }
-          attribute {
-            name: "arg_output_list"
-            type: OUTPUT_LIST
-            mandatory: false
-            documentation: "A list of outputs argument."
-            default: "[\'//foo:bar\', \'//bar:baz\']"
-          }
-          attribute {
-            name: "arg_string"
-            type: STRING
-            mandatory: false
-            documentation: "A string argument."
-            default: "\'foo\'"
-          }
-          attribute {
-            name: "arg_string_dict"
-            type: STRING_DICT
-            mandatory: false
-            documentation: "A dictionary mapping string to string argument."
-            default: "{\'foo\': \'bar\'}"
-          }
-          attribute {
-            name: "arg_string_list"
-            type: STRING_LIST
-            mandatory: false
-            documentation: "A list of strings argument."
-            default: "[\'foo\', \'bar\']"
-          }
-          attribute {
-            name: "arg_string_list_dict"
-            type: STRING_LIST_DICT
-            mandatory: false
-            documentation: "A dictionary mapping string to list of string argument."
-            default: "{\'foo\': [\'bar\', \'baz\']}"
-          }
-          type: RULE
-        }
-        """)
-
-    self.check_protos(src, expected)
-
-  def test_undocumented(self):
-    src = textwrap.dedent("""\
-        def _impl(ctx):
-          return struct()
-
-        undocumented = rule(
-            implementation = _impl,
-            attrs = {
-                "arg_label": attr.label(),
-                "arg_string": attr.string(),
-            },
-        )
-        """)
-
-    expected = textwrap.dedent("""\
-        rule {
-          name: "undocumented"
-          attribute {
-            name: "name"
-            type: UNKNOWN
-            mandatory: true
-          }
-          attribute {
-            name: "arg_label"
-            type: LABEL
-            mandatory: false
-          }
-          attribute {
-            name: "arg_string"
-            type: STRING
-            mandatory: false
-            default: "''"
-          }
-          type: RULE
-        }
-        """)
-
-    self.check_protos(src, expected)
-
-  def test_private_rules_skipped(self):
-    src = textwrap.dedent("""\
-        def _private_impl(ctx):
-          return struct()
-
-        def _public_impl(ctx):
-          return struct()
-
-        _private = rule(
-            implementation = _private_impl,
-            attrs = {
-                "arg_label": attr.label(),
-                "arg_string": attr.string(),
-            },
-        )
-        \"\"\"A private rule that should not appear in documentation.
-
-        Args:
-          name: A unique name for this rule.
-          arg_label: A label argument.
-          arg_string: A string argument.
-        \"\"\"
-
-        public = rule(
-            implementation = _public_impl,
-            attrs = {
-                "arg_label": attr.label(),
-                "arg_string": attr.string(),
-            },
-        )
-        \"\"\"A public rule that should appear in documentation.
-
-        Args:
-          name: A unique name for this rule.
-          arg_label: A label argument.
-          arg_string: A string argument.
-        \"\"\"
-        """)
-
-    expected = textwrap.dedent("""
-        rule {
-          name: "public"
-          documentation: "A public rule that should appear in documentation."
-          attribute {
-            name: "name"
-            type: UNKNOWN
-            mandatory: true
-            documentation: "A unique name for this rule."
-          }
-          attribute {
-            name: "arg_label"
-            type: LABEL
-            mandatory: false
-            documentation: "A label argument."
-          }
-          attribute {
-            name: "arg_string"
-            type: STRING
-            mandatory: false
-            documentation: "A string argument."
-            default: "''"
-          }
-          type: RULE
-        }
-        """)
-
-    self.check_protos(src, expected)
-
-  def test_rule_with_generated_impl(self):
-    src = textwrap.dedent("""\
-        def real_impl(ctx):
-          return struct()
-
-        def macro():
-          return real_impl
-
-        impl = macro()
-
-        thisrule = rule(
-            implementation = impl,
-        )
-        """)
-
-    expected = textwrap.dedent("""\
-        rule {
-          name: "thisrule"
-          attribute {
-            name: "name"
-            type: UNKNOWN
-            mandatory: true
-          }
-          type: RULE
-        }
-        """)
-
-    self.check_protos(src, expected)
-
-  def test_multi_line_description(self):
-    src = textwrap.dedent("""\
-        def _impl(ctx):
-          return struct()
-
-        multiline = rule(
-            implementation = _impl,
-            attrs = {
-                "arg_bool": attr.bool(),
-                "arg_label": attr.label(),
-            },
-        )
-        \"\"\"A rule with multiline documentation.
-
-        Some more documentation about this rule here.
-
-        Args:
-          name: A unique name for this rule.
-          arg_bool: A boolean argument.
-
-            Documentation for arg_bool continued here.
-          arg_label: A label argument.
-
-            Documentation for arg_label continued here.
-        \"\"\"
-        """)
-
-    expected = textwrap.dedent("""\
-        rule {
-          name: "multiline"
-          documentation: "A rule with multiline documentation.\\n\\nSome more documentation about this rule here."
-          attribute {
-            name: "name"
-            type: UNKNOWN
-            mandatory: true
-            documentation: "A unique name for this rule."
-          }
-          attribute {
-            name: "arg_bool"
-            type: BOOLEAN
-            mandatory: false
-            documentation: "A boolean argument.\\n\\nDocumentation for arg_bool continued here."
-            default: "False"
-          }
-          attribute {
-            name: "arg_label"
-            type: LABEL
-            mandatory: false
-            documentation: "A label argument.\\n\\nDocumentation for arg_label continued here."
-          }
-          type: RULE
-        }
-        """)
-
-    self.check_protos(src, expected)
-
-  def test_rule_macro_mix(self):
-    src = textwrap.dedent("""\
-        def _impl(ctx):
-          return struct()
-
-        example_rule = rule(
-            implementation = _impl,
-            attrs = {
-                "arg_label": attr.label(),
-                "arg_string": attr.string(),
-            },
-        )
-        \"\"\"An example rule.
-
-        Args:
-          name: A unique name for this rule.
-          arg_label: A label argument.
-          arg_string: A string argument.
-        \"\"\"
-
-        def example_macro(name, foo, visibility=None):
-          \"\"\"An example macro.
-
-          Args:
-            name: A unique name for this rule.
-            foo: A test argument.
-            visibility: The visibility of this rule.
-          \"\"\"
-          native.genrule(
-              name = name,
-              out = ["foo"],
-              cmd = "touch $@",
-              visibility = visibility,
-          )
-        """)
-
-    expected = textwrap.dedent("""\
-        rule {
-          name: "example_rule"
-          documentation: "An example rule."
-          attribute {
-            name: "name"
-            type: UNKNOWN
-            mandatory: true
-            documentation: "A unique name for this rule."
-          }
-          attribute {
-            name: "arg_label"
-            type: LABEL
-            mandatory: false
-            documentation: "A label argument."
-          }
-          attribute {
-            name: "arg_string"
-            type: STRING
-            mandatory: false
-            documentation: "A string argument."
-            default: "''"
-          }
-          type: RULE
-        }
-        """)
-
-    self.check_protos(src, expected)
-
-  def test_rule_with_example_doc(self):
-    src = textwrap.dedent("""\
-        def _impl(ctx):
-          return struct()
-
-        rule_with_example = rule(
-            implementation = _impl,
-            attrs = {
-                "arg_label": attr.label(),
-                "arg_string": attr.string(),
-            },
-        )
-        \"\"\"Rule with example.
-
-        Example:
-          Here is an example of how to use this rule.
-
-        Args:
-          name: A unique name for this rule.
-          arg_label: A label argument.
-          arg_string: A string argument.
-        \"\"\"
-        """)
-
-    expected = textwrap.dedent("""\
-        rule {
-          name: "rule_with_example"
-          documentation: "Rule with example."
-          example_documentation: "Here is an example of how to use this rule."
-          attribute {
-            name: "name"
-            type: UNKNOWN
-            mandatory: true
-            documentation: "A unique name for this rule."
-          }
-          attribute {
-            name: "arg_label"
-            type: LABEL
-            mandatory: false
-            documentation: "A label argument."
-          }
-          attribute {
-            name: "arg_string"
-            type: STRING
-            mandatory: false
-            documentation: "A string argument."
-            default: "''"
-          }
-          type: RULE
-        }
-        """)
-
-    self.check_protos(src, expected)
-
-  def test_rule_with_output_doc(self):
-    src = textwrap.dedent("""\
-        def _impl(ctx):
-          return struct()
-
-        rule_with_outputs = rule(
-            implementation = _impl,
-            attrs = {
-                "arg_label": attr.label(),
-                "arg_string": attr.string(),
-            },
-            outputs = {
-                "jar": "%{name}.jar",
-                "deploy_jar": "%{name}_deploy.jar",
-            },
-        )
-        \"\"\"Rule with output documentation.
-
-        Outputs:
-          jar: A Java archive.
-          deploy_jar: A Java archive suitable for deployment.
-
-              Only built if explicitly requested.
-
-        Args:
-          name: A unique name for this rule.
-          arg_label: A label argument.
-          arg_string: A string argument.
-        \"\"\"
-        """)
-
-    expected = textwrap.dedent("""\
-        rule {
-          name: "rule_with_outputs"
-          documentation: "Rule with output documentation."
-          attribute {
-            name: "name"
-            type: UNKNOWN
-            mandatory: true
-            documentation: "A unique name for this rule."
-          }
-          attribute {
-            name: "arg_label"
-            type: LABEL
-            mandatory: false
-            documentation: "A label argument."
-          }
-          attribute {
-            name: "arg_string"
-            type: STRING
-            mandatory: false
-            documentation: "A string argument."
-            default: "''"
-          }
-          output {
-            template: "%{name}.jar"
-            documentation: "A Java archive."
-          }
-          output {
-            template: "%{name}_deploy.jar"
-            documentation: "A Java archive suitable for deployment.\\n\\nOnly built if explicitly requested."
-          }
-          type: RULE
-        }
-        """)
-
-    self.check_protos(src, expected)
-
-  def test_loads(self):
-    src = textwrap.dedent("""\
-        load("//foo/bar:bar.bzl", "foo_library")
-        load("//foo/bar:baz.bzl", "foo_test", orig_foo_binary = "foo_binary")
-
-        _references_foo_library = foo_library
-        _references_orig_foo_binary = orig_foo_binary
-        """)
-    load_symbols = [
-        load_extractor.LoadSymbol('//foo/bar:bar.bzl', 'foo_library', None),
-        load_extractor.LoadSymbol('//foo/bar:baz.bzl', 'foo_test', None),
-        load_extractor.LoadSymbol('//foo/bar:baz.bzl', 'foo_binary',
-                                  'orig_foo_binary'),
-    ]
-    expected = ""
-    self.check_protos(src, expected, load_symbols)
-
-  def test_repository_rule(self):
-    src = textwrap.dedent("""\
-        def _impl(repository_ctx):
-          return struct()
-
-        repo_rule = repository_rule(
-            implementation = _impl,
-            local = True,
-            attrs = {
-                "path": attr.string(mandatory=True)
-            },
-        )
-        \"\"\"A repository rule.
-
-        Args:
-          name: A unique name for this rule.
-          path: The path of the external dependency.
-        \"\"\"
-        """)
-
-    expected = textwrap.dedent("""\
-        rule {
-          name: "repo_rule"
-          documentation: "A repository rule."
-          attribute {
-            name: "name"
-            type: UNKNOWN
-            mandatory: true
-            documentation: "A unique name for this rule."
-          }
-          attribute {
-            name: "path"
-            type: STRING
-            mandatory: true
-            documentation: "The path of the external dependency."
-            default: "\'\'"
-          }
-          type: REPOSITORY_RULE
-        }
-        """)
-
-    self.check_protos(src, expected)
-
-  def test_doc_arg(self):
-    src = textwrap.dedent("""\
-        def _impl(ctx):
-          return struct()
-
-        rule_with_doc = rule(
-            implementation = _impl,
-            attrs = {
-                "foo": attr.string(doc = "Attribute documentation.")
-            },
-        )
-        \"\"\"A rule.
-        \"\"\"
-        """)
-
-    expected = textwrap.dedent("""\
-        rule {
-          name: "rule_with_doc"
-          documentation: "A rule."
-          attribute {
-            name: "name"
-            type: UNKNOWN
-            mandatory: true
-          }
-          attribute {
-            name: "foo"
-            type: STRING
-            mandatory: false
-            documentation: "Attribute documentation."
-            default: "\'\'"
-          }
-          type: RULE
-        }
-        """)
-
-    self.check_protos(src, expected)
-
-if __name__ == '__main__':
-  unittest.main()
diff --git a/skydoc/sass/BUILD b/skydoc/sass/BUILD
deleted file mode 100644
index fa0cbed..0000000
--- a/skydoc/sass/BUILD
+++ /dev/null
@@ -1,10 +0,0 @@
-licenses(["notice"])  # Apache 2.0
-
-package(default_visibility = ["//skydoc:__pkg__"])
-
-load("@io_bazel_rules_sass//sass:sass.bzl", "sass_binary")
-
-sass_binary(
-    name = "main",
-    src = "main.scss",
-)
diff --git a/skydoc/sass/main.scss b/skydoc/sass/main.scss
deleted file mode 100644
index 5b3ecf2..0000000
--- a/skydoc/sass/main.scss
+++ /dev/null
@@ -1,258 +0,0 @@
-// Copyright 2016 The Bazel Authors. All rights reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//    http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-$primary-color: #4caf50;
-
-body {
-  background-color: #fafafa;
-}
-
-pre,
-code {
-  font-family: 'Liberation Mono', Consolas, Monaco, 'Andale Mono', monospace;
-}
-
-pre {
-  background-color: #eee;
-  padding: 20px;
-  overflow-x: auto;
-  word-wrap: normal;
-
-  code {
-    overflow-wrap: normal;
-    white-space: pre;
-  }
-}
-
-code {
-  display: inline-block;
-  font-size: 90%;
-  white-space: pre-wrap;
-}
-
-.mdl-layout__drawer {
-  background-color: #fff;
-
-  .mdl-layout-title {
-    border-bottom: 1px solid #e0e0e0;
-    padding-left: 24px;
-  }
-}
-
-.drawer-nav {
-  ul {
-    list-style: none;
-    padding-left: 0;
-
-    li {
-      display: block;
-      padding: 0;
-
-      ul {
-        li {
-          a {
-            padding-left: 44px;
-            font-weight: 400;
-          }
-        }
-      }
-
-      a {
-        display: block;
-        flex-shrink: 0;
-        padding: 15px 0 15px 22px;
-        margin: 0;
-        font-weight: 600;
-        color: #757575;
-        line-height: 1em;
-        text-decoration: none;
-        cursor: pointer;
-
-        &:active,
-        &:hover {
-          background-color: #f0f0f0;
-        }
-      }
-
-      &.active {
-        a {
-          color: $primary-color;
-          font-weight: 500;
-        }
-      }
-    }
-  }
-}
-
-h1.page-title {
-  font-size: 34px;
-  font-weight: 400;
-  line-height: 40px;
-  margin-bottom: 30px;
-  color: $primary-color;
-}
-
-p.lead {
-  font-size: 20px;
-  line-height: 32px;
-}
-
-table {
-  border-collapse: collapse;
-  border-spacing: 0;
-  background-color: #fff;
-  table-layout: auto;
-
-  thead {
-    th {
-      background-color: #fafafa;
-      border: 1px solid #eee;
-      color: #757575;
-      padding: 12px 12px 12px 24px;
-      vertical-align: top;
-    }
-  }
-
-  tbody {
-    td {
-      border: 1px solid #eee;
-      padding: 12px 12px 12px 24px;
-      vertical-align: top;
-    }
-  }
-}
-
-table.params-table {
-  width: 100%;
-
-  col.col-param {
-    width: 25%;
-  }
-
-  col.col-description {
-    width: 75%;
-  }
-}
-
-table.overview-table {
-  width: 100%;
-
-  col.col-name {
-    width: 25%;
-  }
-
-  col.col-description {
-    width: 75%;
-  }
-
-  td {
-    p {
-      margin: 0;
-    }
-  }
-}
-
-hr {
-  margin-top: 40px;
-  margin-bottom: 40px;
-}
-
-nav.toc {
-  border-left: 5px solid $primary-color;
-  padding-left: 20px;
-  margin-bottom: 48px;
-
-  h1,
-  h2 {
-    font-size: 15px;
-    line-height: 16px;
-    padding-bottom: 12px;
-    margin-bottom: 0;
-    font-weight: 400;
-    color: #757575;
-  }
-
-  ul {
-    list-style: none;
-    margin-top: 0;
-    padding-left: 0;
-
-    li {
-      font-size: 20px;
-      line-height: 40px;
-
-      a {
-        color: $primary-color;
-      }
-    }
-  }
-}
-
-.page-content {
-  margin-left: auto;
-  margin-right: auto;
-  padding-top: 60px;
-  padding-bottom: 60px;
-    width: 760px;
-
-  a {
-    text-decoration: none;
-  }
-
-  h1 {
-    font-size: 34px;
-    font-weight: 400;
-    line-height: 40px;
-    margin-bottom: 30px;
-    color: $primary-color;
-  }
-
-  h2 {
-    font-size: 24px;
-    font-weight: 400;
-    line-height: 32px;
-    margin-bottom: 30px;
-    color: $primary-color;
-  }
-
-  h3 {
-    font-size: 20px;
-    font-weight: 400;
-    line-height: 32px;
-    margin-bottom: 30px;
-    color: $primary-color;
-  }
-}
-
-@media (max-width: 768px) {
-  .page-content {
-    width: 360px;
-  }
-}
-
-@media (min-width: 768px) {
-  .page-content {
-    width: 760px;
-  }
-}
-
-@media (min-width: 1476px) {
-  .page-content {
-    width: 1160px;
-  }
-}
-
-.mdl-mini-footer {
-  padding-left: 40px;
-}
diff --git a/skydoc/stubs/BUILD b/skydoc/stubs/BUILD
deleted file mode 100644
index 485b149..0000000
--- a/skydoc/stubs/BUILD
+++ /dev/null
@@ -1,16 +0,0 @@
-licenses(["notice"])  # Apache 2.0
-
-package(default_visibility = ["//skydoc:__pkg__"])
-
-load("@rules_python//python:defs.bzl", "py_library")
-
-py_library(
-    name = "stubs",
-    srcs = [
-        "attr.py",
-        "skylark_globals.py",
-    ],
-    deps = [
-        "//skydoc:build_pb_py",
-    ],
-)
diff --git a/skydoc/stubs/attr.py b/skydoc/stubs/attr.py
deleted file mode 100644
index 8b8c10d..0000000
--- a/skydoc/stubs/attr.py
+++ /dev/null
@@ -1,187 +0,0 @@
-# Copyright 2016 The Bazel Authors. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#    http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# internal imports
-from skydoc import build_pb2
-
-
-def strcmp(s1, s2):
-  if s1 > s2:
-    return 1
-  elif s1 < s2:
-    return -1
-  else:
-    return 0
-
-
-def attr_compare(a, b):
-  if a.compare_priority() > b.compare_priority():
-    return 1
-  elif a.compare_priority() < b.compare_priority():
-    return -1
-  else:
-    return strcmp(a.name, b.name)
-
-
-class AttrDescriptor(object):
-  ATTRIBUTE_ORDERING = {
-      "name": -99,
-      "deps": -98,
-      "src": -97,
-      "srcs": -86,
-      "data": -95,
-      "resource": -94,
-      "resources": -93,
-      "out": -92,
-      "outs": -91,
-      "hdrs": -90,
-  }
-
-  def __init__(self,
-               type=build_pb2.Attribute.UNKNOWN,
-               default=None,
-               mandatory=False,
-               doc="",
-               name=""):
-    """Constructor for AttrDescriptor
-
-    Args:
-      self: The current instance
-      type: The type of attribute based on the enum in the Attribute proto.
-      default: The default value of the attribute.
-      mandatory: True if the attribute is required, false if optional.
-      doc: Documentation for this attribute. This parameter is used internally
-        by skydoc and is not set by any Skylark code in .bzl files.
-      name: Name of this attribute. This parameter is used internally by skydoc
-        and is not set by any Skylark code in .bzl files.
-    """
-    self.type = type
-    self.default = default
-    self.mandatory = mandatory
-    self.doc = doc
-    self.name = name
-
-  def compare_priority(self):
-    if self.name in AttrDescriptor.ATTRIBUTE_ORDERING:
-      return AttrDescriptor.ATTRIBUTE_ORDERING[self.name]
-    else:
-      return 0
-
-
-def bool(default=False, mandatory=False, doc=""):
-  return AttrDescriptor(
-      build_pb2.Attribute.BOOLEAN, default=repr(default), mandatory=mandatory, doc=doc)
-
-
-def int(default=0, mandatory=False, values=[], doc=""):
-  return AttrDescriptor(build_pb2.Attribute.INTEGER, repr(default), mandatory, doc=doc)
-
-
-def int_list(default=[], mandatory=False, non_empty=False, allow_empty=True, doc=""):
-  return AttrDescriptor(build_pb2.Attribute.INTEGER_LIST, repr(default),
-                        mandatory, doc)
-
-
-def label(default=None,
-          executable=False,
-          allow_files=False,
-          allow_single_file=False,
-          mandatory=False,
-          providers=[],
-          allow_rules=None,
-          single_file=False,
-          cfg=None,
-          aspects=[],
-          doc=""):
-  if default != None:
-    default = repr(default)
-  return AttrDescriptor(build_pb2.Attribute.LABEL, default, mandatory, doc)
-
-
-def label_list(default=[],
-               allow_files=False,
-               allow_rules=None,
-               providers=[],
-               flags=[],
-               mandatory=False,
-               non_empty=False,
-               allow_empty=True,
-               cfg=None,
-               aspects=[],
-               doc=""):
-  default_val = []
-  for label in default:
-    default_val.append(repr(label))
-  return AttrDescriptor(build_pb2.Attribute.LABEL_LIST, repr(default_val),
-                        mandatory, doc)
-
-
-def license(default=None, mandatory=False, doc=""):
-  if default != None:
-    default = repr(default)
-  return AttrDescriptor(build_pb2.Attribute.LICENSE, default, mandatory, doc)
-
-
-def output(default=None, mandatory=False, doc=""):
-  if default != None:
-    default = repr(default)
-  return AttrDescriptor(build_pb2.Attribute.OUTPUT, default, mandatory, doc)
-
-
-def output_list(default=[], mandatory=False, non_empty=False, allow_empty=True, doc=""):
-  default_val = []
-  for label in default:
-    default_val.append(repr(label))
-  return AttrDescriptor(build_pb2.Attribute.OUTPUT_LIST, repr(default_val),
-                        mandatory, doc)
-
-
-def string(default="", mandatory=False, values=[], doc=""):
-  return AttrDescriptor(build_pb2.Attribute.STRING, repr(default), mandatory, doc)
-
-
-def string_dict(default={},
-                mandatory=False,
-                non_empty=False,
-                allow_empty=True,
-                doc=""):
-  return AttrDescriptor(build_pb2.Attribute.STRING_DICT, repr(default),
-                        mandatory, doc)
-
-
-def string_list(default=[],
-                mandatory=False,
-                non_empty=False,
-                allow_empty=True,
-                doc=""):
-  return AttrDescriptor(build_pb2.Attribute.STRING_LIST, repr(default),
-                        mandatory, doc)
-
-
-def string_list_dict(default={},
-                     mandatory=False,
-                     non_empty=False,
-                     allow_empty=True,
-                     doc=""):
-  return AttrDescriptor(build_pb2.Attribute.STRING_LIST_DICT, repr(default),
-                        mandatory, doc)
-
-def label_keyed_string_dict(default={},
-                            mandatory=False,
-                            allow_files=False,
-                            non_empty=False,
-                            allow_empty=True,
-                            doc=""):
-  return AttrDescriptor(build_pb2.Attribute.LABEL_KEYED_STRING_DICT, repr(default),
-                        mandatory, doc)
diff --git a/skydoc/stubs/skylark_globals.py b/skydoc/stubs/skylark_globals.py
deleted file mode 100644
index 021cd95..0000000
--- a/skydoc/stubs/skylark_globals.py
+++ /dev/null
@@ -1,109 +0,0 @@
-# Copyright 2016 The Bazel Authors. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#    http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-"""Stubs for Skylark globals"""
-
-import collections
-
-
-def FileType(filetypes=[]):
-  return filetypes
-
-HOST_CFG = 'HOST_CFG'
-DATA_CFG = 'DATA_CFG'
-PACKAGE_NAME = 'PACKAGE_NAME'
-REPOSITORY_NAME = 'REPOSITORY_NAME'
-
-native = ''
-
-def aspect(implementation, attr_aspects=[], attrs=None, fragments=[],
-           host_fragments=[], toolchains=[]):
-  return None
-
-def provider(doc='', fields=None):
-  return None
-
-def select(x):
-  return None
-
-def struct(**kwargs):
-  return None
-
-def load(label, *args, **kwargs):
-  return None
-
-class Label(object):
-  def __init__(self, label_string, relative_to_caller_repository=False):
-    self.label_string = label_string
-    self.relative_to_caller_repository = relative_to_caller_repository
-
-  def __repr__(self):
-    return self.label_string
-
-class RuleDescriptor(object):
-  def __init__(self, implementation, test=False, attrs={}, outputs={},
-               executable=False, output_to_genfiles=False, fragments=[],
-               host_fragments=[], local=False, doc='', type='rule', toolchains=[]):
-    """Constructor for RuleDescriptor
-
-    Args:
-      self: The current instance.
-      implementation: The implementation function for the rule (not used).
-      test: Whether this is a test rule
-      attrs: Dictionary mapping attribute name to attribute descriptor
-      outputs: Outputs for this rule as a mapping from string to template name.
-          The dictionary keys are used to refer to the output in the docstring
-          documentation.
-      executable: Whether this rule produces an executable.
-      output_to_genfiles: Whether the rule generates files in the genfiles
-          directory rather than the bin directory (not used).
-      fragments: List of names of configuration fragments the rule requires in
-          the target configuration (not used).
-      host_fragments: List of names of configuration fragments that the rule
-          requires in the host configuration (not used).
-      local: Indicates that the rule fetches everything from the local system.
-          (Only used if type='repository').
-      doc: Documentation for this rule. This parameter is used internally by
-          skydoc and is not set by any Skylark code in .bzl files.
-      example_doc: Example documentation for this rule. This parameter is used
-          internally by skydoc and is not set by any Skylark code in .bzl files.
-      type: The type of rule (rule, repository_rule). This parameter is used
-          by skydoc and is not set by any Skylark code in .bzl files.
-    """
-    self.implementation = implementation
-    self.test = test
-    self.attrs = attrs
-    self.outputs = outputs
-    self.executable = executable
-    self.output_to_genfiles = output_to_genfiles
-    self.fragments = fragments
-    self.host_fragments = host_fragments
-    self.local = local
-    self.doc = doc
-    self.example_doc = ''
-    self.outputs = outputs
-    self.output_docs = collections.OrderedDict() if hasattr(collections, 'OrderedDict') else {}
-    self.type = type
-    for name, attr in self.attrs.items():
-      attr.name = name
-
-def rule(implementation, test=False, attrs={}, outputs=None,
-         executable=False, output_to_genfiles=False, fragments=[],
-         host_fragments=[], toolchains=[]):
-  return RuleDescriptor(implementation, test, attrs, outputs, executable,
-                        output_to_genfiles, fragments, host_fragments, toolchains)
-
-def repository_rule(implementation, attrs={}, local=False, environ=[]):
-  return RuleDescriptor(implementation, attrs=attrs, local=local,
-                        type='repository')
diff --git a/skydoc/templates/BUILD b/skydoc/templates/BUILD
deleted file mode 100644
index ade6211..0000000
--- a/skydoc/templates/BUILD
+++ /dev/null
@@ -1,20 +0,0 @@
-licenses(["notice"])  # Apache 2.0
-
-package(default_visibility = ["//skydoc:__pkg__"])
-
-filegroup(
-    name = "templates",
-    srcs = [
-        "attributes.jinja",
-        "html.jinja",
-        "html_footer.jinja",
-        "html_header.jinja",
-        "html_overview.jinja",
-        "markdown.jinja",
-        "markdown_overview.jinja",
-        "nav.jinja",
-        "outputs.jinja",
-        "overview.jinja",
-        "toc.jinja",
-    ],
-)
diff --git a/skydoc/templates/attributes.jinja b/skydoc/templates/attributes.jinja
deleted file mode 100644
index 6d58577..0000000
--- a/skydoc/templates/attributes.jinja
+++ /dev/null
@@ -1,32 +0,0 @@
-{#
-Copyright 2016 The Bazel Authors. All rights reserved.
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
-   http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
-#}
-<table class="params-table">
-  <colgroup>
-    <col class="col-param" />
-    <col class="col-description" />
-  </colgroup>
-  <tbody>
-% for attribute in rule.attributes:
-    <tr id="{{ rule.name }}.{{ attribute.name }}">
-      <td><code>{{ attribute.name }}</code></td>
-      <td>
-        <p><code>{{ attribute.type }}</code></p>
-        {{ attribute.documentation|markdown|trim }}
-      </td>
-    </tr>
-% endfor
-  </tbody>
-</table>
diff --git a/skydoc/templates/html.jinja b/skydoc/templates/html.jinja
deleted file mode 100644
index 15d9fa9..0000000
--- a/skydoc/templates/html.jinja
+++ /dev/null
@@ -1,53 +0,0 @@
-{#
-Copyright 2016 The Bazel Authors. All rights reserved.
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
-   http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
-#}
-% include "html_header.jinja"
-
-          <h1>{{ ruleset.title }}</h1>
-% include "toc.jinja"
-% if ruleset.description:
-          <hr>
-          <h2 id="overview">Overview</h2>
-          {{ ruleset.description|markdown }}
-% endif
-% for rule in ruleset.definitions
-          <hr>
-
-          <h2 id="{{ rule.name }}">{{ rule.name }}</h2>
-
-          <pre>{{ rule.signature }}</pre>
-
-          {{ rule.documentation|markdown }}
-
-% if rule.outputs[0] is defined:
-          <h3 id="{{ rule.name }}_outputs">
-            Outputs
-          </h3>
-% include "outputs.jinja"
-% endif
-
-% if rule.attributes[0] is defined:
-          <h3 id="{{ rule.name }}_args">Attributes</h3>
-% include "attributes.jinja"
-% endif
-
-% if rule.example_documentation
-          <h3 id="{{ rule.name }}_examples">Examples</h3>
-          {{ rule.example_documentation|markdown }}
-% endif
-
-% endfor
-
-% include "html_footer.jinja"
diff --git a/skydoc/templates/html_footer.jinja b/skydoc/templates/html_footer.jinja
deleted file mode 100644
index 82987da..0000000
--- a/skydoc/templates/html_footer.jinja
+++ /dev/null
@@ -1,31 +0,0 @@
-{#
-Copyright 2016 The Bazel Authors. All rights reserved.
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
-   http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
-#}
-
-        </div>
-
-        <footer class="mdl-mini-footer">
-          <div class="mdl-mini-footer__left-section">
-            <div class="mdl-logo">Bazel</div>
-            <ul class="mdl-mini-footer__link-list">
-              <li><a href="https://bazel.build">Home</a></li>
-              <li><a href="https://github.com/bazelbuild">GitHub</a></li>
-            </ul>
-          </div>
-        </footer>
-      </main>
-    </div>
-  </body>
-</html>
diff --git a/skydoc/templates/html_header.jinja b/skydoc/templates/html_header.jinja
deleted file mode 100644
index 135bdc6..0000000
--- a/skydoc/templates/html_header.jinja
+++ /dev/null
@@ -1,52 +0,0 @@
-{#
-Copyright 2016 The Bazel Authors. All rights reserved.
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
-   http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
-#}
-<!--
-Documentation generated by Skydoc
--->
-<!DOCTYPE html>
-<html>
-  <head>
-    <meta charset="utf-8">
-    <meta name="viewport" content="width=device-width initial-scale=1" />
-    <meta http-equiv="X-UA-Compatible" content="IE=edge">
-
-    <title>{{ title }}</title>
-
-    <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,400,500,600,700" type="text/css">
-    <link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons">
-    <link rel="stylesheet" href="https://code.getmdl.io/1.1.1/material.green-light_blue.min.css">
-    <script defer src="https://code.getmdl.io/1.1.1/material.min.js"></script>
-    <link rel="stylesheet" href="{{ 'main.css' | link }}">
-  </head>
-  <body>
-    <div class="mdl-layout mdl-js-layout mdl-layout--fixed-drawer
-      mdl-layout--fixed-header">
-      <header class="mdl-layout__header">
-        <div class="mdl-layout__header-row">
-          <span class="mdl-layout-title">{{ title }}</span>
-        </div>
-      </header>
-      <div class="mdl-layout__drawer">
-        <span class="mdl-layout-title">Bazel</span>
-        <nav class="drawer-nav">
-          <ul class="drawer-nav">
-            {{ nav }}
-          </ul>
-        </nav>
-      </div>
-
-      <main class="mdl-layout__content">
-        <div class="page-content">
diff --git a/skydoc/templates/html_overview.jinja b/skydoc/templates/html_overview.jinja
deleted file mode 100644
index 7abdcfd..0000000
--- a/skydoc/templates/html_overview.jinja
+++ /dev/null
@@ -1,22 +0,0 @@
-{#
-Copyright 2016 The Bazel Authors. All rights reserved.
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
-   http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
-#}
-% include "html_header.jinja"
-
-<h1>Overview</h1>
-
-% include "overview.jinja"
-
-% include "html_footer.jinja"
diff --git a/skydoc/templates/markdown.jinja b/skydoc/templates/markdown.jinja
deleted file mode 100644
index 5545bc0..0000000
--- a/skydoc/templates/markdown.jinja
+++ /dev/null
@@ -1,67 +0,0 @@
-{#
-Copyright 2016 The Bazel Authors. All rights reserved.
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
-   http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
-#}
-<!---
-Documentation generated by Skydoc
--->
-<h1>{{ ruleset.title }}</h1>
-
-% include "toc.jinja"
-
-% if ruleset.description:
-<hr>
-
-<a name="overview"></a>
-## Overview
-
-{{ ruleset.description }}
-{# I want a blank line here #}
-% endif
-
-% for rule in ruleset.definitions:
-<a name="{{ rule.name }}"></a>
-## {{ rule.name }}
-
-<pre>
-{{ rule.signature }}
-</pre>
-
-{{ rule.documentation }}
-
-% if rule.outputs[0] is defined:
-{# I want a blank line here #}
-<a name="{{ rule.name }}_outputs"></a>
-### Outputs
-
-% include "outputs.jinja"
-% endif
-
-% if rule.attributes[0] is defined:
-{# I want a blank line here #}
-<a name="{{ rule.name }}_args"></a>
-### Attributes
-
-% include "attributes.jinja"
-% endif
-
-% if rule.example_documentation
-{# I want a blank line here #}
-<a name="{{ rule.name }}_examples"></a>
-### Examples
-
-{{ rule.example_documentation }}
-% endif
-
-% endfor
diff --git a/skydoc/templates/markdown_overview.jinja b/skydoc/templates/markdown_overview.jinja
deleted file mode 100644
index f810a7e..0000000
--- a/skydoc/templates/markdown_overview.jinja
+++ /dev/null
@@ -1,18 +0,0 @@
-{#
-Copyright 2016 The Bazel Authors. All rights reserved.
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
-   http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
-#}
-# Overview
-
-% include "overview.jinja"
diff --git a/skydoc/templates/nav.jinja b/skydoc/templates/nav.jinja
deleted file mode 100644
index 9fc5447..0000000
--- a/skydoc/templates/nav.jinja
+++ /dev/null
@@ -1,35 +0,0 @@
-{#
-Copyright 2016 The Bazel Authors. All rights reserved.
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
-   http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
-#}
-% if overview:
-<li><a href="{{ overview_filename | doc_link }}">Overview</a></li>
-% endif
-% for ruleset in rulesets:
-<li>
-  <a href="{{ ruleset.output_file | doc_link }}">{{ ruleset.title }}</a>
-  <ul>
-% if ruleset.description:
-    <li><a href="{{ ruleset.output_file | doc_link }}#overview">Overview</a></li>
-% endif
-% for rule in ruleset.rules:
-    <li>
-      <a href="{{ ruleset.output_file | doc_link }}#{{ rule.name }}">
-        {{ rule.name }}
-      </a>
-    </li>
-% endfor
-  </ul>
-</li>
-% endfor
diff --git a/skydoc/templates/outputs.jinja b/skydoc/templates/outputs.jinja
deleted file mode 100644
index 68a3c19..0000000
--- a/skydoc/templates/outputs.jinja
+++ /dev/null
@@ -1,31 +0,0 @@
-{#
-Copyright 2016 The Bazel Authors. All rights reserved.
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
-   http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
-#}
-<table class="params-table">
-  <colgroup>
-    <col class="col-param" />
-    <col class="col-description" />
-  </colgroup>
-  <tbody>
-% for output in rule.outputs:
-    <tr>
-      <td><code>{{ output.template }}</code></td>
-      <td>
-        {{ output.documentation|markdown|trim }}
-      </td>
-    </tr>
-% endfor
-  </tbody>
-</table>
diff --git a/skydoc/templates/overview.jinja b/skydoc/templates/overview.jinja
deleted file mode 100644
index 81a469e..0000000
--- a/skydoc/templates/overview.jinja
+++ /dev/null
@@ -1,100 +0,0 @@
-{#
-Copyright 2016 The Bazel Authors. All rights reserved.
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
-   http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
-#}
-<nav class="toc">
-  <h2>Rule sets</h2>
-  <ul>
-% for ruleset in rulesets:
-    <li><a href="#{{ ruleset.name }}">{{ ruleset.title }}</a></li>
-% endfor
-  </ul>
-</nav>
-
-% for ruleset in rulesets:
-<h2><a href="{{ ruleset.output_file | doc_link }}" id="{{ ruleset.name }}">{{ ruleset.title }}</a></h2>
-
-% if ruleset.rules[0] is defined:
-<h3>Rules</h3>
-<table class="overview-table">
-  <colgroup>
-    <col class="col-name" />
-    <col class="col-description" />
-  </colgroup>
-  <tbody>
-% for rule in ruleset.rules:
-    <tr>
-      <td>
-        <a href="{{ ruleset.output_file | doc_link }}#{{ rule.name }}">
-          <code>{{ rule.name }}</code>
-        </a>
-      </td>
-      <td>
-        {{ rule.short_documentation | markdown }}
-      </td>
-    </tr>
-% endfor
-  </tbody>
-</table>
-% endif
-
-% if ruleset.macros[0] is defined:
-<h3>Macros</h3>
-<table class="overview-table">
-  <colgroup>
-    <col class="col-name" />
-    <col class="col-description" />
-  </colgroup>
-  <tbody>
-% for rule in ruleset.macros:
-    <tr>
-      <td>
-        <a href="{{ ruleset.output_file | doc_link }}#{{ rule.name }}">
-          <code>{{ rule.name }}</code>
-        </a>
-      </td>
-      <td>
-        {{ rule.short_documentation | markdown }}
-      </td>
-    </tr>
-% endfor
-  </tbody>
-</table>
-% endif
-
-% if ruleset.repository_rules[0] is defined:
-<h3>Repository Rules</h3>
-<table class="overview-table">
-  <colgroup>
-    <col class="col-name" />
-    <col class="col-description" />
-  </colgroup>
-  <tbody>
-% for rule in ruleset.repository_rules:
-    <tr>
-      <td>
-        <a href="{{ ruleset.output_file | doc_link }}#{{ rule.name }}">
-          <code>{{ rule.name }}</code>
-        </a>
-      </td>
-      <td>
-        {{ rule.short_documentation | markdown }}
-      </td>
-    </tr>
-% endfor
-  </tbody>
-</table>
-% endif
-
-% endfor
diff --git a/skydoc/templates/toc.jinja b/skydoc/templates/toc.jinja
deleted file mode 100644
index f6642af..0000000
--- a/skydoc/templates/toc.jinja
+++ /dev/null
@@ -1,44 +0,0 @@
-{#
-Copyright 2016 The Bazel Authors. All rights reserved.
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
-   http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
-#}
-<nav class="toc">
-% if ruleset.description:
-  <h2><a href="#overview">Overview</a></h2>
-% endif
-% if ruleset.repository_rules[0] is defined:
-  <h2>Repository Rules</h2>
-  <ul>
-% for rule in ruleset.repository_rules:
-    <li><a href="#{{ rule.name }}">{{ rule.name }}</a></li>
-% endfor
-  </ul>
-% endif
-% if ruleset.rules[0] is defined:
-  <h2>Rules</h2>
-  <ul>
-% for rule in ruleset.rules:
-    <li><a href="#{{ rule.name }}">{{ rule.name }}</a></li>
-% endfor
-  </ul>
-% endif
-% if ruleset.macros[0] is defined:
-  <h2>Macros</h2>
-  <ul>
-% for macro in ruleset.macros:
-    <li><a href="#{{ macro.name }}">{{ macro.name }}</a></li>
-% endfor
-  </ul>
-% endif
-</nav>
diff --git a/skylark/BUILD b/skylark/BUILD
deleted file mode 100644
index 29e4dbf..0000000
--- a/skylark/BUILD
+++ /dev/null
@@ -1,22 +0,0 @@
-licenses(["notice"])  # Apache 2.0
-
-package(default_visibility = ["//visibility:public"])
-
-load("@bazel_skylib//:bzl_library.bzl", "bzl_library")
-load("//skylark:skylark.bzl", "skylark_doc")
-
-bzl_library(
-    name = "skylark",
-    srcs = ["skylark.bzl"],
-    deps = [
-        "@bazel_skylib//:bzl_library",
-    ],
-)
-
-skylark_doc(
-    name = "skylark-docs",
-    srcs = ["skylark.bzl"],
-    overview = False,
-    strip_prefix = "skylark",
-    deps = [":skylark"],
-)
diff --git a/skylark/skylark.bzl b/skylark/skylark.bzl
deleted file mode 100644
index fd7a697..0000000
--- a/skylark/skylark.bzl
+++ /dev/null
@@ -1,172 +0,0 @@
-# Copyright 2016 The Bazel Authors. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#    http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-"""Skylark rules"""
-
-load("@bazel_skylib//:bzl_library.bzl", "StarlarkLibraryInfo")
-
-_SKYLARK_FILETYPE = [".bzl"]
-
-ZIP_PATH = "/usr/bin/zip"
-
-def _skydoc(ctx):
-    for f in ctx.files.skydoc:
-        if not f.path.endswith(".py"):
-            return f
-    fail("no valid .py file")
-
-def _skylark_doc_impl(ctx):
-    """Implementation of the skylark_doc rule."""
-    skylark_doc_zip = ctx.outputs.skylark_doc_zip
-    direct = []
-    transitive = []
-    skydoc = _skydoc(ctx)
-    for dep in ctx.attr.srcs:
-        if StarlarkLibraryInfo in dep:
-            direct.extend(dep[StarlarkLibraryInfo].srcs)
-            transitive.append(dep[StarlarkLibraryInfo].transitive_srcs)
-        else:
-            direct.extend(dep.files.to_list())
-    inputs = depset(order = "postorder", direct = direct, transitive = transitive + [
-        dep[StarlarkLibraryInfo].transitive_srcs
-        for dep in ctx.attr.deps
-    ])
-    sources = [source.path for source in direct]
-    flags = [
-        "--format=%s" % ctx.attr.format,
-        "--output_file=%s" % ctx.outputs.skylark_doc_zip.path,
-    ]
-    if ctx.attr.strip_prefix:
-        flags += ["--strip_prefix=%s" % ctx.attr.strip_prefix]
-    if ctx.attr.overview:
-        flags += ["--overview"]
-    if ctx.attr.overview_filename:
-        flags += ["--overview_filename=%s" % ctx.attr.overview_filename]
-    if ctx.attr.link_ext:
-        flags += ["--link_ext=%s" % ctx.attr.link_ext]
-    if ctx.attr.site_root:
-        flags += ["--site_root=%s" % ctx.attr.site_root]
-    ctx.actions.run(
-        inputs = inputs,
-        tools = [skydoc],
-        executable = skydoc,
-        arguments = flags + sources,
-        outputs = [skylark_doc_zip],
-        mnemonic = "Skydoc",
-        use_default_shell_env = True,
-        progress_message = ("Generating Skylark doc for %s (%d files)" %
-                            (ctx.label.name, len(sources))),
-    )
-
-skylark_doc = rule(
-    _skylark_doc_impl,
-    attrs = {
-        "srcs": attr.label_list(
-            providers = [StarlarkLibraryInfo],
-            allow_files = _SKYLARK_FILETYPE,
-        ),
-        "deps": attr.label_list(
-            providers = [StarlarkLibraryInfo],
-            allow_files = False,
-        ),
-        "format": attr.string(default = "markdown"),
-        "strip_prefix": attr.string(),
-        "overview": attr.bool(default = True),
-        "overview_filename": attr.string(),
-        "link_ext": attr.string(),
-        "site_root": attr.string(),
-        "skydoc": attr.label(
-            default = Label("//skydoc"),
-            cfg = "host",
-            executable = True,
-        ),
-    },
-    outputs = {
-        "skylark_doc_zip": "%{name}-skydoc.zip",
-    },
-)
-# buildozer: disable=no-effect
-"""Generates Skylark rule documentation.
-
-Documentation is generated in directories that follows the package structure
-of the input `.bzl` files. For example, suppose the set of input files are
-as follows:
-
-* `foo/foo.bzl`
-* `foo/bar/bar.bzl`
-
-The archive generated by `skylark_doc` will contain the following generated
-docs:
-
-* `foo/foo.html`
-* `foo/bar/bar.html`
-
-Args:
-  srcs: List of `.bzl` files that are processed to create this target.
-  deps: List of other `skylark_library` targets that are required by the Skylark
-    files listed in `srcs`.
-  format: The type of output to generate. Possible values are `"markdown"` and
-    `"html"`.
-  strip_prefix: The directory prefix to strip from the generated output files.
-
-    The directory prefix to strip must be common to all input files. Otherwise,
-    skydoc will raise an error.
-  overview: If set to `True`, then generate an overview page.
-  overview_filename: The file name to use for the overview page. By default,
-    the page is named `index.md` or `index.html` for Markdown and HTML output
-    respectively.
-  link_ext: The file extension used for links in the generated documentation.
-    By default, skydoc uses `.html`.
-  site_root: The site root to be prepended to all URLs in the generated
-    documentation, such as links, style sheets, and images.
-
-    This is useful if the generated documentation is served from a subdirectory
-    on the web server. For example, if the skydoc site is to served from
-    `https://host.com/rules`, then by setting
-    `site_root = "https://host.com/rules"`, all links will be prefixed with
-    the site root, for example, `https://host.com/rules/index.html`.
-
-Outputs:
-  skylark_doc_zip: A zip file containing the generated documentation.
-
-Example:
-  Suppose you have a project containing Skylark rules you want to document:
-
-  ```
-  [workspace]/
-      WORKSPACE
-      checkstyle/
-          BUILD
-          checkstyle.bzl
-  ```
-
-  To generate documentation for the rules and macros in `checkstyle.bzl`, add the
-  following target to `rules/BUILD`:
-
-  ```python
-  load("@io_bazel_skydoc//skylark:skylark.bzl", "skylark_doc")
-
-  skylark_doc(
-      name = "checkstyle-docs",
-      srcs = ["checkstyle.bzl"],
-  )
-  ```
-
-  Running `bazel build //checkstyle:checkstyle-docs` will generate a zip file
-  containing documentation for the public rules and macros in `checkstyle.bzl`.
-
-  By default, Skydoc will generate documentation in Markdown. To generate
-  a set of HTML pages that is ready to be served, set `format = "html"`.
-"""
-