diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index e83dfeb3df..faac4b06cc 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@8aeb6ff8030dd539317f8e1769a044873b56ea71 # v1.268.0 + uses: ruby/setup-ruby@09a7688d3b55cf0e976497ff046b70949eeaccfd # v1.288.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 f5d1eb1213..b642089ec6 100644 --- a/.github/workflows/schedule-doc-report.yml +++ b/.github/workflows/schedule-doc-report.yml @@ -11,7 +11,7 @@ jobs: steps: - uses: actions/checkout@ee0669bd1cc54295c223e0bb666b733df41de1c5 # v2.7.0 - name: Set up Ruby - uses: ruby/setup-ruby@8aeb6ff8030dd539317f8e1769a044873b56ea71 # v1.268.0 + uses: ruby/setup-ruby@09a7688d3b55cf0e976497ff046b70949eeaccfd # v1.288.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 953d3e0256..555b6a0c78 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -11,7 +11,7 @@ jobs: steps: - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1 - name: Set up Ruby - uses: ruby/setup-ruby@8aeb6ff8030dd539317f8e1769a044873b56ea71 # v1.268.0 + uses: ruby/setup-ruby@09a7688d3b55cf0e976497ff046b70949eeaccfd # v1.288.0 with: bundler-cache: true # runs 'bundle install' and caches installed gems automatically - name: Run tests diff --git a/.ruby-version b/.ruby-version index 2aa5131992..7921bd0c89 100644 --- a/.ruby-version +++ b/.ruby-version @@ -1 +1 @@ -3.4.7 +3.4.8 diff --git a/.tool-versions b/.tool-versions index 3f03c7a73d..58766197c0 100644 --- a/.tool-versions +++ b/.tool-versions @@ -1 +1 @@ -ruby 3.4.7 +ruby 3.4.8 diff --git a/COPYRIGHT b/COPYRIGHT index 374054bdbf..ad89869379 100644 --- a/COPYRIGHT +++ b/COPYRIGHT @@ -1,4 +1,4 @@ -Copyright 2013-2025 Thibaut Courouble and other contributors +Copyright 2013-2026 Thibaut Courouble and other contributors This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed with this diff --git a/Gemfile b/Gemfile index 9893bb5774..c2a38a7a71 100644 --- a/Gemfile +++ b/Gemfile @@ -1,5 +1,5 @@ source 'https://rubygems.org' -ruby '3.4.7' +ruby '3.4.8' gem 'activesupport', require: false gem 'html-pipeline' diff --git a/Gemfile.lock b/Gemfile.lock index 0dc3ed1f8e..6d257a9e4e 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -191,7 +191,7 @@ DEPENDENCIES yajl-ruby RUBY VERSION - ruby 3.4.7p58 + ruby 3.4.8p72 BUNDLED WITH 2.4.6 diff --git a/README.md b/README.md index fcdb677d84..cf6c735a76 100644 --- a/README.md +++ b/README.md @@ -215,7 +215,7 @@ Made something cool? Feel free to open a PR to add a new row to this table! You ## Copyright / License -Copyright 2013–2025 Thibaut Courouble and [other contributors](https://github.com/freeCodeCamp/devdocs/graphs/contributors) +Copyright 2013–2026 Thibaut Courouble and [other contributors](https://github.com/freeCodeCamp/devdocs/graphs/contributors) This software is licensed under the terms of the Mozilla Public License v2.0. See the [COPYRIGHT](./COPYRIGHT) and [LICENSE](./LICENSE) files. diff --git a/assets/javascripts/lib/license.js b/assets/javascripts/lib/license.js index 15b42c98f4..e4c3c0103a 100644 --- a/assets/javascripts/lib/license.js +++ b/assets/javascripts/lib/license.js @@ -1,5 +1,5 @@ /* - * Copyright 2013-2025 Thibaut Courouble and other contributors + * Copyright 2013-2026 Thibaut Courouble and other contributors * * This source code is licensed under the terms of the Mozilla * Public License, v. 2.0, a copy of which may be obtained at: diff --git a/assets/javascripts/news.json b/assets/javascripts/news.json index 1f821abae4..8db945d488 100644 --- a/assets/javascripts/news.json +++ b/assets/javascripts/news.json @@ -1,4 +1,8 @@ [ + [ + "2026-02-14", + "New documentation: CouchDB" + ], [ "2025-10-19", "New documentations: Lit, Graphviz, Bun" diff --git a/assets/javascripts/templates/pages/about_tmpl.js b/assets/javascripts/templates/pages/about_tmpl.js index e3142da5fc..d8780005e6 100644 --- a/assets/javascripts/templates/pages/about_tmpl.js +++ b/assets/javascripts/templates/pages/about_tmpl.js @@ -32,7 +32,7 @@ app.templates.aboutPage = function () {
- Copyright 2013–2025 Thibaut Courouble and other contributors
+ Copyright 2013–2026 Thibaut Courouble and other contributors
This software is licensed under the terms of the Mozilla Public License v2.0.
You may obtain a copy of the source code at github.com/freeCodeCamp/devdocs.
For more information, see the COPYRIGHT
diff --git a/assets/stylesheets/application.css.scss b/assets/stylesheets/application.css.scss
index 12247d4405..289867076a 100644
--- a/assets/stylesheets/application.css.scss
+++ b/assets/stylesheets/application.css.scss
@@ -3,7 +3,7 @@
//= depend_on sprites/docs.json
/*!
- * Copyright 2013-2025 Thibaut Courouble and other contributors
+ * Copyright 2013-2026 Thibaut Courouble and other contributors
*
* This source code is licensed under the terms of the Mozilla
* Public License, v. 2.0, a copy of which may be obtained at:
diff --git a/assets/stylesheets/components/_environment.scss b/assets/stylesheets/components/_environment.scss
new file mode 100644
index 0000000000..d994d69378
--- /dev/null
+++ b/assets/stylesheets/components/_environment.scss
@@ -0,0 +1,3 @@
+._hide-in-development {
+
+}
diff --git a/assets/stylesheets/global/_icons.scss b/assets/stylesheets/global/_icons.scss
new file mode 100644
index 0000000000..4f7476a375
--- /dev/null
+++ b/assets/stylesheets/global/_icons.scss
@@ -0,0 +1,32 @@
+
+
+%svg-icon {
+ display: inline-block;
+ vertical-align: top;
+ width: 1rem;
+ height: 1rem;
+ pointer-events: none;
+ fill: currentColor;
+}
+
+%doc-icon {
+ content: '';
+ display: block;
+ width: 1rem;
+ height: 1rem;
+ background-image: image-url('sprites/docs.png');
+ background-size: 15rem 15rem;
+}
+
+@media (-webkit-min-device-pixel-ratio: 1.5), (min-resolution: 144dpi) {
+ %doc-icon { background-image: image-url('sprites/docs@2x.png'); }
+}
+
+html._theme-dark {
+ %darkIconFix {
+ filter: invert(100%) grayscale(100%);
+ -webkit-filter: invert(100%) grayscale(100%);
+ }
+}
+
+._icon-angular:before { background-position: -0rem -0rem; }._icon-angularjs:before { background-position: -1rem -0rem; }._icon-ansible:before { background-position: -2rem -0rem; }._icon-apache_http_server:before { background-position: -3rem -0rem; @extend %darkIconFix !optional; }._icon-apache_pig:before { background-position: -4rem -0rem; }._icon-astro:before { background-position: -5rem -0rem; @extend %darkIconFix !optional; }._icon-async:before { background-position: -6rem -0rem; }._icon-axios:before { background-position: -7rem -0rem; }._icon-babel:before { background-position: -8rem -0rem; }._icon-backbone:before { background-position: -9rem -0rem; @extend %darkIconFix !optional; }._icon-bash:before { background-position: -10rem -0rem; }._icon-bazel:before { background-position: -11rem -0rem; }._icon-bluebird:before { background-position: -12rem -0rem; }._icon-bootstrap:before { background-position: -13rem -0rem; }._icon-bottle:before { background-position: -14rem -0rem; }._icon-bower:before { background-position: -0rem -1rem; }._icon-bun:before { background-position: -1rem -1rem; }._icon-c:before { background-position: -2rem -1rem; }._icon-cpp:before { background-position: -3rem -1rem; }._icon-cakephp:before { background-position: -4rem -1rem; }._icon-chai:before { background-position: -5rem -1rem; }._icon-chef:before { background-position: -6rem -1rem; }._icon-click:before { background-position: -7rem -1rem; @extend %darkIconFix !optional; }._icon-clojure:before { background-position: -8rem -1rem; }._icon-cmake:before { background-position: -9rem -1rem; }._icon-codeception:before { background-position: -10rem -1rem; }._icon-codeceptjs:before { background-position: -11rem -1rem; }._icon-codeigniter:before { background-position: -12rem -1rem; }._icon-coffeescript:before { background-position: -13rem -1rem; @extend %darkIconFix !optional; }._icon-composer:before { background-position: -14rem -1rem; }._icon-cordova:before { background-position: -0rem -2rem; }._icon-crystal:before { background-position: -1rem -2rem; @extend %darkIconFix !optional; }._icon-css:before { background-position: -2rem -2rem; }._icon-cypress:before { background-position: -3rem -2rem; }._icon-d:before { background-position: -4rem -2rem; }._icon-d3:before { background-position: -5rem -2rem; }._icon-dart:before { background-position: -6rem -2rem; }._icon-date_fns:before { background-position: -7rem -2rem; @extend %darkIconFix !optional; }._icon-deno:before { background-position: -8rem -2rem; }._icon-django:before { background-position: -9rem -2rem; }._icon-django_rest_framework:before { background-position: -10rem -2rem; @extend %darkIconFix !optional; }._icon-docker:before { background-position: -11rem -2rem; }._icon-dojo:before { background-position: -12rem -2rem; }._icon-drupal:before { background-position: -13rem -2rem; }._icon-duckdb:before { background-position: -14rem -2rem; }._icon-eigen3:before { background-position: -0rem -3rem; @extend %darkIconFix !optional; }._icon-electron:before { background-position: -1rem -3rem; }._icon-elisp:before { background-position: -2rem -3rem; }._icon-elixir:before { background-position: -3rem -3rem; }._icon-ember:before { background-position: -4rem -3rem; }._icon-enzyme:before { background-position: -0rem -8rem; }._icon-erlang:before { background-position: -5rem -3rem; }._icon-es_toolkit:before { background-position: -6rem -3rem; }._icon-esbuild:before { background-position: -7rem -3rem; }._icon-eslint:before { background-position: -8rem -3rem; }._icon-express:before { background-position: -9rem -3rem; }._icon-falcon:before { background-position: -10rem -3rem; }._icon-fastapi:before { background-position: -11rem -3rem; @extend %darkIconFix !optional; }._icon-fish:before { background-position: -12rem -3rem; }._icon-flask:before { background-position: -13rem -3rem; }._icon-flow:before { background-position: -14rem -3rem; }._icon-fluture:before { background-position: -0rem -4rem; }._icon-gcc:before { background-position: -1rem -4rem; }._icon-git:before { background-position: -2rem -4rem; }._icon-gnu_fortran:before { background-position: -3rem -4rem; }._icon-gnu_make:before { background-position: -4rem -4rem; @extend %darkIconFix !optional; }._icon-gnu_cobol:before { background-position: -5rem -4rem; @extend %darkIconFix !optional; }._icon-gnuplot:before { background-position: -6rem -4rem; }._icon-go:before { background-position: -7rem -4rem; }._icon-godot:before { background-position: -8rem -4rem; }._icon-graphite:before { background-position: -0rem -8rem; }._icon-graphviz:before { background-position: -9rem -4rem; @extend %darkIconFix !optional; }._icon-groovy:before { background-position: -10rem -4rem; }._icon-grunt:before { background-position: -11rem -4rem; }._icon-gtk:before { background-position: -12rem -4rem; }._icon-hammerspoon:before { background-position: -13rem -4rem; }._icon-handlebars:before { background-position: -14rem -4rem; @extend %darkIconFix !optional; }._icon-hapi:before { background-position: -0rem -5rem; }._icon-haproxy:before { background-position: -1rem -5rem; }._icon-haskell:before { background-position: -2rem -5rem; @extend %darkIconFix !optional; }._icon-haxe:before { background-position: -3rem -5rem; }._icon-homebrew:before { background-position: -4rem -5rem; }._icon-html:before { background-position: -5rem -5rem; }._icon-htmx:before { background-position: -6rem -5rem; @extend %darkIconFix !optional; }._icon-http:before { background-position: -7rem -5rem; }._icon-i3:before { background-position: -8rem -5rem; }._icon-immutable:before { background-position: -9rem -5rem; @extend %darkIconFix !optional; }._icon-influxdata:before { background-position: -10rem -5rem; @extend %darkIconFix !optional; }._icon-jasmine:before { background-position: -11rem -5rem; }._icon-javascript:before { background-position: -12rem -5rem; }._icon-jekyll:before { background-position: -13rem -5rem; }._icon-jest:before { background-position: -14rem -5rem; }._icon-jinja:before { background-position: -0rem -6rem; @extend %darkIconFix !optional; }._icon-joi:before { background-position: -1rem -6rem; @extend %darkIconFix !optional; }._icon-jq:before { background-position: -2rem -6rem; @extend %darkIconFix !optional; }._icon-jquery:before { background-position: -3rem -6rem; }._icon-jquerymobile:before { background-position: -4rem -6rem; }._icon-jqueryui:before { background-position: -5rem -6rem; }._icon-jsdoc:before { background-position: -0rem -8rem; }._icon-julia:before { background-position: -6rem -6rem; @extend %darkIconFix !optional; }._icon-knockout:before { background-position: -7rem -6rem; }._icon-koa:before { background-position: -0rem -8rem; }._icon-kotlin:before { background-position: -8rem -6rem; }._icon-kubectl:before { background-position: -9rem -6rem; @extend %darkIconFix !optional; }._icon-kubernetes:before { background-position: -10rem -6rem; }._icon-laravel:before { background-position: -11rem -6rem; }._icon-latex:before { background-position: -12rem -6rem; @extend %darkIconFix !optional; }._icon-leaflet:before { background-position: -13rem -6rem; }._icon-less:before { background-position: -14rem -6rem; }._icon-man:before { background-position: -0rem -7rem; }._icon-liquid:before { background-position: -1rem -7rem; }._icon-lit:before { background-position: -2rem -7rem; }._icon-lodash:before { background-position: -3rem -7rem; }._icon-lua:before { background-position: -4rem -7rem; @extend %darkIconFix !optional; }._icon-love:before { background-position: -5rem -7rem; }._icon-mariadb:before { background-position: -6rem -7rem; }._icon-marionette:before { background-position: -7rem -7rem; }._icon-markdown:before { background-position: -8rem -7rem; @extend %darkIconFix !optional; }._icon-matplotlib:before { background-position: -9rem -7rem; }._icon-meteor:before { background-position: -10rem -7rem; @extend %darkIconFix !optional; }._icon-mocha:before { background-position: -11rem -7rem; }._icon-modernizr:before { background-position: -12rem -7rem; }._icon-moment:before { background-position: -13rem -7rem; @extend %darkIconFix !optional; }._icon-moment_timezone:before { background-position: -14rem -7rem; }._icon-mongoose:before { background-position: -0rem -8rem; }._icon-nextjs:before { background-position: -1rem -8rem; @extend %darkIconFix !optional; }._icon-nginx:before { background-position: -2rem -8rem; }._icon-nginx_lua_module:before { background-position: -0rem -8rem; }._icon-nim:before { background-position: -3rem -8rem; @extend %darkIconFix !optional; }._icon-nix:before { background-position: -4rem -8rem; }._icon-node:before { background-position: -5rem -8rem; }._icon-nokogiri:before { background-position: -6rem -8rem; @extend %darkIconFix !optional; }._icon-npm:before { background-position: -7rem -8rem; }._icon-numpy:before { background-position: -8rem -8rem; }._icon-nushell:before { background-position: -9rem -8rem; }._icon-ocaml:before { background-position: -10rem -8rem; }._icon-octave:before { background-position: -11rem -8rem; }._icon-opengl:before { background-position: -12rem -8rem; }._icon-openjdk:before { background-position: -13rem -8rem; }._icon-openlayers:before { background-position: -14rem -8rem; }._icon-opentsdb:before { background-position: -0rem -9rem; }._icon-padrino:before { background-position: -1rem -9rem; }._icon-pandas:before { background-position: -2rem -9rem; @extend %darkIconFix !optional; }._icon-perl:before { background-position: -3rem -9rem; }._icon-phalcon:before { background-position: -4rem -9rem; }._icon-phaser:before { background-position: -5rem -9rem; }._icon-phoenix:before { background-position: -6rem -9rem; }._icon-php:before { background-position: -7rem -9rem; }._icon-phpunit:before { background-position: -8rem -9rem; }._icon-playwright:before { background-position: -9rem -9rem; }._icon-point_cloud_library:before { background-position: -10rem -9rem; }._icon-pony:before { background-position: -11rem -9rem; }._icon-postgresql:before { background-position: -12rem -9rem; }._icon-prettier:before { background-position: -13rem -9rem; @extend %darkIconFix !optional; }._icon-pug:before { background-position: -14rem -9rem; }._icon-puppeteer:before { background-position: -0rem -10rem; }._icon-pygame:before { background-position: -1rem -10rem; }._icon-python:before { background-position: -2rem -10rem; }._icon-pytorch:before { background-position: -3rem -10rem; }._icon-q:before { background-position: -4rem -10rem; }._icon-qt:before { background-position: -5rem -10rem; }._icon-qunit:before { background-position: -6rem -10rem; }._icon-r:before { background-position: -7rem -10rem; }._icon-ramda:before { background-position: -8rem -10rem; @extend %darkIconFix !optional; }._icon-react:before { background-position: -9rem -10rem; }._icon-react_bootstrap:before { background-position: -10rem -10rem; }._icon-react_native:before { background-position: -11rem -10rem; }._icon-react_router:before { background-position: -12rem -10rem; @extend %darkIconFix !optional; }._icon-reactivex:before { background-position: -13rem -10rem; }._icon-redis:before { background-position: -14rem -10rem; }._icon-redux:before { background-position: -0rem -11rem; @extend %darkIconFix !optional; }._icon-relay:before { background-position: -1rem -11rem; }._icon-requests:before { background-position: -2rem -11rem; }._icon-requirejs:before { background-position: -3rem -11rem; }._icon-rethinkdb:before { background-position: -4rem -11rem; }._icon-ruby:before { background-position: -5rem -11rem; }._icon-minitest:before { background-position: -0rem -8rem; }._icon-rails:before { background-position: -6rem -11rem; }._icon-rust:before { background-position: -7rem -11rem; @extend %darkIconFix !optional; }._icon-rxjs:before { background-position: -8rem -11rem; }._icon-saltstack:before { background-position: -9rem -11rem; @extend %darkIconFix !optional; }._icon-sanctuary:before { background-position: -10rem -11rem; }._icon-sanctuary_def:before { background-position: -11rem -11rem; }._icon-sanctuary_type_classes:before { background-position: -12rem -11rem; }._icon-sass:before { background-position: -13rem -11rem; }._icon-scala:before { background-position: -14rem -11rem; }._icon-scikit_image:before { background-position: -0rem -12rem; }._icon-scikit_learn:before { background-position: -1rem -12rem; }._icon-sequelize:before { background-position: -2rem -12rem; }._icon-sinon:before { background-position: -3rem -12rem; }._icon-socketio:before { background-position: -4rem -12rem; }._icon-spring_boot:before { background-position: -5rem -12rem; }._icon-sqlite:before { background-position: -6rem -12rem; }._icon-statsmodels:before { background-position: -7rem -12rem; }._icon-browser_support_tables:before { background-position: -0rem -8rem; }._icon-svelte:before { background-position: -8rem -12rem; }._icon-svg:before { background-position: -9rem -12rem; }._icon-symfony:before { background-position: -10rem -12rem; }._icon-tailwindcss:before { background-position: -11rem -12rem; }._icon-tcl_tk:before { background-position: -12rem -12rem; }._icon-tcllib:before { background-position: -13rem -12rem; }._icon-tensorflow:before { background-position: -14rem -12rem; }._icon-tensorflow_cpp:before { background-position: -0rem -13rem; }._icon-terraform:before { background-position: -1rem -13rem; @extend %darkIconFix !optional; }._icon-threejs:before { background-position: -2rem -13rem; @extend %darkIconFix !optional; }._icon-trio:before { background-position: -3rem -13rem; }._icon-twig:before { background-position: -4rem -13rem; }._icon-typescript:before { background-position: -5rem -13rem; }._icon-underscore:before { background-position: -6rem -13rem; @extend %darkIconFix !optional; }._icon-vagrant:before { background-position: -7rem -13rem; }._icon-varnish:before { background-position: -8rem -13rem; }._icon-vertx:before { background-position: -9rem -13rem; }._icon-vite:before { background-position: -10rem -13rem; }._icon-vitest:before { background-position: -11rem -13rem; }._icon-vue:before { background-position: -12rem -13rem; }._icon-vue_router:before { background-position: -13rem -13rem; }._icon-vueuse:before { background-position: -14rem -13rem; }._icon-vuex:before { background-position: -0rem -14rem; }._icon-vulkan:before { background-position: -1rem -14rem; @extend %darkIconFix !optional; }._icon-wagtail:before { background-position: -2rem -14rem; @extend %darkIconFix !optional; }._icon-dom:before { background-position: -3rem -14rem; }._icon-web_extensions:before { background-position: -0rem -8rem; }._icon-webpack:before { background-position: -4rem -14rem; }._icon-werkzeug:before { background-position: -5rem -14rem; }._icon-wordpress:before { background-position: -6rem -14rem; @extend %darkIconFix !optional; }._icon-xslt_xpath:before { background-position: -0rem -8rem; }._icon-yarn:before { background-position: -7rem -14rem; }._icon-yii:before { background-position: -8rem -14rem; }._icon-zig:before { background-position: -9rem -14rem; }._icon-zsh:before { background-position: -10rem -14rem; }
diff --git a/lib/docs/filters/axios/clean_html.rb b/lib/docs/filters/axios/clean_html.rb
index ab71d1ad4c..e772344e3a 100644
--- a/lib/docs/filters/axios/clean_html.rb
+++ b/lib/docs/filters/axios/clean_html.rb
@@ -7,6 +7,7 @@ def call
end
@doc = at_css('main > .body')
css('.links').remove
+ css('.sponsors_container').remove
css('pre').each do |node|
node.content = node.content
node['data-language'] = node['class'][/lang-(\w+)/, 1]
diff --git a/lib/docs/filters/couchdb/clean_html.rb b/lib/docs/filters/couchdb/clean_html.rb
new file mode 100644
index 0000000000..7c30aea4fa
--- /dev/null
+++ b/lib/docs/filters/couchdb/clean_html.rb
@@ -0,0 +1,29 @@
+module Docs
+ class Couchdb
+ class CleanHtmlFilter < Filter
+ def call
+ css('.section-number').remove
+ css('.headerlink').remove
+
+ css('.sig-name').each do |node|
+ node.name = 'code'
+ end
+
+ css('pre').each do |node|
+ node.content = node.content.strip
+
+ classes = node.parent.parent.classes
+ if classes.include? 'highlight-bash'
+ node['data-language'] = 'bash'
+ else
+ node['data-language'] = 'javascript'
+ end
+
+ node.parent.parent.replace(node)
+ end
+
+ doc
+ end
+ end
+ end
+end
diff --git a/lib/docs/filters/couchdb/entries.rb b/lib/docs/filters/couchdb/entries.rb
new file mode 100644
index 0000000000..3d03a9616e
--- /dev/null
+++ b/lib/docs/filters/couchdb/entries.rb
@@ -0,0 +1,53 @@
+module Docs
+ class Couchdb
+ class EntriesFilter < Docs::EntriesFilter
+ SLUG_MAP = {
+ 'api' => 'API',
+ 'json' => 'JSON Structures',
+ 'cluster' => 'Cluster Management',
+ 'replication' => 'Replication',
+ 'maintenance' => 'Maintenance',
+ 'partitioned' => 'Partitioned Databases'
+ }
+
+ def get_name
+ at_css('h1').content.gsub(/\P{ASCII}/, '').split('.').last
+ end
+
+ def get_type
+ if slug.start_with?('ddocs/views')
+ 'Views'
+ elsif slug.start_with?('ddocs')
+ 'Design Documents'
+ else
+ SLUG_MAP[slug[/^(.+?)[-\/]/, 1]] || name
+ end
+ end
+
+ def additional_entries
+ needs_breakup = [
+ 'JSON Structure Reference',
+ 'Design Documents',
+ 'Partitioned Databases'
+ ]
+
+ if needs_breakup.include?(name)
+ entries = []
+
+ css('section > section').each do |node|
+ h2 = node.at_css('h2')
+
+ if h2.present?
+ name = node.at_css('h2').content.split('.').last
+ entries << [name, node['id']]
+ end
+ end
+
+ entries
+ else
+ []
+ end
+ end
+ end
+ end
+end
diff --git a/lib/docs/filters/htmx/clean_html.rb b/lib/docs/filters/htmx/clean_html.rb
index 4c14c6aad3..95a3107327 100644
--- a/lib/docs/filters/htmx/clean_html.rb
+++ b/lib/docs/filters/htmx/clean_html.rb
@@ -2,6 +2,7 @@ module Docs
class Htmx
class CleanHtmlFilter < Filter
def call
+ css('.ad').remove
css('.zola-anchor').remove
doc.prepend_child("