diff --git a/lib/docs/filters/click/clean_html.rb b/lib/docs/filters/click/clean_html.rb
new file mode 100644
index 00000000..914ee6b4
--- /dev/null
+++ b/lib/docs/filters/click/clean_html.rb
@@ -0,0 +1,15 @@
+module Docs
+ class Click
+ class CleanHtmlFilter < Filter
+ def call
+ if root_page?
+ # Image renders quite badly in dark mode
+ at_css('h1 + a.image-reference').remove
+ # All superfluous
+ css('#documentation, #api-reference, #miscellaneous-pages').remove
+ end
+ doc
+ end
+ end
+ end
+end
diff --git a/lib/docs/filters/click/entries.rb b/lib/docs/filters/click/entries.rb
new file mode 100644
index 00000000..09b3a761
--- /dev/null
+++ b/lib/docs/filters/click/entries.rb
@@ -0,0 +1,45 @@
+module Docs
+ class Click
+ class EntriesFilter < Docs::EntriesFilter
+
+ def initialize(*)
+ super
+ end
+
+ def get_name
+ return at_css('h1').content.strip
+ end
+
+ def get_type
+ return at_css('h1').content.strip
+ end
+
+ def include_default_entry?
+ false
+ end
+
+ def additional_entries
+ return [] if root_page?
+
+ if slug == 'api/'
+ entries = []
+ doc.css('> section').each do |section|
+ title = section.at_css('h2').content.strip
+ section.css('> dl.py > dt[id]').each do |dt|
+ entries << [dt['id'], dt['id'], title]
+ end
+ end
+ return entries
+ end
+
+ (doc.css('> section') || []).map do |section|
+ title = section.at_css('h2').content.strip
+ [title, section['id']]
+ end
+ end
+
+ private
+
+ end
+ end
+end
diff --git a/lib/docs/filters/click/pre_clean_html.rb b/lib/docs/filters/click/pre_clean_html.rb
new file mode 100644
index 00000000..6413aa61
--- /dev/null
+++ b/lib/docs/filters/click/pre_clean_html.rb
@@ -0,0 +1,11 @@
+module Docs
+ class Click
+ class PreCleanHtmlFilter < Filter
+ def call
+ # Remove ΒΆ character from tag w/ name & type
+ css('.headerlink').remove
+ doc
+ end
+ end
+ end
+end
diff --git a/lib/docs/scrapers/click.rb b/lib/docs/scrapers/click.rb
new file mode 100644
index 00000000..7e0121cc
--- /dev/null
+++ b/lib/docs/scrapers/click.rb
@@ -0,0 +1,29 @@
+module Docs
+ class Click < UrlScraper
+ self.name = 'click'
+ self.type = 'sphinx' #'simple'
+ self.release = '8.1.7'
+ self.base_url = 'https://click.palletsprojects.com/en/8.1.x/'
+ self.root_path = 'index.html'
+ self.links = {
+ home: 'https://click.palletsprojects.com/',
+ code: 'https://github.com/pallets/click'
+ }
+
+ html_filters.push 'click/pre_clean_html', 'click/entries', 'click/clean_html', 'sphinx/clean_html', 'title'
+
+ options[:skip] = ['changes/', 'genindex/', 'py-modindex/', 'license/']
+ options[:container] = '.body > section'
+ options[:title] = false
+
+ options[:attribution] = <<-HTML
+ © Copyright 2014 Pallets.
+ Licensed under the BSD 3-Clause License.
+ We are not supported nor endorsed by Pallets.
+ HTML
+
+ def get_latest_version(opts)
+ get_latest_github_release('pallets', 'click', opts)
+ end
+ end
+end
diff --git a/public/icons/docs/click/16.png b/public/icons/docs/click/16.png
new file mode 100644
index 00000000..d1497c30
Binary files /dev/null and b/public/icons/docs/click/16.png differ
diff --git a/public/icons/docs/click/16@2x.png b/public/icons/docs/click/16@2x.png
new file mode 100644
index 00000000..3bc91ffb
Binary files /dev/null and b/public/icons/docs/click/16@2x.png differ
diff --git a/public/icons/docs/click/SOURCE b/public/icons/docs/click/SOURCE
new file mode 100644
index 00000000..be844957
--- /dev/null
+++ b/public/icons/docs/click/SOURCE
@@ -0,0 +1 @@
+https://github.com/pallets/click/blob/main/docs/_static/click-icon.png