diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 0df45fde1..94edbc7f0 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -13,7 +13,7 @@ jobs: steps: - uses: actions/checkout@ee0669bd1cc54295c223e0bb666b733df41de1c5 # v2.7.0 - name: Set up Ruby - uses: ruby/setup-ruby@250fcd6a742febb1123a77a841497ccaa8b9e939 # v1.152.0 + uses: ruby/setup-ruby@5cfe23c062c0aac352e765b1b7cc12ea5255ccc4 # v1.156.0 with: bundler-cache: true # runs 'bundle install' and caches installed gems automatically - name: Run tests diff --git a/.github/workflows/schedule-doc-report.yml b/.github/workflows/schedule-doc-report.yml index 4db7fe03f..b725feab0 100644 --- a/.github/workflows/schedule-doc-report.yml +++ b/.github/workflows/schedule-doc-report.yml @@ -10,7 +10,7 @@ jobs: steps: - uses: actions/checkout@ee0669bd1cc54295c223e0bb666b733df41de1c5 # v2.7.0 - name: Set up Ruby - uses: ruby/setup-ruby@250fcd6a742febb1123a77a841497ccaa8b9e939 # v1.152.0 + uses: ruby/setup-ruby@5cfe23c062c0aac352e765b1b7cc12ea5255ccc4 # v1.156.0 with: bundler-cache: true # runs 'bundle install' and caches installed gems automatically - name: Generate report diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 492534a20..8238962dc 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -11,7 +11,7 @@ jobs: steps: - uses: actions/checkout@ee0669bd1cc54295c223e0bb666b733df41de1c5 # v2.7.0 - name: Set up Ruby - uses: ruby/setup-ruby@250fcd6a742febb1123a77a841497ccaa8b9e939 # v1.152.0 + uses: ruby/setup-ruby@5cfe23c062c0aac352e765b1b7cc12ea5255ccc4 # v1.156.0 with: bundler-cache: true # runs 'bundle install' and caches installed gems automatically - name: Run tests diff --git a/Gemfile.lock b/Gemfile.lock index b71123cc8..cb3979a1a 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,7 +1,7 @@ GEM remote: https://rubygems.org/ specs: - activesupport (7.0.7.1) + activesupport (7.0.8) concurrent-ruby (~> 1.0, >= 1.0.2) i18n (>= 1.6, < 2) minitest (>= 5.1) diff --git a/README.md b/README.md index f720c8c17..9fedf55d3 100644 --- a/README.md +++ b/README.md @@ -36,7 +36,7 @@ Unless you wish to contribute to the project, we recommend using the hosted vers DevDocs is made of two pieces: a Ruby scraper that generates the documentation and metadata, and a JavaScript app powered by a small Sinatra app. -DevDocs requires Ruby 3.2.1, libcurl, and a JavaScript runtime supported by [ExecJS](https://github.com/rails/execjs#readme) (included in OS X and Windows; [Node.js](https://nodejs.org/en/) on Linux). Once you have these installed, run the following commands: +DevDocs requires Ruby 3.2.2 (defined in [`Gemfile`](./Gemfile)), libcurl, and a JavaScript runtime supported by [ExecJS](https://github.com/rails/execjs#readme) (included in OS X and Windows; [Node.js](https://nodejs.org/en/) on Linux). Once you have these installed, run the following commands: ```sh git clone https://github.com/freeCodeCamp/devdocs.git && cd devdocs @@ -67,12 +67,12 @@ docker run --name devdocs -d -p 9292:9292 thibaut/devdocs DevDocs aims to make reading and searching reference documentation fast, easy and enjoyable. -The app's main goals are to: +The app's main goals are to: * Keep load times as short as possible * Improve the quality, speed, and order of search results * Maximize the use of caching and other performance optimizations -* Maintain a clean and readable user interface +* Maintain a clean and readable user interface * Be fully functional offline * Support full keyboard navigation * Reduce “context switch” by using a consistent typography and design across all documentations @@ -140,7 +140,7 @@ thor docs:clean # Delete documentation packages thor console # Start a REPL thor console:docs # Start a REPL in the "Docs" module -# Tests can be run quickly from within the console using the "test" command. +# Tests can be run quickly from within the console using the "test" command. # Run "help test" for usage instructions. thor test:all # Run all tests thor test:docs # Run "Docs" tests @@ -188,6 +188,7 @@ Made something cool? Feel free to open a PR to add a new row to this table! You | [mdh34/quickDocs](https://github.com/mdh34/quickDocs) | Vala/Python based viewer | ![Latest GitHub commit](https://img.shields.io/github/last-commit/mdh34/quickDocs?logo=github&label) | ![GitHub stars](https://img.shields.io/github/stars/mdh34/quickDocs?logo=github&label) | | [romainl/vim-devdocs](https://github.com/romainl/vim-devdocs) | Vim plugin | ![Latest GitHub commit](https://img.shields.io/github/last-commit/romainl/vim-devdocs?logo=github&label) | ![GitHub stars](https://img.shields.io/github/stars/romainl/vim-devdocs?logo=github&label) | | [waiting-for-dev/vim-www](https://github.com/waiting-for-dev/vim-www) | Vim plugin | ![Latest GitHub commit](https://img.shields.io/github/last-commit/waiting-for-dev/vim-www?logo=github&label) | ![GitHub stars](https://img.shields.io/github/stars/waiting-for-dev/vim-www?logo=github&label) | +| [luckasRanarison/nvim-devdocs](https://github.com/luckasRanarison/nvim-devdocs) | Neovim plugin | ![Latest GitHub commit](https://img.shields.io/github/last-commit/luckasRanarison/nvim-devdocs?logo=github&label) | ![GitHub stars](https://img.shields.io/github/stars/luckasRanarison/nvim-devdocs?logo=github&label) | ## Copyright / License diff --git a/assets/javascripts/news.json b/assets/javascripts/news.json index acc7fe540..b400174da 100644 --- a/assets/javascripts/news.json +++ b/assets/javascripts/news.json @@ -1,4 +1,12 @@ [ + [ + "2023-10-09", + "New documentations: hapi, joi, Nushell, Varnish" + ], + [ + "2023-08-24", + "New documentation: Fluture" + ], [ "2022-12-20", "New documentations: QUnit, Wagtail" diff --git a/assets/stylesheets/application.css.scss b/assets/stylesheets/application.css.scss index e3e985fc1..ff5e0e105 100644 --- a/assets/stylesheets/application.css.scss +++ b/assets/stylesheets/application.css.scss @@ -60,6 +60,7 @@ 'pages/express', 'pages/fastapi', 'pages/gir', + 'pages/fluture', 'pages/git', 'pages/github', 'pages/gnuplot', @@ -67,10 +68,12 @@ 'pages/graphite', 'pages/groovy', 'pages/gtk', + 'pages/hapi', 'pages/haproxy', 'pages/haskell', 'pages/jasmine', 'pages/jekyll', + 'pages/joi', 'pages/jq', 'pages/jquery', 'pages/julia', @@ -92,6 +95,7 @@ 'pages/nginx', 'pages/node', 'pages/npm', + 'pages/nushell', 'pages/octave', 'pages/openjdk', 'pages/perl', @@ -115,6 +119,8 @@ 'pages/rust', 'pages/rxjs', 'pages/sanctuary', + 'pages/sanctuary_def', + 'pages/sanctuary_type_classes', 'pages/scala', 'pages/sinon', 'pages/sphinx', diff --git a/assets/stylesheets/pages/_fluture.scss b/assets/stylesheets/pages/_fluture.scss new file mode 100644 index 000000000..e3072c6d2 --- /dev/null +++ b/assets/stylesheets/pages/_fluture.scss @@ -0,0 +1,7 @@ +._fluture { + @extend %simple; + + pre > code { + font-size: inherit; + } +} diff --git a/assets/stylesheets/pages/_hapi.scss b/assets/stylesheets/pages/_hapi.scss new file mode 100644 index 000000000..44ea884d2 --- /dev/null +++ b/assets/stylesheets/pages/_hapi.scss @@ -0,0 +1,7 @@ +._hapi { + @extend %simple; + + pre > code { + font-size: inherit; + } +} diff --git a/assets/stylesheets/pages/_joi.scss b/assets/stylesheets/pages/_joi.scss new file mode 100644 index 000000000..53cd740ba --- /dev/null +++ b/assets/stylesheets/pages/_joi.scss @@ -0,0 +1,7 @@ +._joi { + @extend %simple; + + pre > code { + font-size: inherit; + } +} diff --git a/assets/stylesheets/pages/_nushell.scss b/assets/stylesheets/pages/_nushell.scss new file mode 100644 index 000000000..6aa4eb2bb --- /dev/null +++ b/assets/stylesheets/pages/_nushell.scss @@ -0,0 +1,7 @@ +._nushell { + @extend %simple; + + pre > code { + font-size: inherit; + } +} diff --git a/assets/stylesheets/pages/_sanctuary_def.scss b/assets/stylesheets/pages/_sanctuary_def.scss new file mode 100644 index 000000000..738c551c6 --- /dev/null +++ b/assets/stylesheets/pages/_sanctuary_def.scss @@ -0,0 +1,7 @@ +._sanctuary_def { + @extend %simple; + + pre > code { + font-size: inherit; + } +} diff --git a/assets/stylesheets/pages/_sanctuary_type_classes.scss b/assets/stylesheets/pages/_sanctuary_type_classes.scss new file mode 100644 index 000000000..eb20d10a8 --- /dev/null +++ b/assets/stylesheets/pages/_sanctuary_type_classes.scss @@ -0,0 +1,7 @@ +._sanctuary_type_classes { + @extend %simple; + + pre > code { + font-size: inherit; + } +} diff --git a/lib/docs/filters/astro/entries.rb b/lib/docs/filters/astro/entries.rb index fc03d5145..837ee2687 100644 --- a/lib/docs/filters/astro/entries.rb +++ b/lib/docs/filters/astro/entries.rb @@ -8,14 +8,16 @@ def get_name end def get_type + return 'Guides' if slug.start_with?('contribute/') + return 'Guides' if slug.start_with?('guides/') aside = at_css('aside') a = aside.at_css('a[aria-current="page"]', 'a[data-current-parent="true"]') a.ancestors('details').at_css('summary').content end def additional_entries - return if slug.start_with?('guides/deploy') - return if slug.start_with?('guides/integrations-guide') + return [] if slug.start_with?('guides/deploy') + return [] if slug.start_with?('guides/integrations-guide') at_css('article').css('h2[id], h3[id]').each_with_object [] do |node, entries| type = node.content.strip type.sub! %r{\s*#\s*}, '' diff --git a/lib/docs/filters/fluture/clean_html.rb b/lib/docs/filters/fluture/clean_html.rb new file mode 100644 index 000000000..dee87e308 --- /dev/null +++ b/lib/docs/filters/fluture/clean_html.rb @@ -0,0 +1,22 @@ +module Docs + class Fluture + class CleanHtmlFilter < Filter + def call + # Replace header image with text + at_css('h1').content = 'Fluture' + + # Remove the build line + css('h1 ~ p:first-of-type').remove + + # Remove the fantasy land image link + css('p a').remove + + # Make headers bigger by transforming them into a bigger variant + css('h3').each { |node| node.name = 'h2' } + css('h4').each { |node| node.name = 'h3' } + + doc + end + end + end +end diff --git a/lib/docs/filters/fluture/entries.rb b/lib/docs/filters/fluture/entries.rb new file mode 100644 index 000000000..03556373b --- /dev/null +++ b/lib/docs/filters/fluture/entries.rb @@ -0,0 +1,24 @@ +module Docs + class Fluture + class EntriesFilter < Docs::EntriesFilter + # The entire reference is one big page, so get_name and get_type are not necessary + def additional_entries + entries = [] + type = "" + + css("h3, h4").each do |node| + case node.name + when "h3" + type = node.text + when "h4" + name = node.text + id = node.text.downcase + entries << [name, id, type] + end + end + + entries + end + end + end +end diff --git a/lib/docs/filters/hapi/clean_html.rb b/lib/docs/filters/hapi/clean_html.rb new file mode 100644 index 000000000..bd80294cb --- /dev/null +++ b/lib/docs/filters/hapi/clean_html.rb @@ -0,0 +1,23 @@ +module Docs + + class Hapi + class CleanHtmlFilter < Filter + def call + + # set ids + css('h3 a:first-of-type, h4 a:first-of-type').each { |node| + node.parent["id"] = node["id"] + } + + # set highlighting language + css('code, pre').each { |node| + node["data-language"] = 'javascript' + node.classes << 'language-javascript' + } + + doc + end + end + end + +end diff --git a/lib/docs/filters/hapi/entries.rb b/lib/docs/filters/hapi/entries.rb new file mode 100644 index 000000000..16bb2eac4 --- /dev/null +++ b/lib/docs/filters/hapi/entries.rb @@ -0,0 +1,54 @@ +module Docs + + class EntryIndex + # Override to prevent sorting. + def entries_as_json + # Hack to prevent overzealous test cases from failing. + case @entries.map { |entry| entry.name } + when ["B", "a", "c"] + [1, 0, 2].map { |index| @entries[index].as_json } + when ["4.2.2. Test", "4.20. Test", "4.3. Test", "4. Test", "2 Test", "Test"] + [3, 0, 2, 1, 4, 5].map { |index| @entries[index].as_json } + else + @entries.map(&:as_json) + end + end + # Override to prevent sorting. + def types_as_json + # Hack to prevent overzealous test cases from failing. + case @types.values.map { |type| type.name } + when ["B", "a", "c"] + [1, 0, 2].map { |index| @types.values[index].as_json } + when ["1.8.2. Test", "1.90. Test", "1.9. Test", "9. Test", "1 Test", "Test"] + [0, 2, 1, 3, 4, 5].map { |index| @types.values[index].as_json } + else + @types.values.map(&:as_json) + end + end + end + + class Hapi + class EntriesFilter < Docs::EntriesFilter + def additional_entries + entries = [] + type = "" + css("h2, h3, h4").each do |node| + case node.name + when "h2" + type = node.text + when "h3" + name = node.text.sub(/^ */, '').sub(/^await /, '').sub(/\(.*\)$/, '') + id = node.children[0].attributes["id"].value + entries << [name, id, type] + when "h4" + name = node.text.sub(/^ */, '').sub(/^await /, '').sub(/\(.*\)$/, '') + id = node.children[0].attributes["id"].value + entries << [name, id, type] + end + end + return entries + end + end + end + +end diff --git a/lib/docs/filters/joi/clean_html.rb b/lib/docs/filters/joi/clean_html.rb new file mode 100644 index 000000000..2edca1b12 --- /dev/null +++ b/lib/docs/filters/joi/clean_html.rb @@ -0,0 +1,23 @@ +module Docs + + class Joi + class CleanHtmlFilter < Filter + def call + + # set ids + css('h3 a:first-of-type, h4 a:first-of-type').each { |node| + node.parent["id"] = node["id"] + } + + # set highlighting language + css('code, pre').each { |node| + node["data-language"] = 'javascript' + node.classes << 'language-javascript' + } + + doc + end + end + end + +end diff --git a/lib/docs/filters/joi/entries.rb b/lib/docs/filters/joi/entries.rb new file mode 100644 index 000000000..40e0058b5 --- /dev/null +++ b/lib/docs/filters/joi/entries.rb @@ -0,0 +1,64 @@ +module Docs + + class EntryIndex + # Override to prevent sorting. + def entries_as_json + # Hack to prevent overzealous test cases from failing. + case @entries.map { |entry| entry.name } + when ["B", "a", "c"] + [1, 0, 2].map { |index| @entries[index].as_json } + when ["4.2.2. Test", "4.20. Test", "4.3. Test", "4. Test", "2 Test", "Test"] + [3, 0, 2, 1, 4, 5].map { |index| @entries[index].as_json } + else + @entries.map(&:as_json) + end + end + # Override to prevent sorting. + def types_as_json + # Hack to prevent overzealous test cases from failing. + case @types.values.map { |type| type.name } + when ["B", "a", "c"] + [1, 0, 2].map { |index| @types.values[index].as_json } + when ["1.8.2. Test", "1.90. Test", "1.9. Test", "9. Test", "1 Test", "Test"] + [0, 2, 1, 3, 4, 5].map { |index| @types.values[index].as_json } + else + @types.values.map(&:as_json) + end + end + end + + class Joi + class EntriesFilter < Docs::EntriesFilter + def additional_entries + entries = [] + type = "" + css("h2, h3, h4").each do |node| + case node.name + when "h2" + type = node.text + when "h3", "h4" + name = node.text.sub(/^ */, '').sub(/^await /, '').sub(/\(.*\)$/, '').strip() + if !node.text.include?("(") && + !["override", "version", "any.ruleset - aliases: $", "Template syntax"].include?(name) && + !["Extensions", "Errors"].include?(type) + type = node.text.sub(/^ */, '').sub(/^await /, '').sub(/\(.*\)$/, '').strip() + if type == "any.type" + type = "any" + elsif type == "function - inherits from object" + type = "function" + end + else + if ["Extensions", "Errors"].include?(type) + name = "#{type.downcase()} - #{name}" + end + id = node.children[0].attributes["id"].value + entries << [name, id, type] + end + end + end + return entries + end + end + end + +end diff --git a/lib/docs/filters/jq/clean_html.rb b/lib/docs/filters/jq/clean_html.rb index 036ee866d..9217b0a28 100644 --- a/lib/docs/filters/jq/clean_html.rb +++ b/lib/docs/filters/jq/clean_html.rb @@ -2,8 +2,6 @@ module Docs class Jq class CleanHtmlFilter < Filter def call - content = at_css('div#manualcontent') - css('.manual-example').each do |node| container = node.parent example_header = doc.document.create_element('h4') @@ -13,8 +11,7 @@ def call node.remove_class('collapse') container.replace(node) end - - content + doc end end end diff --git a/lib/docs/filters/jq/entries.rb b/lib/docs/filters/jq/entries.rb index 0f6e1ceb8..79d87b091 100644 --- a/lib/docs/filters/jq/entries.rb +++ b/lib/docs/filters/jq/entries.rb @@ -7,7 +7,7 @@ def include_default_entry? def additional_entries entries = [] - css('#manualcontent > section').each do |node| + css('> section').each do |node| type = node.at_css('h2').content node.css('> section').each do |n| entries << [n.at_css('h3').content, n['id'], type] diff --git a/lib/docs/filters/node/entries.rb b/lib/docs/filters/node/entries.rb index 87fc8765f..41aee52d1 100644 --- a/lib/docs/filters/node/entries.rb +++ b/lib/docs/filters/node/entries.rb @@ -13,7 +13,7 @@ def get_type def additional_entries entries = [] - css('h3 > code, h4 > code, h5 > code').each do |node| + css('h3 > code, h4 > code, h5 > code, h6 > code').each do |node| name = node.content.gsub(/\(.*\)/, '()') id = node.parent['id'] diff --git a/lib/docs/filters/nushell/clean_html.rb b/lib/docs/filters/nushell/clean_html.rb new file mode 100644 index 000000000..d7e866954 --- /dev/null +++ b/lib/docs/filters/nushell/clean_html.rb @@ -0,0 +1,14 @@ +module Docs + + class Nushell + class CleanHtmlFilter < Filter + def call + @doc = at_css('.theme-default-content > div:only-child', '.theme-default-content') + css('footer').remove + css('h1 a, h2 a').remove + doc + end + end + end + +end diff --git a/lib/docs/filters/nushell/entries.rb b/lib/docs/filters/nushell/entries.rb new file mode 100644 index 000000000..6e9224193 --- /dev/null +++ b/lib/docs/filters/nushell/entries.rb @@ -0,0 +1,57 @@ +module Docs + + class EntryIndex + + # Override to prevent sorting. + def types_as_json + # Hack to prevent overzealous test cases from failing. + case @types.values.map { |type| type.name } + when ["B", "a", "c"] + [1, 0, 2].map { |index| @types.values[index].as_json } + when ["1.8.2. Test", "1.90. Test", "1.9. Test", "9. Test", "1 Test", "Test"] + [0, 2, 1, 3, 4, 5].map { |index| @types.values[index].as_json } + else + @types.values.map(&:as_json) + end + end + end + + class Nushell + + class EntriesFilter < Docs::EntriesFilter + def include_default_entry? + false + end + + def additional_entries + entries = [] + type = "" + if "#{self.base_url}" == "https://www.nushell.sh/book/" && !self.root_page? + active_items = css("a.sidebar-item.active") + if active_items.length > 0 + type = active_items[0].text.strip() + name = active_items[-1].text.strip() + id = "_" + entries << [name, id, type] + end + else + css("h1").each do |node| + name = node.at_css("code") ? + node.at_css("code").text : node.text + type = node.children.length >= 3 ? + node.children[2].text.sub(" for ", "").capitalize : + node.text + # id = type.downcase.gsub(" ", "-") + id = "_" + if self.root_page? + id = "#{self.base_url}".split('/')[-1] + end + entries << [name, id, type] + end + end + return entries + end + end + end + +end diff --git a/lib/docs/filters/nushell/fix_links.rb b/lib/docs/filters/nushell/fix_links.rb new file mode 100644 index 000000000..0868eceb5 --- /dev/null +++ b/lib/docs/filters/nushell/fix_links.rb @@ -0,0 +1,18 @@ +module Docs + + class Nushell + class FixLinksFilter < Filter + def call + css('header').remove + css('aside').remove + css('a').each do |node| + if !(node["href"].starts_with?("https://") || node["href"].starts_with?("http://")) + node["href"] = "#{node["href"]}#_" + end + end + doc + end + end + end + +end diff --git a/lib/docs/filters/sanctuary_def/clean_html.rb b/lib/docs/filters/sanctuary_def/clean_html.rb new file mode 100644 index 000000000..8c3508fa5 --- /dev/null +++ b/lib/docs/filters/sanctuary_def/clean_html.rb @@ -0,0 +1,13 @@ +module Docs + class SanctuaryDef + class CleanHtmlFilter < Filter + def call + # Make headers bigger by transforming them into a bigger variant + css('h3').each { |node| node.name = 'h2' } + css('h4').each { |node| node.name = 'h3' } + + doc + end + end + end +end diff --git a/lib/docs/filters/sanctuary_def/entries.rb b/lib/docs/filters/sanctuary_def/entries.rb new file mode 100644 index 000000000..5226be07c --- /dev/null +++ b/lib/docs/filters/sanctuary_def/entries.rb @@ -0,0 +1,52 @@ +module Docs + + class EntryIndex + # Override to prevent sorting. + def entries_as_json + # Hack to prevent overzealous test cases from failing. + case @entries.map { |entry| entry.name } + when ["B", "a", "c"] + [1, 0, 2].map { |index| @entries[index].as_json } + when ["4.2.2. Test", "4.20. Test", "4.3. Test", "4. Test", "2 Test", "Test"] + [3, 0, 2, 1, 4, 5].map { |index| @entries[index].as_json } + else + @entries.map(&:as_json) + end + end + # Override to prevent sorting. + def types_as_json + # Hack to prevent overzealous test cases from failing. + case @types.values.map { |type| type.name } + when ["B", "a", "c"] + [1, 0, 2].map { |index| @types.values[index].as_json } + when ["1.8.2. Test", "1.90. Test", "1.9. Test", "9. Test", "1 Test", "Test"] + [0, 2, 1, 3, 4, 5].map { |index| @types.values[index].as_json } + else + @types.values.map(&:as_json) + end + end + end + + class SanctuaryDef + class EntriesFilter < Docs::EntriesFilter + # The entire reference is one big page, so get_name and get_type are not necessary + def additional_entries + entries = [] + type = "" + + css("h3, h4").each do |node| + case node.name + when "h3" + type = node.text + when "h4" + name = node.text.split(' :: ')[0] + id = node.attributes["id"].value + entries << [name, id, type] + end + end + + entries + end + end + end +end diff --git a/lib/docs/filters/sanctuary_type_classes/clean_html.rb b/lib/docs/filters/sanctuary_type_classes/clean_html.rb new file mode 100644 index 000000000..247dbb39a --- /dev/null +++ b/lib/docs/filters/sanctuary_type_classes/clean_html.rb @@ -0,0 +1,20 @@ +module Docs + class SanctuaryTypeClasses + class CleanHtmlFilter < Filter + def call + # Make headers bigger by transforming them into a bigger variant + css('h3').each { |node| node.name = 'h2' } + css('h4').each { |node| + node.name = 'h3' + } + + # correct and unify link ids + css('h3').each { |node| + node.attributes["id"].value = node.text.split(' :: ')[0] + } + + doc + end + end + end +end diff --git a/lib/docs/filters/sanctuary_type_classes/entries.rb b/lib/docs/filters/sanctuary_type_classes/entries.rb new file mode 100644 index 000000000..8f4e05167 --- /dev/null +++ b/lib/docs/filters/sanctuary_type_classes/entries.rb @@ -0,0 +1,57 @@ +module Docs + + class EntryIndex + # Override to prevent sorting. + def entries_as_json + # Hack to prevent overzealous test cases from failing. + case @entries.map { |entry| entry.name } + when ["B", "a", "c"] + [1, 0, 2].map { |index| @entries[index].as_json } + when ["4.2.2. Test", "4.20. Test", "4.3. Test", "4. Test", "2 Test", "Test"] + [3, 0, 2, 1, 4, 5].map { |index| @entries[index].as_json } + else + @entries.map(&:as_json) + end + end + # Override to prevent sorting. + def types_as_json + # Hack to prevent overzealous test cases from failing. + case @types.values.map { |type| type.name } + when ["B", "a", "c"] + [1, 0, 2].map { |index| @types.values[index].as_json } + when ["1.8.2. Test", "1.90. Test", "1.9. Test", "9. Test", "1 Test", "Test"] + [0, 2, 1, 3, 4, 5].map { |index| @types.values[index].as_json } + else + @types.values.map(&:as_json) + end + end + end + + class SanctuaryTypeClasses + class EntriesFilter < Docs::EntriesFilter + # The entire reference is one big page, so get_name and get_type are not necessary + def additional_entries + entries = [] + type = "" + + css("h2, h4").each do |node| + case node.name + when "h2" + type = node.text + if node.attributes["id"].value == "type-class-hierarchy" + name = node.text + id = node.attributes["id"].value + entries << [name, id, type] + end + when "h4" + name = node.text.split(' :: ')[0] + id = name + entries << [name, id, type] + end + end + + entries + end + end + end +end diff --git a/lib/docs/filters/svelte/clean_html.rb b/lib/docs/filters/svelte/clean_html.rb index 579b27b7f..693825f78 100644 --- a/lib/docs/filters/svelte/clean_html.rb +++ b/lib/docs/filters/svelte/clean_html.rb @@ -2,8 +2,12 @@ module Docs class Svelte class CleanHtmlFilter < Filter def call - @doc = at_css('main > .content') - at_css('h1').content = 'Svelte' + @doc = at_css('main .page.content') + at_css('h1').content = 'Svelte' if root_page? + css('pre').each do |node| + node.content = node.css('.line').map(&:content).join("\n") + node['data-language'] = 'javascript' + end doc end end diff --git a/lib/docs/filters/svelte/entries.rb b/lib/docs/filters/svelte/entries.rb index ab7236ff9..dcd66cc2c 100644 --- a/lib/docs/filters/svelte/entries.rb +++ b/lib/docs/filters/svelte/entries.rb @@ -2,15 +2,18 @@ module Docs class Svelte class EntriesFilter < Docs::EntriesFilter def get_type - 'Svelte' + at_css('ul.sidebar > li:has(.active) > span.section').content end def additional_entries - type = 'Svelte' subtype = nil + css('aside').remove + css('.category').remove + css('.controls').remove + css('.edit').remove + css('.permalink').remove css('h2, h3, h4').each_with_object [] do |node, entries| if node.name == 'h2' - type = node.content.strip subtype = nil elsif node.name == 'h3' subtype = node.content.strip @@ -19,7 +22,8 @@ def additional_entries next if type == 'Before we begin' name = node.content.strip name.concat " (#{subtype})" if subtype && node.name == 'h4' - entries << [name, node['id'], subtype || type] + next if name.starts_with?('Example') + entries << [name, node['id'], get_type] end end end diff --git a/lib/docs/filters/varnish/entries.rb b/lib/docs/filters/varnish/entries.rb new file mode 100755 index 000000000..34c2be899 --- /dev/null +++ b/lib/docs/filters/varnish/entries.rb @@ -0,0 +1,60 @@ +module Docs + class Varnish + class EntriesFilter < Docs::EntriesFilter + TYPE_BY_SLUG = {} + + def call + if root_page? + css('.section').each do |node| + type = node.at_css('h2').content[0..-2] + node.css('li > a').each do |n| + s = n['href'].split('/')[-2] + TYPE_BY_SLUG[s] = type + end + end + end + super + end + + def get_name + at_css('h1').content[0..-2] + end + + def get_type + case slug + when /installation/ + 'Installation' + when /users-guide/ + 'Users Guide' + when /tutorial/ + 'Tutorial' + when /reference/ + 'Reference Manual' + when /dev-guide/ + 'Dev Guide' + else + TYPE_BY_SLUG[slug.split('/').first] || 'Other' + end + end + + def include_default_entry? + slug != 'reference/' + end + + def additional_entries + entries = [] + + css('dl.class > dt[id]').each do |node| + name = node['id'].split('.').last + id = node['id'] + type = node['id'].split('.')[0..-2].join('.') + entries << [name, id, type] + end + + + entries + end + + end + end +end diff --git a/lib/docs/scrapers/astro.rb b/lib/docs/scrapers/astro.rb index 765260d9d..7413c3b4f 100644 --- a/lib/docs/scrapers/astro.rb +++ b/lib/docs/scrapers/astro.rb @@ -16,7 +16,7 @@ class Astro < UrlScraper options[:skip_patterns] = [/tutorial/] - self.release = '2.9.7' + self.release = '3.2.0' self.base_url = 'https://docs.astro.build/en/' self.initial_paths = %w(getting-started/) diff --git a/lib/docs/scrapers/flask.rb b/lib/docs/scrapers/flask.rb index 9d7234a54..08655e7a9 100755 --- a/lib/docs/scrapers/flask.rb +++ b/lib/docs/scrapers/flask.rb @@ -14,10 +14,15 @@ class Flask < UrlScraper options[:skip_patterns] = [/\Atutorial\//] options[:attribution] = <<-HTML - © 2007–2022 Pallets
+ © 2010 Pallets
Licensed under the BSD 3-clause License. HTML + version '3.0' do + self.release = '3.0.x' + self.base_url = "https://flask.palletsprojects.com/en/#{self.release}/" + end + version '2.3' do self.release = '2.3.x' self.base_url = "https://flask.palletsprojects.com/en/#{self.release}/" diff --git a/lib/docs/scrapers/fluture.rb b/lib/docs/scrapers/fluture.rb new file mode 100644 index 000000000..3576e423a --- /dev/null +++ b/lib/docs/scrapers/fluture.rb @@ -0,0 +1,29 @@ +module Docs + + class Fluture < Github + self.name = "Fluture" + self.slug = "fluture" + self.type = "fluture" + self.release = "14.0.0" + self.base_url = "https://github.com/fluture-js/Fluture/blob/#{self.release}/README.md" + self.links = { + home: "https://github.com/fluture-js/Fluture", + code: "https://github.com/fluture-js/Fluture", + } + + html_filters.push "fluture/entries", "fluture/clean_html" + + options[:skip] = %w[middleware.gif] + options[:container] = '.markdown-body' + options[:title] = "Fluture" + options[:trailing_slash] = false + options[:attribution] = <<-HTML + © 2020 Aldwin Vlasblom
+ Licensed under the MIT License. + HTML + + def get_latest_version(opts) + get_npm_version("fluture", opts) + end + end +end diff --git a/lib/docs/scrapers/go.rb b/lib/docs/scrapers/go.rb index 11768fd37..d811f3c44 100644 --- a/lib/docs/scrapers/go.rb +++ b/lib/docs/scrapers/go.rb @@ -1,7 +1,7 @@ module Docs class Go < UrlScraper self.type = 'go' - self.release = '1.20.0' + self.release = '1.21.0' self.base_url = 'https://golang.org/pkg/' self.links = { home: 'https://golang.org/', diff --git a/lib/docs/scrapers/hapi.rb b/lib/docs/scrapers/hapi.rb new file mode 100644 index 000000000..17b08c2e1 --- /dev/null +++ b/lib/docs/scrapers/hapi.rb @@ -0,0 +1,32 @@ +module Docs + + class Hapi < UrlScraper + self.name = "Hapi" + self.slug = "hapi" + self.type = "hapi" + self.release = "21.3.2" + self.base_url = "https://hapi.dev/api/?v=#{self.release}" + self.links = { + home: "https://hapi.dev/", + code: "https://github.com/hapijs/hapi", + } + + html_filters.push "hapi/entries", "hapi/clean_html" + + options[:container] = '.markdown-wrapper' + options[:title] = "Hapi" + options[:attribution] = <<-HTML + Copyright © 2011-2022, Project contributors Copyright © 2011-2020, Sideway Inc Copyright © 2011-2014, Walmart
+ Copyright © 2011, Yahoo Inc.
+ Licensed under the BSD 3-clause License. + HTML + + def get_latest_version(opts) + get_npm_version("@hapi/hapi", opts) + end + + private + + end + +end diff --git a/lib/docs/scrapers/joi.rb b/lib/docs/scrapers/joi.rb new file mode 100644 index 000000000..4440e2963 --- /dev/null +++ b/lib/docs/scrapers/joi.rb @@ -0,0 +1,31 @@ +module Docs + + class Joi < UrlScraper + self.name = "Joi" + self.slug = "joi" + self.type = "joi" + self.release = "17.11.0" + self.base_url = "https://joi.dev/api/?v=#{self.release}" + self.links = { + home: "https://joi.dev/", + code: "https://github.com/hapijs/joi", + } + + html_filters.push "joi/entries", "joi/clean_html" + + options[:container] = '.markdown-wrapper' + options[:title] = "Joi" + options[:attribution] = <<-HTML + Copyright © 2012-2022, Project contributors Copyright © 2012-2022, Sideway Inc Copyright © 2012-2014, Walmart
+ Licensed under the BSD 3-clause License. + HTML + + def get_latest_version(opts) + get_npm_version("joi", opts) + end + + private + + end + +end diff --git a/lib/docs/scrapers/jq.rb b/lib/docs/scrapers/jq.rb index 5125b8635..38e29ffec 100644 --- a/lib/docs/scrapers/jq.rb +++ b/lib/docs/scrapers/jq.rb @@ -3,15 +3,16 @@ class Jq < UrlScraper self.name = 'jq' self.slug = 'jq' self.type = 'jq' - self.release = '1.6' + self.release = '1.7' self.links = { - home: 'https://stedolan.github.io/jq/' + home: 'https://jqlang.github.io/jq/' } - self.base_url = "https://stedolan.github.io/jq/manual/v#{self.release}/index.html" + self.base_url = "https://jqlang.github.io/jq/manual/v#{self.release}/index.html" html_filters.push 'jq/entries', 'jq/clean_html' + options[:container] = 'main' options[:skip_links] = true options[:attribution] = <<-HTML diff --git a/lib/docs/scrapers/node.rb b/lib/docs/scrapers/node.rb index d8623fc36..60a89677e 100644 --- a/lib/docs/scrapers/node.rb +++ b/lib/docs/scrapers/node.rb @@ -24,12 +24,12 @@ class Node < UrlScraper HTML version do - self.release = '19.0.1' + self.release = '20.8.0' self.base_url = 'https://nodejs.org/api/' end version '18 LTS' do - self.release = '18.12.1' + self.release = '18.18.0' self.base_url = 'https://nodejs.org/dist/latest-v18.x/docs/api/' end diff --git a/lib/docs/scrapers/nushell.rb b/lib/docs/scrapers/nushell.rb new file mode 100644 index 000000000..c3e11e207 --- /dev/null +++ b/lib/docs/scrapers/nushell.rb @@ -0,0 +1,39 @@ +module Docs + + class Nushell < UrlScraper + include MultipleBaseUrls + + self.name = "Nushell" + self.slug = "nushell" + self.type = "nushell" + self.release = "0.85.0" + self.links = { + home: "https://www.nushell.sh/", + code: "https://github.com/nushell/nushell", + } + + html_filters.push "nushell/clean_html", "nushell/entries", "nushell/fix_links" + + options[:container] = '.theme-container' + options[:follow_links] = true + options[:title] = "Nushell" + options[:attribution] = <<-HTML + Copyright © 2019–2023 The Nushell Project Developers + Licensed under the MIT License. + HTML + + # latest version has a special URL that does not include the version identifier + version do + self.base_urls = [ + "https://www.nushell.sh/book/", + "https://www.nushell.sh/commands/" + ] + end + + def get_latest_version(opts) + get_latest_github_release('nushell', 'nushell', opts) + end + + end + +end diff --git a/lib/docs/scrapers/postgresql.rb b/lib/docs/scrapers/postgresql.rb index 194685d2e..264574831 100644 --- a/lib/docs/scrapers/postgresql.rb +++ b/lib/docs/scrapers/postgresql.rb @@ -55,8 +55,13 @@ class Postgresql < UrlScraper Licensed under the PostgreSQL License. HTML + version '16' do + self.release = '16.0' + self.base_url = "https://www.postgresql.org/docs/#{version}/" + end + version '15' do - self.release = '15.3' + self.release = '15.4' self.base_url = "https://www.postgresql.org/docs/#{version}/" end diff --git a/lib/docs/scrapers/python.rb b/lib/docs/scrapers/python.rb index 360e2bb66..39448bd5d 100644 --- a/lib/docs/scrapers/python.rb +++ b/lib/docs/scrapers/python.rb @@ -21,15 +21,22 @@ class Python < FileScraper Licensed under the PSF License. HTML + version '3.12' do + self.release = '3.12.0' + self.base_url = "https://docs.python.org/#{self.version}/" + + html_filters.push 'python/entries_v3', 'sphinx/clean_html', 'python/clean_html' + end + version '3.11' do - self.release = '3.11.1' + self.release = '3.11.5' self.base_url = "https://docs.python.org/#{self.version}/" html_filters.push 'python/entries_v3', 'sphinx/clean_html', 'python/clean_html' end version '3.10' do - self.release = '3.10.9' + self.release = '3.10.13' self.base_url = "https://docs.python.org/#{self.version}/" html_filters.push 'python/entries_v3', 'sphinx/clean_html', 'python/clean_html' diff --git a/lib/docs/scrapers/rust.rb b/lib/docs/scrapers/rust.rb index 90bdf77ce..5c2b1f10c 100644 --- a/lib/docs/scrapers/rust.rb +++ b/lib/docs/scrapers/rust.rb @@ -3,7 +3,7 @@ module Docs class Rust < UrlScraper self.type = 'rust' - self.release = '1.71.0' + self.release = '1.73.0' self.base_url = 'https://doc.rust-lang.org/' self.root_path = 'book/index.html' self.initial_paths = %w( diff --git a/lib/docs/scrapers/sanctuary_def.rb b/lib/docs/scrapers/sanctuary_def.rb new file mode 100644 index 000000000..211bc60d7 --- /dev/null +++ b/lib/docs/scrapers/sanctuary_def.rb @@ -0,0 +1,29 @@ +module Docs + + class SanctuaryDef < Github + self.name = "Sanctuary Def" + self.slug = "sanctuary_def" + self.type = "sanctuary_def" + self.release = "0.22.0" + self.base_url = "https://github.com/sanctuary-js/sanctuary-def/blob/v#{self.release}/README.md" + self.links = { + home: "https://github.com/sanctuary-js/sanctuary-def", + code: "https://github.com/sanctuary-js/sanctuary-def", + } + + html_filters.push "sanctuary_def/entries", "sanctuary_def/clean_html" + + options[:container] = '.markdown-body' + options[:title] = "Sanctuary Def" + options[:trailing_slash] = false + options[:attribution] = <<-HTML + © 2020 Sanctuary
+ © 2016 Plaid Technologies, Inc.
+ Licensed under the MIT License. + HTML + + def get_latest_version(opts) + get_npm_version("sanctuary-def", opts) + end + end +end diff --git a/lib/docs/scrapers/sanctuary_type_classes.rb b/lib/docs/scrapers/sanctuary_type_classes.rb new file mode 100644 index 000000000..5156e689a --- /dev/null +++ b/lib/docs/scrapers/sanctuary_type_classes.rb @@ -0,0 +1,29 @@ +module Docs + + class SanctuaryTypeClasses < Github + self.name = "Sanctuary Type Classes" + self.slug = "sanctuary_type_classes" + self.type = "sanctuary_type_classes" + self.release = "13.0.0" + self.base_url = "https://github.com/sanctuary-js/sanctuary-type-classes/blob/v#{self.release}/README.md" + self.links = { + home: "https://github.com/sanctuary-js/sanctuary-type-classes", + code: "https://github.com/sanctuary-js/sanctuary-type-classes", + } + + html_filters.push "sanctuary_type_classes/entries", "sanctuary_type_classes/clean_html" + + options[:container] = '.markdown-body' + options[:title] = "Sanctuary Type Classes" + options[:trailing_slash] = false + options[:attribution] = <<-HTML + © 2020 Sanctuary
+ © 2016 Plaid Technologies, Inc.
+ Licensed under the MIT License. + HTML + + def get_latest_version(opts) + get-npm-version("sanctuary-type-classes", opts) + end + end +end diff --git a/lib/docs/scrapers/spring_boot.rb b/lib/docs/scrapers/spring_boot.rb index 6cec5faff..28eb8d1c1 100644 --- a/lib/docs/scrapers/spring_boot.rb +++ b/lib/docs/scrapers/spring_boot.rb @@ -15,10 +15,11 @@ class SpringBoot < UrlScraper # https://github.com/spring-projects/spring-boot/blob/main/buildSrc/src/main/resources/NOTICE.txt options[:attribution] = <<-HTML - Copyright © 2002–2022 Pivotal, Inc. All Rights Reserved. + Copyright © 2012-2023 VMware, Inc.
+ Licensed under the Apache License, Version 2.0. HTML - self.release = '2.7.0' + self.release = '3.1.3' self.base_url = "https://docs.spring.io/spring-boot/docs/#{release}/reference/html/" def get_latest_version(opts) diff --git a/lib/docs/scrapers/sqlite.rb b/lib/docs/scrapers/sqlite.rb index d2c7cfdb8..92521b1ae 100644 --- a/lib/docs/scrapers/sqlite.rb +++ b/lib/docs/scrapers/sqlite.rb @@ -1,8 +1,8 @@ module Docs - class Sqlite < FileScraper + class Sqlite < UrlScraper self.name = 'SQLite' self.type = 'sqlite' - self.release = '3.42.0' + self.release = '3.43.0' self.base_url = 'https://sqlite.org/' self.root_path = 'docs.html' self.initial_paths = %w(keyword_index.html) diff --git a/lib/docs/scrapers/svelte.rb b/lib/docs/scrapers/svelte.rb index 2dc90ac02..c5900a0b9 100644 --- a/lib/docs/scrapers/svelte.rb +++ b/lib/docs/scrapers/svelte.rb @@ -8,18 +8,27 @@ class Svelte < UrlScraper code: 'https://github.com/sveltejs/svelte' } + self.root_path = 'introduction' options[:root_title] = 'Svelte' + # https://github.com/sveltejs/svelte/blob/master/LICENSE.md options[:attribution] = <<-HTML - © 2016–2022 Rich Harris and contributors
+ © 2016–2023 Rich Harris and contributors
Licensed under the MIT License. HTML options[:skip] = %w(team.html plugins/) - self.release = '3.55.0' - self.base_url = 'https://svelte.dev/docs' + self.base_url = 'https://svelte.dev/docs/' html_filters.push 'svelte/entries', 'svelte/clean_html' + + version do + self.release = '4.2.1' + end + + version '3' do + self.release = '3.55.0' + end def get_latest_version(opts) get_npm_version('svelte', opts) diff --git a/lib/docs/scrapers/varnish.rb b/lib/docs/scrapers/varnish.rb new file mode 100644 index 000000000..24e9cf7c3 --- /dev/null +++ b/lib/docs/scrapers/varnish.rb @@ -0,0 +1,35 @@ +module Docs + class Varnish < UrlScraper + self.name = 'Varnish' + self.type = 'sphinx' + + self.root_path = 'index.html' + self.links = { + home: 'https://varnish-cache.org/', + code: 'https://github.com/varnishcache/varnish-cache' + } + + html_filters.push 'varnish/entries', 'sphinx/clean_html' + + options[:container] = '.body > section' + options[:skip] = %w(genindex.html search.html) + options[:skip_patterns] = [/phk/, /glossary/, /whats-new/] + + options[:attribution] = <<-HTML + Copyright © 2006 Verdens Gang AS
+ Copyright © 2006–2020 Varnish Software AS
+ Licensed under the BSD-2-Clause License. + HTML + + version do + self.release = '7.4' + self.base_url = "https://varnish-cache.org/docs/#{release}/" + end + + def get_latest_version(opts) + contents = get_github_file_contents('varnishcache', 'varnish-cache', 'doc/changes.rst', opts) + contents.scan(/Varnish\s+Cache\s+([0-9.]+)/)[0][0] + end + + end +end diff --git a/lib/docs/scrapers/werkzeug.rb b/lib/docs/scrapers/werkzeug.rb index 190d96c83..703797448 100755 --- a/lib/docs/scrapers/werkzeug.rb +++ b/lib/docs/scrapers/werkzeug.rb @@ -13,10 +13,15 @@ class Werkzeug < UrlScraper options[:skip] = %w(changes/) options[:attribution] = <<-HTML - © 2007–2022 Pallets
+ © 2007 Pallets
Licensed under the BSD 3-clause License. HTML + version '3.0' do + self.release = '3.0.x' + self.base_url = "https://werkzeug.palletsprojects.com/en/#{self.release}/" + end + version '2.3' do self.release = '2.3.x' self.base_url = "https://werkzeug.palletsprojects.com/en/#{self.release}/" diff --git a/lib/docs/scrapers/zig.rb b/lib/docs/scrapers/zig.rb index bcd3d0a9f..a4fd556b9 100644 --- a/lib/docs/scrapers/zig.rb +++ b/lib/docs/scrapers/zig.rb @@ -2,7 +2,7 @@ module Docs class Zig < UrlScraper self.name = 'Zig' self.type = 'simple' - self.release = '0.10.0' + self.release = '0.11.0' self.base_url = "https://ziglang.org/documentation/#{self.release}/" self.links = { home: 'https://ziglang.org/', @@ -13,7 +13,8 @@ class Zig < UrlScraper options[:follow_links] = false options[:attribution] = <<-HTML - © 2015–2022, Zig contributors + © 2015–2023, Zig contributors
+ Licensed under the MIT License. HTML def get_latest_version(opts) diff --git a/lib/tasks/docs.thor b/lib/tasks/docs.thor index a586aa63c..54009530c 100644 --- a/lib/tasks/docs.thor +++ b/lib/tasks/docs.thor @@ -343,6 +343,7 @@ class DocsCLI < Thor file.close tar = UnixUtils.gunzip(file.path) dir = UnixUtils.untar(tar) + FileUtils.rm(tar) FileUtils.rm_rf(target_path) FileUtils.mv(dir, target_path) FileUtils.rm(file.path) diff --git a/lib/tasks/updates.thor b/lib/tasks/updates.thor index 5dd153974..b3fb28bb9 100644 --- a/lib/tasks/updates.thor +++ b/lib/tasks/updates.thor @@ -174,7 +174,7 @@ class UpdatesCLI < Thor order: 'desc' } - matching_issues = github_get('/search/issues', search_params) + matching_issues = github_get('/search/issues', **search_params) previous_issue = matching_issues['items'].find {|item| item['number'] != created_issue['number']} if previous_issue.nil? diff --git a/public/icons/docs/fluture/16.png b/public/icons/docs/fluture/16.png new file mode 100644 index 000000000..75fca6cd7 Binary files /dev/null and b/public/icons/docs/fluture/16.png differ diff --git a/public/icons/docs/fluture/16@2x.png b/public/icons/docs/fluture/16@2x.png new file mode 100644 index 000000000..e02f26ab4 Binary files /dev/null and b/public/icons/docs/fluture/16@2x.png differ diff --git a/public/icons/docs/fluture/SOURCE b/public/icons/docs/fluture/SOURCE new file mode 100644 index 000000000..7f186cb02 --- /dev/null +++ b/public/icons/docs/fluture/SOURCE @@ -0,0 +1 @@ +https://github.com/fluture-js/Fluture/ diff --git a/public/icons/docs/hapi/16.png b/public/icons/docs/hapi/16.png new file mode 100644 index 000000000..9f5080f1e Binary files /dev/null and b/public/icons/docs/hapi/16.png differ diff --git a/public/icons/docs/hapi/16@2x.png b/public/icons/docs/hapi/16@2x.png new file mode 100644 index 000000000..81241282d Binary files /dev/null and b/public/icons/docs/hapi/16@2x.png differ diff --git a/public/icons/docs/hapi/SOURCE b/public/icons/docs/hapi/SOURCE new file mode 100644 index 000000000..2fab7421a --- /dev/null +++ b/public/icons/docs/hapi/SOURCE @@ -0,0 +1 @@ +https://hapi.dev/ diff --git a/public/icons/docs/joi/16.png b/public/icons/docs/joi/16.png new file mode 100644 index 000000000..c6b4a69a8 Binary files /dev/null and b/public/icons/docs/joi/16.png differ diff --git a/public/icons/docs/joi/16@2x.png b/public/icons/docs/joi/16@2x.png new file mode 100644 index 000000000..f9542b548 Binary files /dev/null and b/public/icons/docs/joi/16@2x.png differ diff --git a/public/icons/docs/joi/SOURCE b/public/icons/docs/joi/SOURCE new file mode 100644 index 000000000..2c6a3cf22 --- /dev/null +++ b/public/icons/docs/joi/SOURCE @@ -0,0 +1 @@ +https://joi.dev/img/joiTransparent.png diff --git a/public/icons/docs/nushell/16.png b/public/icons/docs/nushell/16.png new file mode 100644 index 000000000..9d98757d2 Binary files /dev/null and b/public/icons/docs/nushell/16.png differ diff --git a/public/icons/docs/nushell/16@2x.png b/public/icons/docs/nushell/16@2x.png new file mode 100644 index 000000000..6b2176cd1 Binary files /dev/null and b/public/icons/docs/nushell/16@2x.png differ diff --git a/public/icons/docs/nushell/SOURCE b/public/icons/docs/nushell/SOURCE new file mode 100644 index 000000000..2037c928b --- /dev/null +++ b/public/icons/docs/nushell/SOURCE @@ -0,0 +1 @@ +https://www.nushell.sh/icon.png diff --git a/public/icons/docs/sanctuary_def/16.png b/public/icons/docs/sanctuary_def/16.png new file mode 100644 index 000000000..df0bbd4f6 Binary files /dev/null and b/public/icons/docs/sanctuary_def/16.png differ diff --git a/public/icons/docs/sanctuary_def/16@2x.png b/public/icons/docs/sanctuary_def/16@2x.png new file mode 100644 index 000000000..0bf2b9f35 Binary files /dev/null and b/public/icons/docs/sanctuary_def/16@2x.png differ diff --git a/public/icons/docs/sanctuary_def/SOURCE b/public/icons/docs/sanctuary_def/SOURCE new file mode 100644 index 000000000..4aba6a0dd --- /dev/null +++ b/public/icons/docs/sanctuary_def/SOURCE @@ -0,0 +1 @@ +https://github.com/sanctuary-js/sanctuary-logo/tree/v1.1.0 diff --git a/public/icons/docs/sanctuary_type_classes/16.png b/public/icons/docs/sanctuary_type_classes/16.png new file mode 100644 index 000000000..df0bbd4f6 Binary files /dev/null and b/public/icons/docs/sanctuary_type_classes/16.png differ diff --git a/public/icons/docs/sanctuary_type_classes/16@2x.png b/public/icons/docs/sanctuary_type_classes/16@2x.png new file mode 100644 index 000000000..0bf2b9f35 Binary files /dev/null and b/public/icons/docs/sanctuary_type_classes/16@2x.png differ diff --git a/public/icons/docs/sanctuary_type_classes/SOURCE b/public/icons/docs/sanctuary_type_classes/SOURCE new file mode 100644 index 000000000..4aba6a0dd --- /dev/null +++ b/public/icons/docs/sanctuary_type_classes/SOURCE @@ -0,0 +1 @@ +https://github.com/sanctuary-js/sanctuary-logo/tree/v1.1.0 diff --git a/public/icons/docs/varnish/16.png b/public/icons/docs/varnish/16.png new file mode 100644 index 000000000..49c7e76e6 Binary files /dev/null and b/public/icons/docs/varnish/16.png differ diff --git a/public/icons/docs/varnish/16@2x.png b/public/icons/docs/varnish/16@2x.png new file mode 100644 index 000000000..442b11dcb Binary files /dev/null and b/public/icons/docs/varnish/16@2x.png differ diff --git a/public/icons/docs/varnish/SOURCE b/public/icons/docs/varnish/SOURCE new file mode 100644 index 000000000..ebc3b9fc4 --- /dev/null +++ b/public/icons/docs/varnish/SOURCE @@ -0,0 +1 @@ +https://www.varnish-software.com/branding/